2015-01-07 13 views
0

튜토리얼 http://3dgep.com/introduction-to-directx-11을 만들었습니다.DirectXMath로 행렬 곱하기

튜토리얼 3 행렬 (투영, 뷰 및 월드 행렬)이 버텍스 셰이더로 전송되어 거기에서 곱해진다.

3 개의 행렬을 곱해서 버텍스 셰이더에 보내야하는 행렬 하나만 얻고 싶습니다.

XMMatrixMultiply() 함수를 사용하여이를 곱하려고 시도 할 때 액세스 위반 오류가 발생합니다.

XMMatrix wvp=XMMatrixMultiply(g_ProjectionMatrix,XMMatrixMultiply(g_worldmatrix,g_viewmatrix)); 

답변

0

변수와의 메모리 정렬을 제대로 고려하지 않았기 때문에 AV가 들릴 가능성이 큽니다. DirectXMath (일명 XNAMath)에는 두 개의 'SIMD'유형 XMVECTORXMMATRIX이 있으며 항상 16 바이트로 정렬되어야합니다. 전역 변수, 정적 변수 또는 스택에 할당 된 경우 제대로 정렬됩니다. x64 기본 응용 프로그램에서만 힙 할당 메모리 (new 또는 malloc)에 올바르게 정렬됩니다. 32 비트 (x86) 또는 ARM에서는 기본적으로 지원되지 않습니다. 이와 같이 DirectXMath는 정렬을 염려하지 않고도 (즉, XMFLOAT4X4XMLoadFloat4x4/XMStoreFloat4x4 함수) 데이터 저장소 유형 및로드/저장 함수 모음을 제공하여 정렬을 처리합니다. 이 내용은 MSDN의 Programmer 's Guide에서 다룰 수 있습니다. 이 조금 장황하지만, 더 직접적으로 매핑 ...

XMMATRIX proj = XMLoadFloat4x4(&g_ProjectionMatrix); 
XMMATRIX world = XMLoadFloat4x4(&g_worldMatrix); 
XMMATRIX view = XMLoadFloat4x4(&g_viewMatrix); 
XMMATRIX wvp = XMMatrixMultiply(proj, XMMatrixMultiply(world, view)); 

XMFLOAT4X4 g_ProjectionMatrix; 
XMFLOAT4X4 g_worldMatrix; 
XMFLOAT4X4 g_viewMatrix; 

:

그래서 그 대신 데이터 저장 변수로 XMMATRIX를 사용하여, 당신은 뭔가를 할 것 실제로 하드웨어가 수행하는 작업에 이르기까지로드/저장 오버 헤드를 피할 수있는 기회를 찾고 SIMD 레지스터에 오래 유지 될 가능성이있는 데이터로 작업 할 수 있습니다.

이 튜토리얼에서와 같이 당신의 g_ProjectionMatrix, g_worldmatrixg_viewmatrix 변수가 진정으로 전역하고 AV 타격하는 경우, 말했다 모든

은 또한 컴파일러의 버그가 타격 수 있습니다. 어떤 버전의 VS를 사용하고 있습니까? VS 2008 및 VS 2010은 약간 버그가 있습니다. intrinsics에. VS 2010 서비스 팩 1은 VS 2010 RTM보다 약간 낫습니다. VS 2012 및 VS 2013이 훨씬 좋습니다. VS 2012 또는 VS 2013에 대한 최신 업데이트를 사용하고 있는지 확인하십시오. VS 2013 Pro +에 대한 예산이없는 경우 VS 2013 커뮤니티 (VS 업데이트 4)로 이동하는 것이 좋습니다. 여기에 또 다른 옵션은 Matrix 같은 유형, Vector2, Vector3, Vector4와 더 많은 용서 '순진'수학의 코드를 작성하기 위해 일부 C++ '마법'을 사용하는 DirectX Tool KitSimpleMath 래퍼을 활용하는 것입니다

주, 등

#include "SimpleMath.h" 
using namespace DirectX::SimpleMath; 

Matrix g_ProjectionMatrix; 
Matrix g_worldMatrix; 
Matrix g_viewMatrix; 

...

Matrix wvp = proj * world * view; 
+0

는 훌륭한 답변을 주셔서 감사합니다. 나는 내일 그것을 시험 할 것이다. 나는 win7에 VS 2012 궁극의 마지막 업데이트를 사용합니다. – CrazySocke