目录
1、DX与HLSL的矩阵
2、创建常量缓冲区的尺寸需要按照16字节对齐
DX的矩阵(DirectX::XMMATRIX)按照行主元优先存储,而HLSL的矩阵默认按照列主元优先存储。解决这个问题的方法有两种
1)将DirectX的矩阵转置
DirectX::XMMATRIX m_matrix;
...
DirectX::XMMatrixTranspose(m_matrix);
2)在HLSL中用 row_major声明矩阵
cbuffer Cbuffer0: register(b0)
{
row_major matrix mWorld; // HLSL里,没有 row_major 修饰的话矩阵是用列主元优先存储的
}
我更喜欢做法2
创建常量缓冲区的时候需要填充 D3D11_BUFFER_DESC 结构体,其中ByteWidth属性表示缓冲区的大小,这个属性应该为16的整数倍,否则缓冲区会创建失败
bufferDesc = {};
bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof(CBufferTrans); // CBufferTrans 是一个结构体,尺寸按照16字节对齐,若不是16字节的整数倍,缓冲区会创建失败
hr = m_pD3dDevice->CreateBuffer(&bufferDesc, nullptr, &m_pCBufferTrans);