2011-10-03 3 views
0

J'essaye de passer de l'affichage de mon GL_QUADS avec glBegin() à leur affichage avec un VBO. Malheureusement après mon changement, le programme n'affiche plus les QUADS. Tout ce que je vois est un écran noir. C'est ce que je suis en train de faire:OpenGl - L'objet tampon Vertex n'est pas dessiné à l'écran

Je définis deux VBO. Un pour les données de sommet, l'un des indices, et allouer un espace en eux:

glGenBuffersARB(2, pboIds); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, pboIds[0]); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 50000*sizeof(GLfloat), 0, GL_STREAM_DRAW_ARB); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, pboIds[1]); 
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 50000*sizeof(GLint), 0, GL_STREAM_DRAW_ARB); 

Je leur carte et écrire des informations sur les:

float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int *ptrind = (int*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int nVertexCount=0; 
for (...){ 
    *ptr=vertX; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertY; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertZ; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
} 
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); 
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); 

Enfin, je tente de les afficher:

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glDrawElements(GL_QUADS, nVertexCount, GL_INT, (pboIds+1)); 
glDisableClientState(GL_VERTEX_ARRAY); 

Mon programme compile très bien. Je ne reçois aucun crash lors de l'exécution. Mais tout ce que je vois - est un écran noir. J'utilise la même routine pour déterminer les coordonnées de vertex comme je l'ai fait avec glBegin (GL_QUADS). À l'époque, je pouvais voir des quads blancs sur l'écran. Peut-être que je fais quelque chose de mal dans mon code VBO?

EDIT: Malheureusement, je suis sous Windows. Dois-je faire quelque chose pour arrêter d'utiliser l'extension ARB? Je que d'un exemple de code:

#ifdef _WIN32 
PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0; 
PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0; 
PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0; 
PFNGLBUFFERSUBDATAARBPROC pglBufferSubDataARB = 0; 
PFNGLDELETEBUFFERSARBPROC pglDeleteBuffersARB = 0; 
PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameterivARB = 0; 
PFNGLMAPBUFFERARBPROC pglMapBufferARB = 0; 
PFNGLUNMAPBUFFERARBPROC pglUnmapBufferARB = 0; 
#define glGenBuffersARB   pglGenBuffersARB 
#define glBindBufferARB   pglBindBufferARB 
#define glBufferDataARB   pglBufferDataARB 
#define glBufferSubDataARB  pglBufferSubDataARB 
#define glDeleteBuffersARB  pglDeleteBuffersARB 
#define glGetBufferParameterivARB pglGetBufferParameterivARB 
#define glMapBufferARB   pglMapBufferARB 
#define glUnmapBufferARB   pglUnmapBufferARB 
#endif 
+0

Avec le nouveau code VBO, définissez-vous toujours la couleur actuelle via 'glColor()'? – genpfault

+0

@ genpfault: Je pense que je ne définis aucune couleur. Devrais-je? EDIT: J'ai fait un essai avec glColor3f (1.0f, 1.0f, 1.0f); toujours tout noir, aucun signe de GL_QUADS. – Fejwin

+0

'for (...) {' Qu'est-ce que le '...' ici? –

Répondre

2

glDrawElements (GL_QUADS, nVertexCount, GL_INT, (pboIds + 1));

Vous ne transmettez pas le nom de l'objet tampon à cette fonction. Il utilise tout objet tampon qui se trouve lié à GL_ELEMENT_ARRAY_BUFFER à ce moment. Cette valeur est le décalage par rapport au début du tampon; il spécifie où le premier index est.

De même, arrêtez d'utiliser la version d'extension ARB des objets de la mémoire tampon. Utilisez juste les trucs de base.


Malheureusement, je suis sous windows.

Je ne vois pas ce que cela a à voir avec ça. Utilisez un OpenGL loading library si vous ne pouvez pas do it yourself.

+0

Pour ajouter à la réponse de Nicol Bolas, le dernier paramètre ressemble généralement à 'BUFFER_OFFSET (youroffset)', après avoir fait quelque chose comme '#define BUFFER_OFFSET (i) ((char *) NULL + (i))'. Personnellement, j'essaie d'éviter les définitions en C++, mais vous voyez souvent cela définir dans un exemple de code. – luke

+0

voir ma vérification ci-dessus. – Fejwin

+0

@Fejwin: Voir ma modification. –

Questions connexes