2016-06-10 8 views
2

Я работаю над динамическим рендерингом cubemap. В частности, для рендеринга cubemap я использую шейдер из примера DirectX SDK «CubeMapGS». Шейдер кажется правильным, как вы можете видеть здесь:Ошибка связи с шейдером/несоответствие

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

Однако, это не работает. На самом деле, я получаю следующее сообщение об ошибке 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] 

сообщение об ошибке, кажется, указывают на какое-то несоответствие между входными аргументами и выходных значений различных функций Shader, однако я не могу признать это несоответствие.

Любые идеи или объяснения относительно этой ошибки?

ответ

0

Вы не читаете Pos в вашем пиксельных шейдеров, из-за этого Tex получить регистр 0, а в выводе геометрии шейдеров, это регистр 1.

Вы можете это исправить, как, что, делая вывод не читает на следующем этапе в конце структуры

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

Кроме того, будьте осторожны с использованием специального SV_POSITION не от последней ступени до пиксельного шейдера, он ведет себя не то же самое между NVIDIA и AMD. просто назовите его POSDONTMESSWITHME и потому, что вершинный шейдер должен вывести его, поместите поддельный в конце GS_CUBEMAP_IN и установите его на 0.

Как совет, геометрический шейдер - плохая идея. Расширение геометрии довольно медленно и не стоит для такого приложения, они лучше отбраковывают треугольники, к сожалению, они являются единственной стадией вывода индекса rt и viewport без расширений.