0

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 でデバッグしてきましたが、両方のバージョンでポスト vs 頂点が同じであることを示しています。

射影行列が原因であることに気付きました。私の射影行列では、次のことを行います。

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

修繕

行列を頂点シェーダーに渡す前に転置する必要があります。

4

1 に答える 1

0

また、いつでも mul(); でパラメーターの順序を切り替えることができます。

mul(行列, ベクトル);

この方法では、mul() が「行列」を行優先として解釈するため、乗算が正しく行われます。

于 2012-11-10T15:24:02.493 に答える