2014-07-21 10 views
5

Próbuję napisać kod, który używa VAO w C++ przy użyciu Androida NDK do kompilacji. Oczekuję, że będę mógł używać glDeleteVertexArraysOES, glGenVertexArraysOES i glBindVertexArrayOES.Czy obiekty tablicy wierzchołkowej są obsługiwane w systemie Android OpenGL ES 2.0 z rozszerzeniami?

Dołączam nagłówki dla OpenGL ES 2 i rozszerzenia w moim nagłówku.

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

Jestem również linkami do OpenGL ES 2 w Android.mk.

LOCAL_LDLIBS += -lGLESv2 

Ale z jakiegoś powodu, gdy kod jest podłączony, nie powiedzie się.

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

Czy linker nie zawiera GLES2/gl2ext.h?

+0

Sprawdziłem biblioteki NDK i jedyną biblioteką, w której znalazłem te wywołania (za pomocą polecenia 'nm' na Linuksie) była biblioteka GLESv3. Oczywiście ma połączenia bez nazwy "OES" w nazwie, ponieważ jest to podstawowa funkcjonalność w ES 3.0. Ale formularz z 'OES' znajduje się w tej samej bibliotece. Uważam, że to trochę zagadkowe. Sądzę, że możesz spróbować dodać '-glGLvv3' na końcu' LOCAL_LDLIBS' i sprawdzić, czy dzieje się coś strasznego. Zdecydowanie nie będzie to dobry pomysł. –

+0

Najśmieszniejsze jest to, że -GLGLewv3 faktycznie działa. Mój problem: chcę uruchomić go na emulatorze, który nie obsługuje OpenGL ES 3. –

Odpowiedz

7

Biblioteka GLES2 że zostanie dołączony NDK może zawierać tylko standardowe OpenGL ES 2.0 połączeń, bez żadnych rozszerzeń, które mogą lub nie mogą być obsługiwane przez każdego konkretnego urządzenia/Producent/kierowcy ...

Chociaż większość nowych urządzenia obsługują VAO, może być konieczne pobranie wskaźników do funkcji lub uzyskanie innej biblioteki binarnej (można ją wyodrębnić z urządzenia lub z jakiegoś ROM-u).

musiałem uciekać się do korzystania z tego kodu, aby uzyskać wskaźników funkcji z 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"); 

[...] 
} 

I zdefiniowanie tych wskaźników funkcji wewnątrz obiektu statycznego. Mogą istnieć lepsze sposoby robienia tego, ale jak dotąd to mi się udało.

Mam nadzieję, że to pomoże.

+0

Zakładam, że powinienem się pozbyć #define GL_GLEXT_PROTOTYPES? –

+1

Dla innych czytelników: pamiętaj, aby "#include " użyć dynamicznego linkowania. –

+0

Z jakiegoś powodu mój program nadal nie rozpoznaje "bindVertexArrayOES" za każdym razem, gdy próbuję go użyć. Jednak rozpoznaje "genVertexArraysOES", więc jestem bardzo podenerwowany, dlaczego nie działa. Czy macie jakieś sugestie? –