DirectX11学习笔记(不定期更新)

目录

 

1、DX与HLSL的矩阵

2、创建常量缓冲区的尺寸需要按照16字节对齐

1、DX与HLSL的矩阵

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

 

2、创建常量缓冲区的尺寸需要按照16字节对齐

创建常量缓冲区的时候需要填充 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);

 

你可能感兴趣的:(c++,DirectX,矩阵,常量缓冲)