1

我正在编写一些代码来使用 DirectX 9 中的一个大顶点缓冲区作为纹理四边形来呈现精灵列表。当在正交视图中旋转和渲染时,这些带纹理的四边形会被拉伸,我遇到了问题。奇怪的是,当旋转 0 或 PI 弧度时,不会发生拉伸,而当旋转 1/2 PI 或 1 1/2 PI 弧度时,拉伸程度最高。

在此处输入图像描述

这似乎是合理的,这取决于视图或投影矩阵,或者是生成旋转矩阵时的问题,但是经过大量调整和测试后我无法找到任何解决方案。作为参考,使用的纹理为 32x32 像素。

这是我最初用来为所有精灵设置投影和视图矩阵的代码:

D3DXMATRIX projection;
D3DXMatrixOrthoOffCenterLH(&projection, -(float)ScreenWidth / 2.0f,
                                         (float)ScreenWidth / 2.0f,
                                         (float)ScreenHeight / 2.0f,
                                        -(float)ScreenHeight / 2.0f,
                                         1.0f, 1000.0f);

HR(mFX->SetMatrix(mProjectionHandle, &projection));

D3DXMATRIX view;
D3DXVECTOR3 pos(0.0f, 0.0f, -100.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXMatrixLookAtLH(&view, &pos, &target, &up);

HR(mFX->SetMatrix(mViewHandle, &view));

以及创建旋转矩阵的代码:

D3DXMatrixRotationZ(&_rotation,
                    (2.0f * D3DX_PI) - _spriteComponent.GetRotation());

最后是着色器代码:

outVS.col.a = gAlpha;

outVS.posH = mul(float4(posL, 1.0f), gWorld);
outVS.posH = mul(outVS.posH, gView);
outVS.posH = mul(outVS.posH, gProjection);
outVS.posH = mul(outVS.posH, gScaling);
outVS.posH = mul(outVS.posH, gRotation);
outVS.posH = mul(outVS.posH, gTranslation);

outVS.tex0 = tex0;

return outVS;

在设置投影矩阵时,我也尝试使用 D3DXMatrixOrthoLH() 函数,并且出现同样的问题。任何想法可能导致这种奇怪的缩放?

4

0 回答 0