Opengl es GLSL lowp:语法错误

Opengl es GLSL lowp:语法错误,opengl-es,glsl,opengl-es-2.0,Opengl Es,Glsl,Opengl Es 2.0,为什么下面的着色器不是在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 c

为什么下面的着色器不是在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
char const *shader = 

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

"varying lowp vec4 colorVarying;\n"

/* ... */
;

有什么想法吗?

通过GLSL 1.1,GLSL规范中没有提到
低。
在GLSL1.2(与OpenGL2.1一起使用)中,
lowp
是为实现保留的。 在GLSL 1.3中(与OpenGL一起使用
lowp
)开始被允许(但没有意义)

因此,无论您在桌面上使用什么,似乎都只能识别较旧版本的GLSL。显而易见的修复方法是删除它,或者在桌面上添加一个宏,如:

#ifdef DESKTOP
#define lowp
#endif
DESKTOP
替换为在桌面上使用的任何环境中定义的标识符,而不是在iPhone上使用的任何环境中定义的标识符

编辑:将其输入源代码本身是非常重要的。一种方法如下:

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
char const *shader = 

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

"varying lowp vec4 colorVarying;\n"

/* ... */
;

这样,当且仅当在主机环境中设置了桌面时,着色器中的“lowp”将被定义为nothing。

实际上,如果使用该语言的更新功能,则必须在代码中指定尽可能多的内容:#版本130。否则(根据规范),GL编译器应该将其编译为110着色器。不幸的是,如果您输入#版本130,它将不再在OpenGL/ES上编译。如果您希望能够编写一个着色器,该着色器将使用单个“#版本300 ES”在其中之一上工作,则必须等待OpenGL/ES 3.0和OpenGL 4.2在着色器的顶部,您如何将该标识符放入着色器?从我所看到的,其中唯一定义的标识符是GL_ES,要放入其他内容,您必须将其作为另一个着色器字符串传递到
glShaderSource
。@rich.e:您通常在周围的源代码中执行
\ifdef
/
endif
,但是
#define lowp
实际上是一个字符串,连接到定义着色器的字符串前面。请参见编辑的示例。您将顶点着色器与片段着色器放错了位置。谢谢。您是对的