Android中的OpenGL ES 3.0 r9
最近的Android NDK r9发布了对OpenGL ES 3.0的支持。有一个示例samples/gles3jni
,演示了如何使用来自JNI /本机代码的OpenGL ES 3.0。样品可以建立两种不同的方式:Android中的OpenGL ES 3.0 r9
- 兼容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();
}
我怎么能忽略静态链接都和负载GLES 2或3动态地从.so
?
我没有4.3设备来测试它,但我的理解是,第一种方法实际上使用GLES 3(如果可用),所以它相当于动态链接libGLESv3。
也可以使用libglesxx.so进行动态链接,但是您没有快捷方式,并且不得不dlsym您使用的所有函数。这不值得,恕我直言。
是的,但它将静态链接GLES2。 –
它会静态链接GLES2,但libGLESv2.so会将呼叫转发给v3。 –
我明白了,现在就这样做了。然而,问题是动态选择GLES2 vs GLES3而没有任何静态链接。有没有“libglesxx.so”的标准名称? –
在API 18及更高版本上,您可以使用eglGetProcAddress动态查询ES 2.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版本上,不应该存在链接反向的任何缺点。
请注意标签,请:http://meta.stackexchange.com/questions/190739/opengl-es-3-or-opengl-es-3-0-tag?noredirect=1#comment591924_190739 –