gKit2 light
Loading...
Searching...
No Matches
TP Class Reference
Inheritance diagram for TP:

Classes

struct  Object

Public Member Functions

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

Protected Attributes

Mesh m_objet
Mesh m_repere
GLuint m_vao
GLuint m_program
std::vector< GLuint > m_textures
std::vector< TriangleGroup > m_groups
Mesh m_grid
Orbiter m_camera
GLuint m_texture
Mesh m_cube
Transform m_model
Buffers m_objet
std::vector< Color > m_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
Mesh repere
Mesh mesh
GLuint vao
GLuint vao_replay
unsigned n
GLuint texture
GLuint buffer
unsigned size
GLuint program_record
GLuint program_replay
Mesh m_mesh
GLuint m_vertex_query
GLuint m_primitive_query
GLuint m_vertex_shader_query
GLuint m_culling_query
GLuint m_clipping_query
GLuint m_sample_query
GLuint m_fragment_shader_query
GLuint m_indirect_buffer
GLuint m_model_buffer
GLuint m_time_query
GLuint m_program_direct
Text m_console
std::vector< IndirectParam > m_multi_indirect
std::vector< Transform > m_multi_model
GLuint m_parameter_buffer
GLuint m_object_buffer
GLuint m_remap_buffer
GLuint m_program_cull
std::vector< Object > m_objects
int m_draws
GLuint m_indirect_count_buffer
GLuint m_vertex_buffer
unsigned int m_vertex_count
Mesh m_objet_reference
std::vector< unsigned > m_shared
GLuint m_display_program
GLuint m_buffer
GLuint m_query_vertices
GLuint m_query_vertex_shaders
GLuint m_query_fragment_shaders
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 57 of file alpha.cpp.


Class Documentation

◆ TP::Object

struct TP::Object

Definition at line 202 of file tuto_dynamic_cubemap.cpp.

Class Members
Transform model
Color color

Constructor & Destructor Documentation

◆ TP() [1/29]

TP::TP ( )
inline

Definition at line 61 of file alpha.cpp.

