我正在编写一些代码来使用 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() 函数,并且出现同样的问题。任何想法可能导致这种奇怪的缩放?