Dela via


Strukturkoordinater (Direct3D 9)

De flesta texturer, till exempel bitmappar, är en tvådimensionell matris med färgvärden. Kartstrukturer för kubikmiljö är ett undantag. Mer information finns i Kubikmiljömappning (Direct3D 9). De enskilda färgvärdena kallas för ett texturelement eller texel. Varje texel har en unik adress i strukturen. Adressen kan betraktas som ett kolumn- och radnummer, som är märkta med dig respektive v i följande bild.

bild av en texeladress som kolumn- och radnummer

Strukturkoordinater finns i texturutrymmet. De är alltså relativa till platsen (0,0) i texturen. När en struktur tillämpas på en primitiv i 3D-utrymme måste dess texeladresser mappas till objektkoordinater. De måste sedan översättas till skärmkoordinater eller pixelplatser.

Mappa Texels till skärmutrymme

Direct3D mappar texels i texturutrymme direkt till bildpunkter i skärmutrymmet och hoppar över det mellanliggande steget för större effektivitet. Den här mappningsprocessen är faktiskt en omvänd mappning. För varje bildpunkt i skärmutrymmet beräknas alltså motsvarande texelposition i texturutrymmet. Texturfärgen vid eller runt den punkten samplas. Samplingsprocessen kallas för texturfiltrering. Mer information finns i Texturfiltrering (Direct3D 9).

Varje texel i en struktur kan anges med dess texelkoordinat. Men för att kunna mappa texels till primitiver kräver Direct3D ett enhetligt adressintervall för alla texels i alla texturer. Därför används ett allmänt adressschema där alla texeladresser ligger i intervallet 0.0 till 1.0 inklusive. Direct3D-program anger strukturkoordinater i termer av dig,v-värden, ungefär som 2D kartesiska koordinater anges i termer av x,y-koordinater. Tekniskt sett kan systemet faktiskt bearbeta strukturkoordinater utanför intervallet 0.0 och 1.0, och gör det med hjälp av de parametrar som du anger för struktur adressering. Mer information finns i lägen för strukturhantering (Direct3D 9).

Ett resultat av detta är att identiska texturadresser kan mappas till olika texelkoordinater i olika texturer. I följande bild är texturadressen (0,5,1,0). Men eftersom texturerna är olika storlekar mappar texturadressen till olika texels. Textur 1, till vänster, är 5x5. Texturadressen (0,5,1.0) mappar till texel (2,4). Textur 2, till höger, är 7x7. Texturadressen (0,5,1.0) mappar till texel (3,6).

bild av samma texturadressmappning till olika texels på olika texturer

En förenklad version av texelmappningsprocessen visas i följande bild. Det här exemplet är visserligen mycket enkelt. Mer detaljerad information finns i Direktmappning av Texels till pixlar (Direct3D 9).

bildpunkt (en kvadrat med färg) som mappas till objektutrymme

I det här exemplet idealiseras en bildpunkt, som visas till vänster om bilden, till en fyrkant med färg. Adresserna för pixelns fyra hörn mappas till 3D-primitiven i objektutrymmet. Pixelns form förvrängs ofta på grund av formen på primitiven i 3D-rymden och på grund av visningsvinkeln. Hörnen på ytan på den primitiva som motsvarar hörnen på pixeln mappas sedan till strukturutrymme. Mappningsprocessen förvränger pixelns form igen, vilket är vanligt. Pixelns slutliga färgvärde beräknas från texellerna i den region som pixeln mappar till. Du bestämmer vilken metod som Direct3D använder för att komma fram till pixelfärgen när du anger metoden för texturfiltrering. Mer information finns i Texturfiltrering (Direct3D 9).

Ditt program kan tilldela strukturkoordinater direkt till hörn. Den här funktionen ger dig kontroll över vilken del av en struktur som mappas till en primitiv. Anta till exempel att du skapar en rektangulär primitiv som är exakt lika stor som strukturen i följande bild. I det här exemplet vill du att programmet ska mappa hela strukturen till hela väggen. Strukturen koordinerar programmets tilldelningar till hörnen för primitiven är (0.0,0.0), (1.0,0.0), (1.0,1.0) och (0.0,1.0).

bild av en texturmappad vägg

Om du bestämmer dig för att minska höjden på väggen med hälften kan du förvränga strukturen så att den får plats på den mindre väggen, eller så kan du tilldela texturkoordinater som gör att Direct3D använder den nedre halvan av strukturen.

Om du bestämmer dig för att förvränga eller skala strukturen så att den passar den mindre väggen påverkar texturfiltreringsmetoden som du använder bildens kvalitet. Mer information finns i Texturfiltrering (Direct3D 9).

Om du i stället bestämmer dig för att tilldela strukturkoordinater så att Direct3D använder den nedre halvan av strukturen för den mindre väggen, samordnar strukturen ditt program tilldelar hörnen för primitiven i det här exemplet (0,0,0,5), (1.0,0.5), (1.0,1.0) och (0.0,1.0). Direct3D applicerar den nedre halvan av strukturen på väggen.

Det är möjligt att strukturkoordinater för ett hörn är större än 1,0. När du tilldelar texturkoordinater till ett hörn som inte ligger inom intervallet 0,0 till 1,0 inklusive, bör du också ange texturens adresseringsläge. Mer information finns i lägen för strukturhantering (Direct3D 9).

Strukturkoordinater och struktursteg

Strukturkoordinater associeras med texturer genom strukturfaser. Texturer tilldelas till strukturfaser med SetTexture(stageIndex, pTexture). Se IDirect3DDevice9::SetTexture.

En FVF-kod (Flexible Vertex Format) kan definiera upp till åtta uppsättningar strukturkoordinater. Texturkoordinatdata tillhandahålls av användaren i hörndata. Data refereras till med ett nollbaserat index: 0–7. Det finns upp till åtta strukturblandningssteg. En struktur är associerad med en viss fas med SetTexture( stageIndex, pTexture).

När detta är klart kan valfri uppsättning strukturkoordinater användas i valfri fas. Varje uppsättning koordinater associeras med en fas med SetTextureStageState( stageIndex, D3DTSS_TEXCOORDINDEX, textureCoordinateIndex ). Se IDirect3DDevice9::SetTextureStageState. På så sätt kan blandningsstegen konfigureras för att använda valfri struktur och eventuella strukturkoordinater. Fler än en fas kan använda samma texturer eller strukturkoordinater.

Ytterligare information finns i följande avsnitt.

Direct3D-texturer