Opengl ES 3.0着色器功能在Nexus 5 / KitKat 4.4上未实现

时间:2013-11-30 20:27:12

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

我没有运气使用我的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上的工作方式相同。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

结果我在使用eglCreateContext时也必须使用EGL_CONTEXT_CLIENT_VERSION:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

问题中的所有功能均受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);

参考:glCreateProgram glShaderSource glCompileShader

有了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:我们可以省略EGL_RENDERABLE_TYPE的{​​{1}}属性

EGL_RENDERABLE_TYPE

  

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

EGL_OPENGL_ES_BIT

  

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

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

  

EGLConfig的属性没有排序...   EGL_CONFORMANT,... EGL_RENDERABLE_TYPE

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

参考:eglChooseConfig

eglChooseConfig()脚注起

  

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

参考:eglCreateContext

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

我认为设备制造商不希望实现EGL和ES版本相关的功能,因此将eglCreateContext()eglCreateContext() 可能会返回可以与ES 3.x一起使用的上下文,但这取决于运气。

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

如果源代码线包含ES 3.x功能并与libGLESv2链接,则链接器最近会抱怨未定义的引用。