gKit2 light
Loading...
Searching...
No Matches
tuto6GL_buffer.cpp
Go to the documentation of this file.
1
3
4#include <cstdlib>
5#include <ctime>
6
7#include "vec.h"
8#include "mat.h"
9
10#include "mesh.h"
11#include "wavefront.h"
12
13#include "program.h"
14#include "uniforms.h"
15
16#include "orbiter.h"
17#include "app.h" // classe Application a deriver
18
19
20class DrawInstanceBuffer : public App
21{
22public:
23 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
24 DrawInstanceBuffer( ) : App(1024, 640) {}
25
26 int init( )
27 {
28 // charge un mesh
29 Mesh mesh= read_mesh("data/cube.obj");
30 if(mesh.vertex_count() == 0)
31 return -1;
32
33 Point pmin, pmax;
34 mesh.bounds(pmin, pmax);
35 m_camera.lookat(pmin - Vector(40, 40, 40), pmax + Vector(40, 40, 40));
36
37 m_vertex_count= mesh.vertex_count();
38
39 // cree les buffers et le vao
40 glGenVertexArrays(1, &m_vao);
41 glBindVertexArray(m_vao);
42
43 // buffer : positions + normals
44 glGenBuffers(1, &m_buffer);
45 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
46
47 size_t size= mesh.vertex_buffer_size() + mesh.normal_buffer_size();
48 glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
49
50 // transfere les positions des sommets
51 size_t offset= 0;
52 size= mesh.vertex_buffer_size();
53 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.vertex_buffer());
54 // configure l'attribut 0, vec3 position
55 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
56 glEnableVertexAttribArray(0);
57
58 // transfere les normales des sommets
59 offset= offset + size;
60 size= mesh.normal_buffer_size();
61 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.normal_buffer());
62 // configure l'attribut 2, vec3 normal
63 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
64 glEnableVertexAttribArray(2);
65
66
67 // instance buffer, position aleatoire des cubes...
68 srand(time(NULL));
69
70 std::vector<vec3> positions;
71 for(int i= 0; i < 50; i++)
72 {
73 float x= rand() % 11 - 5;
74 float y= rand() % 11 - 5;
75 float z= rand() % 11 - 5;
76
77 positions.push_back(vec3(x *4, y *4, z *4));
78 }
79
80 m_instance_count= (int) positions.size();
81
82 // cree et initialise le buffer d'instance
83 glGenBuffers(1, &m_instance_buffer);
84 glBindBuffer(GL_ARRAY_BUFFER, m_instance_buffer);
85 glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * positions.size(), &positions.front().x, GL_STATIC_DRAW);
86
87 // configure le vao pour l'attribut d'instance
88 // configure l'attribut 1, vec3 instance_position
89 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, /* offset */ 0);
90 glVertexAttribDivisor(1, 1); // !! c'est la seule difference entre un attribut de sommet et un attribut d'instance !!
91 glEnableVertexAttribArray(1);
92
93 //
94 mesh.release();
95 glBindVertexArray(0);
96 glBindBuffer(GL_ARRAY_BUFFER, 0);
97
98 // shaders
99 m_program= read_program("gkit2_tutos/instance_buffer.glsl");
100 program_print_errors(m_program);
101
102
103 // etat openGL par defaut
104 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
105
106 glClearDepth(1.f); // profondeur par defaut
107 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
108 glEnable(GL_DEPTH_TEST); // activer le ztest
109
110 return 0; // ras, pas d'erreur
111 }
112
113 // destruction des objets de l'application
114 int quit( )
115 {
116 release_program(m_program);
117 glDeleteVertexArrays(1, &m_vao);
118 glDeleteBuffers(1, &m_buffer);
119 glDeleteBuffers(1, &m_instance_buffer);
120 return 0;
121 }
122
123 int update( const float time, const float delta )
124 {
125 m_model= RotationY(time / 20);
126 return 0;
127 }
128
129 // dessiner une nouvelle image
130 int render( )
131 {
132 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
133
134 // deplace la camera
135 int mx, my;
136 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
137 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
138 m_camera.rotation(mx, my);
139 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
140 m_camera.move(mx);
141 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
142 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
143
144 glBindVertexArray(m_vao);
145 glUseProgram(m_program);
146
147 Transform m= m_model;
148 Transform v= m_camera.view();
149 Transform p= m_camera.projection(window_width(), window_height(), 45);
150 Transform mvp= p * v * m;
151 Transform mv= v * m;
152
153 program_uniform(m_program, "mvpMatrix", mvp);
154 program_uniform(m_program, "normalMatrix", mv.normal());
155
156 glDrawArraysInstanced(GL_TRIANGLES, 0, m_vertex_count, m_instance_count);
157
158 return 1;
159 }
160
161protected:
162 Transform m_model;
163 Orbiter m_camera;
164 GLuint m_vao;
165 GLuint m_buffer;
166 GLuint m_instance_buffer;
167 GLuint m_program;
168 int m_vertex_count;
169 int m_instance_count;
170};
171
172
173int main( int argc, char **argv )
174{
176 tp.run();
177
178 return 0;
179}
180
int run()
execution de l'application.
Definition app.cpp:36
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
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
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.
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
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
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
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
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181
representation d'un vecteur 3d.
Definition vec.h:67
vecteur generique, utilitaire.
Definition vec.h:169