紋理坐標(biāo)變換

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

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

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

下面的代碼將原來(lái)的紋理坐標(biāo)平移(1.0, 1.0, 0)個(gè)單位。

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

示例程序通過(guò)下列代碼對(duì)自動(dòng)生成的紋理坐標(biāo)進(jìn)行變換:

// 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);


要看效果和完整代碼
去下面這個(gè)主頁(yè)

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


注:紋理矩陣很好很強(qiáng)大。可以做簡(jiǎn)單的水,天空盒背景等效果。
更為嚴(yán)重的是,還能做出流光效果,就像《蜀門》上的衣服效果。。