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 链接,则链接器现在会抱怨未定义的引用。