2017-01-06 12 views
0

Я работаю над движком игры, используя DirectX 11, и у меня возникают проблемы с правильной кодировкой шейдеров. Я предварительно компилирую шейдеры в файлы .csh и создаю шейдеры с байтовыми кодами.D3D11 Create Shader: Encoded Vertex Shader size не соответствует указанному размеру

Я получаю эту ошибку, когда пытаюсь создать какой-либо шейдер, но для этого примера я буду использовать свой шейдер Vertex для PassThrough.

D3D11 ERROR: ID3D11Device::CreateVertexShader: Encoded Vertex Shader size doesn't match specified size. [ STATE_CREATION ERROR #166: CREATEVERTEXSHADER_INVALIDSHADERBYTECODE] 

Шейдер:

#include "../VertexLayouts.hlsli" 
// structs in included file 
struct PASS_THROUGH_VS 
{ 
    float3 pos : POSITION; 
    float2 texCoord : TEXCOORD; 
}; 

struct PASS_THROUGH_PS 
{ 
    float4 pos : SV_POSITION; 
    float2 texCoord : TEXCOORD; 
}; 


PASS_THROUGH_PS main(PASS_THROUGH_VS input) 
{ 
    PASS_THROUGH_PS output = (PASS_THROUGH_PS)(0); 
    output.pos = float4(input.pos, 1); 
    output.texCoord = input.texCoord; 
    return output; 
} 

с этими настройками: PassThrough_PS properties

В Renderer.h

#include "Vertex Shaders\PassThrough_VS.csh" 

В Renderer.cpp

HRESULT hrReturn; 

    hrReturn = CreateVertexShader(&PassThrough_VS, sizeof(PassThrough_VS), Pass_Through_VS); 
    if (FAILED(hrReturn)) {} 
     //return hrReturn; 

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type) 
{ 
    HRESULT hrReturn; 
    tVertShader newShader = {}; 
    hrReturn = D3Device->CreateVertexShader(&ptrByteCode, szByteCodeLength, nullptr, &(newShader.m_id3dShader)); // WHERE ERROR OCCURS 
    if (FAILED(hrReturn)) 
     return hrReturn; 
    newShader.m_ptrByteCode = ptrByteCode; 
    newShader.m_szByteCodeLength = szByteCodeLength; 
    D3VertexShaders[type] = newShader; 
    return hrReturn; 
} 
+0

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

+0

Другой вопрос: в чем причина .cso или .csh? Меня научили использовать метод .csh, но не могли для меня помнить, какие причины дал учитель. Также кажется, что это очень редкая техника, поскольку в этом типе файлов ничего не найдено в google или bing. – eatapotart

ответ

0

Проблема заключается в том, что вы передаете указатель на указатель, так что вы фактически не передаете данные кадровой синхронизации в Direct3D.

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type) 
{ 
    HRESULT hrReturn; 
    tVertShader newShader = {}; 
    hrReturn = D3Device->CreateVertexShader(&ptrByteCode, szByteCodeLength, 
     nullptr, &(newShader.m_id3dShader)); 
    ...  

Правильный код:

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type) 
{ 
    HRESULT hrReturn; 
    tVertShader newShader = {}; 
    hrReturn = D3Device->CreateVertexShader(ptrByteCode, szByteCodeLength, 
     nullptr, &(newShader.m_id3dShader)); 
    ...  

Вы должны взглянуть на DirectX Tool Kit и tutorials в частности.

Вы не указали информацию о типах tVertShader, но у вас могут быть проблемы с подсчетом ссылок. Рассмотрите возможность использования Microsoft::WRL::ComPtr вместо необработанных указателей для управления временем жизни объектов COM Direct3D. См. this article.

+0

Благодарим за отзыв. Я сейчас работаю, так что это будет немного, прежде чем я смогу попробовать решения. это правда, у меня есть проблемы с ссылкой, и я использовал comptrs раньше, но у меня, похоже, есть несколько мест, где ресурсы рассортированы. в структуре tVertex шейдер удерживается указателем шейдера ID3D11, а байтовый код - const void *. – eatapotart

+0

Я вижу, где была ошибка. Большое спасибо. – eatapotart