2014-07-21 56 views
5

我想写一些使用Android NDK编译C++中的VAO的代码。我期望能够使用glDeleteVertexArraysOES,glGenVertexArraysOESglBindVertexArrayOES使用扩展在Android OpenGL ES 2.0中支持顶点数组对象吗?

我在OpenGL ES 2中包含头文件和头文件中的扩展名。

#define GL_GLEXT_PROTOTYPES 
#include <GLES2/gl2.h> 
#include <GLES2/gl2ext.h> 

我还链接到Android.mk的OpenGL ES 2。

LOCAL_LDLIBS += -lGLESv2 

但由于某些原因,当代码被链接时,它会失败。

undefined reference to 'glDeleteVertexArraysOES' 
undefined reference to 'glGenVertexArraysOES' 
undefined reference to 'glBindVertexArrayOES' 

链接器是否不包括GLES2/gl2ext.h

+0

我检查了NDK库,我发现这些调用的唯一库(在Linux上使用'nm'命令)是GLESv3库。它明显具有名称中没有'OES'的调用,因为这是ES 3.0中的核心功能。但带有'OES'的表单在同一个库中。我觉得有点令人费解。我想你可以尝试在LOCAL_LDLIBS末尾添加'-lGLESv3',看看是否有什么可怕的事情发生。一般来说,这绝对不是一个好主意。 –

+0

有趣的是,-lGLESv3实际上起作用。我的问题:我想在模拟器上运行它,它不支持OpenGL ES 3. –

回答

7

其被包含在NDK可以仅包括标准的OpenGL ES 2.0的呼叫,而不可以或可以不被每个特定的设备/制造商/驱动器支持的任何扩展的GLES2库...

虽然大多数新设备支持VAO,您可能必须自己获取指向函数的指针,或者获取不同的二进制库(可以从设备或某些ROM中提取它)。

我不得不求助于使用此代码从dylib得到函数指针:

//these ugly typenames are defined in GLES2/gl2ext.h 
PFNGLBINDVERTEXARRAYOESPROC bindVertexArrayOES; 
PFNGLDELETEVERTEXARRAYSOESPROC deleteVertexArraysOES; 
PFNGLGENVERTEXARRAYSOESPROC genVertexArraysOES; 
PFNGLISVERTEXARRAYOESPROC isVertexArrayOES; 

void initialiseFunctions() { 

//[check here that VAOs are actually supported] 

void *libhandle = dlopen("libGLESv2.so", RTLD_LAZY); 

bindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC) dlsym(libhandle, 
                 "glBindVertexArrayOES"); 
deleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC) dlsym(libhandle, 
                   "glDeleteVertexArraysOES"); 
genVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)dlsym(libhandle, 
                 "glGenVertexArraysOES"); 
isVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC)dlsym(libhandle, 
                "glIsVertexArrayOES"); 

[...] 
} 

我定义一个静态对象中,这些函数指针。可能有更好的方法来做到这一点,但迄今为止,这对我来说已经奏效了。

希望这会有所帮助。

+0

所以我想我应该摆脱#define GL_GLEXT_PROTOTYPES? –

+1

对于其他读者:一定要'#include '为了使用动态链接。 –

+0

出于某种原因,我的程序在我尝试使用它时仍然无法识别“bindVertexArrayOES”。然而,它确实承认“genVertexArraysOES”,所以我真的很害怕它为什么不起作用。你们有什么建议吗? –