2

为什么以下着色器未在 OpenGL(桌面)上编译 - 但在 OpenGL ES 2.0(iPhone)上运行良好(我使用相同的 c/c++ 代码在两个平台上加载、编译和链接着色器)。我的片段着色器:

varying lowp vec4 colorVarying;

void main()
{
    gl_FragColor = colorVarying;
}

顶点着色器:

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform float translate;

void main()
{
    gl_Position = position;
    gl_Position.y += sin(translate) / 2.0;

    colorVarying = color;
}

编译日志如下所示:

Shader compile log:
ERROR: 0:9: 'lowp' : syntax error syntax error
ERROR: Parser found no code to compile in source strings.
Failed to compile fragment shaderProgram validate log:
Validation Failed: Program is not successfully linked.
Failed to validate program: 1

有任何想法吗?

4

1 回答 1

5

在 GLSL 1.1 之前,lowpGLSL 规范中没有提到。在 GLSL 1.2(与 OpenGL 2.1 一起使用)lowp中,保留用于实现。在 GLSL 1.3 中(与 OpenGL 一起lowp开始被允许(但没有意义)。

因此,无论您在桌面上使用什么,似乎都只能识别旧版本的 GLSL。明显的解决方法是删除它,或者对于桌面,添加一个宏,如:

#ifdef DESKTOP
#define lowp
#endif

替换DESKTOP为在您在桌面上使用的任何环境中定义的某个标识符,而不是在您用于 iPhone 的任何环境中定义的标识符。

编辑:将其放入源代码本身可能并非易事。一种方法是这样的:

char const *shader = 

#ifdef DESKTOP
    "#define lowp\n"
#endif

"varying lowp vec4 colorVarying;\n"

/* ... */
;

这样,当且仅当在宿主环境中设置了 DESKTOP 时,“lowp”才会在着色器中被定义为空。

于 2011-01-29T07:52:45.573 回答