共用方式為


紋理包裹(Direct3D 9)

簡言之,紋理包覆會使用為每個頂點指定的紋理座標,變更 Direct3D 光柵化紋理多邊形的基本方式。 在點陣化多邊形時,系統會在每個多邊形頂點的紋理座標之間插補,以判斷應該用於多邊形每個圖元的紋素。 一般而言,系統會將紋理視為 2D 平面,藉由從紋理內的 A 點到點 B 的最短路線來插補新的紋素。如果點 A 代表 u、v 位置(0.8、0.1),而點 B 位於 (0.1,0.1),則插補線看起來會像下圖所示。

兩個點之間的插補線圖

請注意,在此圖中,A 與 B 之間的最短距離大致會穿過紋理的中間。 啟用 u 紋理或 v 紋理座標包裝會變更 Direct3D 如何感知 u 方向和 v 方向紋理座標之間的最短路線。 根據定義,紋理環繞會導致光柵化器在紋理座標集之間採用最短的路線,假設0.0 和 1.0 是重合的。 最後一個位是棘手的部分:您可以想像,讓紋理包裝在一個方向會導致系統將紋理視為包裹在圓柱體周圍。 例如,請考慮下圖。

紋理和兩個環繞圓柱體的點的 圖

上圖顯示在 u 方向上進行環繞,會如何影響系統插值紋理座標的方式。 使用與一般或非環繞紋理範例相同的點,您可以看到 A 和 B 點之間的最短路線不再是跨越紋理當中,而是穿越0.0和1.0共同存在的邊界。 在 v 方向的環繞方式很類似,只是它會將紋理包覆在橫躺的圓柱體周圍。 U 方向和 V 方向的包裝比較複雜。 在此情況下,您可以將紋理想像成環圈或甜甜圈。

紋理包裝最常見的實用應用程式是執行環境對應。 通常,具有環境地圖紋理的物件看起來非常反射,顯示出場景中物件周圍環境的鏡像影像。 為了這個討論,圖片有四面牆的房間,每一個都塗有字母 R、G、B、Y 和對應的色彩:紅色、綠色、藍色和黃色。 這類簡單房間的環境對應看起來可能如下圖所示。

紅色、綠色、藍色和黃色的垂直條紋圖例

想像一下,房間的天花板被一個完全反射的四面柱子所支撐。 將環境地圖紋理對應至柱形圖很簡單;使柱子看起來好像它反映了字母和顏色並不容易。 下圖顯示柱子的線框,其中包含頂點附近所列適用的紋理座標。 包覆會越過紋理邊緣的接縫以虛線顯示。

矩形的 圖表,其中具有兩邊虛線

在U方向啟用包裝后,紋理柱形圖會適當地顯示環境地圖中的色彩和符號,而且,在紋理正面的接縫處,點陣化器會適當地選擇紋理座標之間的最短路線,假設 u 座標 0.0 和 1.0 共用相同的位置。 紋理柱形看起來像下圖。

由紅色、綠色、藍色和黃色象限組成的柱形圖例

如果未啟用紋理封裝,則光柵化器不會在產生可信的反射影像所需的方向上進行插補。 相反地,柱子前面的區域包含 u 座標 0.175 和 0.875 之間的像素橫向壓縮版本,因為它們通過材質的中心。 包裝效果被毀了。

使用紋理包裹

若要啟用紋理包裝,請呼叫 IDirect3DDevice9::SetRenderState 方法,如下列程式代碼範例所示。

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

IDirect3DDevice9::SetRenderState 接受的第一個參數是要設定的渲染狀態。 指定其中一個從D3DRS_WRAP0到D3DRS_WRAP7的列舉值,以設定要換行的紋理層級。 在第二個參數中指定D3DWRAPCOORD_0到D3DWRAPCOORD_3旗標,以啟用對應方向的紋理包裝,或將它們結合以啟用多個方向的包裝。 如果您省略某個旗標,則會關閉對應方向的材質包裹功能。 若要停用一組紋理座標的紋理纏繞,請將對應渲染狀態的值設定為 0。

請勿混淆紋理包裝與類似名稱的紋理尋址模式。 紋理包裹會在紋理尋址之前執行。 請確定紋理換行數據不包含 [0.0, 1.0] 範圍以外的任何紋理座標,因為這會產生未定義的結果。 如需紋理尋址的詳細資訊,請參閱 紋理尋址模式 (Direct3D 9)

位移圖換行

位移貼圖是由細分引擎插值。 因為無法為鑲嵌引擎指定換行模式,所以無法以位移對應執行紋理換行。 應用程式可以使用一組頂點,強制插值以任何方向環繞。 應用程式也可以指定將插補作為簡單的線性插補。

Direct3D 紋理