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

OpenGL ES GLSL shader on Android not loading correct version?

我按照这个示例使用 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

因此,为了查看问题是否出自我复制的着色器代码,我将顶点着色器示例中的这一行(参见上文 link)从

更改为
gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 )

gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0f, 1.0f )

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

GLSL Version = OpenGL ES GLSL ES 3.10

我是否错误地设置了 OpenGL ES 上下文?这是怎么回事?

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

error C0201: unsupported version 120

当编译器确实告诉您 支持时,您为什么添加 f 后缀?这些后缀实际上在 GLSL 中没有任何意义,无论如何默认情况下文字都是单精度的 - 双精度有 lf 后缀。

似乎在该着色器的其他地方有一些 f 后缀,并且在删除后才能编译。

I've confirmed GLSL's version is high enough by outputting > GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION) which gives:

GLSL Version = OpenGL ES GLSL ES 3.10

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