opengl-es - Android NDK r9 中的 OpenGL ES 3.0

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

最近的 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/

相关文章:

android - AssetManager 无法在 NDK 中运行

iphone - 在 iPad 上流畅书写

android - 在 ffmpeg-android 中执行 build.sh 时出错

android - 如何使用 .so 文件在 android 应用程序中为我的自定义视频编解码器创建 .apk 文件

机器人/位图.h : No such file or directory (after updating Android SDK tools to revision 14)

opengl-es - 如何在opengles 3.0中实现多个渲染目标

Android OpenGL ES 3.0 PBO 而不是 glReadPixels()

ios - iOS OpenGLES 上 DisparityFloat16 像素格式的纹理采样器值

android - 通过 MappedByteBuffer 将原始 VBO 数据加载到 OpenGL(不工作)

c++ - Open gl es - 如何提高性能、渲染到纹理、混合