변수와의 메모리 정렬을 제대로 고려하지 않았기 때문에 AV가 들릴 가능성이 큽니다. DirectXMath (일명 XNAMath)에는 두 개의 'SIMD'유형 XMVECTOR
과 XMMATRIX
이 있으며 항상 16 바이트로 정렬되어야합니다. 전역 변수, 정적 변수 또는 스택에 할당 된 경우 제대로 정렬됩니다. x64 기본 응용 프로그램에서만 힙 할당 메모리 (new
또는 malloc
)에 올바르게 정렬됩니다. 32 비트 (x86) 또는 ARM에서는 기본적으로 지원되지 않습니다. 이와 같이 DirectXMath는 정렬을 염려하지 않고도 (즉, XMFLOAT4X4
및 XMLoadFloat4x4
/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_worldmatrix
및 g_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 Kit에
SimpleMath 래퍼을 활용하는 것입니다
주, 등
#include "SimpleMath.h"
using namespace DirectX::SimpleMath;
Matrix g_ProjectionMatrix;
Matrix g_worldMatrix;
Matrix g_viewMatrix;
...
Matrix wvp = proj * world * view;
는 훌륭한 답변을 주셔서 감사합니다. 나는 내일 그것을 시험 할 것이다. 나는 win7에 VS 2012 궁극의 마지막 업데이트를 사용합니다. – CrazySocke