紋理坐標變換

Direct3D提供了對生成的紋理坐標進行坐標變換的功能,與頂點坐標變換相類似,可以指定一個4x4的紋理坐標變換矩陣,把它與生成的紋理坐標相乘,然后將變換之后的紋理坐標輸出至Direct3D渲染流水線。使用紋理坐標變換可以對紋理坐標進行諸如平移、旋轉和縮放等三維變換。紋理坐標變換對于生成一些特殊效果是非常有用的,它不用直接修改頂點的紋理坐標。例如可以通過一個簡單的平移矩陣對紋理坐標進行變換,從而使物體表面上的紋理不斷變換位置,產生動畫效果。紋理坐標自動生成在三維圖形程序中最廣泛的應用是環境映射。

可通過函數IDirect3DDevice9::SetTransform()來設置4x4的紋理坐標變換矩陣,它以D3DTS_TEXTURE0~ D3DTS_TEXTURE7作為第一個參數,表示設置紋理層0~7的紋理矩陣。下列代碼對紋理層0設置了一個將紋理坐標u、v縮小到原來一半的紋理矩陣:

D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
mat._11 = 0.5f;
mat._22 = 0.5f;
pd3dDevice->SetTransform(D3DTS_TEXTURE0, &mat);

下面的代碼將原來的紋理坐標平移(1.0, 1.0, 0)個單位。

D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
mat._41 = 1.0f;
mat._42 = 1.0f;
mat._43 = 0.0f;
pd3dDevice->SetTransform(D3DTS_TEXTURE0, &mat);

示例程序通過下列代碼對自動生成的紋理坐標進行變換:

// texture coordinate transform

D3DXMATRIX mat_texture, mat_scale, mat_trans;

D3DXMatrixIdentity(&mat_texture);
D3DXMatrixScaling(&mat_scale, 0.5f, -0.5f, 1.0f);
D3DXMatrixTranslation(&mat_trans, 0.5f, 0.5f, 1.0f);

mat_texture = mat_texture * mat_scale * mat_trans;
pd3dDevice->SetTransform(D3DTS_TEXTURE0, &mat_texture);


要看效果和完整代碼
去下面這個主頁

http://www.cnblogs.com/billwillman/articles/1232081.html


注:紋理矩陣很好很強大??梢宰龊唵蔚乃?,天空盒背景等效果。
更為嚴重的是,還能做出流光效果,就像《蜀門》上的衣服效果。。