Bonjour, je programme sur OpenGL depuis quelques temps en parallèle avec mes études pour voir comment ça marche et j'ai commencé un moteur avec SFML 2.0/OpenGL 3.3 il y a quelques temps déjà.
Tout allait plutôt bien et j'implémentait au fur et à mesure de nouvelles fonctionnalitées, mais je viens de m'apercevoir que je les testais toujours sur un deux ou trois cubes. J'ai donc essayé d'en mettre 100, et la le nombre de FPS a chuté et frolait presque les 0.
J'ai donc enlevé le Per-Pixel Lighting. Pareil. Enlevé les textures. Pareil. Réduit mes primitives a de simples carrés dessinés en GL_LINES, et c'est toujours pareil.
Exemple:
0 Carré : Très grosses perturbations entre 1000 et 4000 FPS, normal je suppose
1 Carré : ~1300 FPS
3 Carrés : ~650 FPS
20 Carrés : ~125 FPS
100 Carrés : ~2 FPS
Quand je parle de carré, ça ressemble a ça:
http://d.imagehost.org/0219/Capturecarre.png
Donc, j'utilise comme il se doit uniquement des VAO et des VBO, et je fais mes propres shaders.
Voici des parties importantes de mon code en simplifié, en enlevant quelques commentaires inutiles et en renomant quelques variables pour la compréhension:
Creation des VAOs / VBOs :
Voici le code de render :
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 glGenVertexArrays(1, &mVao); // Generation VAO glGenBuffers(1, &mVbo); // Generation VBO glBindBuffer(GL_ARRAY_BUFFER, mVbo); glBufferData(GL_ARRAY_BUFFER, pSize, pVector, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glGenBuffers(1, &mIbo); // Generation des VBO d'indices glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIbo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, pSize, pIndices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); mICount = pIndiceSize / sizeof(Index); // Nombre d'indices // Bind du VAO pour y inclure les deux VBO précédents glBindVertexArray(mVao); glBindBuffer(GL_ARRAY_BUFFER, mVbo.GetBuffer()); GLint loc = glGetAttribLocation(pShader->GetProgram(), "inVertex"); glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(loc); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIbo.GetBuffer()); glBindVertexArray(0);
Des shaders que j'ai simplifié au maximum mais qui n'améliorent pas les choses:
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 glUseProgram(shader.ID); // Envoi de la Model * View * Projection Matrix au shader shader.SendMatrix("ModelViewProjMatrix", entity.GetModelMatrix() * m3DViewProjMatrix); // Envoi de la couleur diffuse de l'entité au shader shader.SendColor("Kd", entity.GetMaterial().mDiffuse); // Bind du VAO afin de le dessiner glBindVertexArray(entity.GetVAO().ID); glDrawElements(GL_LINES, entity.GetVAO().GetIndexCount(), GL_UNSIGNED_INT, 0); glBindVertexArray(0); glUseProgram(0);
Voila, je ne sais que faire, je trouve ça anormal, vu que ce ne sont que quelques simples primitives, sans texture, sans éclairage, je devrais pouvoir en afficher des centaines sans qu'il n'y ait de problème non?
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 // VERTEX SHADER #version 330 // matrix uniform mat4 ModelViewProjMatrix; // in attribs in vec3 inVertex; void main(){ // VertexPos in clip space vec4 position = vec4(inVertex, 1.0); gl_Position = ModelViewProjMatrix * position; } // FRAGMENT SHADER #version 330 // color uniform vec4 Kd; // out attribs out vec4 finalColor; void main(){ finalColor = Kd; }
Est-ce que j'utilise mal les VAO/VBO? J'ai pourtant il me semble respecté les tutoriels que j'ai pu croiser à mes débuts.
Coté matériel, j'ai une GeForce GTX285 et mes drivers sont à jour.
Si vous avez besoin d'autres parties de mon code que j'aurai oublié ou pour toutes autres questions, demandez-moi. De toute façon, tous mes codes sont open source.
Merci d'avance si quelqu'un a une idée. Et j'espère que c'est pas quelque chose de trop bête ^^.
Partager