2016-06-10 204 views
2

我正在处理动态立方体贴图渲染。特别是,为了渲染立方体贴图,我使用了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

你不要在你的像素着色器读取的名次,因为那句话获取寄存器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和视口索引而没有扩展的唯一阶段。