Android NDK r9中的OpenGL ES 3.0

时间:2013-07-27 20:40:02

标签: opengl-es android-ndk opengl-es-3.0

最近的Android NDK r9推出了对OpenGL ES 3.0的支持。有一个示例samples/gles3jni演示了如何从JNI /本机代码中使用OpenGL ES 3.0。样本可以通过两种不同的方式构建:

  • 与API级别11及更高版本兼容
  • 要求API级别18或更高版本。

这两个版本都包含一个OpenGL ES 2.0回退路径,适用于不支持OpenGL ES 3.0的设备。但是,在第一个案例中,使用LOCAL_LDLIBS选项-lGLESv2静态链接到OpenGL ES 2。在第二种情况下,它以相同的方式与GLES 3静态链接。

初始化如下:

const char* versionStr = (const char*)glGetString(GL_VERSION);
if (strstr(versionStr, "OpenGL ES 3.") && gl3stubInit()) {
    g_renderer = createES3Renderer();
} else if (strstr(versionStr, "OpenGL ES 2.")) {
    g_renderer = createES2Renderer();
}

如何省略静态链接并从.so动态加载GLES 2或3?

2 个答案:

答案 0 :(得分:1)

我没有4.3设备来测试它,但我的理解是第一种方法实际上使用了GLES 3(如果可用),所以它相当于动态链接libGLESv3。

也可以使用libglesxx.so动态链接,但是你没有快捷方式,并且必须使用你所使用的所有函数。这不值得,恕我直言。

答案 1 :(得分:1)

在API 18及更高版本中,您可以使用eglGetProcAddress动态查询ES 2.0函数,就像ES 3.0函数示例中的gl3stub.c一样。在API 18之前,您需要执行以下操作:

// global scope, probably a header file
extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetString) (GLenum name);
extern GL_APICALL GLenum (* GL_APIENTRY glGetError) (void);
...

// initialization code
void* libGLESv2 = dlopen("libGLESv2.so", RTLD_GLOBAL | RTLD_NOW);
glGetString = dlsym(libGLESv2, "glGetString");
glGetError = dlsym(libGLESv2, "glGetError");
...

当然,在dlopen和dlsym调用上添加错误检查。

但是,我不确定你为什么要这样做。 libGLESv2.so出现在您可能想要定位的任何Android版本上,不应该有任何不利的链接。