我没有运气使用我的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上的工作方式相同。
任何帮助将不胜感激!
答案 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中的大部分定义。
链接库取决于所需的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()
脚注起
可能无法满足请求的属性,但需要上下文 创建仍然可以成功。
NB2: 创建ES 2.x上下文并不意味着我们可以将其用于ES3.x。
我认为设备制造商不希望实现EGL和ES版本相关的功能,因此将eglCreateContext()
与eglCreateContext()
可能会返回可以与ES 3.x一起使用的上下文,但这取决于运气。
并非总是如此,但libGLESv3只是libGLESv2的符号链接,在某些设备上以及某些Android版本中。在过去,它是作为临时错误修复程序链接的,这给我们带来了许多与版本相关的混乱。
如果源代码线包含ES 3.x功能并与libGLESv2链接,则链接器最近会抱怨未定义的引用。