умножение матриц в вершинных шейдерах

Когда я умножаю матрицы на процессоре

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)

ФИКСИРОВАННЫЙ

Я должен транспонировать матрицы перед передачей их в вершинный шейдер.

0

Решение

Также вы всегда можете переключить порядок параметров в mul ();

mul (матрица, вектор);

Таким образом, умножение будет выполнено правильно, так как mul () интерпретирует «матрицу» как мажор строки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]