gKit2 light
Loading...
Searching...
No Matches
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#include "app_camera.h" // gestion camera
15
16
17struct Buffers
18{
19 GLuint vao;
20 GLuint vertex_buffer;
21 int vertex_count;
22
23 Buffers( ) : vao(0), vertex_buffer(0), vertex_count(0) {}
24
25 void create( const Mesh& mesh )
26 {
27 if(!mesh.vertex_buffer_size()) return;
28
29 // cree et configure le vertex array object: conserve la description des attributs de sommets
30 glGenVertexArrays(1, &vao);
31 glBindVertexArray(vao);
32
33 // cree et initialise le buffer: conserve la positions des sommets
34 glGenBuffers(1, &vertex_buffer);
35 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
36 glBufferData(GL_ARRAY_BUFFER, mesh.vertex_buffer_size(), mesh.vertex_buffer(), GL_STATIC_DRAW);
37
38 // attribut 0, position des sommets, declare dans le vertex shader : in vec3 position;
39 glVertexAttribPointer(0,
40 3, GL_FLOAT, // size et type, position est un vec3 dans le vertex shader
41 GL_FALSE, // pas de normalisation des valeurs
42 0, // stride 0, les valeurs sont les unes a la suite des autres
43 0 // offset 0, les valeurs sont au debut du buffer
44 );
45 glEnableVertexAttribArray(0);
46 // attention : le vertex array selectionne est un parametre implicite
47 // attention : le buffer selectionne sur GL_ARRAY_BUFFER est un parametre implicite
48
49 // conserve le nombre de sommets
50 vertex_count= mesh.vertex_count();
51 }
52
53 void release( )
54 {
55 glDeleteBuffers(1, &vertex_buffer);
56 glDeleteVertexArrays(1, &vao);
57 }
58};
59
60
61class TP : public App
62{
63public:
64 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
65 TP( ) : App(1024, 640) {}
66
67 int init( )
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 }
94
95 // destruction des objets de l'application
96 int quit( )
97 {
98 // etape 4 : detruire le shader program
99 release_program(m_program);
100 m_objet.release();
101 return 0;
102 }
103
104 // dessiner une nouvelle image
105 int render( )
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 }
144
145protected:
146 Transform m_model;
147 Buffers m_objet;
148 Orbiter m_camera;
149 GLuint m_texture;
150 GLuint m_program;
151};
152
153
154int main( int argc, char **argv )
155{
156 TP tp;
157 tp.run();
158
159 return 0;
160}
classe application.
Definition app.h:20
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
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
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:139
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: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
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