Förskjutningsmappning (Direct3D 9)
Förskjutningskartor liknar texturkartor men nås av vertexmotorn.
Blockdiagram
Ytterligare ett provsteg finns i den tidiga delen av hörnröret, som visas i följande diagram, som kan prova en förskjutningskarta för att tillhandahålla hörnförskjutningsdata.
Sampeltillståndet för förskjutningskartan kan anges av SetSamplerState med hjälp av stegnummer 256, vilket är ett nytt stegnummer. Förskjutningskartans struktur anges av SetTexture.
Kartan kan förimpleras eller inte, vilket innebär att den kan ordnas på ett sätt som möjliggör sökning av förskjutningsvärdena utan filtrering.
- Förskjutningskartor är analoga med texturkartor men nås av vertexmotorn.
- Ytterligare ett samplingssteg finns vid den tidiga delen av vertex pipe som kan sampla en förskjutningskarta. Den här fasen nås av det vanliga SetSamplerState-API:et, men stegnumret är D3DDMAPSAMPLER = 256.
- Förskjutningskartans samplertillstånd kan anges med API:et SetSamplerState(D3DDMAPSAMPLER, ...).
- Förskjutningskartans struktur anges av API:et SetTexture(D3DDMAPSAMPLER, textur).
- Kartan kan vara förexempel eller inte. Det innebär att den kan ordnas på ett visst sätt som möjliggör sökning av förskjutningsvärdena utan filtrering.
- Ändringarna i deklarationsstrukturen tillåter specifikationen av strukturkoordinaten som används för att leta upp texturkartan. Till exempel Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Detta talar om för tessellatorn att använda 2D-flyttalvektorn i stream0 vid en viss förskjutning som en strukturkoordinat för att leta upp förskjutningskartan och associera Displacement_value användningssemantik till den. Deklarationen för hörnskuggning skulle innehålla en rad som liknar {dcl_texture0, v0} som anger att texture0-semantiken ska associeras med v0-indataregistret. Förskjutningsvärdet som letats upp kopieras till indataregistret v0.
- Det finns en särskild typ av förskjutningsmappning när texturkartan är förprovad. Sekventiellt index för genererade hörn används som en strukturkoordinat till en strukturkarta. Till exempel 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, användning, användningsindex.
- Utdata från sökningen är 4 flyttal.
- Förskjutningsmappning stöds endast med N-patches.
- Drivrutiner måste ignorera D3DDMAPSAMPLER i SetTextureStageState om de inte hanterar förskjutningskartor.
- D3DTEXF_ANISOTROPIC filterläge stöds inte.
- När D3DSAMP_MIPFILTER i förskjutningskartan inte är D3DTEXF_NONE beräknas detaljnivån enligt följande (Observera att det anpassningsbara tessellationstillståndet används även om D3DRS_ENABLEADAPTIVETESSELLATION är FALSE): Tmax = återgivningstillstånd D3DRS_MAXTESSELLATIONLEVEL
- Beräkna tessellationsnivå Te för en vertex Vi: (Xi, Yi, Zi) på samma sätt som beskrivs i avsnittet "Anpassad tessellation". Detaljnivå L = log2(Tmax) – log2 (Te).
- Strukturfiltrerings- och samplingsåtgärder följer samma regler som pixelpipelinen (detaljnivå(LOD) tillämpas osv.).
- Alla format kan inte användas som förskjutningskartor utan endast de som stöder D3DUSAGE_DMAP. Programmet kan fråga om detta med CheckDeviceFormat CheckDeviceFormat.
- D3DUSAGE_DMAP måste anges i CreateTexture för att meddela drivrutinen att den här strukturen ska användas som förskjutningskarta.
- D3DUSAGE_DMAP kan endast användas med texturer. Den kan inte användas med kubkartor eller volymer.
- Strukturer och återgivningsmål som skapats med D3DUSAGE_DMAP kan ställas in i regelbundna urvalssteg och som återgivningsmål.
- Renderingtillstånden för att ange wrap-läget för texturkoordinaterna ignoreras vid förskjutningsmappning. Generellt sett finns det inga wrap-lägen för tessellatormotorn.
- En förskjutningskarta har ett beteende som är identiskt med bildpunktsexemplets. Om en textur med mindre än fyra kanaler (som R32f) söks upp går uppslagsvärdena till lämpliga kanaler i målregistret (hörnskuggningsindataregistret taggat med _sample semantik), medan de andra kanalerna är standard (1, 1, 1). När D3DFMT_L8 hämtas, mappas det till R-, G-, och B-kanalerna och A får standardvärdet 1. Referens rastreringsverktyget innehåller fullständig implementeringsinformation.
Förprovtagna förskjutningskartor
- Nytt exempeltillstånd introduceras: D3DSAMP_DMAPOFFSET (DWORD) – förskjutning (i hörn) i en förexempelbaserad förskjutningskarta.
- Ny deklarationsmetod introduceras: D3DDECLMETHOD_LOOKUPPRESAMPLED.
- Anpassningsbar tessellation bör inaktiveras.
- Inställningar för strukturfilter ignoreras. Punktsampling görs. Texturfiltret för mip antas vara D3DTEXF_NONE. Alla andra texturfilterlägen antas vara D3DTEXF_POINT.
- Strukturkoordinater beräknas som: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) där Index är ett sekventiellt index över genererade hörn plus TSS[D3DSAMP_DMAPOFFSET]. Sekventiellt index är inställt på noll i början av varje primitiv och ökas efter att ett hörn har genererats.
Det här är de API-ändringar som stöder förskjutningsmappning.
- Ett format med en kanal har lagts till, D3DFMT_L16.
- En ny användningsflagga, D3DUSAGE_DMAP.
- Ett speciellt struktursteg, som används för att ange en förskjutningskartas struktur, D3DDMAPSAMPLER.
- Nya maskinvarutak har lagts till, D3DDEVCAPS2_DMAPNPATCH och D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Se D3DDEVCAPS2.
Relaterade ämnen