6

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

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 上。

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

4

2 回答 2

4

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

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

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

precision mediump float;
于 2013-06-25T22:25:30.310 回答
3

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

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

precision mediump float;
uniform highp vec4 uniformColor;

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

当我终于注意到它时,错误消息非常有用:Symbol uEcLightPos defined with different precision in vertex and fragment shaders.

于 2013-10-12T19:51:43.070 回答