使用扩展在Android OpenGL ES 2.0中支持顶点数组对象吗?
我想写一些使用Android NDK编译C++中的VAO的代码。我期望能够使用glDeleteVertexArraysOES
,glGenVertexArraysOES
和glBindVertexArrayOES
。使用扩展在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
?
其被包含在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");
[...]
}
我定义一个静态对象中,这些函数指针。可能有更好的方法来做到这一点,但迄今为止,这对我来说已经奏效了。
希望这会有所帮助。
所以我想我应该摆脱#define GL_GLEXT_PROTOTYPES? –
对于其他读者:一定要'#include
出于某种原因,我的程序在我尝试使用它时仍然无法识别“bindVertexArrayOES”。然而,它确实承认“genVertexArraysOES”,所以我真的很害怕它为什么不起作用。你们有什么建议吗? –
我检查了NDK库,我发现这些调用的唯一库(在Linux上使用'nm'命令)是GLESv3库。它明显具有名称中没有'OES'的调用,因为这是ES 3.0中的核心功能。但带有'OES'的表单在同一个库中。我觉得有点令人费解。我想你可以尝试在LOCAL_LDLIBS末尾添加'-lGLESv3',看看是否有什么可怕的事情发生。一般来说,这绝对不是一个好主意。 –
有趣的是,-lGLESv3实际上起作用。我的问题:我想在模拟器上运行它,它不支持OpenGL ES 3. –