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

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

我有些困惑,因为从网上复制和粘贴示例会导致出现错误。


你尝试过明确指定精度(lowpmediump等)吗?另外,在着色器编译时你得到了什么错误信息? - keaukraine
发布错误信息。 - borrrden
我不知道你需要为uniform指定一个。这里没有指定:http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/uniform.php而且调用GetShader没有返回true状态。 - reza
是的,这只是我的猜测。详细的编译错误信息可能会有所帮助。 - keaukraine
1
我如何从iOS中获取详细的编译错误?实际上,我是通过调整他们的OpenGLES20Example在Monotouch/Xamarin上编译代码的。 - reza
2个回答

4
在OpenGL ES中,片元着色器不存在默认的浮点精度限定符。使用任何浮点指针变量都需要一个精度限定符,无论是uniform、varying还是本地变量。顶点着色器有一个默认的精度限定符,因此你不需要在那里添加任何限定符。
在OpenGL中,精度限定符是不必要的,这就是为什么你所指向的示例没有包含它们的原因。
尝试将以下代码添加到你的着色器顶部,应该可以解决问题:
precision mediump float;

3
我曾经遇到过同样的问题,它确实与缺失精度有关,但问题在于如果一个uniform被顶点和片元着色器共享,它必须具有相同的精度(至少在ES 2.0中是这样)。我想这很合理,因为它们在着色器之间共享。
由于顶点着色器的默认精度是“highp”,因此片元着色器中此uniform的精度也需要是“highp”,如下所示:
precision mediump float;
uniform highp vec4 uniformColor;

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

当我最终注意到它时,错误信息非常有用:符号uEcLightPos在顶点和片段着色器中定义的精度不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接