gKit2 light
Loading...
Searching...
No Matches
tuto_deferred_decal.cpp
Go to the documentation of this file.
1
3
4
5#include "wavefront.h"
6#include "texture.h"
7#include "program.h"
8#include "uniforms.h"
9#include "framebuffer.h"
10
11#include "orbiter.h"
12#include "draw.h"
13#include "app_camera.h" // classe Application a deriver
14
15
16// utilitaire. creation d'une grille / repere.
17// n= 0 ne dessine que les axes du repere.
18Mesh make_grid( const int n= 10 )
19{
20 glLineWidth(2);
21 Mesh grid= Mesh(GL_LINES);
22
23 // grille
24 grid.color(White());
25 float w= float(n-1) / 2;
26 for(int x= 0; x < n; x++)
27 {
28 grid.vertex(x -w, 0, -w);
29 grid.vertex(x -w, 0, w);
30 }
31
32 for(int z= 0; z < n; z++)
33 {
34 grid.vertex(-w, 0, z -w);
35 grid.vertex( w, 0, z -w);
36 }
37
38 // axes XYZ
39 grid.color(Red());
40 grid.vertex(0, .1, 0);
41 grid.vertex(1, .1, 0);
42
43 grid.color(Green());
44 grid.vertex(0, .1, 0);
45 grid.vertex(0, 1, 0);
46
47 grid.color(Blue());
48 grid.vertex(0, .1, 0);
49 grid.vertex(0, .1, 1);
50
51 return grid;
52}
53
54// utilitaire. creation d'un plan / sol
55Mesh make_ground( const int n= 10 )
56{
57 Mesh grid= Mesh(GL_TRIANGLES);
58
59 grid.normal(0, 1, 0);
60 int a= grid.vertex(-n/2, -1, n/2);
61 int b= grid.vertex( n/2, -1, n/2);
62 int c= grid.vertex( n/2, -1, -n/2);
63 int d= grid.vertex(-n/2, -1, -n/2);
64 grid.triangle(a, b, c);
65 grid.triangle(a, c, d);
66
67 return grid;
68}
69
70Mesh make_xyz( )
71{
72 glLineWidth(2);
73 Mesh camera= Mesh(GL_LINES);
74
75 // axes XYZ
76 camera.color(Red());
77 camera.vertex(Point(0, 0, 0));
78 camera.vertex(Point(1, 0, 0));
79
80 camera.color(Green());
81 camera.vertex(Point(0, 0, 0));
82 camera.vertex(Point(0, 1, 0));
83
84 camera.color(Blue());
85 camera.vertex(Point(0, 0, 0));
86 camera.vertex(Point(0, 0, 1));
87
88 return camera;
89}
90
91Mesh make_frustum( )
92{
93 glLineWidth(2);
94 Mesh camera= Mesh(GL_LINES);
95
96 camera.color(Yellow());
97 // face avant
98 camera.vertex(-1, -1, -1);
99 camera.vertex(-1, 1, -1);
100 camera.vertex(-1, 1, -1);
101 camera.vertex(1, 1, -1);
102 camera.vertex(1, 1, -1);
103 camera.vertex(1, -1, -1);
104 camera.vertex(1, -1, -1);
105 camera.vertex(-1, -1, -1);
106
107 // face arriere
108 camera.vertex(-1, -1, 1);
109 camera.vertex(-1, 1, 1);
110 camera.vertex(-1, 1, 1);
111 camera.vertex(1, 1, 1);
112 camera.vertex(1, 1, 1);
113 camera.vertex(1, -1, 1);
114 camera.vertex(1, -1, 1);
115 camera.vertex(-1, -1, 1);
116
117 // aretes
118 camera.vertex(-1, -1, -1);
119 camera.vertex(-1, -1, 1);
120 camera.vertex(-1, 1, -1);
121 camera.vertex(-1, 1, 1);
122 camera.vertex(1, 1, -1);
123 camera.vertex(1, 1, 1);
124 camera.vertex(1, -1, -1);
125 camera.vertex(1, -1, 1);
126
127 return camera;
128}
129
130class TP : public AppCamera
131{
132public:
133 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
134 TP( ) : AppCamera(1024, 640) {}
135
136 // creation des objets de l'application
137 int init( )
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 }
185
186 // destruction des objets de l'application
187 int quit( )
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 }
201
202 // dessiner une nouvelle image
203 int render( )
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
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 }
319
320protected:
321 Mesh m_objet;
322 Mesh m_repere;
323 Mesh m_local;
324 Mesh m_proxy;
325 Mesh m_frustum;
326 Mesh m_frustum_cube;
327 Mesh m_ground;
328 Transform m_position;
329 Framebuffer m_framebuffer;
330 GLuint m_texture;
331 GLuint m_mesh_program;
332 GLuint m_decal_program;
333};
334
335
336int main( int argc, char **argv )
337{
338 // il ne reste plus qu'a creer un objet application et la lancer
339 TP tp;
340 tp.run();
341
342 return 0;
343}
classe application.
Definition app_camera.h:19
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
AppCamera(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5
int run()
execution de l'application.
Definition app.cpp:36
representation d'un objet / maillage.
Definition mesh.h:121
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Definition mesh.cpp:97
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
Definition mesh.cpp:178
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
Definition mesh.cpp:76
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:59
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:53
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
Color Yellow()
utilitaire. renvoie une couleur jaune.
Definition color.cpp:43
Color Blue()
utilitaire. renvoie une couleur bleue.
Definition color.cpp:38
Color Black()
utilitaire. renvoie une couleur noire.
Definition color.cpp:18
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition mat.cpp:230
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
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
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition mat.cpp:216
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240
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
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21