2012-10-26 2 views
3

J'essaie d'utiliser les VBO pour restituer un carré texturé 2d normal sur un FBO. Les fonctions du mode immédiat fonctionnent parfaitement mais pas ce VBO. GL_TEXTURE_2D est déjà activé pour le code. Qu'est-ce qui va pas avec ça?Un simple objet tampon Vertex (C++) qui ne rend pas

unsigned int VBOid = 0; 
unsigned int Iid = 0; 

float *geometry; 
unsigned int *indices; 

int num_geometry = 1; 
int num_vertices = 4; 
int num_indices = num_geometry*num_vertices; 
geometry = new float[num_geometry*num_vertices*4]; 
indices = new unsigned int[num_indices]; 

indices[0] = 0; 
indices[1] = 1; 
indices[2] = 2; 
indices[3] = 3; 

/* Fill geometry: 0, 1, = vertex_xy 
*    2, 3 = tex_coord_uv 
*/ 
geometry[0] = 0.0f; 
geometry[1] = 0.0f; 
geometry[2] = 0.0f; 
geometry[3] = 0.0f; 

geometry[4] = 50.0f; 
geometry[5] = 0.0f; 
geometry[6] = 1.0f; 
geometry[7] = 0.0f; 

geometry[8] = 50.0f; 
geometry[9] = 50.0f; 
geometry[10] = 1.0f; 
geometry[11] = 1.0f; 

geometry[12] = 0.0f; 
geometry[13] = 50.0f; 
geometry[14] = 0.0f; 
geometry[15] = 1.0f; 

glGenBuffers(1, &VBOid); 
glBindBuffer(GL_ARRAY_BUFFER, VBOid); 
glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), geometry, GL_STATIC_DRAW); 

glGenBuffers(1, &Iid); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Iid); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

//GL_TEXTURE_2D is already enabled here 
//Buffers are already bound from above 

glBindTexture(GL_TEXTURE_2D, 2); //I used 2 just to test to see if it is rendering a texture correctly. Yes, 2 does exist in my program thats why i arbitrarily used it 
//glClientActiveTexture(GL_TEXTURE0); I dont know what this is for and where to put it 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
//glActiveTexture(GL_TEXTURE0); same here I dont know what this is for or where to put it 
glVertexPointer(2, GL_FLOAT, sizeof(GLfloat)*4, 0); 
glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*4, (float*)(sizeof(GLfloat)*2)); 

glDrawElements(GL_QUADS, num_indices, GL_UNSIGNED_INT, indices); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
+0

'sizeof (geometry)' comme taille de buffer dans 'glBufferData' est la première erreur évidente que je peux voir. Cela retournera toujours la taille de votre pointeur '(4)'. Aussi, pourquoi définissez-vous des valeurs z à 0 et d'autres à 1? Vous devriez vraiment faire fonctionner votre débogueur et vérifier ligne par ligne ce que vous envoyez à GL ... – Grimmy

+0

et ce sont les coordonnées UV de la texture. La syntaxe est de 2 UV pour chaque xy – sgtHale

+0

@ user1775989 Avez-vous réellement lu la première partie de son commentaire (qui correspond exactement à votre problème, comme indiqué dans ma réponse) ou seulement sa seconde partie non pertinente? –

Répondre

3

Le problème est votre utilisation de sizeof(geometry) (et même pour indices) à l'intérieur des glBufferData appels. Ces variables ne sont en fait que des pointeurs, peu importe si elles pointent vers des tableaux alloués dynamiquement (que le compilateur ne connaît pas). Ainsi, vous aurez toujours la taille d'un pointeur (4 ou 8 octets, selon la plateforme).

Remplacez sizeof(geometry) par num_geometry*num_vertices*4*sizeof(float) et sizeof(indices) par num_indices*sizeof(unsigned int). Eh bien, en fait, vous n'avez pas besoin indices ici du tout et peut tout simplement dessiner le tout avec un simple

glDrawArrays(GL_QUADS, 0, 4); 

toujours être au courant des différences entre un tableau réel (taille de compilation) et un simple pointeur pointant vers un tableau alloué dynamiquement, avec le résultat de l'opérateur sizeof étant un de ces différences (et l'exigence de libérer la mémoire de ce dernier en utilisant delete[] à un moment ultérieur étant une autre différence, mais non moins importante,).

Questions connexes