gKit2 light
Loading...
Searching...
No Matches
tuto9_materials.cpp
Go to the documentation of this file.
1
3
4#include "mat.h"
5#include "mesh.h"
6#include "wavefront.h"
7
8#include "orbiter.h"
9#include "program.h"
10#include "uniforms.h"
11#include "draw.h"
12
13#include "app_camera.h" // classe Application a deriver
14
15
16class TP : public AppCamera
17{
18public:
19 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
20 TP( ) : AppCamera(1024, 640) {}
21
22 int init( )
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 }
63
64 // destruction des objets de l'application
65 int quit( )
66 {
67 // etape 3 : detruire le shader program
68 release_program(m_program);
69 m_objet.release();
70 return 0;
71 }
72
73 // dessiner une nouvelle image
74 int render( )
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 }
105
106protected:
107 Transform m_model;
108 Mesh m_objet;
109 Orbiter m_camera;
110 GLuint m_texture;
111 GLuint m_program;
112 std::vector<Color> m_colors;
113};
114
115
116int main( int argc, char **argv )
117{
118 TP tp;
119 tp.run();
120
121 return 0;
122}
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
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
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.
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
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:139
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp: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
Color diffuse
couleur diffuse / de base.
Definition materials.h:17
int count() const
nombre de matieres.
Definition materials.h:102
std::vector< Material > materials
description des matieres.
Definition materials.h:47
const Material & material(const int id) const
renvoie la ieme matiere.
Definition materials.h:110
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