HLSL像素着色器的第一个参数

时间:2015-01-20 16:10:16

标签: direct3d hlsl

无论出于何种原因,渲染器似乎忽略了第一个参数的语义,并始终传递像素位置。即使一个不同的参数具有SV_POSITION语义,该位置仍然作为第一个参数传递。有这个原因吗?

顶点着色器:

cbuffer transforms
{
    float4x4 view, projection;
};

void main(
    in float4 inPos : POSITION, in float3 inNorm : NORMAL,
    out float4 outPos : SV_POSITION, out float3 outNorm : TEXCOORD0
    )
{
    outPos = mul(projection, mul(view, inPos));
    outNorm = inNorm;
}

像素着色器:

void main(
    float4 inPos : SV_POSITION, in float3 inNorm : TEXCOORD0,
    out float4 outClr : SV_TARGET
    )
{
    outClr.xyz = inNorm * 0.5 + 0.5;
    outClr.w = 1.0;
}

1 个答案:

答案 0 :(得分:0)

这是因为POSITIONSV_Position的意思基本相同。 POSITION是顶点位置的Direct3D 9时代语义。 SV_Position是顶点位置的Direct3D 10+时代语义。

您可以在此处使用多种不同的模式,但要使用您的模式,您应该使用inout作为位置:

void main(
    inout float4 pos : SV_Position, in float3 inNorm : NORMAL,
    out float3 outNorm : TEXCOORD0
    )
{
    pos = mul(projection, mul(view, pos));
    outNorm = inNorm;
}

此外,您需要与顶点着色器中POSITIONSV_Position的HLSL使用情况保持一致,以及如何声明Direct3D 10.x / 11.x输入布局,以及你的VS与PS让他们正确绑定。