【问题标题】:Opengl ES 3.0 shader functions unimplemented on Nexus 5/KitKat 4.4Nexus 5/KitKat 4.4 上未实现的 Opengl ES 3.0 着色器功能
【发布时间】:2013-11-30 20:27:11
【问题描述】:

我在我的 Nexus 5 w/KitKat 4.4 上使用任何 OpenGL 3.0 着色器函数都没有运气,我得到“称为未实现的 opengl es api”的函数,例如

glCreateProgram()
glShaderSource()
glCompileShader()

e.t.c.我在 OpenGL 上下文处于活动状态时执行所有调用。我无法想象这些功能不会实现,所以相信我一定做错了!我已经包括以下内容

<GLES3/gl3.h>
<GLES2/gl2ext.h>
<GLES3/gl3platform.h>

并且正在使用

-lGLESv3

在我的 LOCAL_LDLIBS 中。我注意到在 EGL/egl.h 中没有 EGL_OPENGL_ES3_BIT,所以在创建上下文时,如果我没有定义 EGL_RENDERABLE_TYPE,或者如果我使用 EGL_OPENGL_ES2_BIT,结果都是一样的。

关于我在哪里的更多信息,以防万一:我正在使用 OpenGL ES 3.0 和 NDK 将我的 OpenGL 游戏引擎从 Windows 移植到 Android。我的一切编译正常,没有错误,并且测试并验证了窗口化、GL 上下文管理、Android 生命周期集成和引擎的基本运行正常。我有一个基本场景,它简单地激活上下文,执行 glClearColour 然后交换缓冲区,每秒从黑色跳动到红色,它的工作原理与在 Windows 上相同。

任何帮助将不胜感激!

【问题讨论】:

    标签: android opengl-es shader android-4.4-kitkat opengl-es-3.0


    【解决方案1】:

    原来我在使用 eglCreateContext 时也必须使用 EGL_CONTEXT_CLIENT_VERSION:

    const EGLint attribs2[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
    context = eglCreateContext(displayHandle, config, NULL, attribs2);
    

    【讨论】:

      【解决方案2】:

      OpenGL ES 2.0 支持问题中的所有函数。

      glCreateProgram()
      glShaderSource()
      glCompileShader()
      

      EGL_CONTEXT_CLIENT_VERSION, 2 足以清除“调用未实现的 opengl es api”错误。所以,我认为Nexus5上的ES默认版本小于2,是造成这个问题的原因。

      const EGLint attribs2[] = 
      {
          EGL_CONTEXT_CLIENT_VERSION, 3, // ES 3.x
          // EGL_CONTEXT_CLIENT_VERSION, 2, // if you want to use ES 2.x
          EGL_NONE
      };
      context = eglCreateContext(displayHandle, config, EGL_NO_CONTEXT, attribs2);
      

      参考:glCreateProgramglShaderSourceglCompileShader

      有了EGL_RENDERABLE_TYPE,我们就有了EGL_OPENGL_ES3_BIT_KHR,这需要EGL 1.4。 EGL_OPENGL_ES3_BIT_KHR 在 EGL/eglext.h 中定义。

      包括 EGL/eglext.h

      #include <EGL/egl.h>
      #include <EGL/eglext.h>
      
      #include <GLES3/gl3.h>
      

      并将EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR 传递给eglChooseConfig()

      const EGLint attribs1[] = 
      {
          EGL_RED_SIZE, 8,
          EGL_GREEN_SIZE, 8,
          EGL_BLUE_SIZE, 8,
          //EGL_ALPHA_SIZE, 8,
          //EGL_DEPTH_SIZE, 24, // if you want
          EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, // ES 3.x
          EGL_NONE
      };
      

      GLES3/gl3platform.h 包含在 GLES3/gl3.h 中。 GLES3/gl3.h 包含 GLES2/gl2.h 中的大部分定义。

      参考:EGL_KHR_create_context

      而链接库取决于你想要的 ES 版本。

      -lGLESv3
      

      NB1:我们可以省略eglChooseConfig()EGL_RENDERABLE_TYPE 属性

      EGL_RENDERABLE_TYPE

      一个位掩码,指示哪些类型的客户端 API 上下文帧 缓冲区配置必须支持使用 eglCreateContext 创建 ... 默认值为 EGL_OPENGL_ES_BIT。

      EGL_OPENGL_ES_BIT

      Config 支持创建 OpenGL ES 1.0 和/或 1.1 上下文。

      eglChooseConfig()返回的配置排序规则。

      EGLConfigs 不按属性排序... EGL_CONFORMANT, ... EGL_RENDERABLE_TYPE

      所以,我认为很少有依赖于 ES 版本的单独配置,但是eglChooseConfig() 可能会返回支持 ES 1.0/1.1 作为第一个配置。

      参考:eglChooseConfig

      来自eglCreateContext()脚注

      请求的属性可能无法满足,但上下文 创建可能仍然成功。

      参考:eglCreateContext

      NB2: 创建 ES 2.x 上下文并不意味着我们可以将它用于 ES 3.x。

      我认为设备制造商不想实现 EGL 和 ES 版本依赖的功能,所以 eglCreateContext()EGL_CONTEXT_CLIENT_VERSION, 2 可能会返回一个可以与 ES 3.x 一起使用的上下文,但这取决于命运。

      并非总是如此,但 libGLESv3 只是 libGLESv2 的符号链接,在某些设备上与某些 Android 版本。在过去,它是作为临时错误修复链接的,这给我们带来了许多与版本相关的困惑。

      如果源代码包含 ES 3.x 函数,并与 libGLESv2 链接,则链接器现在会抱怨未定义的引用。

      【讨论】:

        【解决方案3】:

        您似乎错误地创建了上下文。要在 Android 中使用 OpenGL ES 3.0,您必须创建通常的 ES 2.0 上下文,然后检查创建的上下文的版本。这就是我在 Java 代码中使用它的方式,它工作得很好。

        更多信息: https://plus.google.com/109538161516040592207/posts/iJmTjpUfR5E

        【讨论】:

        • 我看不到我做错了什么,here 是我的代码的粘贴。请注意,根据我上面的回答,它可以工作。在接受答案之前,我会等着看你是否认为我在做任何不必要的事情。
        • 之前的pastebin将EGL的版本打印为OpenGLES的版本,哎呀,这是个错误。然而,Android 开发人员指南中的here 说要按照我目前的方式进行操作,即在上下文创建期间传递属性 EGL_CONTEXT_CLIENT_VERSION,即使在 Java 中也是如此。如果失败,那么设备不支持请求的版本,那么我应该默认为 2.0。
        • 感谢您指出这种创建 GLES 3.0 上下文的方式。我只是没有这样用过。所以你的答案当然是正确的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多