Ошибка отображения матрицы в коде вершинного шейдера в DirectX9

В моем образце DirectX9, когда я делаю следующие вещи, все работает нормально, и я получаю на экране желаемый вращающийся треугольник,

без шейдеров

g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

Но когда я пытаюсь сделать то же самое с помощью шейдеров, ничего не отображается.

D3DXMATRIXA16 matWorldViewProj = matWorld * matView * matProj;
constantTable->SetMatrix(g_pd3dDevice, "g_mWorldViewProjection", &matWorldViewProj);
//Vertex Shader snippet
Output.Position = mul(In.Position,g_mWorldViewProjection);

когда я сделал ниже изменения в вершинном шейдере

Output.Position =  In.Position;

Я получаю статический треугольник, отображаемый на экране.

введите здесь описание изображения

Что может быть вероятной ошибкой в ​​моем коде/технике?

(профиль: vs

Output.Position =  In.Position;
0 с использованием D3DXCompileShaderFromFile)


person control    schedule 25.11.2012    source источник
comment
Вы пытались изменить D3DXMATRIXA16 matWorldViewProj = matWorld * matView * matProj; на D3DXMATRIXA16 matWorldViewProj = matProj * matView * matWorld ;. Может быть, это помогает.   -  person Gnietschow    schedule 26.11.2012
comment
Да, пробовал то же самое, но не помогло. Ничего не визуализируется.   -  person control    schedule 26.11.2012
comment
Похоже проблема где-то в другом. Можете ли вы предоставить еще код, пожалуйста? Весь шейдер и ваш вызов отрисовки были бы интересны. Если это слишком долго, вы можете использовать pastebin и связать его.   -  person Gnietschow    schedule 26.11.2012
comment
Вот код и оба шейдера. Я вставил все 3 на одну страницу, которую вам нужно извлечь и сохранить вершинный шейдер как vertex.vsh и пиксельный шейдер как файл pixel.psh. ССЫЛКА НА КОД   -  person control    schedule 26.11.2012
comment
Возможно, матрица не установлена ​​в вершинном шейдере. Вы перезаписываете свою переменную constantTable при компиляции пиксельного шейдера. Таким образом, ваша матрица будет установлена ​​​​только в шейдере пикселей.   -  person Gnietschow    schedule 26.11.2012
comment
Я так не думаю, потому что использование переменной constantTable правильно. Что-то еще идет не так.   -  person control    schedule 26.11.2012
comment
Похоже, вы использовали это руководство и там при компиляции PixelShader параметру ConstantTable присваивается значение null. Это переопределит ваш указатель, поэтому вы устанавливаете только константы в шейдере пикселей.   -  person Gnietschow    schedule 26.11.2012
comment
давайте продолжим это обсуждение в чате   -  person control    schedule 26.11.2012


Ответы (1)


При компиляции пиксельного шейдера вы перезаписываете свою переменную constantTable. Таким образом, матрица задается только в пиксельном шейдере, а не в вершинном шейдере. Либо вы объявляете дополнительную переменную constantTablePix, либо устанавливаете параметр в NULL, если вам не нужно передавать информацию в пиксельный шейдер.

Правильный порядок матрицы. (Я никогда не получаю правильный заказ, но теперь он работает :))

D3DXMATRIXA16 matWorldViewProj = matWorld * matView * matProj;  
person Gnietschow    schedule 26.11.2012