Mapping spostamento (Direct3D 9)

Le mappe di spostamento sono simili alle mappe delle trame, ma sono accessibili dal motore dei vertici.

Diagramma a blocchi

Una fase di campionamento aggiuntiva è presente nella parte iniziale della pipe dei vertici, come illustrato nel diagramma seguente, che può campionare una mappa di spostamento per fornire dati sullo spostamento dei vertici.

diagramma della fase del campionatore nella pipe dei vertici

Lo stato del campionatore della mappa di spostamento può essere impostato da SetSamplerState usando il numero di fase 256, ovvero un nuovo numero di fase. La trama della mappa di spostamento è impostata da SetTexture.

La mappa può essere prevendita o meno, il che significa che può essere ordinato in modo da consentire la ricerca dei valori di spostamento senza filtrare.

  • Le mappe di spostamento sono analoghe alle mappe delle trame, ma sono accessibili dal motore dei vertici.
  • Una fase aggiuntiva del campionatore è presente nella parte iniziale della pipe dei vertici che può campionarne una mappa di spostamento. Questa fase è accessibile dall'API SetSamplerState consueta, ma il numero di fase è D3DDMAPSAMPLER = 256.
  • Lo stato del campionatore della mappa di spostamento può essere impostato da SetSamplerState(D3DDMAPSAMPLER, ...) API.
  • La trama della mappa di spostamento viene impostata dall'API SetTexture(D3DDMAPSAMPLER, texture).
  • La mappa può essere pre-campionata o meno. Ciò significa che può essere ordinato in un modo particolare che consente la ricerca dei valori di spostamento senza filtrare.
  • Le modifiche nella struttura di dichiarazione consentono la specifica della coordinata della trama usata per cercare la mappa delle trame. Ad esempio, Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Questo indica al tassellatore di usare il vettore float 2D in stream0 in corrispondenza di un determinato offset come coordinata della trama per cercare la mappa di spostamento e associare la semantica di utilizzo Displacement_value. La dichiarazione del vertex shader contiene una riga simile a {dcl_texture0, v0} che indica che la semantica texture0 deve essere associata al registro di input v0. Il valore di spostamento cercato viene copiato nel registro di input v0.
  • Esiste un tipo speciale di mapping di spostamento, quando la mappa della trama viene pre-campionata. L'indice sequenziale dei vertici generati viene usato come coordinata di trama per una mappa delle trame. Ad esempio, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex.
  • L'output della ricerca è 4 float.
  • Il mapping di spostamento è supportato solo con le patch N.
  • I driver devono ignorare D3DDMAPSAMPLER in SetTextureStageState se non gestiscono le mappe di spostamento.
  • D3DTEXF_ANISOTROPIC modalità filtro non è supportata.
  • Quando D3DSAMP_MIPFILTER nel campionatore di mappa di spostamento non è D3DTEXF_NONE, il livello di dettaglio viene calcolato come segue (Si noti che lo stato a mosaico adattivo viene usato anche se la D3DRS_ENABLEADAPTIVETESSELLATION è FALSE): Tmax = stato di rendering D3DRS_MAXTESSELLATIONLEVEL
  • Livello di tassellatura di calcolo Te per un vertice Vi: (Xi, Yi, Zi) allo stesso modo descritto nella sezione "Tassellatura adattiva". Livello di dettaglio L = log2(Tmax) - log2 (Te).
  • Le operazioni di filtro e campionamento delle trame seguono le stesse regole della pipeline in pixel (viene applicata la distorsione del livello di dettaglio( LOD) e così via.
  • Non tutti i formati possono essere utilizzati come mappe di spostamento, ma solo quelle che supportano il D3DUSAGE_DMAP. L'applicazione può eseguire una query con CheckDeviceFormat CheckDeviceFormat.
  • D3DUSAGE_DMAP deve essere specificato in CreateTexture per notificare al driver che questa trama deve essere usata come mappa di spostamento.
  • D3DUSAGE_DMAP possono essere usati solo con trame. Non può essere usato con mappe o volumi del cubo.
  • Le trame e le destinazioni di rendering create con D3DUSAGE_DMAP possono essere impostate in fasi regolari del campionatore e come destinazioni di rendering.
  • Gli stati di rendering per impostare la modalità di wrapping per le coordinate della trama vengono ignorati nel mapping di spostamento. In generale, non sono disponibili modalità di ritorno a capo per il motore a mosaico.
  • Un campionatore di mappa di spostamento ha un comportamento identico a quello dei campioni di trama pixel. Se viene cercata una trama con meno di quattro canali (ad esempio R32f), i valori cercati passano ai canali appropriati del registro di destinazione (il registro di input del vertex shader contrassegnato con la semantica _sample), mentre gli altri canali vengono usati per impostazione predefinita (1, 1, 1). Quando viene cercata, D3DFMT_L8 viene trasmessa nei canali R, G, B e A per impostazione predefinita è 1. Il rasterizzatore di riferimento include i dettagli completi dell'implementazione.

Mapping di spostamento pre-campionato

  • Viene introdotto un nuovo stato del campionatore: D3DSAMP_DMAPOFFSET (DWORD) - offset (in vertici) in una mappa di spostamento pre-campionata.
  • È stato introdotto un nuovo metodo di dichiarazione: D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • La tassellatura adattiva deve essere disabilitata.
  • Le impostazioni del filtro trama vengono ignorate. Il campionamento dei punti viene eseguito. Si presuppone che il filtro di trama mip sia D3DTEXF_NONE. Si presuppone che tutte le altre modalità di filtro trama siano D3DTEXF_POINT.
  • Le coordinate delle trame vengono calcolate come: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) dove Index è un indice sequenziale di vertici generati più TSS[D3DSAMP_DMAPOFFSET]. L'indice sequenziale è impostato su zero all'inizio di ogni primitiva e viene aumentato dopo la generazione di un vertice.

Si tratta delle modifiche api che supportano il mapping di spostamento.

  • È stato aggiunto un formato a canale singolo, D3DFMT_L16.
  • Un nuovo flag di utilizzo D3DUSAGE_DMAP.
  • Una fase di trama speciale, usata per impostare una trama della mappa di spostamento, D3DDMAPSAMPLER.
  • Sono stati aggiunti nuovi limiti hardware, D3DDEVCAPS2_DMAPNPATCH e D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Vedere D3DDEVCAPS2.

Pipeline dei vertici