最近的 Android NDK r9 推出了对 OpenGL ES 3.0 的支持。有一个示例 samples/gles3jni
演示了如何从 JNI/ native 代码使用 OpenGL ES 3.0。该示例可以通过两种不同的方式构建:
- 与 API 级别 11 及更高版本兼容
- 需要 API 级别 18 或更高版本。
两个版本都包含适用于不支持 OpenGL ES 3.0 的设备的 OpenGL ES 2.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?
最佳答案
在 API 18 及更高版本中,您可以使用eglGetProcAddress 动态查询 ES 2.0 函数,就像示例中的 gl3stub.c 对 ES 3.0 函数所做的那样。在 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 版本上,链接它应该不会有任何缺点。
关于opengl-es - Android NDK r9 中的 OpenGL ES 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902243/