Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es Android NDK r9中的OpenGL ES 3.0_Opengl Es_Android Ndk_Opengl Es 3.0 - Fatal编程技术网

Opengl es 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。在第二种情况下,它以相同

最近的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。在第二种情况下,它以相同的方式与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
有什么标准名称吗?问题是你为什么反对这个静态链接。我想知道如何改进我的应用程序。