2016-06-10 22 views
2

Ich arbeite am dynamischen Cubemap Rendering. Insbesondere benutze ich einen Shader aus dem DirectX SDK-Beispiel "CubeMapGS", um die Cubemap zu rendern. Der Shader scheint korrekt zu sein, wie Sie hier sehen können:Shader Linking Fehler/Mismatch

SamplerState ss; 
Texture2D tex; 

cbuffer Constants 
{ 
    float4x4 worldMat; 
    float4x4 viewMats[6]; 
    float4x4 projMat; 
}; 

struct VS_CUBEMAP_IN 
{ 
    float4 Pos : POSITION; 
    float3 Normal : NORMAL; 
    float2 Tex : TEXCOORD0; 
}; 

struct GS_CUBEMAP_IN 
{ 
    float4 Pos : SV_POSITION; // World position 
    float2 Tex : TEXCOORD0; // Texture coord 
}; 


struct PS_CUBEMAP_IN 
{ 
    float4 Pos : SV_POSITION; // Projection coord 
    float2 Tex : TEXCOORD0; // Texture coord 
    uint RTIndex : SV_RenderTargetArrayIndex; 
}; 


GS_CUBEMAP_IN VShader(VS_CUBEMAP_IN input) 
{ 
    GS_CUBEMAP_IN output = (GS_CUBEMAP_IN) 0.0f; 

    // Compute world position 
    output.Pos = mul(input.Pos, worldMat); 

    // Propagate tex coord 
    output.Tex = input.Tex; 

    return output; 
} 

[maxvertexcount(18)] 
void GShader(triangle GS_CUBEMAP_IN input[3], inout TriangleStream<PS_CUBEMAP_IN> CubeMapStream) 
{ 
    for (int f = 0; f < 6; ++f) 
    { 
     // Compute screen coordinates 
     PS_CUBEMAP_IN output; 
     output.RTIndex = f; 
     for (int v = 0; v < 3; v++) 
     { 
      output.Pos = mul(input[v].Pos, viewMats[f]); 
      output.Pos = mul(output.Pos, projMat); 
      output.Tex = input[v].Tex; 
      CubeMapStream.Append(output); 
     } 
     CubeMapStream.RestartStrip(); 
    } 
} 


float4 PShader(PS_CUBEMAP_IN input) : SV_Target { 
    return tex.Sample(ss, input.Tex); 
} 

Es funktioniert jedoch nicht. In der Tat, erhalte ich folgende Fehlermeldung DirectX:

D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Vertex Shader - Geometry Shader linkage error: Signatures between stages are incompatible. Semantic 'SV_POSITION' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Vertex Shader - Geometry Shader linkage error: Signatures between stages are incompatible. Semantic 'TEXCOORD' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Geometry Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'TEXCOORD' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Geometry Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'SV_POSITION' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 

Die Fehlermeldung erscheint eine Art von Diskrepanz zwischen den Eingabeargumenten und den Ausgangswert der verschiedenen Shader-Funktionen anzuzeigen, jedoch kann ich nicht wirklich erkennen, diese Nichtübereinstimmung.

Irgendwelche Ideen oder Erklärungen in Bezug auf diesen Fehler?

Antwort

0

Sie nicht Po im Pixelshader lesen, da diese Tex das Register 0, während in der Shader-Ausgabe Geometrie erhalten, war es 1.

Sie es so fix anmelden können, durch Ausgabe setzt nicht lesen durch die nächste Stufe am Ende der Struktur

struct PS_CUBEMAP_IN 
{ 
    float2 Tex : TEXCOORD0; // Texture coord 
    uint RTIndex : SV_RenderTargetArrayIndex; 
    float4 Pos : SV_POSITION; // Projection coord 
}; 

auch mit der Verwendung der speziellen SV_POSITION nicht von der letzten Stufe vor dem Pixel-Shader vorsichtig sein, verhält es sich nicht gleich zwischen nvidia und AMD. Nennen Sie es einfach POSDONTMESSWITHME und weil der Vertex-Shader es ausgeben soll, setzen Sie einen falschen am Ende von GS_CUBEMAP_IN und setzen Sie ihn auf 0.

Als einen Ratschlag, Geometrie-Shader sind eine schlechte Idee. Die Geometrieerweiterung ist ziemlich langsam und lohnt sich nicht für diese Art von Anwendung, sie sind besser beim Aussortieren von Dreiecken, leider sind sie die einzige Stufe, um den rt- und den Darstellungsindex ohne Erweiterungen auszugeben.