这是一个奇怪的问题。如果我尝试将统一颜色传递给片段着色器,则会出现编译错误
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上。
我有点困惑,因为从网上复制和粘贴示例会给我带来错误。
答案 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.