关于像素着色器输入缓冲区

时间:2017-05-10 09:05:37

标签: shader directx-11 pixel-shader

我正在使用VS2015,directx11

这是我的顶点着色器代码。

cbuffer cbperobject {
    float4x4 gWorldViewProj;
};

struct VertexIn {
    float3 Pos : POSITION;
    float2 tex : TEXCOORD0;
};

struct VertexOut {
    float4 PosH : SV_POSITION;
    float2 tex : TEXCOORD0;

};

VertexOut main( VertexIn vin ) 
{
    VertexOut vOut;

    vOut.PosH = mul(float4(vin.Pos, 1.0f), gWorldViewProj);
    vOut.tex = vin.tex;
    return vOut;
}

这是我的像素着色器代码

Texture2D shaderTexture;
SamplerState SampleType;
struct VertexIn {
    float4 PosH : SV_POSITION;
    float2 tex : TEXCOORD0;
};


float4 main(VertexIn Pin) : SV_TARGET
{
    float4 textureColor;
    textureColor = shaderTexture.Sample(SampleType, Pin.tex);
    return  textureColor;
}

对于像素着色器输入缓冲区,我在此代码中不需要位置缓冲区。所以我在这段代码中删除了float4 PosH。然后像素着色器不起作用我看到黑啤酒箱。当我回复结构形式,其中float4用于位置信息而float2用于textcoord信息时,它可以正常工作。我想我不明白这个渲染管道是如何工作的。你能解释一下为什么这个以及管道如何工作?谢谢。

1 个答案:

答案 0 :(得分:0)

DirectX着色器需要在着色器阶段之间具有匹配的输入和输出,否则寄存器将错过对齐。如果您使用调试层运行,则会收到警告。

如果你的像素着色器不需要sv_position,你可以把它放在VertexOut的末尾