当我在 CPU 上乘以矩阵时
D3DXMATRIX mb = mbb.matWorld * mbb.matView * mbb.matProj;
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(D3DXMATRIX);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &mb;
//*****************************************
cbuffer ConstantBuffer : register(cb0)
{
matrix mat;
float4 vs(float4 pos : POSITION) : SV_POSITION
{
float4 ret = mul(pos, mat);
return ret;
}
它工作得很好。但是当我在 GPU 上做的时候
struct Buffer
{
D3DXMATRIX mat[3];
};
Buffer b;
// b[..] = ....
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(D3DXMATRIX) * 3;
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA initData;
ZeroMemory(&initData, sizeof(initData));
initData.pSysMem = &b;
//*****************************************
cbuffer ConstantBuffer : register(cb0)
{
matrix matWorld;
matrix matView;
matrix matProj;
}
float4 vs(float4 pos : POSITION)
{
float4 ret = mul(pos, matWorld);
ret = mul(ret, matView);
ret = mul(ret, matProj);
return ret;
}
屏幕上没有呈现任何内容。怎么了?
我一直在使用 PIX 进行调试,它表明在两个版本中 post-vs 顶点是相同的。
我注意到这是由投影矩阵引起的。对于我的投影矩阵,我这样做:
D3DXMatrixPerspectiveFovLH(&mbb.matProj, D3DX_PI / 2, (float) init_params.width / init_params.height, 0.01f, 100.0f)
固定的
我必须先转置矩阵,然后再将它们传递给顶点着色器。