2013-07-27 46 views
2

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

+1

请注意标签,请:http://meta.stackexchange.com/questions/190739/opengl-es-3-or-opengl-es-3-0-tag?noredirect=1#comment591924_190739 –

回答

1

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

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

+1

是的,但它将静态链接GLES2。 –

+0

它会静态链接GLES2,但libGLESv2.so会将呼叫转发给v3。 –

+0

我明白了,现在就这样做了。然而,问题是动态选择GLES2 vs GLES3而没有任何静态链接。有没有“libglesxx.so”的标准名称? –

1

在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版本上,不应该存在链接反向的任何缺点。