gKit2 light
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
14 struct 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 
24 class TP : public AppCamera
25 {
26 public:
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("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 
121 protected:
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 
131 int 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
int run()
execution de l'application.
Definition: app.cpp:36
representation d'un objet / maillage.
Definition: mesh.h:112
GLuint create_buffers(const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
construit les buffers et le vertex array object necessaires pour dessiner l'objet avec openGL....
Definition: mesh.cpp:581
std::vector< TriangleGroup > groups()
renvoie les groupes de triangles de meme matiere. re-organise les triangles. permet d'afficher l'obje...
Definition: mesh.cpp:305
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:503
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition: orbiter.cpp:7
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:47
Transform view() const
renvoie la transformation vue.
Definition: orbiter.cpp:40
Definition: alpha.cpp:59
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...
Definition: wavefront.cpp:197
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:204
void program_uniform(const GLuint program, const char *uniform, const std::vector< unsigned > &v)
affecte un tableau de valeurs a un uniform du shader program.
Definition: uniforms.cpp:94
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition: program.cpp:432
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