【问题标题】:Trouble using vertices position in the pixel shader在像素着色器中使用顶点位置时遇到问题
【发布时间】:2019-11-03 14:20:59
【问题描述】:

尝试使用地形的 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)

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

【问题讨论】:

    标签: shader directx-11 hlsl


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这解释了。我在顶点着色器期间做了一个单独的东西来存储输入位置y值并在像素着色器中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多