我正在使用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信息时,它可以正常工作。我想我不明白这个渲染管道是如何工作的。你能解释一下为什么这个以及管道如何工作?谢谢。
答案 0 :(得分:0)
DirectX着色器需要在着色器阶段之间具有匹配的输入和输出,否则寄存器将错过对齐。如果您使用调试层运行,则会收到警告。
如果你的像素着色器不需要sv_position,你可以把它放在VertexOut
的末尾