将统一颜色传递给片段着色器(openGL ES 2.0)

时间:2013-06-25 06:44:04

标签: ios opengl-es-2.0 glsl uniform varying

这是一个奇怪的问题。如果我尝试将统一颜色传递给片段着色器,则会出现编译错误

uniform vec4 uniformColor;

void main(){
   gl_FragColor = uniformColor;
}

但是,如果我将相同的均匀颜色传递给顶点着色器,然后通过变化将其传递给片段着色器,那么它可以正常工作..

    attribute vec4 position;
    uniform mat4 matrix;
    uniform vec4 uniformColor;
    varying vec4 fragmentColor; 
    void main()
    {
        gl_Position = matrix * position;
        fragmentColor = uniformColor;
    }

varying lowp vec4 fragmentColor;
void main()
{
  gl_FragColor = fragmentColor;
}

这是在iOS上。

我有点困惑,因为从网上复制和粘贴示例会给我带来错误。

2 个答案:

答案 0 :(得分:4)

OpenGL ES中的片段着色器没有默认的float精度限定符。使用任何浮动指针变量都需要精度限定符 - 它是统一的,变化的还是仅仅是局部变量并不重要。顶点着色器有一个默认精度,因此您无需在那里添加任何限定符。

在OpenGL中,不需要精度限定符,这就是您指向的示例不包含它们的原因。

尝试将此添加到着色器的顶部,您应该没问题:

precision mediump float;

答案 1 :(得分:1)

我有同样的问题,它确实与缺失的精度相关,但问题是如果在顶点和片段着色器之间共享一个统一,它必须具有相同的精度(至少在ES 2.0中)。我认为这是有道理的,因为它们在着色器之间共享。

由于顶点着色器的默认精度为highp,因此片段着色器中此统一的精度也必须为highp,如下所示:

precision mediump float;
uniform highp vec4 uniformColor;

或者,您可以在顶点着色器中将精度更改为mediump。

当我最终注意到它时,错误信息非常丰富:Symbol uEcLightPos defined with different precision in vertex and fragment shaders.