Directx 着色器链接错误/不匹配

Directx 着色器链接错误/不匹配,directx,shader,hlsl,geometry-shader,Directx,Shader,Hlsl,Geometry Shader,我正在研究动态立方体贴图渲染。特别是,为了渲染立方体贴图,我使用了DirectX SDK示例“CubeMapGS”中的着色器。着色器似乎正确,如您在此处所见: SamplerState ss; Texture2D tex; cbuffer Constants { float4x4 worldMat; float4x4 viewMats[6]; float4x4 projMat; }; struct VS_CUBEMAP_IN { float4 Pos : PO

我正在研究动态立方体贴图渲染。特别是,为了渲染立方体贴图,我使用了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);
}
错误消息似乎表明不同着色器函数的输入参数和输出值之间存在某种不匹配,但是我无法真正识别这种不匹配


关于此错误有什么想法或解释吗?

您没有在像素着色器中读取Pos,因为在几何体着色器输出中,Tex获得寄存器0,而它是寄存器1

您可以这样修复它,将下一阶段不读取的输出放在结构的末尾

struct PS_CUBEMAP_IN
{
    float2 Tex : TEXCOORD0; // Texture coord
    uint RTIndex : SV_RenderTargetArrayIndex;
    float4 Pos : SV_POSITION; // Projection coord
};
另外,要小心使用特殊的
SV_位置
不是从像素着色器之前的最后一个阶段开始,它在nvidia和AMD之间的行为不一样。只需将其命名为
POSDONTMESSWITHME
,因为顶点着色器必须输出它,所以在
GS_CUBEMAP_的末尾放入一个伪值,并将其设置为0

作为一条建议,几何体着色器不是一个好主意。几何体扩展非常缓慢,对于这种应用程序来说不值得,它们更擅长剔除三角形,遗憾的是,它们是输出rt和视口索引而不进行扩展的唯一阶段

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