61: AppCamera(1024, 640, 4,3) {}
AppCamera(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5

◆ TP() [2/29]

TP::TP ( )
inline

Definition at line 61 of file tuto10.cpp.

61: AppTime(1024, 640) {}
AppTime(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_time.cpp:8

◆ TP() [3/29]

TP::TP ( )
inline

Definition at line 17 of file tuto7.cpp.

17: App(1024, 640) {}
App(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app.cpp:11

◆ TP() [4/29]

TP::TP ( )
inline

Definition at line 56 of file tuto7_camera.cpp.

56: AppCamera(1024, 640) {}

◆ TP() [5/29]

TP::TP ( )
inline

Definition at line 18 of file tuto8.cpp.

18: App(1024, 640) {}

◆ TP() [6/29]

TP::TP ( )
inline

Definition at line 20 of file tuto9.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [7/29]

TP::TP ( )
inline

Definition at line 65 of file tuto9_buffers.cpp.

65: App(1024, 640) {}

◆ TP() [8/29]

TP::TP ( )
inline

Definition at line 20 of file tuto9_groups.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [9/29]

TP::TP ( )
inline

Definition at line 20 of file tuto9_materials.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [10/29]

TP::TP ( )
inline

Definition at line 22 of file tuto9_texture1.cpp.

22: App(1024, 640) {}

◆ TP() [11/29]

TP::TP ( )
inline

Definition at line 22 of file tuto9_textures.cpp.

22: App(1024, 640) {}

◆ TP() [12/29]

TP::TP ( )
inline

Definition at line 83 of file tuto_cubemap.cpp.

83: AppCamera(1024, 640) {}

◆ TP() [13/29]

TP::TP ( )
inline

Definition at line 178 of file tuto_decal.cpp.

178: AppCamera(1024, 640) {}

◆ TP() [14/29]

TP::TP ( )
inline

Definition at line 134 of file tuto_deferred_decal.cpp.

134: AppCamera(1024, 640) {}

◆ TP() [15/29]

TP::TP ( )
inline

Definition at line 81 of file tuto_draw_cubemap.cpp.

81: AppCamera(1024, 640) {}

◆ TP() [16/29]

TP::TP ( )
inline

Definition at line 122 of file tuto_dynamic_cubemap.cpp.

122: AppCamera(1024, 640) {}

◆ TP() [17/29]

TP::TP ( )
inline

Definition at line 133 of file tuto_shadows.cpp.

133: AppCamera(1024, 640) {}

◆ TP() [18/29]

TP::TP ( )
inline

Definition at line 53 of file tuto_transform.cpp.

53: App(1024, 640) {}

◆ TP() [19/29]

TP::TP ( )
inline

Definition at line 57 of file tuto_transformations.cpp.

57: AppCamera(1024, 640) {}

◆ TP() [20/29]

TP::TP ( )
inline

Definition at line 100 of file tuto_transformations_camera.cpp.

100: AppCamera(1024, 640) {}

◆ TP() [21/29]

TP::TP ( )
inline

Definition at line 100 of file tuto_transformations_lookat.cpp.

100: AppCamera(1024, 640) {}

◆ TP() [22/29]

TP::TP ( const char * filename)
inline

Definition at line 59 of file fragments.cpp.

59 : AppCamera(1024, 640, 4, 3)
60 {
61 // charge un objet
62 mesh= read_mesh_fast( filename );
63 }
Mesh read_mesh_fast(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....

◆ TP() [23/29]

TP::TP ( const char * filename)
inline

Definition at line 15 of file pipeline_statistics.cpp.

15 : AppTime(1024, 640)
16 {
17 m_mesh= read_indexed_mesh_fast( filename );
18 }
Mesh read_indexed_mesh_fast(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles indexes. utiliser glDrawElem...

◆ TP() [24/29]

TP::TP ( )
inline

Definition at line 34 of file tuto_mdi.cpp.

34: App(1024, 640, 4, 6) {} // openGL version 4.6, ne marchera pas sur mac.

◆ TP() [25/29]

TP::TP ( )
inline

Definition at line 42 of file tuto_mdi_count.cpp.

42: App(1024, 640, 4,3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [26/29]

TP::TP ( )
inline

Definition at line 27 of file tuto_mdi_elements.cpp.

27: AppCamera(1024, 640, 4, 3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [27/29]

TP::TP ( )
inline

Definition at line 27 of file tuto_mdi_elements_count.cpp.

27: AppCamera(1024, 640, 4, 3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [28/29]

TP::TP ( )
inline

Definition at line 23 of file tuto_time.cpp.

23 : App(1024, 640)
24 {
25 // desactive vsync et la synchro gpu pour les mesures de temps
26 vsync_off();
27 }

◆ TP() [29/29]

TP::TP ( const char * filename)
inline

Definition at line 111 of file vertices.cpp.

111 : AppTime(1024, 576, 4,4)
112 {
113 m_objet= read_indexed_mesh_fast(filename);
114 }

Member Function Documentation

◆ init() [1/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 64 of file alpha.cpp.

65 {
66 // decrire un repere / grille
67 m_repere= make_grid(20);
68
69 Point grid_pmin, grid_pmax;
70 m_repere.bounds(grid_pmin, grid_pmax);
71
72 //~ m_objet= read_mesh("data/alpha.obj"); // utiliser alpha.glsl !!
73 m_objet= read_mesh("data/robot.obj"); // utiliser alpha_notexture.glsl !!
74
75 Point pmin, pmax;
76 m_objet.bounds(pmin, pmax);
77
78 pmin= min(pmin, grid_pmin);
79 pmax= max(pmax, grid_pmax);
80
81 // parametrer la camera de l'application, renvoyee par la fonction camera()
82 camera().lookat(pmin, pmax);
83
84 // charge les textures, si necessaire
85 Materials& materials= m_objet.materials();
86 m_textures.resize(materials.filename_count());
87 for(unsigned i= 0; i < m_textures.size(); i++)
88 m_textures[i]= read_texture(0, materials.filename(i));
89
90 // affiche les matieres
91 {
92 for(int i= 0; i < materials.count(); i++)
93 {
94 const Material& material= materials.material(i);
95 printf("material[%d] '%s' kd %f %f %f ", i, materials.name(i), material.diffuse.r, material.diffuse.g, material.diffuse.b);
96 if(material.diffuse_texture != -1)
97 printf("texture '%s'", materials.filename(material.diffuse_texture));
98 printf("\n");
99 }
100 }
101
102 m_groups= m_objet.groups();
103 //~ m_vao= m_objet.create_buffers( USE_POSITION | USE_TEXCOORD | USE_NORMAL );
104 m_vao= m_objet.create_buffers( USE_POSITION | USE_NORMAL );
105
106 //
107 //~ m_program= read_program("gkit2_tutos/alpha.glsl");
108 m_program= read_program("gkit2_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
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 { max(a.x, b.x), max(a.y, b.y), max(a....
Definition vec.cpp:35
Point min(const Point &a, const Point &b)
renvoie la plus petite composante de chaque point { min(a.x, b.x), min(a.y, b.y), min(a....
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
@ USE_POSITION
inclut l'attribut position dans les buffers.
Definition mesh.h:112
@ USE_NORMAL
inclut l'attribut normale dans les buffers.
Definition mesh.h:114
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:214
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:459
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
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:147
const char * filename(const int id) const
renvoie le nom de fichier d'une texture.
Definition materials.h:149
int count() const
nombre de matieres.
Definition materials.h:102
const Material & material(const int id) const
renvoie la ieme matiere.
Definition materials.h:110
const char * name(const int id) const
renvoie le nom de la ieme matiere.
Definition materials.h:105

◆ quit() [1/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 125 of file alpha.cpp.

126 {
127 m_objet.release();
128 m_repere.release();
129 return 0;
130 }

◆ render() [1/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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);
145 program_print_errors(m_program);
146 }
147
148 glBindVertexArray(m_vao);
149 glUseProgram(m_program);
150
151 Transform model= Identity();
152 Transform view= camera().view();
153 Transform projection= camera().projection();
154 Transform mv= view * model;
155 Transform mvp= projection * mv;
156
157 program_uniform(m_program, "mvMatrix", mv);
158 program_uniform(m_program, "mvpMatrix", mvp);
159
160 // dessine tous les groupes de triangles, tries par matiere
161 const Materials& materials= m_objet.materials();
162 for(unsigned i= 0; i < m_groups.size(); i++)
163 {
164 const Material& material= materials.material(m_groups[i].index);
165 if(material.diffuse_texture != -1)
166 program_use_texture(m_program, "alpha", 0, m_textures[material.diffuse_texture]);
167 else
168 program_use_texture(m_program, "alpha", 0, 0);
169
170 //~ 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);
171
172 glDrawArrays(GL_TRIANGLES, m_groups[i].first, m_groups[i].n);
173 }
174
175 if(key_state('s'))
176 {
177 clear_key_state('s');
178 static int id= 1;
179 screenshot("alpha", id++);
180 }
181
182 // continuer...
183 return 1;
184 }
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:69
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:63
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:178
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

◆ init() [2/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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("gkit2_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/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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)
Definition program.cpp:238

◆ render() [2/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 98 of file tuto10.cpp.

99 {
100 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
101
102 // gestion des mouvements de la camera.
103 update_camera( m_camera );
104
105 // recharge le shader program
106 if(key_state('r'))
107 {
108 clear_key_state('r'); // une seule fois...
109 reload_program(m_program);
110 program_print_errors(m_program);
111 }
112
113 // etape 2 : dessiner m_objet avec le shader program
114 // configurer le pipeline
115 glUseProgram(m_program);
116
117 // configurer le shader program
118 // . recuperer les transformations
119 Transform model= RotationX(global_time() / 20);
120 Transform view= m_camera.view();
121 Transform projection= m_camera.projection(window_width(), window_height(), 45);
122
123 // . composer les transformations : model, view et projection
124 Transform mv= view * model;
125 Transform mvp= projection * mv;
126
127 // . parametrer le shader program :
128 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
129 program_uniform(m_program, "mvpMatrix", mvp);
130
131 // . parametres "supplementaires" :
132
133 // go !
134 m_objet.draw(m_program);
135 // relisez le tuto9 sur l'utilisation des shaders et de mesh
136
137 // et pour afficher un autre cube d'une autre couleur ?
138
139 // dessine aussi le repere et la grille pour le meme point de vue
140 draw(m_grid, Identity(), m_camera);
141
142 return 1;
143 }
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:145
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/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 20 of file tuto7.cpp.

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

◆ quit() [3/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 41 of file tuto7.cpp.

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

◆ render() [3/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 50 of file tuto7.cpp.

51 {
52 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
53
54 // gestion mouvements camera
55 update_camera( m_camera );
56
57 // affiche l'objet pour le point de vue de la camera et avec une texture
58 draw(m_objet, m_camera, m_texture);
59
60 return 1;
61 }

◆ init() [4/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 59 of file tuto7_camera.cpp.

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

◆ quit() [4/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 84 of file tuto7_camera.cpp.

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

◆ render() [4/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 92 of file tuto7_camera.cpp.

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

◆ init() [5/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 20 of file tuto8.cpp.

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

◆ quit() [5/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 41 of file tuto8.cpp.

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

◆ 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 AppCamera.

Definition at line 49 of file tuto8.cpp.

50 {
51 // modifier l'orientation du cube a chaque image.
52 // time est le temps ecoule depuis le demarrage de l'application, en millisecondes,
53 // delta est le temps ecoule depuis l'affichage de la derniere image / le dernier appel a draw(), en millisecondes.
54
55 m_model= RotationY(time / 20);
56 return 0;
57 }
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/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 60 of file tuto8.cpp.

61 {
62 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
63
64 // gestion mouvements camera
65 update_camera( m_camera );
66
67 draw(m_objet, m_model, m_camera, m_texture);
68
69 /* on pourrait obtenir le meme resultat sans utiliser App::update( ).
70 les parametres time et update sont renvoyes par les fonctions global_time() et delta_time() :
71 draw(m_objet, RotationY(global_time() / 20), m_camera, m_texture);
72 */
73
74 return 1;
75 }

◆ init() [6/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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("gkit2_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/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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 m_objet.draw(m_program);
83
84 return 1;
85 }

◆ init() [7/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 67 of file tuto9_buffers.cpp.

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

◆ quit() [7/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 96 of file tuto9_buffers.cpp.

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

◆ render() [7/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 105 of file tuto9_buffers.cpp.

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

◆ init() [8/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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 // placer la camera
36 Point pmin, pmax;
37 m_objet.bounds(pmin, pmax);
38 camera().lookat(pmin, pmax);
39
40 m_program= read_program("gkit2_tutos/tuto9_groups.glsl");
41 program_print_errors(m_program);
42
43 // etat openGL par defaut
44 glEnable(GL_FRAMEBUFFER_SRGB);
45
46 glClearColor(0.1, 0.1, 0.1, 1); // couleur par defaut de la fenetre
47 glClearDepth(1); // profondeur par defaut
48 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
49 glEnable(GL_DEPTH_TEST); // activer le ztest
50
51 return 0; // ras, pas d'erreur
52 }

◆ quit() [8/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 55 of file tuto9_groups.cpp.

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

◆ render() [8/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 64 of file tuto9_groups.cpp.

65 {
66 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67
68 // . recuperer les transformations
69 Transform model= RotationY(global_time() / 40);
70 Transform view= camera().view();
71 Transform projection= camera().projection();
72
73 // configurer le pipeline
74 glUseProgram(m_program);
75
76 // configurer le shader program
77 // . composer les transformations : model, view et projection
78 Transform mv= view * model;
79 Transform mvp= projection * mv;
80
81 // . parametrer le shader program :
82 // . transformations : la matrice declaree dans le vertex shader s'appelle mvpMatrix
83 program_uniform(m_program, "mvpMatrix", mvp);
84 program_uniform(m_program, "mvMatrix", mv);
85
86 // afficher chaque groupe
87 const Materials& materials= m_objet.materials();
88 for(auto const & group : m_groups)
89 {
90 // recuperer la matiere
91 const Material& material= materials(group.index);
92 program_uniform(m_program, "color", material.diffuse);
93
94 m_objet.draw(group.first, group.n, m_program);
95 }
96
97 /* et directement avec openGL, qu'est ce qui change ?
98
99 il faut creer un ou plusieurs buffers pour stocker les positions et les normales de l'objet,
100 et configurer le format de sommet, cf vertex array object / vao, comme dans tuto9_buffers.cpp
101 ou tuto4GL.cpp et tuto4GL_normals.cpp, par exemple.
102
103 ou, plus simple, avec Mesh::create_buffers()
104 m_vao= m_objet.create_buffers( USE_POSITION | USE_NORMAL );
105
106 ensuite, c'est comme d'habitude :
107
108 glBindVertexAttrib(m_vao);
109 glUseProgram(m_program);
110
111 // composer les transformations : model, view et projection
112 Transform mv= view * model;
113 Transform mvp= projection * mv;
114
115 // parametrer le shader program :
116 program_uniform(m_program, "mvpMatrix", mvp);
117 program_uniform(m_program, "mvMatrix", mv);
118
119 // dessiner chaque groupe...
120 const Materials& materials= m_objet.materials();
121 for(auto const & group : m_groups)
122 {
123 // recuperer la couleur de base de la matiere
124 const Material& material= materials(group.index);
125 program_uniform(m_program, "color", material.diffuse);
126
127 glDrawArrays(GL_TRIANGLES, group.first, group.n);
128 }
129 */
130
131 return 1;
132 }

◆ init() [9/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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("gkit2_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 {
43 m_colors[i]= materials.material(i).diffuse;
44 printf(" colors[%d] %f %f %f\n", i, m_colors[i].r, m_colors[i].g, m_colors[i].b);
45 }
46
47 // placer la camera
48 Point pmin, pmax;
49 m_objet.bounds(pmin, pmax);
50 camera().lookat(pmin, pmax);
51
52 // etat openGL par defaut
53 glEnable(GL_FRAMEBUFFER_SRGB);
54
55 glClearColor(0.1, 0.1, 0.1, 1); // couleur par defaut de la fenetre
56
57 glClearDepth(1); // profondeur par defaut
58 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
59 glEnable(GL_DEPTH_TEST); // activer le ztest
60
61 return 0; // ras, pas d'erreur
62 }

◆ quit() [9/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 65 of file tuto9_materials.cpp.

66 {
67 // etape 3 : detruire le shader program
68 release_program(m_program);
69 m_objet.release();
70 return 0;
71 }

◆ render() [9/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 74 of file tuto9_materials.cpp.

75 {
76 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
77
78 // dessiner m_objet avec le shader program
79 // configurer le pipeline
80 glUseProgram(m_program);
81
82 // configurer le shader program
83 // . recuperer les transformations
84 Transform model= RotationY(global_time() / 40);
85 // Transform model= RotationY( 35 );
86 Transform view= camera().view();
87 Transform projection= camera().projection();
88
89 // . composer les transformations : model, view et projection
90 Transform mv= view * model;
91 Transform mvp= projection * mv;
92
93 // . parametrer le shader program :
94 program_uniform(m_program, "mvpMatrix", mvp);
95 program_uniform(m_program, "mvMatrix", mv);
96
97 // . parametres "supplementaires" : les couleurs des matieres
98 program_uniform(m_program, "materials", m_colors);
99
100 // go !
101 m_objet.draw(m_program);
102
103 return 1;
104 }

◆ init() [10/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 24 of file tuto9_texture1.cpp.

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

◆ quit() [10/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 49 of file tuto9_texture1.cpp.

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

◆ render() [10/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 60 of file tuto9_texture1.cpp.

61 {
62 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
63
64 // gestion mouvements camera
65 update_camera( m_camera );
66
67 // etape 2 : dessiner m_objet avec le shader program
68 // configurer le pipeline
69 glUseProgram(m_program);
70
71 // configurer le shader program
72 // . recuperer les transformations
73 Transform model= RotationX(global_time() / 20);
74 Transform view= m_camera.view();
75 Transform projection= m_camera.projection(window_width(), window_height(), 45);
76
77 // . composer les transformations : model, view et projection
78 Transform mvp= projection * view * model;
79
80 // . parametrer le shader program :
81 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
82 program_uniform(m_program, "mvpMatrix", mvp);
83
84 // . parametres "supplementaires" :
85 // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
86 program_use_texture(m_program, "texture0", 0, m_texture);
87
88 // go !
89 m_objet.draw(m_program);
90 return 1;
91 }

◆ init() [11/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 24 of file tuto9_textures.cpp.

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

◆ quit() [11/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 52 of file tuto9_textures.cpp.

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

◆ render() [11/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 64 of file tuto9_textures.cpp.

65 {
66 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67
68 // gestion mouvements camera
69 update_camera( m_camera );
70
71 // etape 2 : dessiner m_objet avec le shader program
72 // configurer le pipeline
73 glUseProgram(m_program);
74
75 // configurer le shader program
76 // . recuperer les transformations
77 Transform model= RotationX(global_time() / 20);
78 Transform view= m_camera.view();
79 Transform projection= m_camera.projection(window_width(), window_height(), 45);
80
81 // . composer les transformations : model, view et projection
82 Transform mvp= projection * view * model;
83
84 // . parametrer le shader program :
85 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
86 program_uniform(m_program, "mvpMatrix", mvp);
87
88 // . parametres "supplementaires" :
89 // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
90 program_use_texture(m_program, "texture0", 0, m_texture0);
91
92 // . utilisation d'une texture configuree sur l'unite 1, le fragment shader declare "uniform sampler2D texture1;"
93 program_use_texture(m_program, "texture1", 1, m_texture1);
94
95 // go !
96 m_objet.draw(m_program);
97 return 1;
98 }

◆ init() [12/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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, "gkit2_tutos/cubemap_debug_cross.png");
93 // m_texture= read_cubemap(0, "canyon2.jpg");
94
95 m_program_draw= read_program("gkit2_tutos/draw_cubemap.glsl");
96 program_print_errors(m_program_draw);
97 m_program= read_program("gkit2_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 }

◆ quit() [12/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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( window_width(), window_height(), 45 );
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.
152 m_objet.draw(m_program);
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);
178 program_print_errors(m_program_draw);
179 reload_program(m_program);
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:84
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197

◆ init() [13/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 181 of file tuto_decal.cpp.

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

◆ quit() [13/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 231 of file tuto_decal.cpp.

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

◆ render() [13/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 245 of file tuto_decal.cpp.

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

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 137 of file tuto_deferred_decal.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("data/ground.obj");
144 m_proxy= make_xyz();
145 m_frustum= make_frustum();
146 m_frustum_cube= read_mesh("data/frustum.obj");
147
148 // charge l'element
149 m_objet= read_mesh("data/robot.obj");
150
151 //~ m_texture= read_texture(0, "data/grid.png");
152 //~ m_texture= read_texture(0, "decal_shadow.png");
153 m_texture= read_texture(0, "orange_splash.png");
154 //~ m_texture= read_texture(0, "yellow_splash.png");
155 //~ m_texture= read_texture(0, "red_splash.png");
156
157 m_mesh_program= read_program("gkit2_tutos/deferred_mesh.glsl");
158 program_print_errors(m_mesh_program);
159 m_decal_program= read_program("gkit2_tutos/deferred_decal.glsl");
160 program_print_errors(m_decal_program);
161
162 // position initiale de l'objet
163 m_position= Identity();
164
165 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
166 // recuperer les points extremes de l'objet (son englobant)
167 Point pmin, pmax;
168 m_ground.bounds(pmin, pmax);
169 // parametrer la camera de l'application, renvoyee par la fonction camera()
170 camera().lookat(pmin, pmax);
171
172 m_framebuffer.create(window_width(), window_height());
173 m_framebuffer.clear_color(Black());
174 m_framebuffer.clear_depth(1);
175
176 // etat openGL par defaut
177 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
178
179 glClearDepth(1.f); // profondeur par defaut
180 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
181 glEnable(GL_DEPTH_TEST); // activer le ztest
182
183 return 0; // ras, pas d'erreur
184 }
Color Black()
utilitaire. renvoie une couleur noire.
Definition color.cpp:18

◆ quit() [14/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 187 of file tuto_deferred_decal.cpp.

188 {
189 m_objet.release();
190 m_repere.release();
191 m_local.release();
192 m_ground.release();
193 m_proxy.release();
194
195 m_framebuffer.release();
196 release_program(m_mesh_program);
197 release_program(m_decal_program);
198 glDeleteTextures(1, &m_texture);
199 return 0;
200 }

◆ render() [14/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 203 of file tuto_deferred_decal.cpp.

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

◆ init() [15/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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, "gkit2_tutos/cubemap_debug_cross.png");
88 m_program= read_program("gkit2_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 }

◆ quit() [15/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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_dynamic_cubemap()

void TP::init_dynamic_cubemap ( const int w,
const int h )
inline

Definition at line 124 of file tuto_dynamic_cubemap.cpp.

125 {
126 // 6 faces couleur
127 glGenTextures(1, &m_texture_cubemap);
128 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
129 for(int i= 0; i < 6; i++)
130 {
131 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
132 GL_RGBA, w, h, 0,
133 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
134 }
135
136 // parametres de filtrage
137 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
138 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
139 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
140 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
141 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
142 //+ mipmaps
143 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
144
145 // 6 faces profondeur
146 glGenTextures(1, &m_depth_cubemap);
147 glBindTexture(GL_TEXTURE_CUBE_MAP, m_depth_cubemap);
148 for(int i= 0; i < 6; i++)
149 {
150 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
151 GL_DEPTH_COMPONENT, w, h, 0,
152 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
153 }
154
155 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
156
157 // framebuffer, attache les 6 faces couleur + profondeur
158 glGenFramebuffers(1, &m_framebuffer);
159 glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
160 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texture_cubemap, 0);
161 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_cubemap, 0);
162
163 glBindFramebuffer(GL_FRAMEBUFFER, 0);
164 }

◆ init() [16/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 167 of file tuto_dynamic_cubemap.cpp.

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

◆ scene()

void TP::scene ( std::vector< Object > & objects)
inline

Definition at line 208 of file tuto_dynamic_cubemap.cpp.

209 {
210 objects.resize(100);
211
212 // place quelques cubes dans la scene
213 float offset= global_time() / 200;
214 for(int i= 0; i < 100; i++)
215 {
216 float x= (i % 10 - 4.5) * 4;
217 float z= (i / 10 - 4.5) * 4;
218 float y= std::cos(x * z + offset);
219
220 objects[i].color= Color(White() * std::abs(y));
221 objects[i].model= Translation(x, y, z) * RotationY(y*180);
222 }
223 }
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23

◆ render() [16/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 226 of file tuto_dynamic_cubemap.cpp.

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

◆ quit() [16/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 364 of file tuto_dynamic_cubemap.cpp.

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

◆ init() [17/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 136 of file tuto_shadows.cpp.

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

◆ quit() [17/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 181 of file tuto_shadows.cpp.

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

◆ render() [17/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 196 of file tuto_shadows.cpp.

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

◆ init() [18/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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 }
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33

◆ quit() [18/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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 AppCamera.

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/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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:28

◆ init() [19/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 60 of file tuto_transformations.cpp.

61 {
62 // decrire un repere / grille
63 m_repere= make_grid(20);
64 m_local= make_grid(4);
65
66 // charge l'element
67 m_objet= read_mesh("data/cube.obj");
68
69 // position initiale de l'objet
70 m_position= Translation(0, 0.5, 0);
71
72 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
73 // recuperer les points extremes de l'objet (son englobant)
74 Point pmin, pmax;
75 m_repere.bounds(pmin, pmax);
76 // parametrer la camera de l'application, renvoyee par la fonction camera()
77 camera().lookat(pmin, pmax);
78
79 // etat openGL par defaut
80 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
81
82 glClearDepth(1.f); // profondeur par defaut
83 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
84 glEnable(GL_DEPTH_TEST); // activer le ztest
85
86 return 0; // ras, pas d'erreur
87 }

◆ quit() [19/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 90 of file tuto_transformations.cpp.

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

◆ render() [19/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 99 of file tuto_transformations.cpp.

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

◆ init() [20/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 103 of file tuto_transformations_camera.cpp.

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

◆ quit() [20/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 134 of file tuto_transformations_camera.cpp.

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

◆ render() [20/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 144 of file tuto_transformations_camera.cpp.

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

◆ init() [21/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 103 of file tuto_transformations_lookat.cpp.

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

◆ quit() [21/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 134 of file tuto_transformations_lookat.cpp.

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

◆ render() [21/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 144 of file tuto_transformations_lookat.cpp.

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

◆ init() [22/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 66 of file fragments.cpp.

67 {
68 // decrire un repere / grille
69 repere= make_grid(10);
70
71 if(mesh.vertex_count() == 0)
72 return -1;
73
74 Point pmin, pmax;
75 mesh.bounds(pmin, pmax);
76 camera().lookat(pmin, pmax);
77
78 vao= mesh.create_buffers( USE_POSITION );
79 n= mesh.vertex_count();
80
81 program_record= read_program("gkit2_tutos/M2/fragment_record.glsl");
82 program_print_errors(program_record);
83
84 program_replay= read_program("gkit2_tutos/M2/fragment.glsl");
85 program_print_errors(program_replay);
86
87 //
88 size= 1024*1024*8;
89
90 glGenBuffers(1, &buffer);
91 glBindBuffer(GL_ARRAY_BUFFER, buffer);
92 glBufferData(GL_ARRAY_BUFFER, size * 6*sizeof(float), nullptr, GL_DYNAMIC_DRAW);
93
94 //
96
97 //
98 glGenVertexArrays(1, &vao_replay);
99
100 glBindVertexArray(vao_replay);
101 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const void *) (1*sizeof(unsigned)));
102 glEnableVertexAttribArray(0);
103 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const void *) (1*sizeof(unsigned) + 3*sizeof(float)));
104 glEnableVertexAttribArray(1);
105
106 // etat openGL par defaut
107 glBindVertexArray(0);
108 glBindBuffer(GL_ARRAY_BUFFER, 0);
109
110 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
111
112 glClearDepth(1.f); // profondeur par defaut
113 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
114 glEnable(GL_DEPTH_TEST); // activer le ztest
115
116 glFrontFace(GL_CCW);
117 glCullFace(GL_BACK);
118 glEnable(GL_CULL_FACE);
119
120 return 0; // pas d'erreur, sinon renvoyer -1
121 }
GLuint make_uint_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition texture.cpp:151

◆ quit() [22/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 124 of file fragments.cpp.

125 {
126 repere.release();
127 return 0; // pas d'erreur
128 }

◆ render() [22/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 131 of file fragments.cpp.

132 {
133 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
134
135 Transform model= Identity();
136 Transform view= camera().view();
137 Transform projection= camera().projection();
138 Transform mv= view * model;
139 Transform mvp= projection * mv;
140
141 // clear
142 static bool init= false;
143 static bool zinit= false;
144 static unsigned replay= 0;
145
146 if(key_state('z'))
147 {
148 clear_key_state('z');
149 zinit= !zinit;
150 init= false; // force une nouvelle capture
151
152 if(zinit)
153 printf("Z prepass ON\n");
154 else
155 printf("Z prepass off\n");
156 }
157
158 //
159 static bool cull= true;
160 if(key_state('f'))
161 {
162 clear_key_state('f');
163 cull= !cull;
164 init= false; // force une nouvelle capture
165
166 if(cull)
167 glEnable(GL_CULL_FACE);
168 else
169 glDisable(GL_CULL_FACE);
170
171 if(cull)
172 printf("face culling ON\n");
173 else
174 printf("face culling off\n");
175 }
176
177 static bool reload= false;
178 static bool early_tests= true;
179 static const char *early_tests_definition= "";
180 if(key_state('e'))
181 {
182 clear_key_state('e');
183 early_tests= !early_tests;
184 init= false; // force une nouvelle capture
185 reload= true; // recompile les shaders
186
187 if(early_tests)
188 early_tests_definition= "#define EARLY_TESTS";
189 else
190 early_tests_definition= "#undef EARLY_TESTS";
191
192 if(early_tests)
193 printf("early fragment tests ON\n");
194 else
195 printf("early fragment test off\n");
196 }
197
198 static bool store_vertices= false;
199 static const char *store_vertices_definition= "";
200 if(key_state('x'))
201 {
202 clear_key_state('x');
203 store_vertices= !store_vertices;
204 init= false; // force une nouvelle capture
205 reload= true; // recompile les shaders
206
207 if(store_vertices)
208 store_vertices_definition= "#define STORE_VERTICES";
209 else
210 store_vertices_definition= "#undef STORE_VERTICES";
211
212 if(store_vertices)
213 printf("store vertices ON\n");
214 else
215 printf("store vertices off\n");
216 }
217
218 if(reload)
219 {
220 reload= false;
221
222 std::string definitions;
223 definitions.append(early_tests_definition).append("\n").append(store_vertices_definition);
224
225 reload_program(program_record, definitions.c_str());
226 program_print_errors(program_record);
227 }
228
229
230 if(!init)
231 {
232 if(zinit)
233 {
234 draw(mesh, model, view, projection);
235 }
236
237 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
238 {
239 float zero= 0;
240 glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32F, GL_RED, GL_FLOAT, &zero);
241 }
242
243 glBindImageTexture(0, texture, 0, GL_TRUE, 0, GL_READ_WRITE, GL_R32UI);
244 {
245 GLuint zero= 0;
246 glClearTexImage(texture, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);
247 }
248
249 replay= 0;
250
251 // passe 1 : record
252 glBindVertexArray(vao);
253 glUseProgram(program_record);
254
255 program_uniform(program_record, "mvpMatrix", mvp);
256 program_uniform(program_record, "mvMatrix", mv);
257 program_uniform(program_record, "counters", 0);
258
259 glDrawArrays(GL_TRIANGLES, 0, n);
260
261 glMemoryBarrier( GL_ALL_BARRIER_BITS);
262
263 if(key_state(' '))
264 {
265 clear_key_state(' ');
266 init= true;
267
268 // rappel de la config...
269 printf("capture: ");
270 if(zinit) printf("Z prepass ON, ");
271 else printf("Z prepass off, ");
272 if(store_vertices) printf("store vertices ON, ");
273 else printf("store vertices off, ");
274 if(cull) printf("face culling ON, ");
275 else printf("face culling off, ");
276 if(early_tests) printf("early fragment tests ON");
277 else printf("early fragment test off");
278 printf("\n");
279 }
280 }
281
282 if(init)
283 {
284 // passe 2 : replay
285 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
286
287 draw(repere, /* model */ Identity(), view, projection);
288
289 glBindVertexArray(vao_replay);
290 glUseProgram(program_replay);
291
292 program_uniform(program_replay, "mvpMatrix", mvp);
293
294 replay+= 4096;
295 if(replay > size)
296 replay= 0;
297 glDrawArrays(GL_POINTS, 0, replay);
298
299 if(key_state(' ')) // on recommence
300 {
301 clear_key_state(' ');
302 init= false;
303 }
304
305 static unsigned points= 1;
306 if(key_state(SDLK_KP_PLUS))
307 {
308 clear_key_state(SDLK_KP_PLUS);
309 points+= 1;
310 }
311 if(key_state(SDLK_KP_MINUS))
312 {
313 clear_key_state(SDLK_KP_MINUS);
314 points-= 1;
315 if(points < 1)
316 points= 1;
317 }
318 glPointSize(points);
319
320 static bool video= false;
321 if(key_state(SDLK_RETURN))
322 {
323 clear_key_state(SDLK_RETURN);
324 video= !video;
325
326 if(video) printf("start video capture...\n");
327 else printf("stop video capture.\n");
328 }
329
330 if(video)
331 capture("fragments");
332 }
333
334 return 1;
335 }
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition alpha.cpp:64
int capture(const char *prefix)
Definition texture.cpp:205

◆ init() [23/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 20 of file pipeline_statistics.cpp.

21 {
22 if(m_mesh.vertex_count() == 0)
23 return -1;
24
25 m_program= read_program("gkit2_tutos/M2/statistics.glsl");
26 program_print_errors(m_program);
27
28 // camera
29 m_camera.projection(window_width(), window_height(), 45);
30 Point pmin, pmax;
31 m_mesh.bounds(pmin, pmax);
32 m_camera.lookat(pmin, pmax);
33
34 // requetes
35 glGenQueries(1, &m_sample_query);
36 glGenQueries(1, &m_vertex_query);
37 glGenQueries(1, &m_primitive_query);
38 glGenQueries(1, &m_vertex_shader_query);
39 glGenQueries(1, &m_culling_query);
40 glGenQueries(1, &m_clipping_query);
41 glGenQueries(1, &m_sample_query);
42 glGenQueries(1, &m_fragment_shader_query);
43
44 // etat openGL par defaut
45 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
46
47 glClearDepth(1.f); // profondeur par defaut
48 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
49 glEnable(GL_DEPTH_TEST); // activer le ztest
50 glEnable(GL_CULL_FACE);
51
52 return 0;
53 }

◆ quit() [23/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 55 of file pipeline_statistics.cpp.

56 {
57 return 0;
58 }

◆ render() [23/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 60 of file pipeline_statistics.cpp.

61 {
62 update_camera( m_camera );
63
64 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
65
66 static bool capture= false;
67 static bool rasterizer_discard= false;
68 if(key_state('d'))
69 {
70 clear_key_state('d');
71 rasterizer_discard= !rasterizer_discard;
72 capture= true; // force une capture
73
74 if(!rasterizer_discard)
75 printf("rasterizer ON\n");
76 else
77 printf("rasterizer off\n");
78 }
79 if(rasterizer_discard)
80 glEnable(GL_RASTERIZER_DISCARD);
81 else
82 glDisable(GL_RASTERIZER_DISCARD);
83
84 static bool zinit= false;
85 if(key_state('z'))
86 {
87 clear_key_state('z');
88 zinit= !zinit;
89 capture= true; // force une capture
90
91 if(zinit)
92 printf("Z prepass ON\n");
93 else
94 printf("Z prepass off\n");
95 }
96
97 //
98 static bool cull= true;
99 if(key_state('f'))
100 {
101 clear_key_state('f');
102 cull= !cull;
103 capture= true; // force une capture
104
105 if(cull)
106 glEnable(GL_CULL_FACE);
107 else
108 glDisable(GL_CULL_FACE);
109
110 if(cull)
111 printf("face culling ON\n");
112 else
113 printf("face culling off\n");
114 }
115
116 static bool early_tests= false;
117 static const char *early_tests_definition= "";
118 if(key_state('e'))
119 {
120 clear_key_state('e');
121 early_tests= !early_tests;
122 capture= true; // force une capture
123
124 if(early_tests)
125 early_tests_definition= "#define EARLY_TESTS";
126 else
127 early_tests_definition= "#undef EARLY_TESTS";
128
129 if(early_tests)
130 printf("early fragment tests ON\n");
131 else
132 printf("early fragment test off\n");
133
134 reload_program(m_program, early_tests_definition);
135 program_print_errors(m_program);
136 }
137
138 //
139 Transform model;
140 Transform view= m_camera.view();
141 Transform projection= m_camera.projection(window_width(), window_height(), 45);
142 Transform mv= view * model;
143 Transform mvp= projection * mv;
144
145 //
146 if(zinit)
147 draw( m_mesh, Identity(), m_camera );
148
149 //
150 glBeginQuery(GL_VERTICES_SUBMITTED, m_vertex_query);
151 glBeginQuery(GL_PRIMITIVES_SUBMITTED, m_primitive_query);
152 glBeginQuery(GL_VERTEX_SHADER_INVOCATIONS, m_vertex_shader_query);
153 glBeginQuery(GL_CLIPPING_INPUT_PRIMITIVES, m_culling_query); // reussi le test de front/back face culling
154 glBeginQuery(GL_CLIPPING_OUTPUT_PRIMITIVES, m_clipping_query);
155 glBeginQuery(GL_SAMPLES_PASSED, m_sample_query);
156 glBeginQuery(GL_FRAGMENT_SHADER_INVOCATIONS, m_fragment_shader_query);
157
158 glUseProgram(m_program);
159 program_uniform(m_program, "mvMatrix", mv);
160 program_uniform(m_program, "mvpMatrix", mvp);
161
162 m_mesh.draw(m_program);
163 // draw( m_mesh, model, m_camera );
164
165 glEndQuery(GL_VERTICES_SUBMITTED);
166 glEndQuery(GL_PRIMITIVES_SUBMITTED);
167 glEndQuery(GL_VERTEX_SHADER_INVOCATIONS);
168 glEndQuery(GL_CLIPPING_INPUT_PRIMITIVES);
169 glEndQuery(GL_CLIPPING_OUTPUT_PRIMITIVES);
170 glEndQuery(GL_SAMPLES_PASSED);
171 glEndQuery(GL_FRAGMENT_SHADER_INVOCATIONS);
172
173 // recuperer les resultats.
174 GLint64 gpu_vertex= 0;
175 glGetQueryObjecti64v(m_vertex_query, GL_QUERY_RESULT, &gpu_vertex);
176 GLint64 gpu_primitive= 0;
177 glGetQueryObjecti64v(m_primitive_query, GL_QUERY_RESULT, &gpu_primitive);
178 GLint64 gpu_vertex_shader= 0;
179 glGetQueryObjecti64v(m_vertex_shader_query, GL_QUERY_RESULT, &gpu_vertex_shader);
180 GLint64 gpu_culling= 0;
181 glGetQueryObjecti64v(m_culling_query, GL_QUERY_RESULT, &gpu_culling);
182 GLint64 gpu_clipping= 0;
183 glGetQueryObjecti64v(m_clipping_query, GL_QUERY_RESULT, &gpu_clipping);
184 GLint64 gpu_samples= 0;
185 glGetQueryObjecti64v(m_sample_query, GL_QUERY_RESULT, &gpu_samples);
186 GLint64 gpu_fragment_shader= 0;
187 glGetQueryObjecti64v(m_fragment_shader_query, GL_QUERY_RESULT, &gpu_fragment_shader);
188
189 if(capture || key_state(' '))
190 {
191 capture= false;
192 clear_key_state(' ');
193
194 if(zinit) printf("Z prepass ON, ");
195 else printf("Z prepass off, ");
196 if(cull) printf("face culling ON, ");
197 else printf("face culling off, ");
198 if(early_tests) printf("early fragment tests ON");
199 else printf("early fragment test off");
200 printf("\n");
201
202 printf("primitives %d\n", int(gpu_primitive));
203 printf("positions %d, indices %d, vertex shader %d\n", m_mesh.vertex_count(), int(gpu_vertex), int(gpu_vertex_shader));
204 printf("culling primitives %d, clipping primitives %d\n", int(gpu_culling), int(gpu_clipping));
205 printf("samples %d, fragment shaders %d\n", int(gpu_samples), int(gpu_fragment_shader));
206 printf("\n");
207 }
208
209 glDisable(GL_RASTERIZER_DISCARD); // le rasterizer doit etre actif, sinon pas de clear, et de pas de texte
210 return 1;
211 }

◆ init() [24/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 36 of file tuto_mdi.cpp.

37 {
38 if(!GLAD_GL_ARB_indirect_parameters)
39 return -1;
40 printf("GL_ARB_indirect_parameters ON\n");
41
42 m_objet= read_mesh("data/bigguy.obj");
43 Point pmin, pmax;
44 m_objet.bounds(pmin, pmax);
45
46 m_camera.lookat(pmin - Vector(200, 200, 0), pmax + Vector(200, 200, 0));
47
48 // genere les parametres des draws et les transformations
49 for(int y= -15; y <= 15; y++)
50 for(int x= -15; x <= 15; x++)
51 {
52 m_multi_model.push_back( Translation(x *20, y *20, 0) );
53 m_multi_indirect.push_back( { unsigned(m_objet.vertex_count()), 1, 0, 0} );
54 }
55 // oui c'est la meme chose qu'un draw instancie, mais c'est juste pour comparer les 2 solutions...
56
57 // stockage des parametres du multi draw indirect
58 glGenBuffers(1, &m_indirect_buffer);
59 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
60 glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(IndirectParam) * m_multi_indirect.size(), &m_multi_indirect.front(), GL_DYNAMIC_DRAW);
61
62 // stockage des matrices des objets
63 glGenBuffers(1, &m_model_buffer);
64 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
65 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Transform) * m_multi_model.size(), &m_multi_model.front(), GL_DYNAMIC_DRAW);
66
67 // creation des vertex buffer, uniquement les positions
68 m_vao= m_objet.create_buffers(/* texcoord */ false, /* normal */ false, /* color */ false, /* material */ false);
69
70 // shader programs
71 m_program_direct= read_program("gkit2_tutos/M2/indirect_direct.glsl"); // affichage classique N draws
72 program_print_errors(m_program_direct);
73
74 m_program= read_program("gkit2_tutos/M2/indirect.glsl"); // affichage indirect 1 multi draw
75 program_print_errors(m_program);
76
77 // affichage du temps cpu / gpu
78 m_console= create_text();
79
80 // mesure du temps gpu de glDraw
81 glGenQueries(1, &m_time_query);
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 }
Text create_text()
cree une console. a detruire avec release_text( ).
Definition text.cpp:14

◆ quit() [24/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 93 of file tuto_mdi.cpp.

94 {
95 glDeleteQueries(1, &m_time_query);
96 release_text(m_console);
97
98 release_program(m_program);
99 m_objet.release();
100 glDeleteBuffers(1, &m_indirect_buffer);
101
102 return 0;
103 }
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 AppCamera.

Definition at line 105 of file tuto_mdi.cpp.

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

◆ render() [24/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 111 of file tuto_mdi.cpp.

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

◆ init() [25/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 44 of file tuto_mdi_count.cpp.

45 {
46 // verifie l'existence des extensions
47 if(!GLAD_GL_ARB_indirect_parameters)
48 return -1;
49 printf("GL_ARB_indirect_parameters ON\n");
50
51 if(!GLAD_GL_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("gkit2_tutos/M2/indirect_cull.glsl"); // tests de visibilite
101 program_print_errors(m_program_cull);
102
103 m_program= read_program("gkit2_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() [25/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

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 AppCamera.

Definition at line 140 of file tuto_mdi_count.cpp.

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

◆ render() [25/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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() [26/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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 glDrawElements, comme d'habitude :
43
44 glBindVertexArray(m_vao);
45 glUseProgram(m_program);
46 glUniform( ... );
47
48 for(unsigned i= 0; i < groups.size(); i++)
49 glDrawElements(GL_TRIANGLES, /count/ groups[i].n, /type/ GL_UNSIGNED_INT, /offset/ groups[i].first * sizeof(unsigned));
50
51 on peut remplir une structure IndirectParam par draw... et utiliser un seul appel a multidrawindirect
52 */
53
54 std::vector<IndirectParam> params;
55 for(unsigned i= 0; i < groups.size(); i++)
56 {
57 params.push_back({
58 unsigned(groups[i].n), // count
59 1, // instance_count
60 unsigned(groups[i].first), // first_index
61 0, // vertex_base, pas la peine de renumeroter les sommets
62 0 // instance_base, pas d'instances
63 });
64 }
65
66 m_draws= params.size();
67
68 // transferer dans un buffer
69 glGenBuffers(1, &m_indirect_buffer);
70 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
71 glBufferData(GL_DRAW_INDIRECT_BUFFER, params.size() * sizeof(IndirectParam), params.data(), GL_STATIC_READ);
72
73 // construire aussi les buffers de l'objet
74 m_vao= m_objet.create_buffers(/* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index */ false);
75
76 // et charge un shader..
77 m_program= read_program("gkit2_tutos/M2/indirect_elements.glsl");
78 program_print_errors(m_program);
79
80 // etat openGL par defaut
81 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
82
83 glClearDepth(1.f); // profondeur par defaut
84 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
85 glEnable(GL_DEPTH_TEST); // activer le ztest
86
87 return 0;
88 }
Mesh read_indexed_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles indexes. utiliser glDrawElem...

◆ quit() [26/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 90 of file tuto_mdi_elements.cpp.

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

◆ render() [26/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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() [27/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

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(GLAD_GL_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("gkit2_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() [27/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 103 of file tuto_mdi_elements_count.cpp.

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

◆ render() [27/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

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() [28/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 29 of file tuto_time.cpp.

30 {
31 // charge un objet et une texture a afficher
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/grid.png");
38
39 // mode 2
40 // configure le vertex array / format de sommet
41 m_vao= m_objet.create_buffers( USE_POSITION | USE_TEXCOORD | USE_NORMAL );
42 m_vertex_count= m_objet.vertex_count();
43
44 m_program= read_program("gkit2_tutos/M2/instance.glsl");
45 program_print_errors(m_program);
46
47 // nettoyage
48 glBindVertexArray(0);
49 glBindBuffer(GL_ARRAY_BUFFER, 0);
50
51 // mesure du temps gpu de glDraw
52 glGenQueries(1, &m_time_query);
53
54 // affichage du temps dans la fenetre
55 m_console= create_text();
56
57 // etat openGL par defaut
58 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
59
60 glClearDepth(1.f); // profondeur par defaut
61 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
62 glEnable(GL_DEPTH_TEST); // activer le ztest
63
64 return 0; // ras, pas d'erreur
65 }
@ USE_TEXCOORD
inclut l'attribut coordonnees de texture dans les buffers.
Definition mesh.h:113

◆ quit() [28/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 67 of file tuto_time.cpp.

68 {
69 glDeleteQueries(1, &m_time_query);
70
71 release_text(m_console);
72 m_objet.release();
73 glDeleteTextures(1, &m_texture);
74
75 return 0;
76 }

◆ 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 AppCamera.

Definition at line 78 of file tuto_time.cpp.

79 {
80 m_model= RotationY(time / 20);
81 return 0;
82 }

◆ render() [28/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 84 of file tuto_time.cpp.

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

◆ init() [29/29]

int TP::init ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 116 of file vertices.cpp.

117 {
118 if(m_objet.vertex_count() == 0)
119 return -1;
120
121 // conserve une copie de l'original...
122 m_objet_reference= m_objet;
123
124 // projection par defaut, adaptee a la fenetre
125 m_camera.projection(window_width(), window_height(), 45);
126
127 // placer la camera
128 Point pmin, pmax;
129 m_objet.bounds(pmin, pmax);
130 m_camera.lookat(pmin, pmax);
131
132 // creer le shader program, uniquement necessaire pour l'option 2, cf render()
133 m_program= read_program("gkit2_tutos/M2/vertex.glsl");
134 program_print_errors(m_program);
135
136 m_display_program= read_program("gkit2_tutos/M2/vertex_display.glsl");
137 program_print_errors(m_display_program);
138
139 // etat openGL par defaut
140 glClearColor(0.2, 0.2, 0.2, 1); // couleur par defaut de la fenetre
141
142 glClearDepth(1); // profondeur par defaut
143 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
144 glEnable(GL_DEPTH_TEST); // activer le ztest
145 glEnable(GL_CULL_FACE);
146
147 glGenQueries(1, &m_query_vertex_shaders);
148
149 glGenBuffers(1, &m_buffer);
150 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
151 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(unsigned) * m_objet.vertex_count(), nullptr, GL_STREAM_DRAW);
152
153 // compte le nombre de triangles referencant chaque sommet
154 const std::vector<unsigned> &indices= m_objet.indices();
155 m_shared.resize( m_objet.vertex_count() );
156
157 for(unsigned i= 0; i < indices.size(); i++)
158 m_shared[ indices[i] ]++;
159
160 return 0; // ras, pas d'erreur
161 }

◆ quit() [29/29]

int TP::quit ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 164 of file vertices.cpp.

165 {
166 release_program(m_program);
167 m_objet.release();
168 return 0;
169 }

◆ render() [29/29]

int TP::render ( )
inlinevirtual

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

Implements AppCamera.

Definition at line 172 of file vertices.cpp.

173 {
174 update_camera( m_camera ); // pour screenshot, temps gpu inclu...
175
176 //
177 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
178
179 static int optimize= 0;
180 static bool capture= true;
181 static const char *export_filename= "export.obj";
182
183 if(key_state('o'))
184 {
185 clear_key_state('o');
186 optimize= (optimize +1) % 4;
187
188 if(optimize == 0)
189 {
190 capture= true; // force une nouvelle capture
191 printf("reference...\n");
192 m_objet= m_objet_reference;
193 export_filename= "reference.obj";
194 }
195
196 if(optimize == 1)
197 {
198 capture= true; // force une nouvelle capture
199 printf("optimize...\n");
200 m_objet= optimize_vcache(m_objet_reference);
201 m_objet= optimize_vfetch(m_objet);
202 export_filename= "optimize.obj";
203 }
204
205 if(optimize == 2)
206 {
207 capture= true; // force une nouvelle capture
208 printf("shuffle...\n");
209 m_objet= shuffle(m_objet_reference);
210 export_filename= "shuffle.obj";
211 }
212
213 if(optimize == 3)
214 {
215 capture= false; // pas de capture !! on modifie directement le buffer
216 printf("shared...\n");
217 m_objet= m_objet_reference;
218
219 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_buffer);
220 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(unsigned) * m_shared.size(), m_shared.data(), GL_STREAM_DRAW);
221 export_filename= "reference.obj";
222 }
223
224 // analyse l'objet
225 vcache(m_objet);
226 vfetch(m_objet);
227 }
228
229 // export
230 if(key_state('x'))
231 {
232 clear_key_state('x');
233 write_mesh(m_objet, export_filename);
234 }
235
236 if(key_state('r'))
237 {
238 capture= true; // force une nouvelle capture
239 clear_key_state('r');
240
241 // recharger le shader
242 reload_program(m_program);
243 program_print_errors(m_program);
244
245 reload_program(m_display_program);
246 program_print_errors(m_display_program);
247 }
248
249 static bool rotate= false;
250 if(key_state(' '))
251 {
252 clear_key_state(' ');
253 rotate= !rotate;
254 }
255
256 static Transform model= Identity();
257 if(rotate)
258 model= RotationY(global_time() / 40);
259
260 Transform view= m_camera.view();
261 Transform projection= m_camera.projection(window_width(), window_height(), 45);
262 Transform mv= view * model;
263 Transform mvp= projection * mv;
264
265 // capture les transformations
266 if(capture)
267 {
268 capture= false; // 1 seule fois
269
270 int zeros[4]= { 0, 0, 0, 0 };
271 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
272 glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, zeros);
273
274 glBeginQuery(GL_VERTEX_SHADER_INVOCATIONS, m_query_vertex_shaders);
275
276 glUseProgram(m_program);
277 program_uniform(m_program, "mvpMatrix", mvp);
278
279 m_objet.draw(m_program);
280
281 glEndQuery(GL_VERTEX_SHADER_INVOCATIONS);
282
283 GLuint64 vertices= m_objet.vertex_count();
284 GLuint64 vertex_shaders= 0; glGetQueryObjectui64v(m_query_vertex_shaders, GL_QUERY_RESULT, &vertex_shaders);
285 printf("%lu transformed vertices / %lu vertex atvr %f\n", vertex_shaders, vertices, float(vertex_shaders) / float(vertices));
286
287 glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
288 glClear(GL_COLOR_BUFFER_BIT);
289 }
290
291 // affiche la capture / nombre de sommets transformes
292 {
293 glUseProgram(m_display_program);
294 program_uniform(m_display_program, "mvpMatrix", mvp);
295 program_uniform(m_display_program, "mvMatrix", mv);
296
297 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
298
299 m_objet.draw( m_display_program);
300 }
301
302 return 1;
303 }
int write_mesh(const Mesh &mesh, const char *filename, const char *materials_filename)
enregistre un mesh dans un fichier .obj.
MeshData vertices(MeshData &data)
construit les sommets. prepare l'affichage openGL, avec glDrawArrays().

Member Data Documentation

◆ m_objet [1/2]

Mesh TP::m_objet
protected

Definition at line 187 of file alpha.cpp.

◆ m_repere

Mesh TP::m_repere
protected

Definition at line 188 of file alpha.cpp.

◆ m_vao

GLuint TP::m_vao
protected

Definition at line 189 of file alpha.cpp.

◆ m_program

GLuint TP::m_program
protected

Definition at line 190 of file alpha.cpp.

◆ m_textures

std::vector<GLuint> TP::m_textures
protected

Definition at line 191 of file alpha.cpp.

◆ m_groups

std::vector< TriangleGroup > TP::m_groups
protected

Definition at line 192 of file alpha.cpp.

◆ m_grid

Mesh TP::m_grid
protected

Definition at line 147 of file tuto10.cpp.

◆ m_camera

Orbiter TP::m_camera
protected

Definition at line 148 of file tuto10.cpp.

◆ m_texture

GLuint TP::m_texture
protected

Definition at line 65 of file tuto7.cpp.

◆ m_cube

Mesh TP::m_cube
protected

Definition at line 120 of file tuto7_camera.cpp.

◆ m_model

Transform TP::m_model
protected

Definition at line 78 of file tuto8.cpp.

◆ m_objet [2/2]

Buffers TP::m_objet
protected

Definition at line 147 of file tuto9_buffers.cpp.

◆ m_colors

std::vector<Color> TP::m_colors
protected

Definition at line 112 of file tuto9_materials.cpp.

◆ m_texture0

GLuint TP::m_texture0
protected

Definition at line 103 of file tuto9_textures.cpp.

◆ m_texture1

GLuint TP::m_texture1
protected

Definition at line 104 of file tuto9_textures.cpp.

◆ m_program_draw

GLuint TP::m_program_draw
protected

Definition at line 197 of file tuto_cubemap.cpp.

◆ m_local

Mesh TP::m_local
protected

Definition at line 355 of file tuto_decal.cpp.

◆ m_proxy

Mesh TP::m_proxy
protected

Definition at line 356 of file tuto_decal.cpp.

◆ m_frustum

Mesh TP::m_frustum
protected

Definition at line 357 of file tuto_decal.cpp.

◆ m_ground

Mesh TP::m_ground
protected

Definition at line 358 of file tuto_decal.cpp.

◆ m_position

Transform TP::m_position
protected

Definition at line 359 of file tuto_decal.cpp.

◆ m_frustum_cube

Mesh TP::m_frustum_cube
protected

Definition at line 326 of file tuto_deferred_decal.cpp.

◆ m_framebuffer [1/2]

Framebuffer TP::m_framebuffer
protected

Definition at line 329 of file tuto_deferred_decal.cpp.

◆ m_mesh_program

GLuint TP::m_mesh_program
protected

Definition at line 331 of file tuto_deferred_decal.cpp.

◆ m_decal_program

GLuint TP::m_decal_program
protected

Definition at line 332 of file tuto_deferred_decal.cpp.

◆ m_object

Mesh TP::m_object
protected

Definition at line 383 of file tuto_dynamic_cubemap.cpp.

◆ m_program_render

GLuint TP::m_program_render
protected

Definition at line 387 of file tuto_dynamic_cubemap.cpp.

◆ m_texture_cubemap

GLuint TP::m_texture_cubemap
protected

Definition at line 391 of file tuto_dynamic_cubemap.cpp.

◆ m_depth_cubemap

GLuint TP::m_depth_cubemap
protected

Definition at line 392 of file tuto_dynamic_cubemap.cpp.

◆ m_framebuffer [2/2]

GLuint TP::m_framebuffer
protected

Definition at line 393 of file tuto_dynamic_cubemap.cpp.

◆ m_shadow_program

GLuint TP::m_shadow_program
protected

Definition at line 336 of file tuto_shadows.cpp.

◆ m_observer

Orbiter TP::m_observer
protected

Definition at line 204 of file tuto_transform.cpp.

◆ m_pmin

Point TP::m_pmin
protected

Definition at line 206 of file tuto_transform.cpp.

◆ m_pmax

Point TP::m_pmax
protected

Definition at line 206 of file tuto_transform.cpp.

◆ repere

Mesh TP::repere
protected

Definition at line 338 of file fragments.cpp.

◆ mesh

Mesh TP::mesh
protected

Definition at line 339 of file fragments.cpp.

◆ vao

GLuint TP::vao
protected

Definition at line 341 of file fragments.cpp.

◆ vao_replay

GLuint TP::vao_replay
protected

Definition at line 342 of file fragments.cpp.

◆ n

unsigned TP::n
protected

Definition at line 343 of file fragments.cpp.

◆ texture

GLuint TP::texture
protected

Definition at line 345 of file fragments.cpp.

◆ buffer

GLuint TP::buffer
protected

Definition at line 346 of file fragments.cpp.

◆ size

unsigned TP::size
protected

Definition at line 347 of file fragments.cpp.

◆ program_record

GLuint TP::program_record
protected

Definition at line 349 of file fragments.cpp.

◆ program_replay

GLuint TP::program_replay
protected

Definition at line 350 of file fragments.cpp.

◆ m_mesh

Mesh TP::m_mesh
protected

Definition at line 214 of file pipeline_statistics.cpp.

◆ m_vertex_query

GLuint TP::m_vertex_query
protected

Definition at line 218 of file pipeline_statistics.cpp.

◆ m_primitive_query

GLuint TP::m_primitive_query
protected

Definition at line 219 of file pipeline_statistics.cpp.

◆ m_vertex_shader_query

GLuint TP::m_vertex_shader_query
protected

Definition at line 220 of file pipeline_statistics.cpp.

◆ m_culling_query

GLuint TP::m_culling_query
protected

Definition at line 221 of file pipeline_statistics.cpp.

◆ m_clipping_query

GLuint TP::m_clipping_query
protected

Definition at line 222 of file pipeline_statistics.cpp.

◆ m_sample_query

GLuint TP::m_sample_query
protected

Definition at line 223 of file pipeline_statistics.cpp.

◆ m_fragment_shader_query

GLuint TP::m_fragment_shader_query
protected

Definition at line 224 of file pipeline_statistics.cpp.

◆ m_indirect_buffer

GLuint TP::m_indirect_buffer
protected

Definition at line 187 of file tuto_mdi.cpp.

◆ m_model_buffer

GLuint TP::m_model_buffer
protected

Definition at line 188 of file tuto_mdi.cpp.

◆ m_time_query

GLuint TP::m_time_query
protected

Definition at line 189 of file tuto_mdi.cpp.

◆ m_program_direct

GLuint TP::m_program_direct
protected

Definition at line 193 of file tuto_mdi.cpp.

◆ m_console

Text TP::m_console
protected

Definition at line 195 of file tuto_mdi.cpp.

◆ m_multi_indirect

std::vector<IndirectParam> TP::m_multi_indirect
protected

Definition at line 201 of file tuto_mdi.cpp.

◆ m_multi_model

std::vector< Transform > TP::m_multi_model
protected

Definition at line 202 of file tuto_mdi.cpp.

◆ m_parameter_buffer

GLuint TP::m_parameter_buffer
protected

Definition at line 237 of file tuto_mdi_count.cpp.

◆ m_object_buffer

GLuint TP::m_object_buffer
protected

Definition at line 240 of file tuto_mdi_count.cpp.

◆ m_remap_buffer

GLuint TP::m_remap_buffer
protected

Definition at line 241 of file tuto_mdi_count.cpp.

◆ m_program_cull

GLuint TP::m_program_cull
protected

Definition at line 245 of file tuto_mdi_count.cpp.

◆ m_objects

std::vector<Object> TP::m_objects
protected

Definition at line 255 of file tuto_mdi_count.cpp.

◆ m_draws

int TP::m_draws
protected

Definition at line 128 of file tuto_mdi_elements.cpp.

◆ m_indirect_count_buffer

GLuint TP::m_indirect_count_buffer
protected

Definition at line 146 of file tuto_mdi_elements_count.cpp.

◆ m_vertex_buffer

GLuint TP::m_vertex_buffer
protected

Definition at line 187 of file tuto_time.cpp.

◆ m_vertex_count

unsigned int TP::m_vertex_count
protected

Definition at line 188 of file tuto_time.cpp.

◆ m_objet_reference

Mesh TP::m_objet_reference
protected

Definition at line 309 of file vertices.cpp.

◆ m_shared

std::vector<unsigned> TP::m_shared
protected

Definition at line 311 of file vertices.cpp.

◆ m_display_program

GLuint TP::m_display_program
protected

Definition at line 314 of file vertices.cpp.

◆ m_buffer

GLuint TP::m_buffer
protected

Definition at line 315 of file vertices.cpp.

◆ m_query_vertices

GLuint TP::m_query_vertices
protected

Definition at line 317 of file vertices.cpp.

◆ m_query_vertex_shaders

GLuint TP::m_query_vertex_shaders
protected

Definition at line 318 of file vertices.cpp.

◆ m_query_fragment_shaders

GLuint TP::m_query_fragment_shaders
protected

Definition at line 319 of file vertices.cpp.


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