8

Direct3D11 アプリケーションに奇妙な問題があり、既に数時間解決しようとしています。問題はその方法です:

void CameraClass::Render()
{
    XMFLOAT3 sUp, sLookAt, sRotationInRadians;

    sUp.x = 0.0f;
    sUp.y = 1.0f;
    sUp.z = 0.0f;

    sLookAt.x = 0.0f;
    sLookAt.y = 0.0f;
    sLookAt.z = 1.0f;

    sRotationInRadians.x = m_Rotation.x * 0.0174532925f;
    sRotationInRadians.y = m_Rotation.y * 0.0174532925f;
    sRotationInRadians.z = m_Rotation.z * 0.0174532925f;

    XMVECTOR vecLookAt = XMVectorSet( sLookAt.x, sLookAt.y, sLookAt.z, 0.0f );
    XMVECTOR vecUp = XMVectorSet( sUp.x, sUp.y, sUp.z, 0.0f );
    XMVECTOR vecPosition = XMVectorSet( m_Position.x , m_Position.y, m_Position.z, 0.0f );

    XMMATRIX RotationMatrix( XMMatrixRotationRollPitchYaw( sRotationInRadians.x, sRotationInRadians.y, sRotationInRadians.z ));

    vecLookAt = XMVector3TransformCoord( vecLookAt, RotationMatrix );
    vecUp = XMVector3TransformCoord( vecUp, RotationMatrix );

    vecLookAt += vecPosition;   

    m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );
}

その行に到達するまで、すべて問題ありません。

m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );

どういうわけか、それはアプリケーションのクラッシュを引き起こします (正しいと応答しないように切り替えます)。

実際の呼び出しは次のようになります。

XMMATRIX ViewMatrix;
XMMATRIX ProjectionMatrix;
XMMATRIX WorldMatrix;

m_D3D->BeginScene( 0.0f, 0.0f, 0.0f, 1.0f );

m_Camera->Render();

m_D3D->GetWorldMatrix( WorldMatrix );
m_D3D->GetProjectionMatrix( ProjectionMatrix );

事前に、Vertex シェーダーと Pixel シェーダーは正常にコンパイルされるため、問題はありません。ほとんどの場合、私は xnamath で何か間違ったことをしています (私はまったく新しいものです) が、地球上で何ができるのかわかりません。前もって感謝します。必要に応じて、さらに情報を提供します。

編集@1: 数十回の変更により、Projection および World マトリックスを機能させることができました。私はまだビューマトリックスを設定できませんが。コードを変更したので、実際のものと一致し、重要でないものを取り除きました。

編集@2: 直前の速報: XMMatrixLookAtLH 関数に問題はありません。結果をローカル変数に保存することにしたため、機能しますが、結果マトリックスをクラス メンバーに割り当てたい場合は、クラッシュが発生します。 . それは確かに興味深いです。

4

2 に答える 2

4

この問題を解決するために何時間も費やした後、私は最終的にそれを解決したと信じています.

XMMATRIX は 16 バイトの整列された行列を表し、XMMATRIX の整列されていない割り当てにより、値をコピーしようとするとこのエラーが発生します。これにより、常に発生するとは限らない理由と、異なるモードで動作する理由が説明されます。

この問題に対して私が見つけた最善の解決策は、XMFLOAT4X4 を使用して値を格納することです。

簡単な例を次に示します。

#include <windows.h>
#include <xnamath.h>

class Camera
{
protected:
    XMFLOAT4X4  view_;
public:
    XMFLOAT4X4  const& Update()
    {
        XMStoreFloat4x4(&this->view_ , XMMatrixIdentity());
        return this->view_;
    }
};

int main()
{
    Camera* cam = new Camera;
    XMFLOAT4X4 const& mat = cam->Update();
    XMMATRIX x = XMLoadFloat4x4(&mat);
}
于 2013-02-11T07:38:43.393 に答える
2

割り当て時にクラッシュが発生するため: m_ViewMatrix = XMMatrixLookAtLH(...

ビルドは x86 よりも x64 の方がうまくいきます。m_ViewMatrix またはそのコンテナーである m_Camera は、他の何かと共有されているメモリ空間にマップされていると思います。メモリクローバー。64 ビットへの移行は、問題を隠すためにメモリを移動した可能性があるため、これに対するもう 1 つの指標です。

m_Camera フィールドをどのように割り当てていますか? すべてのメインコンテナは何ですか?

完全な CameraClass ヘッダーと、それを割り当てている場所を投稿します。また、フィールドの周りにいくつかの配列をまき散らしてみて、それが役立つかどうかを確認してください. これは、メモリの破壊も示しています。

于 2013-02-12T03:42:32.633 に答える