gKit2 light
Classes | Public Member Functions | Protected Attributes | List of all members
TP Class Reference
+ Inheritance diagram for TP:

Classes

struct  Object
 

Public Member Functions

 TP (const int msaa=1)
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
void init_dynamic_cubemap (const int w, const int h)
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
void scene (std::vector< Object > &objects)
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon. More...
 
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps. More...
 
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application. More...
 
- Public Member Functions inherited from AppCamera
 AppCamera (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL. More...
 
const Orbitercamera () const
 renvoie l'orbiter gere par l'application. More...
 
Orbitercamera ()
 renvoie l'orbiter gere par l'application. More...
 
- Public Member Functions inherited from App
 App (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL. More...
 
int run ()
 execution de l'application. More...
 
- Public Member Functions inherited from AppTime
 AppTime (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL. More...
 

Protected Attributes

Mesh m_objet
 
Mesh m_repere
 
GLuint m_vao
 
GLuint m_program
 
std::vector< GLuint > m_textures
 
std::vector< TriangleGroupm_groups
 
Mesh m_grid
 
Orbiter m_camera
 
GLuint m_texture
 
Mesh m_cube
 
Transform m_model
 
Buffers m_objet
 
std::vector< Colorm_colors
 
GLuint m_texture0
 
GLuint m_texture1
 
GLuint m_program_draw
 
Mesh m_local
 
Mesh m_proxy
 
Mesh m_frustum
 
Mesh m_ground
 
Transform m_position
 
Mesh m_frustum_cube
 
Framebuffer m_framebuffer
 
GLuint m_mesh_program
 
GLuint m_decal_program
 
Mesh m_object
 
GLuint m_program_render
 
GLuint m_texture_cubemap
 
GLuint m_depth_cubemap
 
GLuint m_framebuffer
 
GLuint m_shadow_program
 
Orbiter m_observer
 
Point m_pmin
 
Point m_pmax
 
GLuint m_indirect_buffer
 
GLuint m_model_buffer
 
GLuint m_time_query
 
GLuint m_program_direct
 
Text m_console
 
std::vector< IndirectParamm_multi_indirect
 
std::vector< Transformm_multi_model
 
GLuint m_parameter_buffer
 
GLuint m_object_buffer
 
GLuint m_remap_buffer
 
GLuint m_program_cull
 
std::vector< Objectm_objects
 
int m_draws
 
GLuint m_indirect_count_buffer
 
GLuint m_vertex_buffer
 
unsigned int m_vertex_count
 
- Protected Attributes inherited from AppCamera
Orbiter m_camera
 
- Protected Attributes inherited from App
Window m_window
 
Context m_context
 
bool sync
 
- Protected Attributes inherited from AppTime
std::chrono::high_resolution_clock::time_point m_cpu_start
 
std::chrono::high_resolution_clock::time_point m_cpu_stop
 
GLuint m_time_query [MAX_FRAMES]
 
GLint64 m_frame_time
 
int m_frame
 
Text m_console
 

Additional Inherited Members

- Protected Member Functions inherited from AppCamera
int prerender ()
 
- Protected Member Functions inherited from App
void vsync_off ()
 
- Protected Member Functions inherited from AppTime
virtual int prerender ()
 
virtual int postrender ()
 

Detailed Description

Definition at line 58 of file alpha.cpp.


Class Documentation

◆ TP::Object

struct TP::Object

Definition at line 203 of file tuto_dynamic_cubemap.cpp.

Class Members
Transform model
Color color

Member Function Documentation

◆ init() [1/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 65 of file alpha.cpp.

66  {
67  // decrire un repere / grille
68  m_repere= make_grid(20);
69 
70  Point grid_pmin, grid_pmax;
71  m_repere.bounds(grid_pmin, grid_pmax);
72 
73  //~ m_objet= read_mesh("data/alpha.obj"); // utiliser alpha.glsl !!
74  m_objet= read_mesh("data/robot.obj"); // utiliser alpha_notexture.glsl !!
75 
76  Point pmin, pmax;
77  m_objet.bounds(pmin, pmax);
78 
79  pmin= min(pmin, grid_pmin);
80  pmax= max(pmax, grid_pmax);
81 
82  // parametrer la camera de l'application, renvoyee par la fonction camera()
83  camera().lookat(pmin, pmax);
84 
85  // charge les textures, si necessaire
86  Materials& materials= m_objet.materials();
87  m_textures.resize(materials.filename_count());
88  for(unsigned i= 0; i < m_textures.size(); i++)
89  m_textures[i]= read_texture(0, materials.filename(i));
90 
91  // affiche les matieres
92  {
93  for(int i= 0; i < materials.count(); i++)
94  {
95  const Material& material= materials.material(i);
96  printf("material[%d] '%s' kd %f %f %f ", i, materials.name(i), material.diffuse.r, material.diffuse.g, material.diffuse.b);
97  if(material.diffuse_texture != -1)
98  printf("texture '%s'", materials.filename(material.diffuse_texture));
99  printf("\n");
100  }
101  }
102 
103  m_groups= m_objet.groups();
104  m_vao= m_objet.create_buffers( /* texcoords */ true, /* normals */ true, /* color */ false, /* material index */ false);
105 
106  //
107  //~ m_program= read_program("tutos/alpha.glsl");
108  m_program= read_program("tutos/alpha_notexture.glsl");
109  program_print_errors(m_program);
110 
111  // etat openGL par defaut
112  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
113 
114  glClearDepth(1.f); // profondeur par defaut
115  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
116  glEnable(GL_DEPTH_TEST); // activer le ztest
117 
118  glEnable(GL_MULTISAMPLE); // MSAA
119  glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); // transformer la transparence en visibilite des samples MSAA
120 
121  return 0; // ras, pas d'erreur
122  }
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition: app_camera.h:37
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:579
std::vector< TriangleGroup > groups()
renvoie les groupes de triangles de meme matiere. re-organise les triangles. permet d'afficher l'obje...
Definition: mesh.cpp:303
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:501
const Materials & materials() const
renvoie la description des matieres.
Definition: mesh.cpp:265
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition: orbiter.cpp:7
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point. x, y, z= max(a.x, b.x), max(a.y,...
Definition: vec.cpp:35
Point min(const Point &a, const Point &b)
renvoie la plus petite composante de chaque point. x, y, z= min(a.x, b.x), min(a.y,...
Definition: vec.cpp:30
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition: wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:204
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition: program.cpp:432
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:154
int diffuse_texture
indice de la texture de la couleur de base, ou -1.
Definition: materials.h:21
Color diffuse
couleur diffuse / de base.
Definition: materials.h:17
int filename_count() const
renvoie le nombre de noms de fichiers de textures.
Definition: materials.h:139
const Material & material(const int id) const
renvoie la ieme matiere.
Definition: materials.h:102
int count() const
nombre de matieres.
Definition: materials.h:94
const char * filename(const int id) const
renvoie le nombre de noms de fichiers de textures.
Definition: materials.h:141
const char * name(const int id) const
renvoie le nom de la ieme matiere.
Definition: materials.h:97
representation d'un point 3d.
Definition: vec.h:21

◆ quit() [1/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 125 of file alpha.cpp.

126  {
127  m_objet.release();
128  m_repere.release();
129  return 0;
130  }
void release()
detruit les objets openGL.
Definition: mesh.cpp:62

◆ render() [1/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 133 of file alpha.cpp.

134  {
135  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
136 
137  // dessine aussi le repere, pour le meme point de vue
138  draw(m_repere, Identity(), camera());
139 
140  if(key_state('r'))
141  {
142  // recharge le shader a la volee...
143  clear_key_state('r');
144  //~ reload_program(m_program, "tutos/alpha.glsl");
145  reload_program(m_program, "tutos/alpha_notexture.glsl");
146  program_print_errors(m_program);
147  }
148 
149  glBindVertexArray(m_vao);
150  glUseProgram(m_program);
151 
152  Transform model= Identity();
153  Transform view= camera().view();
154  Transform projection= camera().projection();
155  Transform mv= view * model;
156  Transform mvp= projection * mv;
157 
158  program_uniform(m_program, "mvMatrix", mv);
159  program_uniform(m_program, "mvpMatrix", mvp);
160 
161  // dessine tous les groupes de triangles, tries par matiere
162  const Materials& materials= m_objet.materials();
163  for(unsigned i= 0; i < m_groups.size(); i++)
164  {
165  const Material& material= materials.material(m_groups[i].material_index);
166  if(material.diffuse_texture != -1)
167  program_use_texture(m_program, "alpha", 0, m_textures[material.diffuse_texture]);
168  else
169  program_use_texture(m_program, "alpha", 0, 0);
170 
171  //~ printf("group[%u] material %d first %d n %d, texture %d\n", i, m_groups[i].material_index, m_groups[i].first, m_groups[i].n, material.diffuse_texture);
172 
173  glDrawArrays(GL_TRIANGLES, m_groups[i].first, m_groups[i].n);
174  }
175 
176  if(key_state('s'))
177  {
178  clear_key_state('s');
179  static int id= 1;
180  screenshot("alpha", id++);
181  }
182 
183  // continuer...
184  return 1;
185  }
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
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition: window.cpp:48
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition: window.cpp:42
Transform Identity()
construit la transformation identite.
Definition: mat.cpp:187
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition: texture.cpp:194
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
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrage,...
Definition: uniforms.cpp:198
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition: mat.h:21

◆ init() [2/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 63 of file tuto10.cpp.

64  {
65  m_grid= make_grid();
66  m_objet= read_mesh("data/cube.obj");
67 
68  Point pmin, pmax;
69  m_grid.bounds(pmin, pmax);
70  m_camera.lookat(pmin, pmax);
71 
72  // etape 1 : creer le shader program
73  m_program= read_program("tutos/tuto10.glsl");
74  program_print_errors(m_program);
75 
76  // etat openGL par defaut
77  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
78 
79  glClearDepth(1.f); // profondeur par defaut
80  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
81  glEnable(GL_DEPTH_TEST); // activer le ztest
82 
83  return 0; // ras, pas d'erreur
84  }

◆ quit() [2/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 87 of file tuto10.cpp.

88  {
89  // etape 3 : detruire le shader program
90  release_program(m_program);
91  // et les objets
92  m_grid.release();
93  m_objet.release();
94  return 0;
95  }
int release_program(const GLuint program)
detruit les shaders et le program.
Definition: program.cpp:211

◆ render() [2/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 98 of file tuto10.cpp.

99  {
100  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
101 
102  // recupere l'etat de la souris
103  int mx, my;
104  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
105 
106  // deplace la camera
107  if(mb & SDL_BUTTON(1))
108  m_camera.rotation(mx, my); // tourne autour de l'objet
109  else if(mb & SDL_BUTTON(3))
110  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height()); // deplace le point de rotation
111  else if(mb & SDL_BUTTON(2))
112  m_camera.move(mx); // approche / eloigne l'objet
113 
114  // recupere l'etat de la molette / touch
115  SDL_MouseWheelEvent wheel= wheel_event();
116  if(wheel.y != 0)
117  {
119  m_camera.move(8.f * wheel.y); // approche / eloigne l'objet
120  }
121 
122  // recharge le shader program
123  if(key_state('r'))
124  {
125  clear_key_state('r'); // une seule fois...
126  reload_program(m_program, "tutos/tuto10.glsl");
127  program_print_errors(m_program);
128  }
129 
130  // etape 2 : dessiner m_objet avec le shader program
131  // configurer le pipeline
132  glUseProgram(m_program);
133 
134  // configurer le shader program
135  // . recuperer les transformations
136  Transform model= RotationX(global_time() / 20);
137  Transform view= m_camera.view();
138  Transform projection= m_camera.projection(window_width(), window_height(), 45);
139 
140  // . composer les transformations : model, view et projection
141  Transform mv= view * model;
142  Transform mvp= projection * mv;
143 
144  // . parametrer le shader program :
145  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
146  program_uniform(m_program, "mvpMatrix", mvp);
147 
148  // . parametres "supplementaires" :
149 
150  // go !
151  // mesh associe les donnees positions, texcoords, normals et colors aux attributs declares dans le vertex shader
152  m_objet.draw(m_program, /* use position */ true, /* use texcoord */ false, /* use normal */ false, /* use color */ false, /* use material index*/ false);
153  // relisez le tuto9 sur l'utilisation des shaders et de mesh
154 
155  // et pour afficher un autre cube d'une autre couleur ?
156 
157  // dessine aussi le repere et la grille pour le meme point de vue
158  draw(m_grid, Identity(), m_camera);
159 
160  return 1;
161  }
void draw(const GLuint program, const bool use_position, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
dessine l'objet avec un shader program.
Definition: mesh.cpp:768
void move(const float z)
rapproche / eloigne la camera du centre.
Definition: orbiter.cpp:33
void translation(const float x, const float y)
deplace le centre / le point observe.
Definition: orbiter.cpp:27
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Definition: orbiter.cpp:21
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:29
void clear_wheel_event()
desactive l'evenement.
Definition: window.cpp:116
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
Definition: window.cpp:112
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:25
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition: window.cpp:128
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition: mat.cpp:230

◆ init() [3/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 19 of file tuto7.cpp.

20  {
21  m_objet= read_mesh("data/cube.obj");
22 
23  Point pmin, pmax;
24  m_objet.bounds(pmin, pmax);
25  m_camera.lookat(pmin, pmax);
26 
27  m_texture= read_texture(0, "data/debug2x2red.png");
28 
29  // etat openGL par defaut
30  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
31 
32  glClearDepth(1.f); // profondeur par defaut
33  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
34  glEnable(GL_DEPTH_TEST); // activer le ztest
35 
36  return 0; // ras, pas d'erreur
37  }

◆ quit() [3/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 40 of file tuto7.cpp.

41  {
42  m_objet.release();
43  glDeleteTextures(1, &m_texture);
44 
45  return 0;
46  }

◆ render() [3/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 49 of file tuto7.cpp.

50  {
51  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
52 
53  // deplace la camera
54  int mx, my;
55  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
56  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
57  m_camera.rotation(mx, my);
58  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
59  m_camera.move(mx);
60  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
61  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
62 
63  // affiche l'objet pour le point de vue de la camera et avec une texture
64  draw(m_objet, m_camera, m_texture);
65 
66  return 1;
67  }

◆ init() [4/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 60 of file tuto7_camera.cpp.

61  {
62  // decrire un repere / grille
63  m_repere= make_grid(10);
64 
65  // charge un objet
66  m_cube= read_mesh("data/cube.obj");
67 
68  // un autre objet
69  m_objet= Mesh(GL_TRIANGLES);
70  {
71  // ajouter des triplets de sommet == des triangles dans objet...
72  }
73 
74  // etat openGL par defaut
75  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
76 
77  glClearDepth(1.f); // profondeur par defaut
78  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
79  glEnable(GL_DEPTH_TEST); // activer le ztest
80 
81  return 0; // pas d'erreur, sinon renvoyer -1
82  }
representation d'un objet / maillage.
Definition: mesh.h:112

◆ quit() [4/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 85 of file tuto7_camera.cpp.

86  {
87  m_objet.release();
88  m_repere.release();
89  return 0; // pas d'erreur
90  }

◆ render() [4/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 93 of file tuto7_camera.cpp.

94  {
95  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
96 
97  // dessine le repere, place au centre du monde, pour le point de vue de la camera
98  draw(m_repere, /* model */ Identity(), camera());
99 
100  // dessine un cube, lui aussi place au centre du monde
101  draw(m_cube, /* model */ Identity(), camera());
102 
103  // dessine le meme cube, a un autre endroit.
104  // il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
105  // par exemple, pour dessiner un 2ieme cube a la verticale au dessus du premier cube :
106  // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
107  Transform t= Translation(0, 2, 0);
108  draw(m_cube, /* model */ t, camera());
109 
110  // comment dessiner m_objet ??
111 
112  // et sans le superposer au cube deja dessine ?
113 
114  // continuer, afficher une nouvelle image
115  // tant que la fenetre est ouverte...
116  return 1;
117  }
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition: mat.cpp:216

◆ init() [5/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 19 of file tuto8.cpp.

20  {
21  m_objet= read_mesh("data/cube.obj");
22 
23  Point pmin, pmax;
24  m_objet.bounds(pmin, pmax);
25  m_camera.lookat(pmin, pmax);
26 
27  m_texture= read_texture(0, "data/debug2x2red.png");
28 
29  // etat openGL par defaut
30  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
31 
32  glClearDepth(1.f); // profondeur par defaut
33  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
34  glEnable(GL_DEPTH_TEST); // activer le ztest
35 
36  return 0; // ras, pas d'erreur
37  }

◆ quit() [5/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 40 of file tuto8.cpp.

41  {
42  m_objet.release();
43  glDeleteTextures(1, &m_texture);
44 
45  return 0;
46  }

◆ update() [1/5]

int TP::update ( const float  time,
const float  delta 
)
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 48 of file tuto8.cpp.

49  {
50  // modifier l'orientation du cube a chaque image.
51  // time est le temps ecoule depuis le demarrage de l'application, en millisecondes,
52  // delta est le temps ecoule depuis l'affichage de la derniere image / le dernier appel a draw(), en millisecondes.
53 
54  m_model= RotationY(time / 20);
55  return 0;
56  }
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition: mat.cpp:242

◆ render() [5/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 59 of file tuto8.cpp.

60  {
61  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62 
63  // deplace la camera
64  int mx, my;
65  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
66  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
67  m_camera.rotation(mx, my);
68  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
69  m_camera.move(mx);
70  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
71  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
72 
73  draw(m_objet, m_model, m_camera, m_texture);
74 
75  /* on pourrait obtenir le meme resultat sans utiliser App::update( ).
76  les parametres time et update sont renvoyes par les fonctions global_time() et delta_time() :
77  draw(m_objet, RotationY(global_time() / 20), m_camera, m_texture);
78  */
79 
80  return 1;
81  }

◆ init() [6/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 22 of file tuto9.cpp.

23  {
24  // charge un obet
25  m_objet= read_mesh("data/cube.obj");
26 
27  // parametre la camera pour observer l'objet
28  Point pmin, pmax;
29  m_objet.bounds(pmin, pmax);
30  camera().lookat(pmin, pmax);
31 
32  // cree le shader program
33  m_program= read_program("tutos/tuto9_color.glsl");
34  program_print_errors(m_program);
35 
36  // etat openGL par defaut
37  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
38 
39  glClearDepth(1.f); // profondeur par defaut
40  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
41  glEnable(GL_DEPTH_TEST); // activer le ztest
42 
43  return 0; // ras, pas d'erreur
44  }

◆ quit() [6/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 47 of file tuto9.cpp.

48  {
49  // detruire le shader program
50  release_program(m_program);
51  // et l'objet...
52  m_objet.release();
53  return 0;
54  }

◆ render() [6/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 57 of file tuto9.cpp.

58  {
59  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
60 
61  // configurer le pipeline
62  glUseProgram(m_program);
63 
64  // configurer le shader program
65  // . recuperer les transformations
66  Transform model= RotationX(global_time() / 20); // fait tourner l'objet sur lui meme en fonction du temps
67  Transform view= camera().view();
68  Transform projection= camera().projection();
69 
70  // . composer les transformations : model, view et projection
71  Transform mvp= projection * view * model;
72 
73  // . parametrer le shader program :
74  // . transformation : la matrice declaree dans le vertex shader s'appelle 'mvpMatrix'
75  program_uniform(m_program, "mvpMatrix", mvp);
76 
77  // . parametre "supplementaire" :
78  // . couleur des pixels, la couleur declaree dans le fragment shader s'appelle 'color'
79  program_uniform(m_program, "color", Color(1, 1, 0, 1));
80 
81  // go !
82  // indiquer quels attributs de sommets du mesh sont necessaires a l'execution du shader.
83  // tuto9_color.glsl n'utilise que position. les autres de servent a rien.
84  m_objet.draw(m_program, /* use position */ true, /* use texcoord */ false, /* use normal */ false, /* use color */ false, /* use material index*/ false);
85 
86  return 1;
87  }
representation d'une couleur (rgba) transparente ou opaque.
Definition: color.h:14

◆ init() [7/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 65 of file tuto9_buffers.cpp.

66  {
67  // charger un objet a afficher
68  Mesh mesh= read_mesh("data/cube.obj");
69  if(!mesh.vertex_count()) return -1;
70 
71  // etape 1 : creer le vertex buffer et le vao
72  m_objet.create(mesh);
73 
74  // etape 2 : configurer la camera
75  Point pmin, pmax;
76  mesh.bounds(pmin, pmax);
77  m_camera.lookat(pmin, pmax);
78 
79  // etape 3 : creer le shader program
80  m_program= read_program("tutos/tuto9_color.glsl");
81  program_print_errors(m_program);
82 
83  // etat openGL par defaut
84  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
85 
86  glClearDepth(1.f); // profondeur par defaut
87  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
88  glEnable(GL_DEPTH_TEST); // activer le ztest
89 
90  return 0; // ras, pas d'erreur
91  }
int create(const GLenum primitives)
construit les objets openGL.
Definition: mesh.cpp:16
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:291

◆ quit() [7/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 94 of file tuto9_buffers.cpp.

95  {
96  // etape 4 : detruire le shader program
97  release_program(m_program);
98  m_objet.release();
99  return 0;
100  }

◆ render() [7/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 103 of file tuto9_buffers.cpp.

104  {
105  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 
107  // deplace la camera
108  int mx, my;
109  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
110  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
111  m_camera.rotation(mx, my);
112  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
113  m_camera.move(mx);
114  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
115  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
116 
117  // etape 2 : dessiner m_objet avec le shader program
118 
119  // . recuperer les transformations
120  Transform model= RotationX(global_time() / 20);
121  Transform view= m_camera.view();
122  Transform projection= m_camera.projection(window_width(), window_height(), 45);
123 
124  // . composer les transformations : model, view et projection
125  Transform mvp= projection * view * model;
126 
127  // configurer le shader program
128  int location;
129  glUseProgram(m_program);
130 
131  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
132  location= glGetUniformLocation(m_program, "mvpMatrix");
133  glUniformMatrix4fv(location, 1, GL_TRUE, mvp.data());
134 
135  // . parametres "supplementaires" :
136  // . couleur des pixels, cf la declaration 'uniform vec4 color;' dans le fragment shader
137  location= glGetUniformLocation(m_program, "color");
138  glUniform4f(location, 1, 1, 0, 1);
139 
140  // go !
141  // selectionner les attributs et les buffers de l'objet
142  glBindVertexArray(m_objet.vao);
143 
144  // dessiner les triangles de l'objet
145  glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count);
146 
147  return 1;
148  }
const float * data() const
renvoie l'adresse de la premiere valeur de la matrice.
Definition: mat.h:75

◆ init() [8/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 22 of file tuto9_groups.cpp.

23  {
24  m_objet= read_mesh("data/robot.obj");
25  if(m_objet.materials().count() == 0)
26  // pas de matieres, pas d'affichage
27  return -1;
28 
29  printf("%d materials.\n", m_objet.materials().count());
30 
31  // trie les triangles par matiere et recupere les groupes de triangles utilisant la meme matiere.
32  m_groups= m_objet.groups();
33  /* remarque : c'est long, donc il vaut mieux le faire une seule fois au debut du programme...
34  */
35 
36  // placer la camera
37  Point pmin, pmax;
38  m_objet.bounds(pmin, pmax);
39  camera().lookat(pmin, pmax);
40 
41  // creer le shader program, uniquement necessaire pour l'option 2, cf render()
42  m_program= read_program("tutos/tuto9_groups.glsl");
43  program_print_errors(m_program);
44 
45  // etat openGL par defaut
46  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
47 
48  glClearDepth(1.f); // profondeur par defaut
49  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
50  glEnable(GL_DEPTH_TEST); // activer le ztest
51 
52  return 0; // ras, pas d'erreur
53  }

◆ quit() [8/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 56 of file tuto9_groups.cpp.

57  {
58  // etape 3 : detruire le shader program
59  release_program(m_program);
60  m_objet.release();
61  return 0;
62  }

◆ render() [8/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 65 of file tuto9_groups.cpp.

66  {
67  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
68 
69  // . recuperer les transformations
70  Transform model= RotationY(global_time() / 40);
71  Transform view= camera().view();
72  Transform projection= camera().projection();
73 
74  #if 0
75  // option 1 : avec les utilitaires draw()
76  {
77  // dessine chaque groupe de triangle, avec sa matiere
78  for(unsigned i= 0; i < m_groups.size(); i++)
79  draw(m_groups[i], m_objet, model, view, projection);
80  // ou :
81  // draw(m_groups[i], m_objet, model, camera()); // meme resultat...
82  }
83  #else
84  // option 2 : dessiner m_objet avec le shader program
85  {
86  // configurer le pipeline
87  glUseProgram(m_program);
88 
89  // configurer le shader program
90  // . composer les transformations : model, view et projection
91  Transform mv= view * model;
92  Transform mvp= projection * mv;
93 
94  // . parametrer le shader program :
95  // . transformations : la matrice declaree dans le vertex shader s'appelle mvpMatrix
96  program_uniform(m_program, "mvpMatrix", mvp);
97  // et mvMatrix
98  program_uniform(m_program, "mvMatrix", mv);
99 
100  // afficher chaque groupe
101  const Materials& materials= m_objet.materials();
102  for(unsigned i= 0; i < m_groups.size(); i++)
103  {
104  // recuperer la couleur de base de la matiere
105  const Material& material= materials(m_groups[i].index);
106 
107  // . parametres "supplementaires" :
108  // . couleur de la matiere du groupe de triangle
109  program_uniform(m_program, "material_color", material.diffuse);
110 
111  // . c'est aussi le bon moment pour changer de texture, par exemple...
112  // program_use_texture(m_program, "material_texture", ... );
113 
114  // go !
115  // indiquer quels attributs de sommets du mesh sont necessaires a l'execution du shader.
116  // tuto9_groups.glsl n'utilise que position et normale. les autres de servent a rien.
117 
118  // 1 draw par groupe de triangles...
119  m_objet.draw(m_groups[i].first, m_groups[i].n, m_program, /* use position */ true, /* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index*/ false);
120  }
121  }
122  #endif
123 
124  /* et directement avec openGL, qu'est ce qui change ?
125 
126  il faut creer un ou plusieurs buffers pour stocker les positions et les normales de l'objet, et configurer le format de sommet,
127  cf vertex array object / vao, comme dans tuto9_buffers.cpp ou tuto4GL.cpp et tuto4GL_normals.cpp, par exemple
128 
129  ensuite, c'est comme d'habitude :
130 
131  glBindVertexAttrib(m_vao);
132  glUseProgram(m_program);
133 
134  // composer les transformations : model, view et projection
135  Transform mv= view * model;
136  Transform mvp= projection * mv;
137 
138  // parametrer le shader program :
139  program_uniform(m_program, "mvpMatrix", mvp);
140  program_uniform(m_program, "mvMatrix", mv);
141 
142  // dessiner chaque groupe...
143  for(unsigned i= 0; i < groups.size(); i++)
144  {
145  // recuperer la couleur de la matiere du groupe de triangles
146  const Material& material= m_objet.materials().material(m_groups[i].material_index);
147  Color color= material.diffuse;
148 
149  // parametrer les uniforms du shader qui dependent de la matiere
150  program_uniform(m_program, "material_color", color);
151 
152  // go ! dessiner les triangles du groupe
153  glDrawArrays(GL_TRIANGLES, groups[i].first, groups[i].n);
154  }
155  */
156 
157  return 1;
158  }

◆ init() [9/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 22 of file tuto9_materials.cpp.

23  {
24  m_objet= read_mesh("data/robot.obj");
25  if(m_objet.materials().count() == 0)
26  // pas de matieres, pas d'affichage
27  return -1;
28  printf("%d materials.\n", m_objet.materials().count());
29 
30  // etape 1 : creer le shader program
31  m_program= read_program("tutos/tuto9_materials.glsl");
32  program_print_errors(m_program);
33 
34  // recupere les matieres.
35  // le shader declare un tableau de 16 matieres
36  m_colors.resize(16);
37 
38  // copier les matieres utilisees
39  const Materials& materials= m_objet.materials();
40  assert(materials.count() <= int(m_colors.size()));
41  for(int i= 0; i < materials.count(); i++)
42  m_colors[i]= materials.material(i).diffuse;
43 
44  // placer la camera
45  Point pmin, pmax;
46  m_objet.bounds(pmin, pmax);
47  camera().lookat(pmin, pmax);
48 
49  // etat openGL par defaut
50  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
51 
52  glClearDepth(1.f); // profondeur par defaut
53  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
54  glEnable(GL_DEPTH_TEST); // activer le ztest
55 
56  return 0; // ras, pas d'erreur
57  }

◆ quit() [9/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 60 of file tuto9_materials.cpp.

61  {
62  // etape 3 : detruire le shader program
63  release_program(m_program);
64  m_objet.release();
65  return 0;
66  }

◆ render() [9/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 69 of file tuto9_materials.cpp.

70  {
71  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
72 
73  // dessiner m_objet avec le shader program
74  // configurer le pipeline
75  glUseProgram(m_program);
76 
77  // configurer le shader program
78  // . recuperer les transformations
79  Transform model= RotationY(global_time() / 40);
80  Transform view= camera().view();
81  Transform projection= camera().projection(window_width(), window_height(), 45);
82 
83  // . composer les transformations : model, view et projection
84  Transform mv= view * model;
85  Transform mvp= projection * mv;
86 
87  // . parametrer le shader program :
88  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
89  program_uniform(m_program, "mvpMatrix", mvp);
90  program_uniform(m_program, "mvMatrix", mv);
91 
92  // . ou, directement en utilisant openGL :
93  // int location= glGetUniformLocation(program, "mvpMatrix");
94  // glUniformMatrix4fv(location, 1, GL_TRUE, mvp.buffer());
95 
96  // . parametres "supplementaires" :
97  // . couleur diffuse des matieres, cf la declaration 'uniform vec4 materials[];' dans le fragment shader
98  int location= glGetUniformLocation(m_program, "materials");
99  glUniform4fv(location, m_colors.size(), &m_colors[0].r);
100 
101  // go !
102  // indiquer quels attributs de sommets du mesh sont necessaires a l'execution du shader.
103  // tuto9_materials.glsl n'utilise que position et material_index. les autres de servent a rien.
104  // 1 draw pour tous les triangles de l'objet.
105  m_objet.draw(m_program, /* use position */ true, /* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index*/ true);
106 
107  return 1;
108  }

◆ init() [10/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 23 of file tuto9_texture1.cpp.

24  {
25  m_objet= read_mesh("data/cube.obj");
26 
27  Point pmin, pmax;
28  m_objet.bounds(pmin, pmax);
29  m_camera.lookat(pmin, pmax);
30 
31  m_texture= read_texture(0, "data/debug2x2red.png");
32 
33  // etape 1 : creer le shader program
34  m_program= read_program("tutos/tuto9_texture1.glsl");
35  program_print_errors(m_program);
36 
37  // etat openGL par defaut
38  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
39 
40  glClearDepth(1.f); // profondeur par defaut
41  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
42  glEnable(GL_DEPTH_TEST); // activer le ztest
43 
44  return 0; // ras, pas d'erreur
45  }

◆ quit() [10/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 48 of file tuto9_texture1.cpp.

49  {
50  // etape 3 : detruire le shader program
51  release_program(m_program);
52 
53  m_objet.release();
54  glDeleteTextures(1, &m_texture);
55  return 0;
56  }

◆ render() [10/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 59 of file tuto9_texture1.cpp.

60  {
61  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62 
63  // deplace la camera
64  int mx, my;
65  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
66  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
67  m_camera.rotation(mx, my);
68  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
69  m_camera.move(mx);
70  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
71  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
72 
73  // etape 2 : dessiner m_objet avec le shader program
74  // configurer le pipeline
75  glUseProgram(m_program);
76 
77  // configurer le shader program
78  // . recuperer les transformations
79  Transform model= RotationX(global_time() / 20);
80  Transform view= m_camera.view();
81  Transform projection= m_camera.projection(window_width(), window_height(), 45);
82 
83  // . composer les transformations : model, view et projection
84  Transform mvp= projection * view * model;
85 
86  // . parametrer le shader program :
87  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
88  program_uniform(m_program, "mvpMatrix", mvp);
89 
90  // . parametres "supplementaires" :
91  // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
92  program_use_texture(m_program, "texture0", 0, m_texture);
93 
94  // go !
95  // indiquer quels attributs de sommets du mesh sont necessaires a l'execution du shader.
96  // tuto9_texture1.glsl n'utilise que position et texcoord. les autres de servent a rien.
97  m_objet.draw(m_program, /* use position */ true, /* use texcoord */ true, /* use normal */ false, /* use color */ false, /* use material index*/ false);
98  return 1;
99  }

◆ init() [11/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 23 of file tuto9_textures.cpp.

24  {
25  m_objet= read_mesh("data/cube.obj");
26 
27  Point pmin, pmax;
28  m_objet.bounds(pmin, pmax);
29  m_camera.lookat(pmin, pmax);
30 
31  // lire une texture sur l'unite 0
32  m_texture0= read_texture(0, "data/debug2x2red.png");
33  // lire une texture sur l'unite 1
34  m_texture1= read_texture(1, "data/pacman.png");
35 
36  // creer le shader program
37  m_program= read_program("tutos/tuto9_textures.glsl");
38  program_print_errors(m_program);
39 
40  // etat openGL par defaut
41  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
42 
43  glClearDepth(1.f); // profondeur par defaut
44  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
45  glEnable(GL_DEPTH_TEST); // activer le ztest
46 
47  return 0; // ras, pas d'erreur
48  }

◆ quit() [11/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 51 of file tuto9_textures.cpp.

52  {
53  // etape 3 : detruire le shader program
54  release_program(m_program);
55 
56  m_objet.release();
57  glDeleteTextures(1, &m_texture0);
58  glDeleteTextures(1, &m_texture1);
59  return 0;
60  }

◆ render() [11/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 63 of file tuto9_textures.cpp.

64  {
65  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
66 
67  // deplace la camera
68  int mx, my;
69  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
70  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
71  m_camera.rotation(mx, my);
72  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
73  m_camera.move(mx);
74  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
75  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
76 
77  // etape 2 : dessiner m_objet avec le shader program
78  // configurer le pipeline
79  glUseProgram(m_program);
80 
81  // configurer le shader program
82  // . recuperer les transformations
83  Transform model= RotationX(global_time() / 20);
84  Transform view= m_camera.view();
85  Transform projection= m_camera.projection(window_width(), window_height(), 45);
86 
87  // . composer les transformations : model, view et projection
88  Transform mvp= projection * view * model;
89 
90  // . parametrer le shader program :
91  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
92  program_uniform(m_program, "mvpMatrix", mvp);
93 
94  // . parametres "supplementaires" :
95  // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
96  program_use_texture(m_program, "texture0", 0, m_texture0);
97 
98  // . utilisation d'une texture configuree sur l'unite 1, le fragment shader declare "uniform sampler2D texture1;"
99  program_use_texture(m_program, "texture1", 1, m_texture1);
100 
101  // go !
102  // indiquer quels attributs de sommets du mesh sont necessaires a l'execution du shader.
103  // tuto9_textures.glsl n'utilise que position et texcoord. les autres de servent a rien.
104  m_objet.draw(m_program, /* use position */ true, /* use texcoord */ true, /* use normal */ false, /* use color */ false, /* use material index*/ false);
105  return 1;
106  }

◆ init() [12/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 86 of file tuto_cubemap.cpp.

87  {
88  //~ m_objet= read_mesh("data/cube.obj");
89  m_objet= read_mesh("data/bigguy.obj");
90  // m_objet= read_mesh("data/ccbigguy.obj");
91 
92  m_texture= read_cubemap(0, "tutos/cubemap_debug_cross.png");
93  // m_texture= read_cubemap(0, "canyon2.jpg");
94 
95  m_program_draw= read_program("tutos/draw_cubemap.glsl");
96  program_print_errors(m_program_draw);
97  m_program= read_program("tutos/cubemap.glsl");
98  program_print_errors(m_program);
99 
100  // init camera
101  Point pmin, pmax;
102  m_objet.bounds(pmin, pmax);
103  camera().lookat(pmin, pmax);
104 
105  // etat openGL par defaut
106  glGenVertexArrays(1, &m_vao);
107 
108  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
109 
110  glClearDepth(1.f); // profondeur par defaut
111  glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
112  glEnable(GL_DEPTH_TEST); // activer le ztest
113 
114  return 0; // ras, pas d'erreur
115  }
GLuint read_cubemap(const int unit, const char *filename, const GLenum texel_type=GL_RGBA)
charge une image, decoupe les 6 faces et renvoie une texture cubemap.

◆ quit() [12/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 118 of file tuto_cubemap.cpp.

119  {
120  m_objet.release();
121  release_program(m_program_draw);
122  release_program(m_program);
123  glDeleteVertexArrays(1, &m_vao);
124  glDeleteTextures(1, &m_texture);
125  return 0;
126  }

◆ render() [12/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 129 of file tuto_cubemap.cpp.

130  {
131  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
132 
133  Transform model= Identity();
134  Transform view= camera().view();
135  Transform projection= camera().projection();
136  Transform viewport= camera().viewport();
137  Transform mvp= projection * view * model;
138 
139  Transform viewInv= Inverse(view);
140  Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
141 
142  // etape 1 : affiche l'objet, utilise la cubemap pour calculer les reflets
143  glUseProgram(m_program);
144  program_uniform(m_program, "mvpMatrix", mvp);
145  program_uniform(m_program, "modelMatrix", model);
146  program_uniform(m_program, "camera_position", camera_position);
147 
148  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
149  program_uniform(m_program, "texture0", int(0));
150 
151  // dessine l'objet, les attributs position et normale sont necessaires a l'execution du shader.
152  m_objet.draw(m_program, /* position */ true, /* texcoord */ false, /* normal */ true, /* color */ false, /* material */ false);
153 
154  // etape 2 : affiche la cube map
155  // inverse de la composition des transformations repere monde vers repere image
156  Transform inv= Inverse(viewport * projection * view);
157 
158  glUseProgram(m_program_draw);
159  glBindVertexArray(m_vao);
160  program_uniform(m_program_draw, "invMatrix", inv);
161  program_uniform(m_program_draw, "camera_position", camera_position);
162 
163  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
164  program_uniform(m_program_draw, "texture0", int(0));
165 
166  glDrawArrays(GL_TRIANGLES, 0, 3);
167 
168  // nettoyage
169  glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
170  glUseProgram(0);
171  glBindVertexArray(0);
172 
173  if(key_state('r'))
174  {
175  clear_key_state('r');
176 
177  reload_program(m_program_draw, "tutos/draw_cubemap.glsl");
178  program_print_errors(m_program_draw);
179  reload_program(m_program, "tutos/cubemap.glsl");
180  program_print_errors(m_program);
181  }
182 
183  if(key_state('s'))
184  {
185  clear_key_state('s');
186  static int calls= 0;
187  screenshot("cubemap_brdf", ++calls);
188  printf("screenshot %d\n", calls);
189  }
190 
191  return 1;
192  }
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Definition: orbiter.cpp:83
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition: mat.cpp:197

◆ init() [13/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 182 of file tuto_decal.cpp.

183  {
184  // decrire un repere / grille
185  m_repere= make_grid(20);
186  m_local= make_grid(2);
187  m_ground= make_ground(20);
188  //~ m_ground= read_mesh("ground.obj"); // pas dans le depot...
189  m_proxy= make_xyz();
190  //~ m_proxy= make_camera();
191  m_frustum= make_frustum();
192 
193  // charge l'element
194  m_objet= read_mesh("data/robot.obj");
195 
196  m_texture= read_texture(0, "data/grid.png");
197  //~ m_texture= read_texture(0, "orange_splash.png"); // pas dans le depot
198  //~ m_texture= read_texture(0, "decal_shadow.png"); // pas dans le depot
199 
200  // gestion des bordures :
201  // solution 1 : utiliser les parametres openGL pour renvoyer du blanc en dehors de la texture,
202  // soit c'est le shader qui fait le boulot...
203  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
204  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
205  float border[]= { 1, 1, 1, 1 };
206  glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
207 
208  m_program= read_program("tutos/decal.glsl");
209  program_print_errors(m_program);
210 
211  // position initiale de l'objet
212  m_position= Identity();
213 
214  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
215  // recuperer les points extremes de l'objet (son englobant)
216  Point pmin, pmax;
217  m_ground.bounds(pmin, pmax);
218  // parametrer la camera de l'application, renvoyee par la fonction camera()
219  camera().lookat(pmin, pmax);
220 
221  // etat openGL par defaut
222  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
223 
224  glClearDepth(1.f); // profondeur par defaut
225  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
226  glEnable(GL_DEPTH_TEST); // activer le ztest
227 
228  return 0; // ras, pas d'erreur
229  }

◆ quit() [13/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 232 of file tuto_decal.cpp.

233  {
234  m_objet.release();
235  m_repere.release();
236  m_local.release();
237  m_ground.release();
238  m_proxy.release();
239 
240  release_program(m_program);
241  glDeleteTextures(1, &m_texture);
242  return 0;
243  }

◆ render() [13/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 246 of file tuto_decal.cpp.

247  {
248  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
249 
250  // modifie la position de l'objet en fonction des fleches de direction
251  if(key_state(SDLK_UP))
252  m_position= m_position * Translation(0, 0, 0.15); // en avant
253  if(key_state(SDLK_DOWN))
254  m_position= m_position * Translation(0, 0, -0.15); // en arriere
255  if(key_state(SDLK_PAGEUP))
256  m_position= m_position * Translation(0, 0.15, 0); // en haut
257  if(key_state(SDLK_PAGEDOWN))
258  m_position= m_position * Translation(0, -0.15, 0); // en bas
259 
260  if(key_state(SDLK_LEFT))
261  m_position= m_position * RotationY(2); // tourne vers la droite
262  if(key_state(SDLK_RIGHT))
263  m_position= m_position * RotationY(-2); // tourne vers la gauche
264 
265 
266  // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
267  // par exemple, a la verticale au dessus du premier cube :
268  // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
269 
270  Transform r= RotationX(-90);
271  Transform t= Translation(0,0, 8);
272  Transform m= r * t;
273 
274  Transform decal_view= Inverse(m_position * m);
275  //~ Transform decal_projection= Perspective(35, 1, float(0.1), float(10));
276  Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10));
277 
278  // transformations de la camera de l'application
279  Transform view= camera().view();
280  Transform projection= camera().projection();
281 
282  if(key_state('d'))
283  {
284  // change de point de vue
285  view= decal_view;
286  projection= decal_projection;
287  }
288 
289  draw(m_objet, /* model */ m_position, view, projection);
290  // dessine aussi le repere local
291  draw(m_local, /* model */ m_position, view, projection);
292 
293  // dessine le 2ieme objet par rapport au premier objet...
294  // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
295 
296  // dessine le repere utilise pour placer le decal...
297  draw(m_proxy, /* model */ m_position * m, view, projection);
298 
299  // dessine aussi le frustum
300  if(key_state('f'))
301  {
302  // passage repere projection vers global : inverse de projection*view
303  Transform decal_m= Inverse(decal_projection * decal_view);
304 
305  draw(m_frustum, decal_m, view, projection);
306  }
307 
308 
309  if(key_state(' '))
310  {
311  // dessine le repere global, pour le meme point de vue
312  draw(m_ground, Identity(), view, projection);
313  // affichage standard, sans texture projective...
314  }
315  else
316  {
317  // affichage du sol avec le decal / texture projective
318  glUseProgram(m_program);
319 
320  // transformations standards
321  Transform model;
322  Transform mv= view * model;
323  Transform mvp= projection * mv;
324 
325  program_uniform(m_program, "mvpMatrix", mvp);
326  program_uniform(m_program, "mvMatrix", mv);
327 
328  // transformations pour le decal
329  // transformation supplementaire pour lire la texture :
330  // passage repere projectif vers repere [0 1]x[0 1]
331  Transform decal_viewport= Viewport(1, 1);
332  Transform decal= decal_viewport * decal_projection * decal_view;
333 
334  program_uniform(m_program, "decalMatrix", decal);
335  program_use_texture(m_program, "texture", 0, m_texture);
336 
337  m_ground.draw(m_program, /* use position */ true, /* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index*/ false);
338  }
339 
340 
341  // screenshot
342  if(key_state('s'))
343  {
344  clear_key_state('s');
345  static int id= 1;
346  screenshot("camera", id++);
347  }
348 
349  // continuer...
350  return 1;
351  }
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition: mat.cpp:357
Transform Ortho(const float left, const float right, const float bottom, const float top, const float znear, const float zfar)
renvoie la matrice representant une transformation orthographique, passage d'un cube []x[]x[] vers [-...
Definition: mat.cpp:343

◆ init() [14/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 138 of file tuto_deferred_decal.cpp.

139  {
140  // decrire un repere / grille
141  m_repere= make_grid(20);
142  m_local= make_grid(2);
143  //~ m_ground= make_ground(20);
144  m_ground= read_mesh("ground.obj");
145  m_proxy= make_xyz();
146  m_frustum= make_frustum();
147  m_frustum_cube= read_mesh("data/frustum.obj");
148 
149  // charge l'element
150  m_objet= read_mesh("data/robot.obj");
151 
152  //~ m_texture= read_texture(0, "data/grid.png");
153  //~ m_texture= read_texture(0, "decal_shadow.png");
154  m_texture= read_texture(0, "orange_splash.png");
155  //~ m_texture= read_texture(0, "yellow_splash.png");
156  //~ m_texture= read_texture(0, "red_splash.png");
157 
158  m_mesh_program= read_program("tutos/deferred_mesh.glsl");
159  program_print_errors(m_mesh_program);
160  m_decal_program= read_program("tutos/deferred_decal.glsl");
161  program_print_errors(m_decal_program);
162 
163  // position initiale de l'objet
164  m_position= Identity();
165 
166  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
167  // recuperer les points extremes de l'objet (son englobant)
168  Point pmin, pmax;
169  m_ground.bounds(pmin, pmax);
170  // parametrer la camera de l'application, renvoyee par la fonction camera()
171  camera().lookat(pmin, pmax);
172 
173  m_framebuffer.create(window_width(), window_height());
174  m_framebuffer.clear_color(Black());
175  m_framebuffer.clear_depth(1);
176 
177  // etat openGL par defaut
178  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
179 
180  glClearDepth(1.f); // profondeur par defaut
181  glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
182  glEnable(GL_DEPTH_TEST); // activer le ztest
183 
184  return 0; // ras, pas d'erreur
185  }
Color Black()
utilitaire. renvoie une couleur noire.
Definition: color.cpp:31
GLuint create(const int width, const int height)
creation du framebuffer
Definition: framebuffer.cpp:13
void clear_color(const Color &value)
couleur par defaut.
void clear_depth(const float value)
profondeur par defaut.

◆ quit() [14/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 188 of file tuto_deferred_decal.cpp.

189  {
190  m_objet.release();
191  m_repere.release();
192  m_local.release();
193  m_ground.release();
194  m_proxy.release();
195 
196  m_framebuffer.release();
197  release_program(m_mesh_program);
198  release_program(m_decal_program);
199  glDeleteTextures(1, &m_texture);
200  return 0;
201  }
void release()
destruction.
Definition: framebuffer.cpp:33

◆ render() [14/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 204 of file tuto_deferred_decal.cpp.

205  {
206  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
207 
208  // modifie la position de l'objet en fonction des fleches de direction
209  if(key_state(SDLK_UP))
210  m_position= m_position * Translation(0, 0, 0.15); // en avant
211  if(key_state(SDLK_DOWN))
212  m_position= m_position * Translation(0, 0, -0.15); // en arriere
213  if(key_state(SDLK_PAGEUP))
214  m_position= m_position * Translation(0, 0.15, 0); // en haut
215  if(key_state(SDLK_PAGEDOWN))
216  m_position= m_position * Translation(0, -0.15, 0); // en bas
217 
218  if(key_state(SDLK_LEFT))
219  m_position= m_position * RotationY(2); // tourne vers la droite
220  if(key_state(SDLK_RIGHT))
221  m_position= m_position * RotationY(-2); // tourne vers la gauche
222 
223 
224  // transformations de la camera de l'application
225  Transform view= camera().view();
226  Transform projection= camera().projection();
227 
228  // dessine les objets dans le framebuffer... ceux sur lesquels on veut projetter le decal...
229  {
230  m_framebuffer.bind(0, /* store_color */ true, /* store_depth */ true, /* store_position */ false, /* store_texcoord */ false, /* store_normal */ false, /* store_material */ false);
231  // dessine le decor
232  draw(m_ground, /* model */ Identity(), view, projection);
233 
234  //~ // dessine l'objet, ou pas ...
235  //~ draw(m_objet, /* model */ m_position, view, projection);
236 
237  m_framebuffer.unbind(window_width(), window_height());
238  }
239 
240  // copie les textures vers la fenetre
241  m_framebuffer.blit_color(0, 0, window_width(), window_height());
242  m_framebuffer.blit_depth(0, 0, window_width(), window_height());
243 
244  // positionne le decal
245  Transform r= RotationX(-90);
246  Transform t= Translation(0,0, 8);
247  Transform m= r * t;
248 
249  Transform decal_view= Inverse(m_position * m);
250  //~ Transform decal_projection= Perspective(35, 1, float(0.1), float(10));
251  Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10));
252 
253  // dessine le frustum pour verifier que le placement est correct...
254  {
255  // passage repere projection vers global : inverse de projection*view
256  Transform decal_model= Inverse(decal_projection * decal_view);
257 
258  // juste les aretes
259  draw(m_frustum, decal_model, view, projection);
260  //~ // ou le proxy / un cube
261  //~ draw(m_frustum_cube, decal_model, view, projection);
262 
263  // dessine le repere utilise pour placer le decal...
264  draw(m_proxy, /* model */ m_position * m, view, projection);
265  }
266 
267  // dessine / projette le decal sur les objets dessines dans le framebuffer et modifie la couleur des pixels de la fenetre.
268  // == execute le fragment shader pour les pixels sur lesquels le decal peut se projetter
269  glUseProgram(m_decal_program);
270  {
271  // passage repere projection vers global : inverse de projection*view
272  {
273  Transform model= Inverse(decal_projection * decal_view);
274  Transform mv= view * model;
275  Transform mvp= projection * mv;
276 
277  program_uniform(m_decal_program, "mvpMatrix", mvp);
278  }
279 
280  {
281  // reprojette le fragment stocke dans le framebuffer dans le repere du monde
283  Transform m= Inverse(viewport * projection * view);
284  // puis passage du monde dans le repere de projection du decal
285  Transform decal_viewport= Viewport(1, 1);
286  Transform inv= decal_viewport * decal_projection * decal_view * m;
287 
288  program_uniform(m_decal_program, "invMatrix", inv);
289  }
290 
291  program_use_texture(m_decal_program, "decal_texture", 0, m_texture);
292  m_framebuffer.use_color_texture(m_decal_program, "color_texture", 1);
293  m_framebuffer.use_depth_texture(m_decal_program, "depth_texture", 2);
294 
295  // dessiner sans modifier le zbuffer / la profondeur stockee
296  glDepthMask(GL_FALSE);
297  m_frustum_cube.draw(m_decal_program, /* position */ true, /* texcoord */ false, /* normal */ false, /* color */ false, /* material id */ false);
298 
299  glDepthMask(GL_TRUE);
300  }
301 
302  // dessine les objets, sans decals...
303  // dessine l'objet, ou pas ...
304  draw(m_objet, /* model */ m_position, view, projection);
305 
306  // dessine aussi le repere local
307  draw(m_local, /* model */ m_position, view, projection);
308 
309  // screenshot
310  if(key_state('s'))
311  {
312  clear_key_state('s');
313  static int id= 1;
314  screenshot("camera", id++);
315  }
316 
317  // continuer...
318  return 1;
319  }
void unbind(const int width, const int height)
desactive le framebuffer, selection du framebuffer par defaut associe a la fenetre.
void bind(const GLuint program, const bool store_color, const bool store_depth, const bool store_position, const bool store_texcoord, const bool store_normal, const bool store_material)
selection du framebuffer, stocker les sorties du fragment shader. les textures sont initialisees avec...
Definition: framebuffer.cpp:51

◆ init() [15/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 84 of file tuto_draw_cubemap.cpp.

85  {
86  m_objet= read_mesh("data/cube.obj");
87  m_texture= read_cubemap(0, "tutos/cubemap_debug_cross.png");
88  m_program= read_program("tutos/draw_cubemap.glsl");
89  program_print_errors(m_program);
90 
91  // init camera
92  Point pmin, pmax;
93  m_objet.bounds(pmin, pmax);
94  camera().lookat(pmin, pmax);
95 
96  // etat openGL par defaut
97  glGenVertexArrays(1, &m_vao);
98 
99  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
100 
101  glClearDepth(1.f); // profondeur par defaut
102  glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
103  glEnable(GL_DEPTH_TEST); // activer le ztest
104 
105  return 0; // ras, pas d'erreur
106  }
GLuint read_cubemap(const int unit, const char *filename, const GLenum texel_type=GL_RGBA)
charge une image, decoupe les 6 faces et renvoie une texture cubemap.

◆ quit() [15/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 109 of file tuto_draw_cubemap.cpp.

110  {
111  m_objet.release();
112  release_program(m_program);
113  glDeleteVertexArrays(1, &m_vao);
114  glDeleteTextures(1, &m_texture);
115  return 0;
116  }

◆ render() [15/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 119 of file tuto_draw_cubemap.cpp.

120  {
121  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
122 
123  glUseProgram(m_program);
124  glBindVertexArray(m_vao);
125 
126  Transform view= camera().view();
127  Transform projection= camera().projection();
128  Transform viewport= camera().viewport();
129  // inverse de la composition des transformations repere monde vers repere image
130  Transform inv= Inverse(viewport * projection * view);
131 
132  Transform viewInv= Inverse(view);
133  Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
134 
135  program_uniform(m_program, "invMatrix", inv);
136  program_uniform(m_program, "camera_position", camera_position);
137 
138  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
139  program_uniform(m_program, "texture0", int(0));
140 
141  glDrawArrays(GL_TRIANGLES, 0, 3);
142 
143  draw(m_objet, Identity(), view, projection);
144 
145  // nettoyage
146  glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
147  glUseProgram(0);
148  glBindVertexArray(0);
149  return 1;
150  }

◆ init() [16/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 168 of file tuto_dynamic_cubemap.cpp.

169  {
170  m_object= read_mesh("data/bigguy.obj");
171  m_cube= read_mesh("data/cube.obj");
172  m_ground= make_grid(20);
173 
174  m_program_render= read_program("tutos/render_cubemap.glsl");
175  program_print_errors(m_program_render);
176  m_program_draw= read_program("tutos/draw_cubemap.glsl");
177  program_print_errors(m_program_draw);
178  m_program= read_program("tutos/cubemap.glsl");
179  program_print_errors(m_program);
180 
181  // init camera
182  Point pmin, pmax;
183  m_object.bounds(pmin, pmax);
184  camera().lookat(pmin*2, pmax*2);
185 
186  // cubemap dynamique / framebuffer
187  init_dynamic_cubemap(1024, 1024);
188 
189  // etat openGL par defaut
190  glGenVertexArrays(1, &m_vao); // un vao sans attributs, pour dessiner la cubemap
191 
192  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
193 
194  glClearDepth(1.f); // profondeur par defaut
195  glDepthFunc(GL_LEQUAL); // !! ztest, conserver l'intersection la plus proche de la camera !!
196  glEnable(GL_DEPTH_TEST); // activer le ztest
197  glLineWidth(1.5);
198 
199  return 0; // ras, pas d'erreur
200  }

◆ render() [16/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 227 of file tuto_dynamic_cubemap.cpp.

228  {
229  Transform view= camera().view();
230  Transform projection= camera().projection();
231  Transform viewport= camera().viewport();
232  Transform mvp= projection * view;
233 
234  // "animer" les cubes du "decor"...
235  std::vector<Object> objects;
236  scene(objects);
237 
238  // partie 1 : dessiner le decor dans la cubemap dynamique
239  {
240  // ... dans le framebuffer
241  glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
242  glViewport(0, 0, 1024, 1024); // dimension des faces de la cubemap
243 
244  // efface les 6 faces couleur + profondeur attachees au framebuffer
245  float black[4]= { 0.6, 0.6, 0.6, 1 };
246  glClearBufferfv(GL_COLOR, 0, black);
247 
248  float one= 1;
249  glClearBufferfv(GL_DEPTH, 0, &one);
250 
251  // prepare les 6 matrices view, une par face de la cubemap
252  // !! attention a la direction 'up' de lookat... rappel : orientation des textures des cubemaps !!
253  Transform faces[6];
254  faces[0]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(1, 0, 0), /* up */ Vector(0, -1, 0)); // +X
255  faces[1]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(-1, 0, 0), /* up */ Vector(0, -1, 0)); // -X
256 
257  faces[2]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 1, 0), /* up */ Vector(0, 0, 1)); // +Y
258  faces[3]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, -1, 0), /* up */ Vector(0, 0, -1)); // -Y
259 
260  faces[4]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 0, 1), /* up */ Vector(0, -1, 0)); // +Z
261  faces[5]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 0, -1), /* up */ Vector(0, -1, 0)); // -Z
262 
263  // dessine chaque objet du decor
264  GLuint vao= m_cube.create_buffers( /* texcoord */ false, /* normal */ true, /* color */ false, /* material */ false);
265  glBindVertexArray(vao);
266 
267  glUseProgram(m_program_render);
268  int location_mvp= glGetUniformLocation(m_program_render, "mvpMatrix");
269  int location_model= glGetUniformLocation(m_program_render, "modelMatrix");
270 
271  for(int i= 0; i < int(objects.size()); i++)
272  {
273  Transform model= objects[i].model;
274  Transform projection= Perspective(45, 1, 0.01, 100);
275 
276  // recalcule les 6 transformations, model est different pour chaque objet
277  Transform mvp[6];
278  for(int i= 0; i < 6; i++)
279  mvp[i]= projection * faces[i] * model;
280 
281  // go !!
282  glUniformMatrix4fv(location_mvp, 6, GL_TRUE, mvp[0].data());
283  glUniformMatrix4fv(location_model, 1, GL_TRUE, model.data());
284  glDrawArraysInstanced(GL_TRIANGLES, 0, m_object.vertex_count(), 6);
285  }
286 
287  // mise a jour des mipmaps des faces de la cubemap
288  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
289  glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
290  }
291 
292  // partie 2 : dessiner avec la cubemap dynamique...
293  {
294  // ... dans le framebuffer de la fenetre de l'application
295  glBindFramebuffer(GL_FRAMEBUFFER, 0);
296  glViewport(0, 0, window_width(), window_height());
297  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
298 
299  Transform viewInv= Inverse(view);
300  Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
301 
302  // affiche l'objet principal, utilise la cubemap pour calculer les reflets
303  Transform model= Identity();
304 
305  glUseProgram(m_program);
306  program_uniform(m_program, "mvpMatrix", mvp * model);
307  program_uniform(m_program, "modelMatrix", model);
308  program_uniform(m_program, "camera_position", camera_position);
309 
310  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
311  program_uniform(m_program, "texture0", int(0));
312 
313  // dessine l'objet, les attributs position et normale sont necessaires a l'execution du shader.
314  m_object.draw(m_program, /* position */ true, /* texcoord */ false, /* normal */ true, /* color */ false, /* material */ false );
315 
316  // et le reste
317  draw(m_ground, Identity(), view, projection);
318  for(int i= 0; i < int(objects.size()); i++)
319  draw(m_cube, objects[i].model, view, projection);
320 
321  // etape 2 : affiche la cube map
322  // inverse de la transformation repere monde vers repere image
323  Transform inv= Inverse(viewport * projection * view);
324 
325  glUseProgram(m_program_draw);
326  glBindVertexArray(m_vao);
327  program_uniform(m_program_draw, "invMatrix", inv);
328  program_uniform(m_program_draw, "camera_position", camera_position);
329 
330  glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
331  program_uniform(m_program_draw, "texture0", int(0));
332 
333  glDrawArrays(GL_TRIANGLES, 0, 3);
334  }
335 
336  // nettoyage
337  glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
338  glUseProgram(0);
339  glBindVertexArray(0);
340 
341  if(key_state('r'))
342  {
343  clear_key_state('r');
344 
345  reload_program(m_program_render, "tutos/render_cubemap.glsl");
346  program_print_errors(m_program_render);
347  reload_program(m_program_draw, "tutos/draw_cubemap.glsl");
348  program_print_errors(m_program_draw);
349  reload_program(m_program, "tutos/cubemap.glsl");
350  program_print_errors(m_program);
351  }
352 
353  if(key_state('s'))
354  {
355  clear_key_state('s');
356  static int calls= 0;
357  screenshot("cubemap_brdf", ++calls);
358  printf("screenshot %d\n", calls);
359  }
360 
361  return 1;
362  }
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
Definition: mat.cpp:329
Transform Lookat(const Point &from, const Point &to, const Vector &up)
renvoie la matrice representant le placement et l'orientation d'une camera pour observer le point to.
Definition: mat.cpp:369
representation d'un vecteur 3d.
Definition: vec.h:59

◆ quit() [16/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 365 of file tuto_dynamic_cubemap.cpp.

366  {
367  m_object.release();
368  m_cube.release();
369  m_ground.release();
370 
371  release_program(m_program_render);
372  release_program(m_program_draw);
373  release_program(m_program);
374 
375  glDeleteVertexArrays(1, &m_vao);
376 
377  glDeleteTextures(1, &m_texture_cubemap);
378  glDeleteTextures(1, &m_depth_cubemap);
379  glDeleteFramebuffers(1, &m_framebuffer);
380  return 0;
381  }

◆ init() [17/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 137 of file tuto_shadows.cpp.

138  {
139  // decrire un repere / grille
140  m_repere= make_grid(20);
141  m_local= make_grid(2);
142  m_ground= make_ground(20);
143  //~ m_ground= read_mesh("ground.obj");
144  m_proxy= make_xyz();
145  m_frustum= make_frustum();
146 
147  // charge l'element
148  m_objet= read_mesh("data/robot.obj");
149 
150  m_decal_program= read_program("tutos/draw_decal.glsl");
151  program_print_errors(m_decal_program);
152 
153  m_shadow_program= read_program("tutos/decal.glsl");
154  program_print_errors(m_shadow_program);
155 
156  // position initiale de l'objet
157  m_position= Identity();
158 
159  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
160  // recuperer les points extremes de l'objet (son englobant)
161  Point pmin, pmax;
162  m_ground.bounds(pmin, pmax);
163  // parametrer la camera de l'application, renvoyee par la fonction camera()
164  camera().lookat(pmin, pmax);
165 
166  // framebuffer pour dessiner les ombres
167  m_framebuffer.create(1024, 1024);
168  m_framebuffer.clear_color(White());
169  m_framebuffer.clear_depth(1);
170 
171  // etat openGL par defaut
172  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
173 
174  glClearDepth(1.f); // profondeur par defaut
175  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
176  glEnable(GL_DEPTH_TEST); // activer le ztest
177 
178  return 0; // ras, pas d'erreur
179  }
Color White()
utilitaire. renvoie une couleur blanche.
Definition: color.cpp:36

◆ quit() [17/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 182 of file tuto_shadows.cpp.

183  {
184  m_objet.release();
185  m_repere.release();
186  m_local.release();
187  m_ground.release();
188  m_proxy.release();
189 
190  release_program(m_decal_program);
191  release_program(m_shadow_program);
192  m_framebuffer.release();
193  return 0;
194  }

◆ render() [17/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 197 of file tuto_shadows.cpp.

198  {
199  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
200 
201  // modifie la position de l'objet en fonction des fleches de direction
202  if(key_state(SDLK_UP))
203  m_position= m_position * Translation(0, 0, 0.15); // en avant
204  if(key_state(SDLK_DOWN))
205  m_position= m_position * Translation(0, 0, -0.15); // en arriere
206  if(key_state(SDLK_PAGEUP))
207  m_position= m_position * Translation(0, 0.15, 0); // en haut
208  if(key_state(SDLK_PAGEDOWN))
209  m_position= m_position * Translation(0, -0.15, 0); // en bas
210 
211  if(key_state(SDLK_LEFT))
212  m_position= m_position * RotationY(2); // tourne vers la droite
213  if(key_state(SDLK_RIGHT))
214  m_position= m_position * RotationY(-2); // tourne vers la gauche
215 
216  // positionne la projection a la vertice au dessus de l'objet
217  Transform r= RotationX(-90);
218  Transform t= Translation(0,0, 8);
219  Transform m= r * t;
220 
221  // construit les transformations
222  Transform decal_view= Inverse(m_position * m);
223  //~ Transform decal_projection= Perspective(40, 1, float(0.1), float(10)); // projection perspective "classique"
224  Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10)); // projection orthographique
225 
226  // transformations de la camera de l'application
227  Transform view= camera().view();
228  Transform projection= camera().projection();
229 
230  if(key_state('c'))
231  {
232  // change de point de vue
233  view= decal_view;
234  projection= decal_projection;
235  }
236 
237  // dessine l'objet
238  draw(m_objet, /* model */ m_position, view, projection);
239  // dessine aussi le repere local
240  draw(m_local, /* model */ m_position, view, projection);
241 
242  // dessine le repere utilise pour placer le decal...
243  draw(m_proxy, /* model */ m_position * m, view, projection);
244 
245  // dessine aussi le frustum pour projetter le decal
246  {
247  // passage repere projection vers global : inverse de projection*view
248  Transform decal_m= Inverse(decal_projection * decal_view);
249 
250  draw(m_frustum, decal_m, view, projection);
251  }
252 
253  if(key_state(' '))
254  {
255  // affichage standard, sans texture projective...
256  draw(m_ground, Identity(), view, projection);
257  }
258  else
259  {
260  // etape 1: dessine l'objet dans le framebuffer, vu du dessus... utilise les transformations du decal
261  m_framebuffer.bind(m_decal_program, /* store_color */ true, /* store_depth */ true, /* store_position */ false, /* store_texcoord */ false, /* store_normal */ false, /* store_material */ false);
262  {
263  glUseProgram(m_decal_program);
264 
265  Transform model= m_position; // position de l'objet
266  Transform mv= decal_view * model;
267  Transform mvp= decal_projection * mv;
268 
269  program_uniform(m_decal_program, "mvpMatrix", mvp);
270 
271  m_objet.draw(m_decal_program, /* use position */ true, /* use texcoord */ false, /* use normal */ false, /* use color */ false, /* use material index*/ false);
272  }
273 
274  // etape 2: retour a la normale, dessine les autres objets dans la fenetre
275  m_framebuffer.unbind(window_width(), window_height());
276 
277  // etape 3: affichage du sol avec le decal / la texture projective dessinee par l'etape 1
278  glUseProgram(m_shadow_program);
279  {
280  // transformations standards
281  Transform model;
282  Transform mv= view * model;
283  Transform mvp= projection * mv;
284 
285  program_uniform(m_shadow_program, "mvpMatrix", mvp);
286  program_uniform(m_shadow_program, "mvMatrix", mv);
287 
288  // transformations pour le decal
289  // transformation supplementaire pour lire la texture : passage repere projectif vers repere [0 1]x[0 1]
290  Transform decal_viewport= Viewport(1, 1);
291  Transform decal= decal_viewport * decal_projection * decal_view;
292 
293  program_uniform(m_shadow_program, "decalMatrix", decal);
294 
295  // utilise la texture de l'etape 1 comme decal...
296  m_framebuffer.use_color_texture(m_shadow_program, "decal", 0);
297 
298  // dessiner l'objet avec le decal...
299  m_ground.draw(m_shadow_program, /* use position */ true, /* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index*/ false);
300  }
301 
302  // etape 4 : nettoyage
303  m_framebuffer.unbind_textures();
304  }
305 
306 
307  // copie la texture de l'etape 1 / le decal en bas a gauche de la fenetre
308  m_framebuffer.blit_color(0, 0, 256, 256);
309 
310 
311  // screenshot
312  if(key_state('s'))
313  {
314  clear_key_state('s');
315  static int id= 1;
316  screenshot("camera", id++);
317  }
318 
319  // continuer...
320  return 1;
321  }
void unbind_textures()
nettoyage, desactive les textures utilisees par les autres shaders, cf use_color_texture(),...

◆ init() [18/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 55 of file tuto_transform.cpp.

56  {
57  // volume visible par une camera, un cube -1 1
58  m_frustum= read_mesh("data/frustum.obj");
59 
60  // grille / plan de reference
61  m_grid.create(GL_LINES);
62  for(int x= 0; x < 10; x++)
63  {
64  float px= (float) x - 5.f + 0.5f;
65  m_grid.vertex(px, 0, -4.5f);
66  m_grid.vertex(px, 0, 4.5f);
67  }
68 
69  for(int z= 0; z < 10; z++)
70  {
71  float pz= (float) z - 5.f + 0.5f;
72  m_grid.vertex(-4.5f, 0, pz);
73  m_grid.vertex(4.5f, 0, pz);
74  }
75 
76  // charge un objet a afficher
77  m_objet= read_mesh("data/bigguy.obj");
78 
79  // conserve (les extremites de) sa boite englobante
80  m_objet.bounds(m_pmin, m_pmax);
81  m_camera.lookat(m_pmin, m_pmax);
82  //~ m_camera.lookat(Point(), 10);
83 
84  m_objet.default_color(Green());
85 
86  // etat openGL par defaut
87  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
88 
89  glClearDepth(1.f); // profondeur par defaut
90  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
91  glEnable(GL_DEPTH_TEST); // activer le ztest
92 
93  return 0; // ras, pas d'erreur
94  }
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Definition: mesh.cpp:109
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee.
Definition: mesh.h:284
Color Green()
utilitaire. renvoie une couleur verte.
Definition: color.cpp:46

◆ quit() [18/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 97 of file tuto_transform.cpp.

98  {
99  m_frustum.release();
100  m_grid.release();
101  m_objet.release();
102  glDeleteTextures(1, &m_texture);
103 
104  return 0;
105  }

◆ update() [2/5]

int TP::update ( const float  time,
const float  delta 
)
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 107 of file tuto_transform.cpp.

108  {
109  // modifier l'orientation du cube a chaque image.
110  // time est le temps ecoule depuis le demarrage de l'application, en millisecondes,
111  // delta est le temps ecoule depuis l'affichage de la derniere image / le dernier appel a draw(), en millisecondes.
112 
113  m_model= RotationY(time / 20);
114  return 0;
115  }

◆ render() [18/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 118 of file tuto_transform.cpp.

119  {
120  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
121 
122  // deplace la camera
123  int mx, my;
124  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
125 
126  if(key_state(' '))
127  {
128  // deplace la camera "normale"
129  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
130  m_camera.rotation((float) mx, (float) my);
131  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
132  m_camera.move((float) mx);
133  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
134  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
135  }
136  else
137  {
138  // deplace l'observateur
139  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
140  m_observer.rotation((float) mx / 10, (float) my / 10);
141  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
142  m_observer.move((float) mx / 10);
143  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
144  m_observer.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
145  }
146 
147  // affiche l'objet en rouge, si sa boite englobante n'est pas visible pour la camera.
148  if(visible(m_camera.projection((float) window_width(), (float)window_height(), 45) * m_camera.view() * m_model, m_pmin, m_pmax))
149  m_objet.default_color(Green());
150  else
151  m_objet.default_color(Red());
152 
153 
154  Transform view= m_observer.view();
155  Transform projection= Perspective(45, (float) window_width() / (float) window_height(), .1f, 1000.f);
156 
157  static bool wireframe= false;
158  if(key_state(' '))
159  {
160  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
161 
162  // afficher le point de vue "normal"
163  draw(m_grid, m_camera);
164  draw(m_objet, m_model, m_camera);
165  }
166  else
167  {
168  if(key_state('w'))
169  {
170  clear_key_state('w');
171  wireframe= !wireframe;
172  }
173 
174  if(!wireframe)
175  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
176  else
177  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
178 
179  #if 1
180  // afficher le volume visible de la camera dans le repere monde
181  draw(m_grid, Identity(), view, projection);
182  draw(m_frustum, Inverse(m_camera.projection((float) window_width(), (float) window_height(), 45) * m_camera.view()), view, projection);
183  draw(m_objet, m_model, view, projection);
184 
185  #else
186  // afficher dans le repere image
187  draw(m_grid, m_camera.projection(window_width(), window_height(), 45) * m_camera.view(), view, projection);
188  draw(m_frustum, m_camera.projection(window_width(), window_height(), 45) * m_camera.view() * Inverse(m_camera.projection(window_width(), window_height(), 45) * m_camera.view()), view, projection);
189  // remarque : ca se simplifie non ??
190  draw(m_objet, m_camera.projection(window_width(), window_height(), 45) * m_camera.view() * m_model, view, projection);
191  #endif
192  }
193 
194  return 1;
195  }
Color Red()
utilitaire. renvoie une couleur rouge.
Definition: color.cpp:41

◆ init() [19/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 61 of file tuto_transformations.cpp.

62  {
63  // decrire un repere / grille
64  m_repere= make_grid(20);
65  m_local= make_grid(4);
66 
67  // charge l'element
68  m_objet= read_mesh("data/cube.obj");
69 
70  // position initiale de l'objet
71  m_position= Translation(0, 0.5, 0);
72 
73  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
74  // recuperer les points extremes de l'objet (son englobant)
75  Point pmin, pmax;
76  m_repere.bounds(pmin, pmax);
77  // parametrer la camera de l'application, renvoyee par la fonction camera()
78  camera().lookat(pmin, pmax);
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; // ras, pas d'erreur
88  }

◆ quit() [19/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 91 of file tuto_transformations.cpp.

92  {
93  m_objet.release();
94  m_repere.release();
95  m_local.release();
96  return 0;
97  }

◆ render() [19/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 100 of file tuto_transformations.cpp.

101  {
102  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
103 
104  // modifie la position de l'objet en fonction des fleches de direction
105  if(key_state(SDLK_UP))
106  m_position= m_position * Translation(0, 0, 0.25); // en avant
107  if(key_state(SDLK_DOWN))
108  m_position= m_position * Translation(0, 0, -0.25); // en arriere
109 
110  if(key_state(SDLK_LEFT))
111  m_position= m_position * RotationY(4); // tourne vers la droite
112  if(key_state(SDLK_RIGHT))
113  m_position= m_position * RotationY(-4); // tourne vers la gauche
114 
115  draw(m_objet, /* model */ m_position, camera());
116 
117  // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
118  // par exemple, a la verticale au dessus du premier cube :
119  // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
120  Transform t= Translation(0, 2, 0);
121 
122  // et si on veut le faire tourner en fonction du temps ?
123  float time= global_time();
124  Transform r= RotationX(time / float(20));
125 
126  // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
127  // mais attention : l'ordre de la multiplication des matrices change le resultat...
128  //~ // solution 1 : tourner le cube puis le deplacer
129  //~ Transform m= t * r;
130 
131  // solution 2 : deplacer puis tourner le cube
132  Transform m= r * t;
133 
134  // dessine le 2ieme objet par rapport au premier objet...
135  // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
136  draw(m_objet, /* model */ m_position * m, camera());
137 
138  // dessine aussi le repere local, pour le meme point de vue
139  draw(m_local, m_position, camera());
140 
141  // dessine le repere global, pour le meme point de vue
142  draw(m_repere, Identity(), camera());
143 
144  // screenshot
145  if(key_state('s'))
146  {
147  clear_key_state('s');
148  static int id= 1;
149  screenshot("camera", id++);
150  }
151 
152  // continuer...
153  return 1;
154  }

◆ init() [20/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 104 of file tuto_transformations_camera.cpp.

105  {
106  // decrire un repere / grille
107  m_repere= make_grid(20);
108  m_local= make_grid(2);
109  m_proxy= make_camera();
110 
111  // charge l'element
112  m_objet= read_mesh("data/cube.obj");
113 
114  // position initiale de l'objet
115  m_position= Identity();
116 
117  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
118  // recuperer les points extremes de l'objet (son englobant)
119  Point pmin, pmax;
120  m_repere.bounds(pmin, pmax);
121  // parametrer la camera de l'application, renvoyee par la fonction camera()
122  camera().lookat(pmin, pmax);
123 
124  // etat openGL par defaut
125  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
126 
127  glClearDepth(1.f); // profondeur par defaut
128  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
129  glEnable(GL_DEPTH_TEST); // activer le ztest
130 
131  return 0; // ras, pas d'erreur
132  }

◆ quit() [20/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 135 of file tuto_transformations_camera.cpp.

136  {
137  m_objet.release();
138  m_repere.release();
139  m_local.release();
140  m_proxy.release();
141  return 0;
142  }

◆ render() [20/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 145 of file tuto_transformations_camera.cpp.

146  {
147  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
148 
149  // modifie la position de l'objet en fonction des fleches de direction
150  if(key_state(SDLK_UP))
151  m_position= m_position * Translation(0, 0, 0.25); // en avant
152  if(key_state(SDLK_DOWN))
153  m_position= m_position * Translation(0, 0, -0.25); // en arriere
154 
155  if(key_state(SDLK_LEFT))
156  m_position= m_position * RotationY(4); // tourne vers la droite
157  if(key_state(SDLK_RIGHT))
158  m_position= m_position * RotationY(-4); // tourne vers la gauche
159 
160 
161  // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
162  // par exemple, a la verticale au dessus du premier cube :
163  // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
164  Transform t= Translation(0, 2, 0);
165 
166  float time= global_time();
167  static Transform r;
168  if(!key_state('f'))
169  // rotation en fonction du temps...
170  r= RotationX(time / float(20));
171  else
172  {
173  // place la camera derriere le cube
174  r= RotationX(15) * RotationY(180);
175  t= Translation(1, 1, 4);
176  }
177  // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
178  // mais attention : l'ordre de la multiplication des matrices change le resultat...
179  Transform m= r * t;
180 
181  // transformations de la camera de l'application
182  Transform view= camera().view();
183  Transform projection= camera().projection();
184 
185  if(key_state(' '))
186  {
187  view= Inverse(m_position * m);
188  projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
189  }
190 
191  draw(m_objet, /* model */ m_position, view, projection);
192 
193  // dessine le 2ieme objet par rapport au premier objet...
194  // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
195  draw(m_proxy, /* model */ m_position * m, view, projection);
196 
197  // dessine aussi le repere local, pour le meme point de vue
198  draw(m_local, m_position, view, projection);
199 
200  // dessine le repere global, pour le meme point de vue
201  draw(m_repere, Identity(), view, projection);
202 
203  // screenshot
204  if(key_state('s'))
205  {
206  clear_key_state('s');
207  static int id= 1;
208  screenshot("camera", id++);
209  }
210 
211  // continuer...
212  return 1;
213  }

◆ init() [21/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 104 of file tuto_transformations_lookat.cpp.

105  {
106  // decrire un repere / grille
107  m_repere= make_grid(20);
108  m_local= make_grid(2);
109  m_proxy= make_camera();
110 
111  // charge l'element
112  m_objet= read_mesh("data/cube.obj");
113 
114  // position initiale de l'objet
115  m_position= Identity();
116 
117  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
118  // recuperer les points extremes de l'objet (son englobant)
119  Point pmin, pmax;
120  m_repere.bounds(pmin, pmax);
121  // parametrer la camera de l'application, renvoyee par la fonction camera()
122  camera().lookat(pmin, pmax);
123 
124  // etat openGL par defaut
125  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
126 
127  glClearDepth(1.f); // profondeur par defaut
128  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
129  glEnable(GL_DEPTH_TEST); // activer le ztest
130 
131  return 0; // ras, pas d'erreur
132  }

◆ quit() [21/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 135 of file tuto_transformations_lookat.cpp.

136  {
137  m_objet.release();
138  m_repere.release();
139  m_local.release();
140  m_proxy.release();
141  return 0;
142  }

◆ render() [21/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 145 of file tuto_transformations_lookat.cpp.

146  {
147  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
148 
149  // modifie la position de l'objet en fonction des fleches de direction
150  if(key_state(SDLK_UP))
151  m_position= m_position * Translation(0, 0, 0.25); // en avant
152  if(key_state(SDLK_DOWN))
153  m_position= m_position * Translation(0, 0, -0.25); // en arriere
154 
155  if(key_state(SDLK_LEFT))
156  m_position= m_position * RotationY(4); // tourne vers la droite
157  if(key_state(SDLK_RIGHT))
158  m_position= m_position * RotationY(-4); // tourne vers la gauche
159 
160  // transformations de la camera de l'application
161  Transform view= camera().view();
162  Transform projection= camera().projection();
163 
164  // view= Inverse(m_position * m);
165  // view= Inverse(m) * Inverse(m_position);
166  // et Inverse(m) est le resultat de Lookat()...
167  view= Lookat(Point(0,1,-4), Point(0,0,1), Vector(0,1,0)) * Inverse(m_position);
168  projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
169  Transform m= Inverse(view);
170 
171  draw(m_objet, /* model */ m_position, view, projection);
172 
173  // dessine le 2ieme objet par rapport au premier objet...
174  // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
175  draw(m_proxy, /* model */ m, view, projection);
176 
177  // dessine aussi le repere local, pour le meme point de vue
178  draw(m_local, m_position, view, projection);
179 
180  // dessine le repere global, pour le meme point de vue
181  draw(m_repere, Identity(), view, projection);
182 
183  // screenshot
184  if(key_state('s'))
185  {
186  clear_key_state('s');
187  static int id= 1;
188  screenshot("lookat", id++);
189  }
190 
191  // continuer...
192  return 1;
193  }

◆ init() [22/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 36 of file tuto_mdi.cpp.

37  {
38  // verifie l'existence des extensions
39  if(!GLEW_ARB_shader_draw_parameters)
40  return -1;
41  printf("GL_ARB_shader_draw_parameters ON\n");
42 
43  m_objet= read_mesh("data/bigguy.obj");
44  Point pmin, pmax;
45  m_objet.bounds(pmin, pmax);
46 
47  m_camera.lookat(pmin - Vector(200, 200, 0), pmax + Vector(200, 200, 0));
48 
49  // genere les parametres des draws et les transformations
50  for(int y= -15; y <= 15; y++)
51  for(int x= -15; x <= 15; x++)
52  {
53  m_multi_model.push_back( Translation(x *20, y *20, 0) );
54  m_multi_indirect.push_back( { unsigned(m_objet.vertex_count()), 1, 0, 0} );
55  }
56  // oui c'est la meme chose qu'un draw instancie, mais c'est juste pour comparer les 2 solutions...
57 
58  // stockage des parametres du multi draw indirect
59  glGenBuffers(1, &m_indirect_buffer);
60  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
61  glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(IndirectParam) * m_multi_indirect.size(), &m_multi_indirect.front(), GL_DYNAMIC_DRAW);
62 
63  // stockage des matrices des objets
64  glGenBuffers(1, &m_model_buffer);
65  glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
66  glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Transform) * m_multi_model.size(), &m_multi_model.front(), GL_DYNAMIC_DRAW);
67 
68  // creation des vertex buffer, uniquement les positions
69  m_vao= m_objet.create_buffers(/* texcoord */ false, /* normal */ false, /* color */ false, /* material */ false);
70 
71  // shader programs
72  m_program_direct= read_program("tutos/M2/indirect_direct.glsl"); // affichage classique N draws
73  program_print_errors(m_program_direct);
74 
75  m_program= read_program("tutos/M2/indirect.glsl"); // affichage indirect 1 multi draw
76  program_print_errors(m_program);
77 
78  // affichage du temps cpu / gpu
79  m_console= create_text();
80 
81  // mesure du temps gpu de glDraw
82  glGenQueries(1, &m_time_query);
83 
84  // etat openGL par defaut
85  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
86 
87  glClearDepth(1.f); // profondeur par defaut
88  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
89  glEnable(GL_DEPTH_TEST); // activer le ztest
90 
91  return 0; // ras, pas d'erreur
92  }
Text create_text()
cree une console. a detruire avec release_text( ).
Definition: text.cpp:14
tuto_mdi_elements.cpp exemple d'utilisation de multidrawindirect pour des triangles indexes.
Definition: tuto_mdi.cpp:22

◆ quit() [22/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 94 of file tuto_mdi.cpp.

95  {
96  glDeleteQueries(1, &m_time_query);
97  release_text(m_console);
98 
99  release_program(m_program);
100  m_objet.release();
101  glDeleteBuffers(1, &m_indirect_buffer);
102 
103  return 0;
104  }
void release_text(Text &text)
detruit une console.
Definition: text.cpp:64

◆ update() [3/5]

int TP::update ( const float  time,
const float  delta 
)
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 106 of file tuto_mdi.cpp.

107  {
108  m_model= RotationY(time / 20);
109  return 0;
110  }

◆ render() [22/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 112 of file tuto_mdi.cpp.

113  {
114  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
115 
116  // deplace la camera
117  int mx, my;
118  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
119  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
120  m_camera.rotation(mx, my);
121  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
122  m_camera.move(mx);
123  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
124  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
125 
126  // mesure le temps d'execution du draw
127  glBeginQuery(GL_TIME_ELAPSED, m_time_query); // pour le gpu
128  std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now(); // pour le cpu
129 
130  #if 0
131  // dessine n copies de l'objet avec 1 glDrawArrays par copie
132  glBindVertexArray(m_vao);
133  glUseProgram(m_program_direct);
134 
135  program_uniform(m_program_direct, "modelMatrix", m_model);
136  program_uniform(m_program_direct, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
137  program_uniform(m_program_direct, "viewMatrix", m_camera.view());
138 
139  // dessine l'objet avec 1 draw par copie
140  for(int i= 0; i < int(m_multi_model.size()); i++)
141  {
142  program_uniform(m_program_direct, "objectMatrix", m_multi_model[i]);
143  glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count());
144  }
145  // dans ce cas particulier, on pourrait utiliser un draw instancie, mais ce n'est pas le but du tuto...
146 
147  #else
148  // dessine n copies de l'objet avec 1 seul appel a glMultiDrawArraysIndirect
149  glBindVertexArray(m_vao);
150  glUseProgram(m_program);
151 
152  // uniforms...
153  program_uniform(m_program, "modelMatrix", m_model);
154  program_uniform(m_program, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
155  program_uniform(m_program, "viewMatrix", m_camera.view());
156 
157  // buffers...
158  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_model_buffer);
159  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
160 
161  glMultiDrawArraysIndirect(m_objet.primitives(), 0, m_multi_indirect.size(), 0);
162  #endif
163 
164 
165  // affiche le temps
166  std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
167  long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
168 
169  glEndQuery(GL_TIME_ELAPSED);
170 
171  // recupere le resultat de la requete gpu
172  GLint64 gpu_time= 0;
173  glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
174 
175  clear(m_console);
176  printf(m_console, 0, 0, "cpu %02dms %03dus", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
177  printf(m_console, 0, 1, "gpu %02dms %03dus", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
178 
179  draw(m_console, window_width(), window_height());
180 
181  printf("cpu %02dms %03dus ", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
182  printf("gpu %02dms %03dus\n", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
183 
184  return 1;
185  }
GLenum primitives() const
renvoie le type de primitives.
Definition: mesh.h:336
void clear(Text &text)
efface le contenu de la console.
Definition: text.cpp:72

◆ init() [23/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 44 of file tuto_mdi_count.cpp.

45  {
46  // verifie l'existence des extensions
47  if(!GLEW_ARB_indirect_parameters)
48  return -1;
49  printf("GL_ARB_indirect_parameters ON\n");
50 
51  if(!GLEW_ARB_shader_draw_parameters)
52  return -1;
53  printf("GL_ARB_shader_draw_parameters ON\n");
54 
55  m_object= read_mesh("data/bigguy.obj");
56  Point pmin, pmax;
57  m_object.bounds(pmin, pmax);
58  m_camera.lookat(pmin - Vector(200, 200, 0), pmax + Vector(200, 200, 0));
59 
60  // genere les parametres des draws et les transformations
61  for(int y= -15; y <= 15; y++)
62  for(int x= -15; x <= 15; x++)
63  {
64  m_multi_model.push_back( Translation(x *20, y *20, 0) );
65 
66  // calcule la bbox de chaque objet dans le repere du monde
67  m_objects.push_back( {pmin + Vector(x *20, y *20, 0), unsigned(m_object.vertex_count()), pmax + Vector(x *20, y *20, 0), 0} );
68  }
69  // oui c'est la meme chose qu'un draw instancie, mais c'est juste pour comparer les 2 solutions...
70 
71  // transformations des objets
72  glGenBuffers(1, &m_model_buffer);
73  glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
74  glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Transform) * m_multi_model.size(), m_multi_model.data(), GL_DYNAMIC_DRAW);
75 
76  // objets a tester
77  glGenBuffers(1, &m_object_buffer);
78  glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_object_buffer);
79  glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Object) * m_objects.size(), m_objects.data(), GL_DYNAMIC_DRAW);
80 
81  // re-indexation des objets visibles
82  glGenBuffers(1, &m_remap_buffer);
83  glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_remap_buffer);
84  glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(int) * m_objects.size(), nullptr, GL_DYNAMIC_DRAW);
85 
86  // parametres du multi draw indirect
87  glGenBuffers(1, &m_indirect_buffer);
88  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
89  glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(IndirectParam) * m_objects.size(), nullptr, GL_DYNAMIC_DRAW);
90 
91  // nombre de draws de multi draw indirect count
92  glGenBuffers(1, &m_parameter_buffer);
93  glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameter_buffer);
94  glBufferData(GL_PARAMETER_BUFFER_ARB, sizeof(int), nullptr, GL_DYNAMIC_DRAW);
95 
96  // creation des vertex buffer, uniquement les positions
97  m_vao= m_object.create_buffers(/* texcoord */ false, /* normal */ false, /* color */ false, /* material */ false);
98 
99  // shader program
100  m_program_cull= read_program("tutos/M2/indirect_cull.glsl"); // tests de visibilite
101  program_print_errors(m_program_cull);
102 
103  m_program= read_program("tutos/M2/indirect_remap.glsl"); // affichage des objets visibles
104  program_print_errors(m_program);
105 
106  // affichage du temps cpu / gpu
107  m_console= create_text();
108 
109  // mesure du temps gpu de glDraw
110  glGenQueries(1, &m_time_query);
111 
112  // etat openGL par defaut
113  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
114 
115  glClearDepth(1.f); // profondeur par defaut
116  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
117  glEnable(GL_DEPTH_TEST); // activer le ztest
118 
119  return 0; // ras, pas d'erreur
120  }

◆ quit() [23/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 122 of file tuto_mdi_count.cpp.

123  {
124  glDeleteQueries(1, &m_time_query);
125  release_text(m_console);
126 
127  release_program(m_program);
128  release_program(m_program_cull);
129 
130  m_object.release();
131 
132  glDeleteBuffers(1, &m_indirect_buffer);
133  glDeleteBuffers(1, &m_parameter_buffer);
134  glDeleteBuffers(1, &m_remap_buffer);
135  glDeleteBuffers(1, &m_object_buffer);
136 
137  return 0;
138  }

◆ update() [4/5]

int TP::update ( const float  time,
const float  delta 
)
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 140 of file tuto_mdi_count.cpp.

141  {
142  m_model= RotationY(time / 20);
143  return 0;
144  }

◆ render() [23/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 146 of file tuto_mdi_count.cpp.

147  {
148  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
149 
150  // deplace la camera
151  int mx, my;
152  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
153  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
154  m_camera.rotation(mx, my);
155  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
156  m_camera.move(mx);
157  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
158  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
159 
160  // mesure le temps d'execution
161  glBeginQuery(GL_TIME_ELAPSED, m_time_query); // pour le gpu
162  std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now(); // pour le cpu
163 
164  // etape 1: compute shader, tester l'inclusion des objets dans une boite
165  glUseProgram(m_program_cull);
166 
167  // uniforms...
168  program_uniform(m_program_cull, "bmin", Point(-60, -60, -10));
169  program_uniform(m_program_cull, "bmax", Point(60, 60, 10));
170  //~ program_uniform(m_program_cull, "bmin", Point(-120, -120, -10));
171  //~ program_uniform(m_program_cull, "bmax", Point(120, 120, 10));
172 
173  // storage buffers...
174  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_object_buffer);
175  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_remap_buffer);
176  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_indirect_buffer);
177 
178  // compteur
179  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_parameter_buffer);
180  // remet le compteur a zero
181  unsigned int zero= 0;
182  glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);
183  // ou
184  // glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(int), &zero);
185 
186  // nombre de groupes de shaders
187  int n= m_objects.size() / 256;
188  if(m_objects.size() % 256)
189  n= n +1;
190 
191  glDispatchCompute(n, 1, 1);
192 
193  // etape 2 : attendre le resultat
194  glMemoryBarrier(GL_COMMAND_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT);
195 
196  // etape 3 : afficher les objets visibles (resultat de l'etape 1) avec 1 seul appel a glMultiDrawArraysIndirectCount
197  glBindVertexArray(m_vao);
198  glUseProgram(m_program);
199 
200  // uniforms...
201  program_uniform(m_program, "modelMatrix", m_model);
202  program_uniform(m_program, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
203  program_uniform(m_program, "viewMatrix", m_camera.view());
204 
205  // storage buffers...
206  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_model_buffer);
207  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_remap_buffer);
208 
209  // parametres du multi draw...
210  glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameter_buffer);
211  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
212 
213  glMultiDrawArraysIndirectCountARB(m_object.primitives(), 0, 0, m_objects.size(), 0);
214 
215  // affiche le temps
216  glEndQuery(GL_TIME_ELAPSED);
217  std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
218  long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
219 
220  // recupere le resultat de la requete gpu
221  GLint64 gpu_time= 0;
222  glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
223 
224  clear(m_console);
225  printf(m_console, 0, 0, "cpu %02dms %03dus", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
226  printf(m_console, 0, 1, "gpu %02dms %03dus", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
227 
228  draw(m_console, window_width(), window_height());
229 
230  printf("cpu %02dms %03dus ", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
231  printf("gpu %02dms %03dus\n", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
232 
233  return 1;
234  }

◆ init() [24/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 29 of file tuto_mdi_elements.cpp.

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 glDrawElememnts, 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  }
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

◆ quit() [24/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 90 of file tuto_mdi_elements.cpp.

91  {
92  // todo
93  return 0;
94  }

◆ render() [24/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 96 of file tuto_mdi_elements.cpp.

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  }

◆ init() [25/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 29 of file tuto_mdi_elements_count.cpp.

30  {
31  // verifier la presence de l'extension indirect_parameter,
32  // cf la doc https://registry.khronos.org/OpenGL/extensions/ARB/ARB_indirect_parameters.txt
33  if(GLEW_ARB_indirect_parameters == 0)
34  // erreur, extension non disponible
35  return -1;
36 
37  // charge un objet indexe
38  m_objet= read_indexed_mesh("data/robot.obj");
39 
40  Point pmin, pmax;
41  m_objet.bounds(pmin, pmax);
42  m_camera.lookat(pmin, pmax);
43 
44  // trie les triangles de l'objet par matiere.
45  std::vector<TriangleGroup> groups= m_objet.groups();
46 
47  /* parcours chaque groupe et construit les parametres du draw correspondant
48  on peut afficher les groupes avec glDrawElememnts, comme d'habitude :
49 
50  glBindVertexArray(m_vao);
51  glUseProgram(m_program);
52  glUniform();
53 
54  for(unsigned i= 0; i < groups.size(); i++)
55  glDrawElements(GL_TRIANGLES, /count/ groups[i].n, /type/ GL_UNSIGNED_INT, /offset/ groups[i].first * sizeof(unsigned));
56 
57  on peut remplir une structure IndirectParam par draw... et utiliser un seul appel a multidrawindirect
58  */
59 
60  std::vector<IndirectParam> params;
61  for(unsigned i= 0; i < groups.size(); i++)
62  {
63  params.push_back({
64  unsigned(groups[i].n), // count
65  1, // instance_count
66  unsigned(groups[i].first), // first_index
67  0, // vertex_base, pas la peine de renumeroter les sommets
68  0 // instance_base, pas d'instances
69  });
70  }
71 
72  m_draws= params.size();
73 
74  // transferer dans un buffer
75  glGenBuffers(1, &m_indirect_buffer);
76  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
77  glBufferData(GL_DRAW_INDIRECT_BUFFER, params.size() * sizeof(IndirectParam), params.data(), GL_STATIC_READ);
78 
79  // buffer pour le nombre de draw
80  unsigned n= params.size() - 2;
81  glGenBuffers(1, &m_indirect_count_buffer);
82  glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_indirect_count_buffer);
83  glBufferData(GL_PARAMETER_BUFFER_ARB, sizeof(unsigned), &n, GL_STATIC_READ);
84  // remarque : on pourrait aussi ajouter le compteur dans indirect_buffer, mais c'est sans doute plus lisible comme ca...
85 
86  // construire les buffers de l'objet
87  m_vao= m_objet.create_buffers(/* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index */ false);
88 
89  // et charge un shader..
90  m_program= read_program("tutos/M2/indirect_elements.glsl");
91  program_print_errors(m_program);
92 
93  // etat openGL par defaut
94  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
95 
96  glClearDepth(1.f); // profondeur par defaut
97  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
98  glEnable(GL_DEPTH_TEST); // activer le ztest
99 
100  return 0;
101  }

◆ quit() [25/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 103 of file tuto_mdi_elements_count.cpp.

104  {
105  // todo
106  return 0;
107  }

◆ render() [25/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 109 of file tuto_mdi_elements_count.cpp.

110  {
111  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
112 
113  // recupere les transformations
114  Transform model;
115  Transform view= camera().view();
116  Transform projection= camera().projection();
117  Transform mv= view * model;
118  Transform mvp= projection * mv;
119 
120  // parametre le shader
121  glBindVertexArray(m_vao);
122  glUseProgram(m_program);
123 
124  program_uniform(m_program, "mvpMatrix", mvp);
125  program_uniform(m_program, "mvMatrix", mv);
126 
127  #if 0
128  // parametre du multidraw indirect
129  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
130  glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, /* indirect */ 0, /* draw count */ m_draws, /* stride */ 0);
131  // on dessine tout
132  #else
133 
134  // parametres du multidraw indirect count
135  glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
136  glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_indirect_count_buffer);
137  glMultiDrawElementsIndirectCountARB(GL_TRIANGLES, GL_UNSIGNED_INT, /* indirect */ 0, /* draw count */ 0, /* max draw count */ m_draws, /* stride */ 0);
138  // on dessine tout, sauf les 2 derniers groupes... cf init du compteur / indirect_count_buffer
139  #endif
140 
141  return 1;
142  }

◆ init() [26/26]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 28 of file tuto_time.cpp.

29  {
30  // charge un objet et une texture a afficher
31  // mode 0 & 1
32  m_objet= read_mesh("data/bigguy.obj");
33  Point pmin, pmax;
34  m_objet.bounds(pmin, pmax);
35  m_camera.lookat(pmin - Vector(20, 20, 0), pmax + Vector(20, 20, 0));
36 
37  m_texture= read_texture(0, "data/debug2x2red.png");
38 
39  // mode 2
40  // configure le vertex array / format de sommet
41  glGenVertexArrays(1, &m_vao);
42  glBindVertexArray(m_vao);
43 
44  // buffer : positions + normals
45  glGenBuffers(1, &m_vertex_buffer);
46  glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer);
47  glBufferData(GL_ARRAY_BUFFER, m_objet.vertex_buffer_size() + m_objet.normal_buffer_size(), 0, GL_STATIC_DRAW);
48 
49  // transfere les positions des sommets
50  glBufferSubData(GL_ARRAY_BUFFER, /* offset */ 0, /* size */ m_objet.vertex_buffer_size(), /* data */ m_objet.vertex_buffer());
51  // configure l'attribut 0, vec3 position
52  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, /* offset */ 0);
53  glEnableVertexAttribArray(0);
54 
55  // transfere les normales des sommets
56  glBufferSubData(GL_ARRAY_BUFFER, /* offset */ m_objet.vertex_buffer_size(), /* size */ m_objet.normal_buffer_size(), /* data */ m_objet.normal_buffer());
57  // configure l'attribut 2, vec3 normal
58  glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, /* offset */ (const GLvoid *) m_objet.vertex_buffer_size());
59  glEnableVertexAttribArray(2);
60 
61  m_vertex_count= m_objet.vertex_count();
62 
63  m_program= read_program("tutos/M2/instance.glsl");
64  program_print_errors(m_program);
65 
66  // nettoyage
67  glBindVertexArray(0);
68  glBindBuffer(GL_ARRAY_BUFFER, 0);
69 
70  // mesure du temps gpu de glDraw
71  glGenQueries(1, &m_time_query);
72 
73  // affichage du temps dans la fenetre
74  m_console= create_text();
75 
76  // etat openGL par defaut
77  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
78 
79  glClearDepth(1.f); // profondeur par defaut
80  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
81  glEnable(GL_DEPTH_TEST); // activer le ztest
82 
83  return 0; // ras, pas d'erreur
84  }
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition: mesh.h:296
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition: mesh.h:298
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
Definition: mesh.h:303
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3,...
Definition: mesh.h:301

◆ quit() [26/26]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 86 of file tuto_time.cpp.

87  {
88  glDeleteQueries(1, &m_time_query);
89 
90  release_text(m_console);
91  m_objet.release();
92  glDeleteTextures(1, &m_texture);
93 
94  return 0;
95  }

◆ update() [5/5]

int TP::update ( const float  time,
const float  delta 
)
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 97 of file tuto_time.cpp.

98  {
99  m_model= RotationY(time / 20);
100  return 0;
101  }

◆ render() [26/26]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 103 of file tuto_time.cpp.

104  {
105  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 
107  // deplace la camera
108  int mx, my;
109  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
110  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
111  m_camera.rotation(mx, my);
112  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
113  m_camera.move(mx);
114  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
115  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
116 
117  // mesure le temps d'execution du draw pour le gpu
118  glBeginQuery(GL_TIME_ELAPSED, m_time_query);
119 
120  // mesure le temps d'execution du draw pour le cpu
121  // utilise std::chrono pour mesurer le temps cpu
122  std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now();
123 
124  static int mode= 0;
125  if(key_state(' '))
126  {
127  clear_key_state(' ');
128  mode= (mode + 1) % 3;
129  }
130 
131  if(mode == 0)
132  {
133  // dessine 1 objet
134  draw(m_objet, m_model, m_camera, m_texture);
135  }
136  else if(mode == 1)
137  {
138  // dessine 25 fois l'objet sur une grille
139  for(int y= -2; y <= 2; y++)
140  for(int x= -2; x <= 2; x++)
141  {
142  Transform t= Translation(x *20, y *20, 0);
143  draw(m_objet, t * m_model, m_camera, m_texture);
144  }
145  }
146  else if(mode == 2)
147  {
148  // dessine 25 copies de l'objet sur une grille avec un seul glDrawArrayInstanced( ), c'est le vertex shader qui calcule la translation
149  // cf gl_InstanceID qui contient l'indice de la copie
150  glBindVertexArray(m_vao);
151  glUseProgram(m_program);
152 
153  Transform m= m_model;
154  Transform v= m_camera.view();
155  Transform p= m_camera.projection(window_width(), window_height(), 45);
156  Transform mvp= p * v * m;
157  Transform mv= v * m;
158 
159  program_uniform(m_program, "mvpMatrix", mvp);
160  program_uniform(m_program, "normalMatrix", mv.normal());
161 
162  glDrawArraysInstanced(GL_TRIANGLES, 0, m_vertex_count, 25);
163  }
164 
165  std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
166  // conversion des mesures en duree...
167  int cpu_time= std::chrono::duration_cast<std::chrono::microseconds>(cpu_stop - cpu_start).count();
168 
169  glEndQuery(GL_TIME_ELAPSED);
170 
171  /* recuperer le resultat de la requete time_elapsed, il faut attendre que le gpu ait fini de dessiner...
172  utilise encore std::chrono pour mesurer le temps d'attente.
173  */
174  std::chrono::high_resolution_clock::time_point wait_start= std::chrono::high_resolution_clock::now();
175 
176  // attendre le resultat de la requete
177  GLint64 gpu_time= 0;
178  glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
179 
180  std::chrono::high_resolution_clock::time_point wait_stop= std::chrono::high_resolution_clock::now();
181  int wait_time= std::chrono::duration_cast<std::chrono::microseconds>(wait_stop - wait_start).count();
182 
183  // affiche le temps mesure, et formate les valeurs... c'est un peu plus lisible.
184  clear(m_console);
185  if(mode == 0) printf(m_console, 0, 0, "mode 0 : 1 draw");
186  if(mode == 1) printf(m_console, 0, 0, "mode 1 : 25 draws");
187  if(mode == 2) printf(m_console, 0, 0, "mode 2 : 1 draw / 25 instances");
188  printf(m_console, 0, 1, "cpu %02dms %03dus", int(cpu_time / 1000), int(cpu_time % 1000));
189  printf(m_console, 0, 2, "gpu %02dms %03dus", int(gpu_time / 1000000), int((gpu_time / 1000) % 1000));
190  printf(m_console, 0, 3, "wait %02dms %03dus", int(wait_time / 1000), int(wait_time % 1000));
191 
192  // affiche le texte dans la fenetre de l'application, utilise console.h
193  draw(m_console, window_width(), window_height());
194 
195  // affiche le temps dans le terminal
196  printf("cpu %02dms %03dus ", int(cpu_time / 1000), int(cpu_time % 1000));
197  printf("gpu %02dms %03dus\n", int(gpu_time / 1000000), int((gpu_time / 1000) % 1000));
198 
199  return 1;
200  }
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition: mat.cpp:181

The documentation for this class was generated from the following files: