2013-01-11 5 views
8

몇 시간 동안 이미 해결하려고하는 Direct3D11 응용 프로그램에 이상한 문제가 있습니다.크래시를 일으키는 행렬

m_ViewMatrix = XMMatrixLookAtLH(vecPosition, vecLookAt, vecUp); 

는 어떻게 든이 응용 프로그램의 충돌 (스위치가 올바른 것으로 응답하지) 원인 : 그것은 그 라인에 도달 할 때까지

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); 
} 

모두의 미세 : 문제는 그 방법이다. 실제 통화처럼 어떻게 여기

그리고이 : 그 문제가되지 않습니다 그래서 사전에

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); 

, 버텍스 및 픽셀 쉐이더는 잘 컴파일합니다. 아마도 xnamath (나는 완전히 새로운 것)로 뭔가 잘못하고있는 것이지만 지구상에 무엇이있을 수 있는지 전혀 알지 못합니다. 미리 감사드립니다. 필요한 경우 더 많은 정보를 제공 할 것입니다.

편집 @ 1 : 수십 가지 변경 사항을 통해 나는 프로젝션과 월드 매트릭스를 작동시킬 수있었습니다. View Matrix를 설정할 수는 없지만. 코드를 변경하여 실제 코드와 일치하고 중요하지 않은 코드를 제거했습니다.

편집 2 @ : 마지막 순간에서 뉴스 속보 :이 난 지역 변수에 결과를 저장하기로 결정하기 때문에, XMMatrixLookAtLH 기능에 문제가되지 않습니다 그것은 작동하지만이 클래스에 결과 행렬을 지정하려면 회원이되면 충돌이 발생합니다. 그것은 가장 흥미로운 부분입니다.

+0

메소드 디버깅을 시도하고 m_ViewMAtrix 포인터의 값을 확인하십시오. –

+0

그래,이 똑같은 오류가 발생했습니다. 이 코드는 XMMatrixLookAtLH 또는 XNA 함수를 계산하려고 할 때 신비하게 충돌합니다. – Caesar

+1

몇 가지 시도를 한 후에 마침내 64x 빌드로 내 모드를 설정하여 작업을 마쳤습니다.아직도 그것이 일어나는 이유에 대한 대답을 찾고 있습니다. – Caesar

답변

5

이 문제를 해결하는 데 많은 시간을 보낸 후 마침내 해결했다고 생각합니다.

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); 
} 
+0

방금 ​​전에 본 질문이 있습니다. 이전에도 같은 문제가 있었지만이 역시 답변이었습니다. 그리고 사실 이것은 마이크로 소프트가 어쨌든 추천하는 것입니다. – jcoder

+0

@jcoder 나는 그들이 그것을 더 분명하게하기를 바란다. – Caesar

+0

참고로 http://msdn.microsoft.com/en-gb/library/windows/desktop/ee418725(v=vs.85).aspx (이것은 이전 xnamath보다는 directxmath가 있지만 많이 동일합니다) – jcoder

3

: m_ViewMatrix = XMMatrixLookAtLH (...

와 나는 가정 것이다 빌드가 86보다 함께 더 나은 64에서 limps 여기

은 간단한 예입니다 m_ViewMatrix 또는 심지어 그 컨테이너 인 m_Camera는 다른 것으로 공유되는 메모리 공간에 매핑됩니다. 메모리 클로버잉. 문제를 숨기기 위해 메모리를 이동 한 이후로 64 비트로의 이동이 다른 방향으로 표시됩니다.

m_Camera 필드를 어떻게 할당합니까? 모든 것을위한 주요 컨테이너는 무엇입니까?

전체 CameraClass 헤더와 할당 할 위치를 게시하십시오. 또한 필드 주변의 일부 배열에 뿌려서 도움이되는지 확인하십시오. 그것은 또한 메모리 clobbering을 나타냅니다.

+0

내가 원래의 포스터가 아니기 때문에 나는 그 포스트를 편집 할 수없는 것 같다. 하지만 내 코드를 살펴보고 버전을 검토하거나 github https://github.com/mmajeed-Fanshawe/XNAError – Caesar

+0

에서이 문제를 확인하려면이 문제가 발생하는 프로세서와 OS는 무엇입니까? – GMasucci

+2

@GMasucci Windows 7, 내 대답을 읽어 주셔서 감사합니다. – Caesar