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

发布于 2024-10-18 12:48:36 字数 163 浏览 0 评论 0原文

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

d3dDevice->SetTransform( D3DTS_TEXTURE0, &matrix );

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

I know there is a function in D3D that transforms the texture coordinate:

d3dDevice->SetTransform( D3DTS_TEXTURE0, &matrix );

The problem is how I could get the matrix. For example, I now have texture offset, scale, rotation, and brightness. How should I set that matrix?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呆萌少年 2024-10-25 12:48:36

转换。该页面上有指向 D3DX 实用程序库方法的链接。

Transforms. There are links to the D3DX Utility Library methods on that page.

不羁少年 2024-10-25 12:48:36

让我们假设您在宽度 (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);

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

Let us consider you have collection of images of same width(txTxWidth) and height(txTxHight) in a texture atlas of width (txFullWidth) and height(txFullHeight).

step 1: Build a 4x4 scale matrix of size equal to an image cell in a texture atlas.

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

step 2: Build a 4x4 translation matrix using the (x,y) offset and the image cell width and height

   D3DXMATRIX matTrans;
   matTrans._13 = x / txFullWidth; // X origin
   matTrans._23 = y / txFullHeight; // Y origin
   matTrans._31 = txTxWidth / txFullWidth;  // Width;   
   matTrans._32 = txTxHeight / txFullHeight; // Height

step: 4: Don't forgot to transpose the translation matrix

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

step 3: Build a 4x4 rotation matrix according to your requirement.

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

step 4: Multiplication

 matix = matScale * matRot * trpos_matTrans ; // SRT

step 5: Set the Texture Transform

device->SetTransform(D3DTS_TEXTURE0, &matrix);

step 6: Set the Texture Stage 0

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

Hope this will solve your propblem. Enjoy !!!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文