Delen via


dichtstbijzijnde puntsampling

Toepassingen zijn niet vereist voor het gebruik van patroonfilters. Direct3D kan zo worden ingesteld dat het het texeladres berekent, wat vaak niet resulteert in gehele getallen, en de kleur kopieert van de texel met het dichtstbijzijnde gehele getaladres. Dit proces heet dichtstbijzijnde puntbemonstering. Steekproeven van dichtstbijzijnde punten kunnen zijn alsof de grootte van het patroon vergelijkbaar is met de grootte van de primitieve afbeelding op het scherm. Zo niet, dan moet de textuur worden vergroot of verkleind. Het resultaat van het niet overeenkomen van textuurgroottes met de afbeeldingsgrootte kan een grove, gekartelde of wazige afbeelding zijn.

Gebruik de dichtstbijzijnde puntsampling zorgvuldig, omdat het soms grafische artefacten kan veroorzaken wanneer de textuur wordt bemonsterd op de grens tussen twee texels. Deze grens is de positie langs de textuur (u of v) waarop de gemonsterde texelse overgang van de ene texel naar de volgende gaat. Wanneer puntsampling wordt gebruikt, kiest het systeem één steekproef texel of de andere, en kan het resultaat plotseling veranderen van de ene texel naar de volgende texel terwijl de grens wordt overschreden. Dit effect kan worden weergegeven als ongewenste grafische artefacten in het weergegeven patroon. Wanneer lineair filteren wordt gebruikt, wordt het resulterende texel berekend uit zowel aangrenzende texels en vloeiend mengt het ertussen terwijl de textuurindex door de grens beweegt.

Dit effect is te zien bij het toepassen van een zeer kleine textuur op een zeer grote veelhoek: een bewerking die vaak vergroting wordt genoemd. Wanneer u bijvoorbeeld een textuur gebruikt die eruitziet als een schaakbord, resulteert nabijheidssampling in een groter schaakbord met duidelijke randen. Het filteren van lineaire textuur resulteert daarentegen in een afbeelding waarin de kleuren van het ruitpatroon soepel variëren over de veelhoek.

In de meeste gevallen ontvangen toepassingen de beste resultaten door waar mogelijk het dichtstbijzijnde puntvoorbeeld te vermijden. Het merendeel van de hardware is momenteel geoptimaliseerd voor lineair filteren, dus uw toepassing mag geen slechtere prestaties hebben. Als het gewenste effect absoluut vereist dat de dichtstbijzijnde puntsampling wordt gebruikt, zoals bij het gebruik van patronen om leesbare teksttekens weer te geven, moet uw toepassing uiterst voorzichtig zijn om steekproeven op de texelse grenzen te voorkomen, wat kan leiden tot ongewenste effecten. In de volgende afbeelding ziet u hoe deze artefacten eruit kunnen zien.

illustratie van een vak met zes secties met niet-doorlopende horizontale lijnen in de twee vierkanten rechtsboven

De twee vierkantjes in de rechterbovenhoek van de groep lijken anders dan hun buren, met diagonale verschuivingen die erdoor lopen. Om grafische artefacten als deze te voorkomen, moet u bekend zijn met direct3D-patroonsamplingregels voor het filteren van dichtstbijzijnde punten. Direct3D wijst een drijvendekommapatrooncoördinaat toe, variërend van [0.0, 1.0] (0,0 tot 1,0, inclusief) tot een geheel getal dat varieert van [ - 0,5, n - 0,5], waarbij n het aantal texels in een bepaalde dimensie op de textuur is. De resulterende textuurindex wordt afgerond op het dichtstbijzijnde gehele getal. Deze toewijzing kan onnauwkeurigheden bij het bemonsteren veroorzaken op texelgrenzen.

Stel voor een eenvoudig voorbeeld een toepassing voor die veelhoeken weergeeft met de Wrap-textuuradresseringsmodus. Met behulp van de toewijzing die Direct3D gebruikt, wordt de u-textuurindex toegewezen zoals weergegeven in het volgende diagram voor een textuur met een breedte van 4 texels.

diagram van texture-coördinaten 0.0 en 1.0 op de grens tussen texels

De patrooncoördinaten, 0,0 en 1.0 voor deze illustratie, liggen precies op de grens tussen texels. Met de methode waarmee Direct3D waarden toedeelt, variëren de patrooncoördinaten van [ - 0,5, 4 - 0,5], waarbij 4 de breedte van het patroon is. Voor dit geval is de gemonsterde texel de 0 texel voor een structuurindex van 1,0. Als de patrooncoördinaat echter maar iets minder dan 1,0 was, zou de gemonsterde texel de n texel zijn in plaats van de 0 texel.

De implicatie hiervan is dat het vergroten van een kleine textuur met behulp van textuurcoördinaten van exact 0,0 en 1,0 met nabijheidspuntsfiltering op een schermruimte-uitgelijnde driehoek resulteert in pixels waarvoor de textuurkaart wordt bemonsterd op de grens tussen texels. Onnauwkeurigheden in de berekening van textuurcoördinaten, hoe klein ook, resulteren in artefacten langs de gebieden in de gerenderde afbeelding die overeenkomen met de randen van de texels van de textuurkaart.

Het uitvoeren van deze toewijzing van drijvendekommatextuurcoördinaten aan integer texels met perfecte nauwkeurigheid is moeilijk, rekenkundig tijdrovend en over het algemeen niet nodig. De meeste hardware-implementaties gebruiken een iteratieve benadering voor het berekenen van patrooncoördinaten op elke pixellocatie binnen een driehoek. Iteratieve benaderingen verbergen deze onnauwkeurigheden meestal omdat de fouten gelijkmatig tijdens de iteratie worden verzameld.

De Direct3D-referentierasterizer maakt gebruik van een directe evaluatiebenadering voor het berekenen van patroonindexen op elke pixellocatie. Directe evaluatie verschilt van de iteratieve benadering omdat elke onnauwkeurigheid in de bewerking een meer willekeurige foutverdeling vertoont. Het resultaat hiervan is dat de steekproeffouten die zich op de grenzen voordoen, duidelijker kunnen zijn, omdat de verwijzingsraster deze bewerking niet met een perfecte nauwkeurigheid uitvoert.

De beste methode is om het dichtstbijzijnde punt te filteren, alleen wanneer dat nodig is. Wanneer u het moet gebruiken, wordt aanbevolen om textuurcoördinaten iets te verschuiven ten opzichte van de grensposities om artefacten te voorkomen.

Textuurfiltering