紋理座標轉換 (Direct3D 9)
Direct3D 裝置可以套用 4x4 矩陣來轉換頂點的紋理座標。 系統會以與幾何相同的方式,將轉換套用至紋理座標。 任何轉換(縮放、旋轉、轉譯、投影、剪力或這些組合)都可以使用 4x4 矩陣來完成。
注意
Direct3D 不會修改已轉換和點亮的頂點。 因此,使用已轉換和點亮頂點的應用程式無法使用 Direct3D 來轉換頂點的紋理座標。
支援硬體加速轉換和照明作業的裝置(T&L HAL 裝置)也會加速紋理座標的轉換。 當無法使用轉換的硬體加速時,Direct3D 幾何管線中的平臺特定優化會套用至紋理座標轉換。
紋理座標轉換有助於產生特殊效果,同時避免需要直接修改幾何的紋理座標。 您可以使用簡單的翻譯或旋轉矩陣,以動畫顯示物件上的紋理,也可以轉換 Direct3D 自動產生的紋理座標,以簡化和加速進階效果,例如投影紋理和動態光線對應。 此外,您可以使用紋理座標轉換,在多個紋理階段中,重複使用單一紋理座標集以供多個用途使用。
設定和擷取紋理座標轉換
就像應用程式用於幾何的矩陣一樣,您可以呼叫 IDirect3DDevice9::SetTransform 和 IDirect3DDevice9::GetTransform 方法來設定和擷取紋理座標轉換。 這些方法會透過D3DTRANSFORMSTATETYPE列舉類型的D3DTS_TEXTURE7成員來接受D3DTS_TEXTURE0,以分別識別紋理階段 0 到 7 的轉換矩陣。
下列程式代碼會設定要套用至紋理階段 0 紋理座標的矩陣。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
D3DMATRIX matTrans = D3DXMatrixIdentity( NULL );
// Set up the matrix for the desired transformation.
d3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );
啟用紋理座標轉換
D3DTSS_TEXTURETRANSFORMFLAGS紋理階段狀態可控制紋理座標轉換的應用。 這個紋理階段狀態的值是由 D3DTEXTURETRANSFORMFLAGS 列舉型別所定義。
當D3DTSS_TEXTURETRANSFORMFLAGS設定為 D3DTTFF_DISABLE 時,會停用紋理座標轉換(預設值)。 假設階段 0 已啟用紋理座標轉換,下列程式代碼會停用它們。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_DISABLE );
D3DTEXTURETRANSFORMFLAGS中定義的其他值可用來啟用紋理座標轉換,以及控制有多少產生的紋理座標元素傳遞至轉譯器。 例如,採用下列程序代碼。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
D3DTTFF_COUNT2值會指示系統套用紋理階段 0 的轉換矩陣集,然後將修改過的紋理座標的前兩個元素傳遞至轉譯器。
D3DTTFF_PROJECTED紋理轉換旗標會指出投影紋理的座標。 指定此旗標時,轉譯器會將傳入的專案除以最後一個專案。 例如,採用下列程序代碼。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT3 | D3DTTFF_PROJECTED );
本範例會通知系統將三個紋理座標元素傳遞至轉譯器。 轉譯器會將前兩個元素除以第三個元素,產生處理紋理所需的 2D 紋理座標。
相關主題