2014-07-21 6 views
5

Sto provando a scrivere del codice che usi VAO in C++ usando l'NDK di Android per compilare. Mi aspetto di poter utilizzare glDeleteVertexArraysOES, glGenVertexArraysOES e glBindVertexArrayOES.Gli oggetti array Vertex sono supportati in Android OpenGL ES 2.0 utilizzando le estensioni?

Sono incluse le intestazioni per OpenGL ES 2 e le estensioni nella mia intestazione.

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

sono anche link a OpenGL ES 2 in Android.mk.

LOCAL_LDLIBS += -lGLESv2 

Ma per qualche ragione, quando il codice viene collegata, viene a mancare.

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

Il linker non include GLES2/gl2ext.h?

+0

Ho controllato le librerie NDK e l'unica libreria in cui ho trovato quelle chiamate (usando il comando 'nm' su Linux) era la libreria GLESv3. Ovviamente ha le chiamate senza "OES" nel nome perché questa è la funzionalità principale in ES 3.0. Ma il modulo con 'OES' si trova nella stessa libreria. Trovo che sia piuttosto sconcertante. Immagino che potresti provare ad aggiungere '-lGLESv3' alla fine di' LOCAL_LDLIBS', e vedere se succede qualcosa di orribile. Sicuramente non sembrerebbe una buona idea in generale. –

+0

La cosa divertente è che -lGLESv3 funziona davvero. Il mio problema: voglio eseguirlo sull'emulatore, che non supporta OpenGL ES 3. –

risposta

7

La biblioteca GLES2 che viene fornito con NDK possono includere solo le chiamate standard OpenGL ES 2.0, senza eventuali estensioni che possono o non possono essere supportati da ogni particolare dispositivo/produttore/autista ...

Mentre la maggior parte nuova i dispositivi supportano VAO, potresti dover ottenere da te le indicazioni sulle funzioni o ottenere una libreria binaria diversa (puoi estrarla dal tuo dispositivo o da qualche ROM).

ho dovuto ricorrere all'utilizzo di questo codice per ottenere i puntatori a funzione dal 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"); 

[...] 
} 

definisco questi puntatori a funzione all'interno di un oggetto statico. Ci possono essere modi migliori per farlo, ma questo ha funzionato per me finora.

Spero che questo aiuti.

+0

Quindi presumo che dovrei sbarazzarmi di #define GL_GLEXT_PROTOTYPES? –

+1

Per altri lettori: assicuratevi di '#includere ' per utilizzare il collegamento dinamico. –

+0

Per qualche motivo, il mio programma continua a non riconoscere "bindVertexArrayOES" ogni volta che cerco di usarlo. Tuttavia, riconosce "genVertexArraysOES", quindi sono davvero preoccupato del perché non funzioni. Avete qualche suggerimento? –

Problemi correlati