【问题标题】:shader value conversion error when passing value between vertex and fragment shader在顶点和片段着色器之间传递值时着色器值转换错误
【发布时间】:2021-09-27 05:16:26
【问题描述】:

我有以下片段和顶点着色器。

顶点:

    #version 450

    layout(location = 0) in vec2 Position;
    layout(location = 1) in vec4 Color;

    layout(location = 0) out vec2 fPosition;

    void main()
    {
        gl_Position = vec4(Position, 0, 1);
        fPosition = Position;
    }

片段:

    #version 450
    
    layout(location = 0) in vec2 fPosition;
    layout(location = 0) out vec4 fColor;

    void main() {
        vec4 colors[4] = vec4[](
            vec4(1.0, 0.0, 0.0, 1.0), 
            vec4(0.0, 1.0, 0.0, 1.0), 
            vec4(0.0, 0.0, 1.0, 1.0), 
            vec4(0.0, 0.0, 0.0, 1.0)
        );

        fColor = vec4(1.0);

        for(int row = 0; row < 2; row++) {
            for(int col = 0; col < 2; col++) {
                float dist = distance(fPosition, vec2(-0.50 + col, 0.50 - row));
                float delta = fwidth(dist);
                float alpha = smoothstep(0.45-delta, 0.45, dist);
                fColor = mix(colors[row*2+col], fColor, alpha);
            }
        }
    }

但是在编译时出现以下错误:

无法从'gl_Position 4-component vector of float Position'转换为''layout(location=0)smooth out highp 2-component vector of float'

我不知道如何解决它。 (这是我第一次做着色器编程)。
如果需要更多信息,请告诉我。

【问题讨论】:

    标签: fragment-shader vertex-shader spir-v


    【解决方案1】:

    1. 在顶点着色器和片段着色器之间传输变量时不需要指定布局。删除顶点和片段着色器中fPosition 变量的layout(location = 0) 参数。

    2. 如果您通过缓冲区将变量(您的位置缓冲区)传递给顶点着色器,则只需指定layout。此外,位置、法线和纹理坐标等变量必须始终先通过顶点着色器,然后再通过片段着色器。

    3. 从片段着色器导出最终颜色(在您的情况下为fColor)时,您不需要传递位置,只需将vector4变量指定为out vec4 fColor; openGL 会自动检测到它。

    4. 您实际遇到的错误是告诉您正在将 vector4 变量 (fColor) 分配给已存储的 vec2 变量 (fPosition)。注意:在属性(位置)“0”的顶点着色器中,您访问了已加载的顶点,但您稍后在片段着色器中尝试将 vector4 分配给同一位置。 OpenGL 不会自动覆盖这样的数据。

    【讨论】:

    • 我强烈建议您查看GLSL Shading Language (OpenGL) 教程。网上有很多,如果你不喜欢看很多书,可以搜索 Youtube;许多 Youtuber 都做过 3D 游戏教程。请参阅 ThinMatrix 关于着色器的 OpenGL 教程(视频 4 和 5)link
    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多