Android 上的 OpenGL ES GLSL 着色器未加载正确版本?

t2k*_*316 2 android opengl-es glsl glsles

我正在使用 GLES 2.0 ( http://maninara.blogspot.com/2012/09/render-camera-preview-using-opengl-es.html )渲染相机预览。它工作得很好,直到我从其他地方复制了一些 GLSL 着色器代码并注意到它不起作用并且我收到此错误:

error C7502: OpenGL does not allow type suffix 'f' on constant literals in versions below 120
Run Code Online (Sandbox Code Playgroud)

因此,要查看问题是否出自我复制的着色器代码,我将顶点着色器示例(请参见上面的链接)中的这一行从

gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 )
Run Code Online (Sandbox Code Playgroud)

gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0f, 1.0f )
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。我已经通过输出 GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION) 来确认 GLSL 的版本足够高,它给出:

GLSL Version = OpenGL ES GLSL ES 3.10
Run Code Online (Sandbox Code Playgroud)

我是否错误地设置了 OpenGL ES 上下文?这里发生了什么?

更新:如果我添加“#version 120”,我会收到这个错误:

error C0201: unsupported version 120
Run Code Online (Sandbox Code Playgroud)

der*_*ass 5

你为什么要添加f后缀时,编译没有告诉你,这是支持?这些后缀实际上在 GLSL 中没有任何意义,并且文字在默认情况下是单精度的 - 有lf双精度的后缀。

f着色器中的其他地方似乎有一些后缀,并且在删除该后缀之前它不会编译。

我已经通过输出 > GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION) 来确认 GLSL 的版本足够高,它给出:

GLSL 版本 = OpenGL ES GLSL ES 3.10

这只是说该实现最多支持 GLSL ES 3.10,而不是您正在使用它。如果#version着色器源中没有指令,#version 100 ES则将使用默认值。

  • @t2k32316:`#version 120` 适用于 _desktop_ GL,而不是 GLES。在 GLES 中只有 100、300 和 310。 (2认同)