gKit2 light
tuto9_buffers.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.h" // classe Application a deriver
14 
15 struct Buffers
16 {
17  GLuint vao;
18  GLuint vertex_buffer;
19  int vertex_count;
20 
21  Buffers( ) : vao(0), vertex_buffer(0), vertex_count(0) {}
22 
23  void create( const Mesh& mesh )
24  {
25  if(!mesh.vertex_buffer_size()) return;
26 
27  // cree et configure le vertex array object: conserve la description des attributs de sommets
28  glGenVertexArrays(1, &vao);
29  glBindVertexArray(vao);
30 
31  // cree et initialise le buffer: conserve la positions des sommets
32  glGenBuffers(1, &vertex_buffer);
33  glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
34  glBufferData(GL_ARRAY_BUFFER, mesh.vertex_buffer_size(), mesh.vertex_buffer(), GL_STATIC_DRAW);
35 
36  // attribut 0, position des sommets, declare dans le vertex shader : in vec3 position;
37  glVertexAttribPointer(0,
38  3, GL_FLOAT, // size et type, position est un vec3 dans le vertex shader
39  GL_FALSE, // pas de normalisation des valeurs
40  0, // stride 0, les valeurs sont les unes a la suite des autres
41  0 // offset 0, les valeurs sont au debut du buffer
42  );
43  glEnableVertexAttribArray(0);
44  // attention : le vertex array selectionne est un parametre implicite
45  // attention : le buffer selectionne sur GL_ARRAY_BUFFER est un parametre implicite
46 
47  // conserve le nombre de sommets
48  vertex_count= mesh.vertex_count();
49  }
50 
51  void release( )
52  {
53  glDeleteBuffers(1, &vertex_buffer);
54  glDeleteVertexArrays(1, &vao);
55  }
56 };
57 
58 
59 class TP : public App
60 {
61 public:
62  // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
63  TP( ) : App(1024, 640) {}
64 
65  int init( )
66  {
67  // charger un objet a afficher
68  Mesh mesh= read_mesh("data/cube.obj");
69  if(!mesh.vertex_count()) return -1;
70 
71  // etape 1 : creer le vertex buffer et le vao
72  m_objet.create(mesh);
73 
74  // etape 2 : configurer la camera
75  Point pmin, pmax;
76  mesh.bounds(pmin, pmax);
77  m_camera.lookat(pmin, pmax);
78 
79  // etape 3 : creer le shader program
80  m_program= read_program("tutos/tuto9_color.glsl");
81  program_print_errors(m_program);
82 
83  // etat openGL par defaut
84  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
85 
86  glClearDepth(1.f); // profondeur par defaut
87  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
88  glEnable(GL_DEPTH_TEST); // activer le ztest
89 
90  return 0; // ras, pas d'erreur
91  }
92 
93  // destruction des objets de l'application
94  int quit( )
95  {
96  // etape 4 : detruire le shader program
97  release_program(m_program);
98  m_objet.release();
99  return 0;
100  }
101 
102  // dessiner une nouvelle image
103  int render( )
104  {
105  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 
107  // deplace la camera
108  int mx, my;
109  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
110  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
111  m_camera.rotation(mx, my);
112  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
113  m_camera.move(mx);
114  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
115  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
116 
117  // etape 2 : dessiner m_objet avec le shader program
118 
119  // . recuperer les transformations
120  Transform model= RotationX(global_time() / 20);
121  Transform view= m_camera.view();
122  Transform projection= m_camera.projection(window_width(), window_height(), 45);
123 
124  // . composer les transformations : model, view et projection
125  Transform mvp= projection * view * model;
126 
127  // configurer le shader program
128  int location;
129  glUseProgram(m_program);
130 
131  // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
132  location= glGetUniformLocation(m_program, "mvpMatrix");
133  glUniformMatrix4fv(location, 1, GL_TRUE, mvp.data());
134 
135  // . parametres "supplementaires" :
136  // . couleur des pixels, cf la declaration 'uniform vec4 color;' dans le fragment shader
137  location= glGetUniformLocation(m_program, "color");
138  glUniform4f(location, 1, 1, 0, 1);
139 
140  // go !
141  // selectionner les attributs et les buffers de l'objet
142  glBindVertexArray(m_objet.vao);
143 
144  // dessiner les triangles de l'objet
145  glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count);
146 
147  return 1;
148  }
149 
150 protected:
151  Transform m_model;
152  Buffers m_objet;
153  Orbiter m_camera;
154  GLuint m_texture;
155  GLuint m_program;
156 };
157 
158 
159 int main( int argc, char **argv )
160 {
161  TP tp;
162  tp.run();
163 
164  return 0;
165 }
classe application.
Definition: app.h:20
int run()
execution de l'application.
Definition: app.cpp:36
representation d'un objet / maillage.
Definition: mesh.h:112
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition: mesh.h:296
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:501
int create(const GLenum primitives)
construit les objets openGL.
Definition: mesh.cpp:16
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition: mesh.h:298
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:291
void release()
detruit les objets openGL.
Definition: mesh.cpp:62
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
void move(const float z)
rapproche / eloigne la camera du centre.
Definition: orbiter.cpp:33
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition: orbiter.cpp:47
void translation(const float x, const float y)
deplace le centre / le point observe.
Definition: orbiter.cpp:27
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Definition: orbiter.cpp:21
Transform view() const
renvoie la transformation vue.
Definition: orbiter.cpp:40
Definition: alpha.cpp:59
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:29
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:25
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition: window.cpp:128
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition: mat.cpp:230
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition: wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:204
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition: program.cpp:432
int release_program(const GLuint program)
detruit les shaders et le program.
Definition: program.cpp:211
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
const float * data() const
renvoie l'adresse de la premiere valeur de la matrice.
Definition: mat.h:75