【问题标题】:OpenGL ES 3.0 in Android NDK r9Android NDK r9 中的 OpenGL ES 3.0
【发布时间】:2013-07-27 20:40:02
【问题描述】:

最近的 Android NDK r9 推出了对 OpenGL ES 3.0 的支持。有一个示例samples/gles3jni 演示了如何从 JNI/native 代码中使用 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?

【问题讨论】:

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


【解决方案1】:

在 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 版本上,链接它不应该有任何不利之处。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,但它静态链接 GLES2。
    • 它会静态链接 GLES2,但 libGLESv2.so 会将调用转发到 v3。
    • 我看到并且目前正在这样做。然而,问题是在没有任何静态链接的情况下动态选择 GLES2 与 GLES3。 libglesxx.so 有标准名称吗?
    • 问题是你为什么反对这种静态链接
    • 正在寻找如何改进我的应用程序的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2011-06-09
    • 2011-04-26
    • 2011-09-14
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多