Bonjour à tous,
Je démarre sous OpenGL 4 et j'éprouve quelques difficultés aujourd'hui à mettre à niveau mon chargeur d'Obj (Wavefront).
Avant j'utilisais 3 tableaux séparés (position, texcoord et normals) + 1 tableau de Poly (face) correspondant aux indices des points à tracer.
Le problème est que l'index est différent entre points, texcoord et normals puisqu'une face s'exprime sous la forme:
f pos1/tex1/norm1 pos2/tex2/norm2 pos3/tex3/norm3 et que pos1!=tex1!=norm1
J'ai galéré pas mal de temps jusqu'à comprendre qu'on ne peut pas avoir un buffer d'index différent pour 2 attributs. Soit...
Après un gros travail, j'ai reconstruit un type de vertex du style :
struct cVertex
{
cVector3f position;
cVector2f texCoord;
cVector3f normal;
}
Quand je créé mes buffers, je fais un :
Mais à l'affichage, j'ai besoin de changer de texture de temps en temps, à divers endroits du buffer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 glGenBuffers(1, &mesh->VB); glBindBuffer(GL_ARRAY_BUFFER, mesh->VB); glBufferData(GL_ARRAY_BUFFER, sizeof(cVertex) * mesh->nbVertex, &mesh->vVertexList[0], GL_STATIC_DRAW); glGenBuffers(1, &mesh->IB); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->IB); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * mesh->nbIndx, &mesh->vIndxList[0], GL_STATIC_DRAW);
Pourquoi ne pas découper le buffer en plusieurs morceaux ? Si je change 15 fois de texture et que je balance 15 sous-buffer, même si je peux envoyer qu'une partie de mes indexes, je devrais envoyer complètement les vertex !
Enfin, je dis ça... je ne sais pas - j'ai un peu de mal à comprendre ce que fait chaque fonction en dehors des classiques tutoriaux où je n'ai pas trouvé de secours.
En gros, si je fais cela :
Si oui, peut-on limiter le glDrawElements et le lancer plusieurs fois avec plus textures sans refaire un glVertexAttribPointer?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 glEnableVertexAttribArray(0); // Position glEnableVertexAttribArray(1); // texCoord glEnableVertexAttribArray(2); // Normals for (unsigned int i = 0 ; i < mesh->nbElem ; i++) { glBindBuffer(GL_ARRAY_BUFFER, mesh->VB); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cVertex), 0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(cVertex), (const GLvoid*)12); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(cVertex), (const GLvoid*)20); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->IB); // Changement de texture ICI glDrawElements(GL_TRIANGLES, mesh->vElemList[i].indxE-mesh->vElemList[i].indxB, GL_UNSIGNED_INT, 0); } glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2);
A moins que le glVertexAttribPointer soit indolore et ne renvoi qu'un pointeur comme son nom l'indique et pas l'ensemble des vertex...
Je suis un peu perdu, please aider me
Greg








Répondre avec citation



Partager