共用方式為


位移貼圖 (Direct3D 9)

位移對應類似於紋理地圖,但由頂點引擎存取。

方框圖

頂點管道的早期有額外的取樣器階段,如下圖所示,可以取樣位移圖以提供頂點位移數據。

頂點管道中取樣器階段的圖表

位移圖取樣器狀態可由 SetSamplerState 使用階段編號 256 來設定,這是新的階段數。 位移地圖紋理是由 SetTexture設定。

地圖可以預先取樣,也可以不取樣,這表示它可以以某種方式排序,以便在不需要篩選的情況下查找位移值。

  • 位移地圖類似於紋理地圖,但由頂點引擎存取。
  • 頂點管線的前段有一個額外的取樣階段,可以取樣位移圖。 此階段是由一般 SetSamplerState API 存取,但階段編號D3DDMAPSAMPLER = 256。
  • 位移地圖取樣器狀態可由 SetSamplerState 設定(D3DDMAPSAMPLER...)應用程式介面。
  • 位移地圖紋理是由 SetTexture(D3DDMAPSAMPLER,紋理) API 所設定。
  • 地圖可以預先取樣或者不預取樣。 這表示它可以以特定方式排序,以便查閱位移值而不篩選。
  • 宣告結構中的變更允許指定用來查閱紋理貼圖的紋理座標。 例如,Stream0、Offset、FLOAT2、LOOKUP、Displacement_value。 這會告訴鑲嵌器在 stream0 中,在特定的偏移處使用 2D 浮點數向量作為紋理坐標,以查詢位移貼圖,並將 Displacement_value 的使用語意與它關聯。 頂點著色器宣告會包含類似 {dcl_texture0 v0} 的行,指出 texture0 語意與 v0 輸入緩存器相關聯。 查閱的位移值會複製到輸入緩存器 v0。
  • 有一種特殊的位移映射類型,是在紋理貼圖預先取樣時使用的。 產生的頂點循序索引會當做紋理地圖的紋理座標使用。 例如,0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED,Usage,UsageIndex。
  • 查詢的輸出為 4 個浮點數。
  • 只有 N-面片支援位移對應。
  • 如果驅動程式沒有支援位移對應,在 SetTextureStageState 中應忽略 D3DDMAPSAMPLER。
  • 不支援D3DTEXF_ANISOTROPIC篩選模式。
  • 當位移圖取樣器中的 D3DSAMP_MIPFILTER 不是 D3DTEXF_NONE 時,詳細層級的計算方式如下(請注意,即使 D3DRS_ENABLEADAPTIVETESSELLATION 是 FALSE,仍然會使用自適應細分狀態):Tmax = 渲染狀態 D3DRS_MAXTESSELLATIONLEVEL
  • 計算頂點 Vi 的鑲嵌層級 Te:(Xi, Yi, Zi)的方式與「調適型鑲嵌」一節中所述的方法相同。 詳細數據層級 L = log2(Tmax) - log2 (Te)。
  • 紋理篩選和取樣作業遵循與像素管線相同的規則(應用細節層次(LOD)偏差等)。
  • 並非所有格式都可以用來做為位移對應,但只能使用支援D3DUSAGE_DMAP的格式。 應用程式可以使用 CheckDeviceFormat CheckDeviceFormat進行查詢。
  • D3DUSAGE_DMAP必須在 createTexture中指定,以通知驅動程式此紋理要當做位移圖使用。
  • D3DUSAGE_DMAP只能與紋理搭配使用。 它不能與立方體貼圖或體積搭配使用。
  • 使用 D3DUSAGE_DMAP 建立的紋理和渲染目標可以在一般取樣器階段和作為渲染目標設定。
  • 在位移對應中,設定紋理座標包裹模式的渲染狀態會被忽略。 一般而言,鑲嵌式引擎沒有包裝模式。
  • 位移地圖取樣器的行為與像素紋理取樣器的行為相同。 如果查詢具有少於四個通道的紋理(例如 R32f),則查詢的值會移至目標暫存器的適當通道(標記為_sample語句的頂點著色器輸入暫存器),而其他通道預設為(1,1,1)。 查閱時,D3DFMT_L8被複製到 R、G、B 通道,且 A 通道預設為 1。 參考光柵化器具有完整的實作細節。

預取樣位移映射

  • 引進了新的取樣器狀態:D3DSAMP_DMAPOFFSET (DWORD) - 預先取樣位移圖中的位移(頂點)。
  • 引進了新的宣告方法:D3DDECLMETHOD_LOOKUPPRESAMPLED。
  • 應停用自適應鑲嵌。
  • 會忽略紋理篩選設定。 點取樣已完成。 假設 mip 紋理篩選條件為「D3DTEXF_NONE」。 所有其他紋理篩選模式都假設為D3DTEXF_POINT。
  • 紋理座標的計算方式為:U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles),其中 Index 是產生頂點的循序索引加上 TSS[D3DSAMP_DMAPOFFSET]。 循序索引會在每個基本類型的開頭設定為零,並在產生頂點之後增加。

這些是關於位移映射的 API 變更。

  • 已新增單一通道格式,D3DFMT_L16。
  • 新的使用旗標,D3DUSAGE_DMAP。
  • 特殊的紋理階段,用來設定位移地圖紋理,D3DDMAPSAMPLER。
  • 現已新增硬體能力上限:D3DDEVCAPS2_DMAPNPATCH 和 D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH。 請參閱 D3DDEVCAPS2

頂點管線