【问题标题】:OpenGL ES GLSL shader on Android not loading correct version?Android上的OpenGL ES GLSL着色器没有加载正确的版本?
【发布时间】:2015-05-09 10:27:25
【问题描述】:

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

所以要查看问题是否来自我复制的着色器代码,我在顶点着色器示例(参见上面的链接)中更改了这一行

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

【问题讨论】:

    标签: android opengl-es glsl glsles


    【解决方案1】:

    当编译器确实告诉您它支持时,您为什么要添加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

    【讨论】:

    • 复制的着色器代码使用“f”作为后缀,并没有使用#version 来指示某个着色器版本,而我从中复制的应用程序没有出现此错误.....
    • 这并没有改变我所说的。编译器对此错误是正确的。其他应用程序的功能完全未知。有许多不同的方法可以达到这个结果,但推测是没有用的。
    • @t2k32316: #version 120 ES 不存在
    • @t2k32316: #version 120 适用于 desktop GL,而不是 GLES。在 GLES 中只有 100、300 和 310。
    • 准确地说,f 后缀在 ES 2.0(100 es 着色器版本)中是不允许的,并且在 ES 3.0 及更高版本附带的 GLSL 版本中是合法的。尽管一些供应商的编译器也默默地接受了 ES 2.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多