使用像素着色器中的顶点位置时出现问题

时间:2019-06-20 17:53:25

标签: shader directx-11 hlsl

尝试使用顶点的Y位置为顶点着色,但结果却很奇怪。

struct InputType
{
    float4 position : SV_POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
    float4 sunlightPos : TEXCOORD1;
};
float4 main(InputType input) : SV_TARGET
{
    float4 textureColour = float4(0.0, 0.0, 0.0, 1.0);

    if (input.position.y > 0.0f) //r
    {
        textureColour.r = 1;
        textureColour.g = 0;
        textureColour.b = 0;
    }
    if (input.position.y > 20.f) //g
    {
        textureColour.r = 0;
        textureColour.g = 1;
        textureColour.b = 0;
    }
    if (input.position.y > 40.f) //b
    {
        textureColour.r = 0;
        textureColour.g = 0;
        textureColour.b = 1;
    }
    return textureColour;
}

但是结果是所有顶点都是蓝色的,相对于地形,我的相机在同一位置相对于我的屏幕有两条红色和绿色的条纹,随着我改变角度,不同的顶点会改变它们的颜色,但始终相对于屏幕位于同一位置。这根本不是我理解着色器应该工作的方式。有什么明显的地方我做错了吗?

View of the terrain from the top (perspective)

我曾经将高度图应用于平面,我将使用纹理的颜色值以相同的方式对顶点进行颜色着色,并使用纹理的颜色值更改顶点着色器中的高度,因此位置顶点着色器中的输出应该正确。

1 个答案:

答案 0 :(得分:0)

  

在着色器中使用时,SV_Position描述像素位置。在所有着色器中均可用,以使像素中心偏移0.5。

SV_POSITION是屏幕空间中的像素位置(用于像素着色器),有关更多信息,请参见this question的答案。

Afaik的顶点位置为no pixel shader semantic,因此您必须通过删除语义标识符并将其从顶点着色器中写入来从顶点着色器手动传递它。