Sinon, tu peux passer par l'instantiation hardware (GL_ARB_draw_instanced)
Sinon, tu peux passer par l'instantiation hardware (GL_ARB_draw_instanced)
J'ai fait quelques recherches, mais du mal à voir comment ça fonctionne concrètement.
Finalement ça reviendrait (dans mon cas) à envoyer un seul cube, et plein de matrices de transformations pour chaque instance du cube, c'est ça ?
Aurais-tu par hasard un bon article expliquant comment mettre en place une instanciation ?
Tu trouveras ce qu'il faut ICI. (c'est en tout cas là que j'ai trouvé ce qu'il fallait pour mon moteur)
Merci pour le lien, je vais regarder de plus près
Mais je suis aussi tombé entre temps sur la méthode du geometry shader : j'envoie un point, et il ajoute des points pour créer le cube. Quels sont les avantages et inconvénients de cette technique par rapport à celle de l'instanciation ? Car j'ai l'impression que pour le geometry shader, ça pourrait prendre beaucoup moins de place en mémoire car encore moins d'infos envoyés au VBO, non ?
Pour tester vite fait le geometry shader, j'ai fait quelque chose de simple : j'envoie X points, et je les transforme en triangle d'une certaine couleur. Seul souci : le geometry shader fait bien son job, mais par contre le fragment shader ne colorie pas les triangles, ils restent noirs. Voici les shaders :
Vertex shader :
Geometry shader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #version 330 compatibility in vec3 in_coordonneesSommets; void main() { gl_Position = vec4(in_coordonneesSommets, 1.0); }
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
18
19
20
21
22
23
24 #version 330 compatibility layout (points) in; layout (triangle_strip, max_vertices = 3) out; uniform mat4 matriceAffichage; void main(void) { vec4 positionSommet = gl_in[0].gl_Position; gl_Position = matriceAffichage * positionSommet; EmitVertex(); positionSommet.x += 1; gl_Position = matriceAffichage * positionSommet; EmitVertex(); positionSommet.y += 1; gl_Position = matriceAffichage * positionSommet; EmitVertex(); EndPrimitive(); }
Pourtant aucune erreur de compilation de shader, c'est assez étonnant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #version 330 compatibility out vec4 out_couleurs; void main() { out_couleurs = vec4(0.2, 0.5, 0.7, 1); }
EDIT : problème résolu, ça venait de mon code compilant les shaders.
Et donc tu y es arrivé en utilisant les geometry shader pour générer des cubes ?
Finalement oui, et les performances sont bien meilleurs qu'avant.
Merci en tout cas pour ton aide
Je n'ai jamais utilisé de geometry shader, ça fait quoi, ça génère des sommets à partir de sommets existant ???
Donc ca s'exécute avant le vertex shader ???
Si j'ai bien compris tu envoie les matrices de transformations de tout tes cubes et tu génères les vertices des autres cube à partir d'un seul cube et les matrices de transformation, c'est bien ça ?
Le geometry shader est exécuté entre le vertex et le fragment shader, et permet de créer un grand nombre de formes à partir de la géométrie envoyée en entrée.
Ça ce serait plus de l'instanciation je pense. Pour ma part, j'envoie un seul point (un triplet de coordonnées) ainsi qu'un float d'info (spécifique à mon utilisation) pour chaque cube, ces infos passent par le vertex shader, puis au geometry shader qui génère des triangles à partir de la coordonnée d'entrée, pour former le cube. Ensuite ça part au fragment shader.Si j'ai bien compris tu envoie les matrices de transformations de tout tes cubes et tu génères les vertices des autres cube à partir d'un seul cube et les matrices de transformation, c'est bien ça ?
Pour les matrices de transformations, je ne préfère pas en envoyer pour chaque cube car je pense que c'est pas mal coûteux (une matrice 4*4 c'est quand même 16 float, alors que là j'en envoie que 4). Etant donné que mes cubes n'ont que la translation de différence, suffit d'ajouter quelque chose aux cordonnées du point envoyé pour faire la translation.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager