2017-01-06 3 views
0

Ich arbeite an einer Game-Engine mit DirectX 11 und habe Probleme, Shader richtig zu kodieren. Ich kompiliere Shader zu .csh-Dateien vor und erzeuge Shader mit den Byte-Codes.D3D11 Create Shader: Kodierte Vertex Shader-Größe stimmt nicht mit der angegebenen Größe überein

Ich bekomme diesen Fehler, wenn ich versuche, einen Shader zu erstellen, aber für dieses Beispiel werde ich meinen PassThrough-Vertex-Shader verwenden.

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

Die Shader:

#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; 
} 

mit diesen Einstellungen: PassThrough_PS properties

In Renderer.h

#include "Vertex Shaders\PassThrough_VS.csh" 

In 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

Ich habe es mit jedem Shader-Modell versucht, meine Treiber aktualisiert und bin zurückgegangen und habe einen trivialen Vertex-Shader ausprobiert, der vorher aber nicht jetzt funktioniert hat. – eatapotart

+0

Eine andere Frage wäre, was ist der Grund für .cso oder .csh? Mir wurde beigebracht, wie man die .csh-Methode benutzt, aber ich kann mich nicht erinnern, was die Gründe dafür waren. Auch scheint es, dass es eine sehr seltene Technik ist, da es bei diesem Dateityp nichts über Google oder Bing gibt. – eatapotart

Antwort

0

Das Problem besteht darin, dass Sie einen Zeiger an einen Zeiger übergeben, sodass Sie die Daten des Shader-Blobs nicht direkt an Direct3D übergeben.

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

Der richtige Code ist:

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

Sie sollten bei DirectX Tool Kit und die tutorials insbesondere einen Blick darauf werfen.

Sie haben keine Details über den Typ tVertShader angegeben, aber Sie könnten Probleme mit der Referenzzählung haben. Erwägen Sie die Verwendung von Microsoft::WRL::ComPtr anstelle von rohen Zeigern zum Verwalten der Lebensdauer von Direct3D-COM-Objekten. Siehe this article.

+0

Vielen Dank für die Antwort. Ich bin gerade bei der Arbeit, also wird es ein bisschen dauern, bevor ich die Lösungen ausprobieren kann. Es ist wahr, ich habe Referenzprobleme und ich habe Comptrs zuvor verwendet, aber ich habe anscheinend mehrere Orte, an denen Ressourcen falsch zugeordnet werden. In der tVertex-Struktur wird der Shader von einem ID3D11-Shader-Pointer gehalten und der Byte-Code ist ein const void *. – eatapotart

+0

Ich sehe, wo der Fehler jetzt war. vielen Dank. – eatapotart

Verwandte Themen