gKit2 light
Loading...
Searching...
No Matches
tuto_storage_buffer.cpp
Go to the documentation of this file.
1
3
4#include "app.h" // classe Application a deriver
5#include "app_camera.h" // gestion camera
6
7#include "vec.h"
8#include "mat.h"
9
10#include "program.h"
11#include "uniforms.h"
12#include "texture.h"
13
14#include "mesh.h"
15#include "wavefront.h"
16
17#include "orbiter.h"
18
19
20// cf tuto_storage
21namespace glsl
22{
23 template < typename T >
24 struct alignas(8) gvec2
25 {
26 alignas(4) T x, y;
27
28 gvec2( ) {}
29 gvec2( const ::vec2& v ) : x(v.x), y(v.y) {}
30 };
31
32 typedef gvec2<float> vec2;
33 typedef gvec2<int> ivec2;
34 typedef gvec2<unsigned int> uvec2;
35 typedef gvec2<int> bvec2;
36
37 template < typename T >
38 struct alignas(16) gvec3
39 {
40 alignas(4) T x, y, z;
41
42 gvec3( ) {}
43 gvec3( const ::vec3& v ) : x(v.x), y(v.y), z(v.z) {}
44 gvec3( const Point& v ) : x(v.x), y(v.y), z(v.z) {}
45 gvec3( const Vector& v ) : x(v.x), y(v.y), z(v.z) {}
46 };
47
48 typedef gvec3<float> vec3;
49 typedef gvec3<int> ivec3;
50 typedef gvec3<unsigned int> uvec3;
51 typedef gvec3<int> bvec3;
52
53 template < typename T >
54 struct alignas(16) gvec4
55 {
56 alignas(4) T x, y, z, w;
57
58 gvec4( ) {}
59 gvec4( const ::vec4& v ) : x(v.x), y(v.y), z(v.z), w(v.w) {}
60 };
61
62 typedef gvec4<float> vec4;
63 typedef gvec4<int> ivec4;
64 typedef gvec4<unsigned int> uvec4;
65 typedef gvec4<int> bvec4;
66}
67
68
69class StorageBuffer : public App
70{
71public:
72 // application openGL 4.3
73 StorageBuffer( ) : App(1024, 640, 4, 3) {}
74
75 int init( )
76 {
77 m_mesh= read_mesh("data/cube.obj");
78
79 #if 1
80 // construit le storage buffer contenant les positions, les normales et les texcoords, en utilisant les types alignes
81 struct vertex
82 {
83 glsl::vec3 position;
84 glsl::vec3 normal;
85 glsl::vec2 texcoord;
86
87 vertex( ) : position(), normal(), texcoord() {}
88 };
89
90 #else
91 // ou a la main
92 struct vertex
93 {
94 vec3 position; // vec3 aligne sur 4 float
95 float pad0;
96 vec3 normal;
97 float pad1;
98 vec2 texcoord; // vec2 aligne sur 2 float
99
100 float pad2;
101 float pad3; // donc la taille totale de la structure doit etre un mulitple de 4 floats
102
103 vertex( ) : position(), normal(), texcoord() {}
104 };
105 #endif
106
107
108 // recupere les attributs du mesh
109 std::vector<vertex> data(m_mesh.vertex_count());
110 for(int i= 0; i < m_mesh.vertex_count(); i++)
111 {
112 data[i].position= m_mesh.positions().at(i);
113 data[i].normal= m_mesh.normals().at(i);
114 data[i].texcoord= m_mesh.texcoords().at(i);
115 }
116
117 // vao par defaut
118 glGenVertexArrays(1, &m_vao);
119 glBindVertexArray(m_vao);
120
121 // storage buffer
122 glGenBuffers(1, &m_buffer);
123
124 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_buffer);
125 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vertex) * data.size(), data.data(), GL_STREAM_READ);
126
127 //
128 m_program= read_program("gkit2_tutos/tuto_storage_buffer.glsl");
129 program_print_errors(m_program);
130
131 //
132 Point pmin, pmax;
133 m_mesh.bounds(pmin, pmax);
134 m_camera.lookat(pmin, pmax);
135
136 m_texture= read_texture(0, "data/debug2x2red.png");
137
138 // etat openGL par defaut
139 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
140
141 glClearDepth(1.f); // profondeur par defaut
142 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
143 glEnable(GL_DEPTH_TEST); // activer le ztest
144
145 return 0; // ras, pas d'erreur
146 }
147
148 // destruction des objets de l'application
149 int quit( )
150 {
151 m_mesh.release();
152 release_program(m_program);
153 glDeleteTextures(1, &m_texture);
154 glDeleteBuffers(1, &m_buffer);
155 glDeleteVertexArrays(1, &m_vao);
156 return 0;
157 }
158
159 // dessiner une nouvelle image
160 int render( )
161 {
162 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
163
164 // gestion mouvements camera
165 update_camera( m_camera );
166
167 glBindVertexArray(m_vao);
168 glUseProgram(m_program);
169
170 Transform model= RotationY(global_time() / 20);
171 Transform view= m_camera.view();
172 Transform projection= m_camera.projection(window_width(), window_height(), 45);
173 Transform mv= view * model;
174 Transform mvp= projection * mv;
175
176 program_uniform(m_program, "mvMatrix", mv);
177 program_uniform(m_program, "normalMatrix", mv.normal());
178 program_uniform(m_program, "mvpMatrix", mvp);
179
180 program_use_texture(m_program, "diffuse_color", 0, m_texture, 0);
181
182 // selectionne le buffer comme storage buffer, numero 0
183 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
184
185 glDrawArrays(GL_TRIANGLES, 0, m_mesh.vertex_count());
186
187 return 1;
188 }
189
190protected:
191 Mesh m_mesh;
192 Orbiter m_camera;
193
194 GLuint m_vao;
195 GLuint m_buffer;
196 GLuint m_program;
197 GLuint m_texture;
198};
199
200
201int main( int argc, char **argv )
202{
203 StorageBuffer app;
204 app.run();
205
206 return 0;
207}
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
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 quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
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 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
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
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181
vecteur generique, utilitaire.
Definition vec.h:152
vecteur generique, utilitaire.
Definition vec.h:169
representation de l'indexation complete d'un sommet