无论出于何种原因,渲染器似乎忽略了第一个参数的语义,并始终传递像素位置。即使一个不同的参数具有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;
}
答案 0 :(得分:0)
这是因为POSITION
和SV_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;
}
此外,您需要与顶点着色器中POSITION
与SV_Position
的HLSL使用情况保持一致,以及如何声明Direct3D 10.x / 11.x输入布局,以及你的VS与PS让他们正确绑定。