Opengl es Android NDK r9中的OpenGL ES 3.0
最近的Android NDK r9发布了对OpenGL ES 3.0的支持。有一个示例Opengl es Android NDK r9中的OpenGL ES 3.0,opengl-es,android-ndk,opengl-es-3.0,Opengl Es,Android Ndk,Opengl Es 3.0,最近的Android NDK r9发布了对OpenGL ES 3.0的支持。有一个示例samples/gles3jni,它演示了如何从JNI/本机代码中使用opengles3.0。可以通过两种不同的方式构建示例: 与API 11级及更高版本兼容 要求API等级18或更高 这两个版本都为不支持OpenGL ES 3.0的设备提供了OpenGL ES 2.0回退路径。但是,在第一种情况下,使用LOCAL\u LDLIBS选项-lGLESv2静态链接OpenGL ES 2。在第二种情况下,它以相同
samples/gles3jni
,它演示了如何从JNI/本机代码中使用opengles3.0。可以通过两种不同的方式构建示例:
- 与API 11级及更高版本兼容
- 要求API等级18或更高
LOCAL\u 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();
}
// 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");
...
我怎么能完全忽略静态链接并从
动态加载gle2或3呢?我没有4.3设备来测试它,但我的理解是,如果可用,第一种方法实际上使用了gle3,因此它相当于动态链接libGLESv3
也可以使用libglesxx.so进行动态链接,但是您没有快捷方式,必须对所有使用的函数进行dlsym。这不值得,IMHO。在API 18和更高版本上,您可以使用eglGetProcAddress动态查询ES 2.0函数,就像示例中的gl3stub.c对ES 3.0函数所做的那样。在API 18之前,您需要执行以下操作:
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();
}
// 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调用中添加错误检查
不过我不知道你为什么要这么做。Libblesv2.so存在于您可能想要针对的任何版本的Android上,链接它不应该有任何负面影响。请注意标签:是的,但它静态链接GLES2。它确实静态链接GLES2,但Libblesv2.so会将调用转发到v3。我看到了,目前正在这样做。然而,问题是在没有任何静态链接的情况下动态地选择GLES2和GLES3。libglesxx.so
有什么标准名称吗?问题是你为什么反对这个静态链接。我想知道如何改进我的应用程序。