2014-07-21 72 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」,所以我真的很害怕它爲什麼不起作用。你們有什麼建議嗎? –