1

DirectX 9 の 1 つの大きな頂点バッファーをテクスチャ クワッドとして使用して、スプライトのリストをレンダリングするコードを作成しています。正投影ビューで回転およびレンダリングすると、これらのテクスチャ付きクワッドが引き伸ばされるという問題があります。奇妙なことは、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