прямой x 11 неверный аргумент при создании вершинного шейдера - PullRequest
0 голосов
/ 03 июля 2019

Вот имя файла кода шейдера: Shader.shader

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VMain(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = position;
    output.color = color;

    return output;
}


float4 PMain(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}

Вот как я собираю свои шейдеры

RasterShader::RasterShader(ID3D11Device* device,LPCWSTR vFile,LPCSTR vEntry,LPCSTR vVersion,LPCWSTR pFile,LPCSTR pEntry,LPCSTR pVersion)
{
 ID3DBlob* compiledCode=nullptr;
 vShader = nullptr;
 pShader = nullptr;
 errors = 0;

 if (FAILED(Compile(vFile,vEntry,vVersion,&compiledCode)))
 {
  errors = 1;
  return;
 }
 if (FAILED(device->CreateVertexShader(compiledCode->GetBufferPointer(), compiledCode->GetBufferSize(),nullptr, &vShader)))
 {
  compiledCode->Release();
  MessageBox(NULL, L"Failed To Create Vertex Shader", L"Failed Vertex Shader", MB_OK);
  errors = 1;
  return;
 }


 D3D11_INPUT_ELEMENT_DESC desc[] =
 {
   {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0}
  ,{"COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0}
 };
 if (FAILED(device->CreateInputLayout(desc, 2,compiledCode->GetBufferPointer(),compiledCode->GetBufferSize(),&inputLayout)))
 {
  compiledCode->Release();
  MessageBox(NULL, L"Failed To Create Input Layout", L"Failed Input Layout", MB_OK);
  errors = 1;
  return;
 }
 compiledCode->Release();


 if (FAILED(Compile(pFile,pEntry,pVersion,&compiledCode)))
 {
  errors = 1;
  return;
 }
 if (FAILED(device->CreatePixelShader(compiledCode->GetBufferPointer(), compiledCode->GetBufferSize(), nullptr, &pShader)))
 {
  compiledCode->Release();
  MessageBox(NULL, L"Failed To Create Pixel Shader", L"Failed Pixel Shader", MB_OK);
  errors = 1;
  return;
 }
 compiledCode->Release();
}

HRESULT RasterShader::Compile(LPCWSTR fileName,LPCSTR entry,LPCSTR version,ID3DBlob** code)
{
 ID3DBlob* errors=nullptr;
 HRESULT hr = D3DCompileFromFile(fileName,nullptr,nullptr
                                ,entry,version
                                ,0,0,code,&errors);
 if (FAILED(hr))
 {
  if (errors!=nullptr)
  {
   CString data((char*)errors->GetBufferPointer());
   MessageBox(NULL, data.GetBuffer(), L"Shader Compile Errors", MB_OK);

   data.ReleaseBuffer();
   errors->Release();
  }
  if (code) { (*code)->Release(); }
 }
 return hr;
}

RasterShader * RasterShader::Create(ID3D11Device* device,LPCWSTR vFile,LPCSTR vMain,LPCSTR vVersion,LPCWSTR pFile,LPCSTR pMain,LPCSTR pVersion)
{
 RasterShader* shader = new RasterShader(device,vFile,vMain,vVersion,pFile,pMain,pVersion);
 if (shader->errors == 1)
 {
  delete shader;
  shader = nullptr;
 }
 return shader;
}

Вот как я создаю свой шейдер

shader = RasterShader::Create(directx->getDevice(), L"Shader.shader","VMain","vs_4_0",L"Shader.shader","PMain","ps_4_0");
 if (shader == nullptr)
 {
  errors = 1;
  return;
 }

Вот как я создаю свое устройство

D3D_FEATURE_LEVEL levels[] = {
       D3D_FEATURE_LEVEL_9_1,
       D3D_FEATURE_LEVEL_9_2,
       D3D_FEATURE_LEVEL_9_3,
       D3D_FEATURE_LEVEL_10_0,
       D3D_FEATURE_LEVEL_10_1,
       D3D_FEATURE_LEVEL_11_0,
       D3D_FEATURE_LEVEL_11_1
    };


 //CREATE DEVICE AND CONTEXT
 HRESULT hr = D3D11CreateDevice(nullptr,D3D_DRIVER_TYPE_HARDWARE,0,D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D10_CREATE_DEVICE_DEBUG
                               ,levels,ARRAYSIZE(levels),D3D11_SDK_VERSION
                               ,&device,&level,&context);

Уровень возвращенных / поддерживаемых функций: 9_1

Программа прерывается в момент, когда я создаю свой VertexShader с сообщением "FAILED TO CREATE VERTEX SHADER"

Когда я анализирую HRESULT, возвращенный device-> CreateVertexShader (), я получаю код ошибки

E_INVALIDARG

Когда был включен уровень отладки, я получил эту ошибку

CreateVertexShader: размер закодированного вершинного шейдера не соответствует указанному размеру. [STATE_CREATION ERROR # 166: CREATEVERTEXSHADER_INVALIDSHADERBYTECODE]

Я устал спрашивать размер моего буфера. Не уверен, что полезно или я сделал все правильно.

wchar_t buffer[256];
wsprintf(buffer, L"%d",sizeof((*code)->GetBufferPointer()));
MessageBox(NULL, buffer, L"A", MB_OK);

It prints 4

wchar_t buffer[256];
wsprintf(buffer, L"%d",sizeof((*code)->GetBufferSize()));
MessageBox(NULL, buffer, L"A", MB_OK);

It prints 164

Любая помощь будет принята с благодарностью. Спасибо U

1 Ответ

0 голосов
/ 04 июля 2019

Эврика, я понял !!

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

Вершинный шейдер: vs_4_0_level_9_1

Пиксельный шейдер: ps_4_0_level_9_1

Спасибо всем:)

...