如何在Direct3D中构建纹理坐标转换矩阵

时间:2011-02-20 13:52:53

标签: c++ d3dx

我知道D3D中有一个转换纹理坐标的函数:

d3dDevice->SetTransform( D3DTS_TEXTURE0, &matrix );

问题是如何获得矩阵。例如,我现在有纹理偏移,缩放,旋转和亮度。我该如何设置该矩阵?

2 个答案:

答案 0 :(得分:1)

Transforms。该页面上有D3DX Utility Library方法的链接。

答案 1 :(得分:0)

让我们考虑在宽度(txFullWidth)和高度(txFullHeight)的纹理图集中有相同宽度(txTxWidth)和高度(txTxHight)的图像集合。

步骤1:构建一个大小等于纹理图集中图像单元格的4x4比例矩阵。

D3DXMatrixScaling(&matScale, txTxWidth/txFullWidth, txTxHeight/txFullHeight, 1.0f);

步骤2:使用(x,y)偏移和图像单元宽度和高度构建4x4平移矩阵

   D3DXMATRIX matTrans;
   matTrans._13 = x / txFullWidth; // X origin
   matTrans._23 = y / txFullHeight; // Y origin
   matTrans._31 = txTxWidth / txFullWidth;  // Width;   
   matTrans._32 = txTxHeight / txFullHeight; // Height
步骤4:不要忘记转换翻译矩阵

   D3DXMATRIX trpos_matTrans;
   D3DXMatrixTranspose(&trpos_matTrans,&matTrans);

步骤3:根据您的要求构建一个4x4旋转矩阵。

 D3DXMatrixRotationX(&matRot, D3DXToRadian(0.0f));

第4步:乘法

 matix = matScale * matRot * trpos_matTrans ; // SRT

步骤5:设置纹理变换

device->SetTransform(D3DTS_TEXTURE0, &matrix);

步骤6:设置纹理阶段0

device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,   D3DTTFF_COUNT2);

希望这能解决你的问题。享受!!!