gKit2 light
Loading...
Searching...
No Matches
tuto_mdi_elements.cpp
1
3
4#include "app_camera.h"
5
6#include "mesh.h"
7#include "wavefront.h"
8
9#include "orbiter.h"
10#include "program.h"
11#include "uniforms.h"
12
13// representation des parametres de multidrawELEMENTSindirect
14struct IndirectParam
15{
16 unsigned index_count;
17 unsigned instance_count;
18 unsigned first_index;
19 unsigned vertex_base;
20 unsigned instance_base;
21};
22
23
24class TP : public AppCamera
25{
26public:
27 TP( ) : AppCamera(1024, 640, 4, 3) {} // openGL version 4.3, ne marchera pas sur mac.
28
29 int init( )
30 {
31 // charge un objet indexe
32 m_objet= read_indexed_mesh("data/robot.obj");
33
34 Point pmin, pmax;
35 m_objet.bounds(pmin, pmax);
36 m_camera.lookat(pmin, pmax);
37
38 // trie les triangles de l'objet par matiere.
39 std::vector<TriangleGroup> groups= m_objet.groups();
40
41 /* parcours chaque groupe et construit les parametres du draw correspondant
42 on peut afficher les groupes avec glDrawElements, comme d'habitude :
43
44 glBindVertexArray(m_vao);
45 glUseProgram(m_program);
46 glUniform( ... );
47
48 for(unsigned i= 0; i < groups.size(); i++)
49 glDrawElements(GL_TRIANGLES, /count/ groups[i].n, /type/ GL_UNSIGNED_INT, /offset/ groups[i].first * sizeof(unsigned));
50
51 on peut remplir une structure IndirectParam par draw... et utiliser un seul appel a multidrawindirect
52 */
53
54 std::vector<IndirectParam> params;
55 for(unsigned i= 0; i < groups.size(); i++)
56 {
57 params.push_back({
58 unsigned(groups[i].n), // count
59 1, // instance_count
60 unsigned(groups[i].first), // first_index
61 0, // vertex_base, pas la peine de renumeroter les sommets
62 0 // instance_base, pas d'instances
63 });
64 }
65
66 m_draws= params.size();
67
68 // transferer dans un buffer
69 glGenBuffers(1, &m_indirect_buffer);
70 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
71 glBufferData(GL_DRAW_INDIRECT_BUFFER, params.size() * sizeof(IndirectParam), params.data(), GL_STATIC_READ);
72
73 // construire aussi les buffers de l'objet
74 m_vao= m_objet.create_buffers(/* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index */ false);
75
76 // et charge un shader..
77 m_program= read_program("gkit2_tutos/M2/indirect_elements.glsl");
78 program_print_errors(m_program);
79
80 // etat openGL par defaut
81 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
82
83 glClearDepth(1.f); // profondeur par defaut
84 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
85 glEnable(GL_DEPTH_TEST); // activer le ztest
86
87 return 0;
88 }
89
90 int quit( )
91 {
92 // todo
93 return 0;
94 }
95
96 int render( )
97 {
98 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
99
100 // recupere les transformations
101 Transform model;
102 Transform view= camera().view();
103 Transform projection= camera().projection();
104 Transform mv= view * model;
105 Transform mvp= projection * mv;
106
107 // parametre le shader
108 glBindVertexArray(m_vao);
109 glUseProgram(m_program);
110
111 program_uniform(m_program, "mvpMatrix", mvp);
112 program_uniform(m_program, "mvMatrix", mv);
113
114 // parametre du multidraw indirect
115 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
116 glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0, m_draws, 0);
117
118 return 1;
119 }
120
121protected:
122 GLuint m_indirect_buffer;
123 GLuint m_vao;
124 GLuint m_program;
125 Transform m_model;
126
127 Mesh m_objet;
128 int m_draws;
129};
130
131int main( )
132{
133 TP app;
134 app.run();
135
136 return 0;
137}
classe application.
Definition app_camera.h:19
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
AppCamera(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5
int run()
execution de l'application.
Definition app.cpp:36
representation d'un objet / maillage.
Definition mesh.h:121
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Mesh read_indexed_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles indexes. utiliser glDrawElem...
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
tuto_mdi_elements.cpp exemple d'utilisation de multidrawindirect pour des triangles indexes.
Definition tuto_mdi.cpp:22
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21