Bonsoir je viens de m'apercevoir d'un problème gênant concernant l'envoi des données dans un VBO (opengl3.3).
Le problème c'est quand j'affiche un plan avec une texture, celle-ci ne s'affiche pas jusqu’à ce que j'ajoute les normal du plan mais pas n'importe quel normal!
des normals avec les UV de la texture, j'avoue je n'y comprend plus rien ! pire encore pas la peine que j'upload les données UV il suffit de mettre que les normals et j'ai ma texturé sur mon plan...
Voici un peux de code en espérant que vous trouveriez quelque chose j'ai passé toute la journée à essayer de trouver l'erreur mais rien a faire.
Création du plan
ensuite je crée un draw buffer pour m'afficher mon mesh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 mesh=MPGE_MeshNew(false);/* false= vbo non indexé*/ MPGE_MeshBufferAllocData(mesh->mbuffer,12,0,12);/*12=3*4 vertices, 0= 0 texcoords, 12=3*4 normals*/ MPGE_MeshBufferAddVertexData(mesh->mbuffer,MPGE_Vector3D(10,0,10)); MPGE_MeshBufferAddVertexData(mesh->mbuffer,MPGE_Vector3D(-10,0,10)); MPGE_MeshBufferAddVertexData(mesh->mbuffer,MPGE_Vector3D(-10,0,-10)); MPGE_MeshBufferAddVertexData(mesh->mbuffer,MPGE_Vector3D(10,0,-10)); /* aucun effet si je rajoute ce code la texture s'affiche malgré que je né pas envoyé de donneés UV MPGE_MeshBufferAddTexCoordData(mesh->mbuffer,MPGE_Vector3D(0,0,0)); MPGE_MeshBufferAddTexCoordData(mesh->mbuffer,MPGE_Vector3D(1,0,0)); MPGE_MeshBufferAddTexCoordData(mesh->mbuffer,MPGE_Vector3D(1,1,0)); MPGE_MeshBufferAddTexCoordData(mesh->mbuffer,MPGE_Vector3D(0,1,0)); */ MPGE_MeshBufferAddNormalData(mesh->mbuffer,MPGE_Vector3D(0,0,0)); MPGE_MeshBufferAddNormalData(mesh->mbuffer,MPGE_Vector3D(1,0,0)); MPGE_MeshBufferAddNormalData(mesh->mbuffer,MPGE_Vector3D(1,1,0)); MPGE_MeshBufferAddNormalData(mesh->mbuffer,MPGE_Vector3D(0,1,0));
Voila rien de méchant ici voici comment je créer mais vbo
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
20 db=MPGE_DrawBufferNew(3,false,MPGE_EDB_QUADS); MPGE_DrawBufferUploadGPU(db,mesh); /* ensuite je charge les shaders*/ sh=MPGE_ResourceGetShader("defaultVertexShader_texture.h"); fh=MPGE_ResourceGetShader("defaultFragmentShader_texture.h"); MPGE_ShaderManagerBind(&sh,&fh); MPGE_ShaderManagerSetAttributes(null,MPGE_EGL3VA_VERTEX,"inPosition",MPGE_EGL3VA_TEXTURE0,"inTexCoord"); MPGE_ShaderManagerUnbind(); /* ensuite affichage*/ MPGE_ShaderUse(sh,true); MPGE_Matrix4Mul(&m,MPGE_MatrixModelViewProjectionGetProjection(mvp),MPGE_MatrixModelViewProjectionGetModelView(mvp)); MPGE_ShaderSendMatrix4(sh,"mvpMatrix",&m); MPGE_ShaderSendInt(sh,"colorMap",0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,MPGE_ResourceGetTexture("box.jpg")->glID); MPGE_DrawBuffer(db); MPGE_ShaderUse(sh,false);
Fonction MPGE_VertexBufferUploadToGPU:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 db->vao.mode=db->drawMode; db->vao.vbuffer=&db->vbo; if(db->indexed) db->vao.ibuffer=&db->ibo; glBindVertexArray(db->vao.id); MPGE_VertexBufferUploadToGPU(&db->vbo,mesh->mbuffer->vertexData,mesh->mbuffer->texcoordData,mesh->mbuffer->normalData); glBindVertexArray(0);
Et enfin le rendu;
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 void MPGE_OPENGL3_API MPGE_VertexBufferUploadToGPU(MPGEVertexBuffer* vb,MPGEArrayf vertexData,MPGEArrayf texcoordData,MPGEArrayf normalData) { if(vertexData) vb->vertexSize = vertexData->size * sizeof(f32); if(texcoordData) vb->texcoordSize = texcoordData->size * sizeof(f32); if(normalData) vb->normalSize = normalData->size * sizeof(f32); if(vb->vertexSize > 0) { glBindBuffer(GL_ARRAY_BUFFER,vb->id[VERTEX_BUFFER]); glBufferData(GL_ARRAY_BUFFER,vb->vertexSize,vertexData->array,vb->type); glVertexAttribPointer(0,vb->dimension, GL_FLOAT, GL_FALSE, 0, 0); vb->hasVertex=true; if(normalData) { glBindBuffer(GL_ARRAY_BUFFER,vb->id[NORMAL_BUFFER]); glBufferData(GL_ARRAY_BUFFER,vb->normalSize,normalData->array,vb->type); glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 0, 0); vb->hasNormal=true; } if(texcoordData) { glBindBuffer(GL_ARRAY_BUFFER,vb->id[TEXCOORD_BUFFER]); glBufferData(GL_ARRAY_BUFFER,vb->texcoordSize,texcoordData->array,vb->type); glVertexAttribPointer(2,2, GL_FLOAT, GL_FALSE, 0, 0); vb->hasTexcoord=true; } } }
Merci d'avance...
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 void MPGE_OPENGL3_API MPGE_VertexArrayBindVertexBuffer(MPGEVertexArray* va) { glBindVertexArray(va->id); if(va->vbuffer->hasVertex) { glBindBuffer(GL_ARRAY_BUFFER, va->vbuffer->id[VERTEX_BUFFER]); glVertexAttribPointer(MPGE_EGL3VA_VERTEX,va->dimension, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0); glEnableVertexAttribArray(MPGE_EGL3VA_VERTEX); glBindBuffer(GL_ARRAY_BUFFER,0); if(va->vbuffer->hasNormal) { glBindBuffer(GL_ARRAY_BUFFER, va->vbuffer->id[NORMAL_BUFFER]); glEnableVertexAttribArray(MPGE_EGL3VA_NORMAL); glVertexAttribPointer(MPGE_EGL3VA_NORMAL, 3, GL_FLOAT, GL_FALSE, 0,(const GLvoid*)0); glBindBuffer(GL_ARRAY_BUFFER,0); } if(va->vbuffer->hasTexcoord) { glBindBuffer(GL_ARRAY_BUFFER, va->vbuffer->id[TEXCOORD_BUFFER]); glEnableVertexAttribArray(MPGE_EGL3VA_TEXTURE0); glVertexAttribPointer(MPGE_EGL3VA_TEXTURE0, 2, GL_FLOAT, GL_FALSE, 0,(const GLvoid*)0); glBindBuffer(GL_ARRAY_BUFFER,0); } } } void MPGE_OPENGL3_API MPGE_VertexArrayUnbind(MPGEVertexArray* va) { if(va->vbuffer->hasVertex) glDisableVertexAttribArray(MPGE_EGL3VA_VERTEX); if(va->vbuffer->hasNormal) glDisableVertexAttribArray(MPGE_EGL3VA_NORMAL); if(va->vbuffer->hasTexcoord) glDisableVertexAttribArray(MPGE_EGL3VA_TEXTURE0); glBindVertexArray(0); } void MPGE_OPENGL3_API MPGE_VertexArrayDraw(MPGEVertexArray* va) { if(va->vbuffer) { MPGE_VertexArrayBindVertexBuffer(va); if(va->ibuffer) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, va->ibuffer->id[VERTEX_BUFFER]); glDrawElements(va->mode,va->ivertices_size/sizeof(u32), GL_UNSIGNED_INT,(GLvoid*)0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, va->ibuffer->id[NORMAL_BUFFER]); glDrawElements(va->mode,va->inormals_size/sizeof(u32), GL_UNSIGNED_INT,(GLvoid*)0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, va->ibuffer->id[TEXCOORD_BUFFER]); glDrawElements(va->mode,va->itexcoords_size/sizeof(u32), GL_UNSIGNED_INT,(GLvoid*)0); } else { glDrawArrays(va->mode,0,(va->vertices_size/sizeof(f32))/va->dimension); } MPGE_VertexArrayUnbind(va); } }
EDIT: j'ai oublier les shaders :
vertex shader:
fragment shader;
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 #version 330 uniform mat4 mvpMatrix; in vec3 inPosition; in vec2 inTexCoord; out vec2 outTexCoords; void main(void) { outTexCoords=inTexCoord; gl_Position = mvpMatrix * vec4(inPosition, 1.0); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #version 330 uniform sampler2D colorMap; in vec2 outTexCoords; out vec4 fragColor; void main(void) { fragColor = texture2D(colorMap,outTexCoords.st); }
Partager