Шейдеры и компиляция Directx11 в c ++

0

Я пытаюсь создать программу Directx 11 с помощью c++. Код, используемый для работы до того, как я добавил Normal в код. Теперь он вообще не компилирует шейдер. Он продолжает давать мне доступ. Ошибка 0X0000.

Я попытался использовать d3dErrorBlolb, но не очень помог. Проблема, похоже, лежит в этой части кода.

void InitPipeline(HWND hwnd)
{

ID3D10Blob * BVS = 0,*BPS  = 0;
ID3D10Blob * BErrorVS,*BErrorPs;

HRESULT hr1 = D3DX11CompileFromFile(L"Test.fx",0,0,"VS","vs_4_0",0,0,0,&BVS,&BErrorVS,0);
HRESULT hr =  D3DX11CompileFromFile(L"Test.fx",0,0,"PS","ps_4_0",0,0,0,&BPS,&BErrorPs,0);


if(FAILED(hr))
{
    printf("Error %08X   %5s\n",hr,(char*)BErrorVS);
    MessageBox(hwnd,L"Pixel shader not created ",L"",0);

}
if(FAILED(hr1))
{   MessageBox(hwnd,L"Vertex shader not created ",L"",0);}
dev->CreateVertexShader(BVS->GetBufferPointer(),BVS->GetBufferSize(),0,&BoxVShader);
dev->CreatePixelShader(BPS->GetBufferPointer(),BPS->GetBufferSize(),0,&BoxPixelShader);


   // create the input layout object
D3D11_INPUT_ELEMENT_DESC ied[] =
{
    {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
    {"NORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0}
  //  {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0}

};
//SecureZeroMemory(&Bin);
dev->CreateInputLayout(ied,2,BVS->GetBufferPointer(),BVS->GetBufferSize(),&BInputLayout);

devcon->VSSetShader(BoxVShader,0,0);
devcon->PSSetShader(BoxPixelShader,0,0);
devcon->IASetInputLayout(BInputLayout);

}

Файл Test.fx

  ecbuffer ConstantBuffer:register(b0)
{
 matrix world;
 matrix view;
 matrix project;
 float3[2] LightDir;
 float4[2] LightColor;

}

struct Vout{
float4 pos:SV_POSITION;
float4 normal : NORMAL;
};


Vout VS(float3 pos:POSITION,float3 Norm:NORMAL)
{
  Vout vo = (Vout)0;
  vo.pos = mul(float4(pos,1),world);
  vo.pos = mul(vo.pos,view);
  vo.pos = mul(vo.pos,project);

  vo.normal = mul(float4(Norm,1),world);


  return vo;



}


float4 PS(float4 pos:SV_POSITION,float4 normal:NORMAL):SV_TARGET
{
    float4 col;

    for(int i=0; i < 2;++i)
    {
        col += saturate(dot(normal,LightDir[i])) * LightColor[i] ;
    }
    return col;
 }

Может кто - нибудь, пожалуйста, будьте любезны, чтобы помочь мне...

Если это возможно, пожалуйста, объясните, почему это держит всегда происходит..What я здесь делаю неправильно

Пожалуйста, помогите мне. Мне отчаянно нужно решить эту проблему....

Спасибо...

Показать ещё 1 комментарий
Теги:
shader
directx
compilation
directx-11

1 ответ

0
Лучший ответ

Хотя компиляция HLSL во время выполнения хороша для обучения и итерации, на самом деле намного проще отлаживать HLSL, компилируя его с помощью командной строки:

fxc test.fx/Tvs_4_0/EVS и fxc test.fx/Tps_4_0/EPS

Второй не удается, потому что вы не смогли установить начальное значение col в пиксельном шейдере:

test.fx(40,25-47): предупреждение X3206: "точка": неявное усечение векторного типа

test.fx(40,9-64): ошибка X4000: переменная 'col' используется без полной инициализации

компиляция не удалась; код не создан

Фиксирование тривиально:

float4 PS(float4 pos:SV_POSITION,float4 normal:NORMAL):SV_TARGET
{
    float4 col = 0;

    for(int i=0; i < 2;++i)
    {
        col += saturate(dot(normal,LightDir[i])) * LightColor[i] ;
    }
    return col;
 }

Вы получаете AV, потому что у вас неправильная обработка неудавшегося вывода компилятора, вы забыли инициализировать как BErrorVS и BErrorPS нулю, и вы пытаетесь вывести BErrorVS когда VS удалось, но PS не удалось. Должен быть:

if(FAILED(hr))
{
    printf("Error %08X   %5s\n",hr,(char*)BErrorPS->GetBufferPointer());
    MessageBox(hwnd,L"Pixel shader not created ",L"",0);

}

Также вы должны помнить, что BErrorVS и BErrorPS могут быть установлены на ненулевое значение, даже если SUCCEEDED(hr)) поскольку он может сообщать только о нефатальных предупреждениях.

См. HLSL, FXC и D3DCompile

  • 0
    Спасибо ... Можете ли вы сказать мне, где эта командная строка, чтобы я мог использовать ее для отладки ... Еще раз спасибо
  • 0
    Если у вас VS 2012, поищите «Командная строка разработчика для VS2012». В VS 2013 найдите папку «Инструменты Visual Studio», в которой есть записи «Командная строка разработчика». Если вы используете устаревший DirectX SDK, найдите «Командная строка DirectX SDK».
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню