我做了http://3dgep.com/introduction-to-directx-11教程。
在教程3中,矩阵(投影、视图和世界矩阵)被发送到顶点着色器,并在那里被乘以。
我想乘这三个矩阵,以得到一个,我必须发送到顶点着色器。
当我试图用XMMatrixMultiply()函数将它们相乘时,我会得到一个访问冲突错误。
XMMatrix wvp=XMMatrixMultiply(g_ProjectionMatrix,XMMatrixMultiply(g_worldmatrix,g_viewmatrix));发布于 2015-01-07 19:17:35
您可能会碰到AV,因为您没有正确地考虑到内存与变量的对齐情况。DirectXMath (又名XNAMath)有两种“SIMD”类型:XMVECTOR和XMMATRIX,它们必须总是16字节对齐。如果将它们分配为全局变量、静态变量或堆栈,则它们将正确对齐。它们仅在堆分配内存(new或malloc)中与x64本机应用程序正确地对齐。对于32位(x86)或ARM,它们不是默认的.因此,DirectXMath还提供了各种数据存储类型和加载/存储函数来处理这一问题,而无需担心对齐问题(即XMFLOAT4X4和XMLoadFloat4x4 / XMStoreFloat4x4函数)。这在MSDN程序员指南中有介绍,我强烈建议您花时间阅读。
因此,与其使用XMMATRIX作为数据存储变量,不如执行以下操作:
XMFLOAT4X4 g_ProjectionMatrix;
XMFLOAT4X4 g_worldMatrix;
XMFLOAT4X4 g_viewMatrix;..。
XMMATRIX proj = XMLoadFloat4x4( &g_ProjectionMatrix );
XMMATRIX world = XMLoadFloat4x4( &g_worldMatrix );
XMMATRIX view = XMLoadFloat4x4( &g_viewMatrix );
XMMATRIX wvp = XMMatrixMultiply( proj, XMMatrixMultiply( world, view ) );虽然这有点冗长,但它更直接地映射到硬件的实际操作,使您能够看到避免加载/存储开销的机会,并继续处理可能在SIMD寄存器中保存更长时间的数据。
尽管如此,如果您的g_ProjectionMatrix、g_worldmatrix和g_viewmatrix变量是真正全局的,如本教程所示,并且您正在访问AV,那么您也可能遇到编译器错误。你用的是什么版本的VS?VS 2008和2010年是有点问题的w.r.t。敬本质。VS 2010 Service Pack 1比VS 2010 RTM稍微好一点。2012年和2013年要好得多。确保您使用的是VS 2012或VS 2013的最新更新。如果您没有VS 2013 Pro+的预算,我建议您迁移到VS 2013社区(也是VS更新4)。
请注意,这里的另一个选项是使用DirectX工具包中的DirectX工具包包装器,它使用了一些C++‘魔术’,使得编写“天真”的数学代码对Matrix、Vector2、Vector3、Vector4等类型更加宽容。
#include "SimpleMath.h"
using namespace DirectX::SimpleMath;
Matrix g_ProjectionMatrix;
Matrix g_worldMatrix;
Matrix g_viewMatrix;..。
Matrix wvp = proj * world * view;https://stackoverflow.com/questions/27818868
复制相似问题