顶点着色器中矩阵的乘法

时间:2012-10-16 13:00:13

标签: c++ directx shader directx-11

当我在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 vertices是相同的。

我注意到它是由投影矩阵引起的。对于我的投影矩阵,我做了:

D3DXMatrixPerspectiveFovLH(&mbb.matProj, D3DX_PI / 2, (float) init_params.width / init_params.height, 0.01f, 100.0f)

固定

我必须在将矩阵传递给顶点着色器之前对其进行转置。

1 个答案:

答案 0 :(得分:0)

此外,您始终可以在mul();

中切换参数顺序

mul(矩阵,向量);

这样,乘法将正确完成,因为mul()将“矩阵”解释为行主要。