Dela via


närmaste punktsampling

Program krävs inte för att använda texturfiltrering. Direct3D kan ställas in för att beräkna texeladresser, som ofta inte är heltal, och kopierar färgen på den texel som har den närmaste heltalsadressen. Den här processen kallas närmaste punktsampling. Närmaste punktsampling kan användas när storleken på texturen är liknande storleken på primitivens avbildning på skärmen. Om inte, måste strukturen förstoras eller minifieras. Resultatet av att texturstorlekarna inte matchar den primitiva bildstorleken kan vara en segmentig, aliaserad eller suddig bild.

Använd "nearest-point sampling" noggrant eftersom det ibland kan orsaka grafiska artefakter när texturen samplas vid gränsen mellan två texlar. Den här gränsen är positionen längs strukturen (u eller v) där den samplade texeln övergår från en texel till en annan. När punktsampling används väljer systemet ett exempeltexel eller det andra, och resultatet kan ändras plötsligt från en texel till nästa texel när gränsen korsas. Den här effekten kan visas som oönskade grafiska artefakter i den textur som visas. När linjär filtrering används beräknas den resulterande texeln från de två intilliggande texlarna och blandas smidigt mellan dem när texturindexet passerar över gränsen.

Den här effekten kan ses när en mycket liten struktur mappas till en mycket stor polygon: en åtgärd som ofta kallas förstoring. När du till exempel använder en textur som ser ut som ett schackbräde, resulterar närmaste punktsampling i ett större rutmönster som visar distinkta kanter. Linjär texturfiltrering resulterar däremot i en bild där schackbrädafärgerna varierar smidigt över polygonen.

I de flesta fall får program bästa resultat genom att undvika närmaste punktexempel där det är möjligt. Majoriteten av maskinvaran idag är optimerad för linjär filtrering, så ditt program bör inte drabbas av sämre prestanda. Om den effekt du önskar absolut kräver användning av närmaste punktsampling - till exempel när du använder texturer för att visa läsbara texttecken - bör ditt program vara mycket noga med att undvika sampling vid texelgränserna, vilket kan leda till oönskade effekter. Följande bild visar hur dessa artefakter kan se ut.

bild av en sexdelad låda med icke-kontinuerliga vågräta linjer i de två övre högra fyrkanterna

De två rutorna i den övre högra delen av gruppen ser annorlunda ut än grannarnas, med diagonala förskjutningar som löper genom dem. För att undvika grafiska artefakter som dessa måste du vara bekant med Direct3D-textursamplingsregler för filtrering med närmaste punkt. Direct3D mappar en flyttals-texturkoordinat som sträcker sig från [0.0, 1.0] (0.0 till 1.0, inklusive) till ett heltalsvärde i texelutrymmet som sträcker sig från [-0,5, n - 0,5], där n är antalet texlar i en viss dimension på texturen. Det resulterande strukturindexet avrundas till närmaste heltal. Denna mappning kan leda till provtagningsoegentligheter vid texelgränser.

I ett enkelt exempel kan du föreställa dig en applikation som återger polygoner med Wrap-textursadressläget. Med hjälp av mappningen som används av Direct3D mappas u-texturindexet enligt diagrammet nedan för en textur med en bredd på 4 texlar.

diagram över texturkoordinater 0.0 och 1.0 vid gränsen mellan texlar

Texturkoordinaterna 0.0 och 1.0 för den här illustrationen ligger exakt vid gränsen mellan textelrutorna. Med hjälp av metoden som Direct3D mappar värden med, varierar strukturkoordinaterna från [ - 0.5, 4 - 0.5], där 4 är bredden på strukturen. I det här fallet är den samplade texeln 0 texel för ett strukturindex på 1,0. Men om strukturkoordinaten bara var något mindre än 1,0 skulle den samplade texeln vara n-texeln i stället för 0-texeln.

Konsekvensen av detta är att förstoring av en liten textur med hjälp av strukturkoordinater på exakt 0,0 och 1,0 med närmaste punktfiltrering på en skärmutrymmesjusterad triangel resulterar i pixlar för vilka texturkartan samplas vid gränsen mellan texels. Eventuella felaktigheter i beräkningen av strukturkoordinater, även om de är små, resulterar i artefakter längs områdena i den renderade bilden som motsvarar texturkartans texelkanter.

Att utföra den här mappningen av flyttalsstrukturkoordinater till heltalstexels med perfekt noggrannhet är svårt, beräkningsmässigt tidskrävande och i allmänhet inte nödvändigt. De flesta maskinvaruimplementeringar använder en iterativ metod för att beräkna strukturkoordinater på varje pixelplats i en triangel. Iterativa metoder tenderar att dölja dessa felaktigheter eftersom felen ackumuleras jämnt under iterationen.

Direct3D-referensrastreraren använder en direktutvärderingsmetod för att beräkna texturindex på varje pixelplats. Direktutvärdering skiljer sig från den iterativa metoden eftersom eventuella felaktigheter i åtgärden uppvisar en mer slumpmässig felfördelning. Resultatet av detta är att de samplingsfel som inträffar vid gränserna kan vara mer märkbara eftersom referens rasterizern inte utför den här åtgärden med perfekt noggrannhet.

Den bästa metoden är att endast använda filtrering med närmaste punkt när det behövs. När du måste använda den rekommenderar vi att du förskjuter texturkoordinater något från gränspositionerna för att undvika artefakter.

Texturfiltrering