gKit2 light
Loading...
Searching...
No Matches
StorageBuffer Class Reference
Inheritance diagram for StorageBuffer:

Public Member Functions

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.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Public Member Functions inherited from App
 App (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL.
virtual int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int run ()
 execution de l'application.

Protected Attributes

Mesh m_mesh
Orbiter m_camera
GLuint m_vao
GLuint m_buffer
GLuint m_program
GLuint m_texture
Protected Attributes inherited from App
Window m_window
Context m_context
bool sync

Additional Inherited Members

Protected Member Functions inherited from App
virtual int prerender ()
virtual int postrender ()
void vsync_off ()

Detailed Description

Definition at line 68 of file tuto_storage_buffer.cpp.

Constructor & Destructor Documentation

◆ StorageBuffer()

StorageBuffer::StorageBuffer ( )
inline

Definition at line 72 of file tuto_storage_buffer.cpp.

72: App(1024, 640, 4, 3) {}
App(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app.cpp:11

Member Function Documentation

◆ init()

int StorageBuffer::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 74 of file tuto_storage_buffer.cpp.

75 {
76 m_mesh= read_mesh("data/cube.obj");
77
78 #if 1
79 // construit le storage buffer contenant les positions, les normales et les texcoords, en utilisant les types alignes
80 struct vertex
81 {
82 glsl::vec3 position;
83 glsl::vec3 normal;
84 glsl::vec2 texcoord;
85
86 vertex( ) : position(), normal(), texcoord() {}
87 };
88
89 #else
90 // ou a la main
91 struct vertex
92 {
93 vec3 position; // vec3 aligne sur 4 float
94 float pad0;
95 vec3 normal;
96 float pad1;
97 vec2 texcoord; // vec2 aligne sur 2 float
98
99 float pad2;
100 float pad3; // donc la taille totale de la structure doit etre un mulitple de 4 floats
101
102 vertex( ) : position(), normal(), texcoord() {}
103 };
104 #endif
105
106
107 // recupere les attributs du mesh
108 std::vector<vertex> data(m_mesh.vertex_count());
109 for(int i= 0; i < m_mesh.vertex_count(); i++)
110 {
111 data[i].position= m_mesh.positions().at(i);
112 data[i].normal= m_mesh.normals().at(i);
113 data[i].texcoord= m_mesh.texcoords().at(i);
114 }
115
116 // vao par defaut
117 glGenVertexArrays(1, &m_vao);
118 glBindVertexArray(m_vao);
119
120 // storage buffer
121 glGenBuffers(1, &m_buffer);
122
123 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_buffer);
124 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vertex) * data.size(), data.data(), GL_STREAM_READ);
125
126 //
127 m_program= read_program("gkit2_tutos/tuto_storage_buffer.glsl");
128 program_print_errors(m_program);
129
130 //
131 Point pmin, pmax;
132 m_mesh.bounds(pmin, pmax);
133 m_camera.lookat(pmin, pmax);
134
135 m_texture= read_texture(0, "data/debug2x2red.png");
136
137 // etat openGL par defaut
138 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
139
140 glClearDepth(1.f); // profondeur par defaut
141 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
142 glEnable(GL_DEPTH_TEST); // activer le ztest
143
144 return 0; // ras, pas d'erreur
145 }
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:218
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition program.cpp:446
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133

◆ quit()

int StorageBuffer::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements App.

Definition at line 148 of file tuto_storage_buffer.cpp.

149 {
150 m_mesh.release();
151 release_program(m_program);
152 glDeleteTextures(1, &m_texture);
153 glDeleteBuffers(1, &m_buffer);
154 glDeleteVertexArrays(1, &m_vao);
155 return 0;
156 }
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:225

◆ render()

int StorageBuffer::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements App.

Definition at line 159 of file tuto_storage_buffer.cpp.

160 {
161 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
162
163 // deplace la camera
164 int mx, my;
165 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
166 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
167 m_camera.rotation(mx, my);
168 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
169 m_camera.move(mx);
170 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
171 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
172
173 glBindVertexArray(m_vao);
174 glUseProgram(m_program);
175
176 Transform model= RotationY(global_time() / 20);
177 Transform view= m_camera.view();
178 Transform projection= m_camera.projection(window_width(), window_height(), 45);
179 Transform mv= view * model;
180 Transform mvp= projection * mv;
181
182 program_uniform(m_program, "mvMatrix", mv);
183 program_uniform(m_program, "normalMatrix", mv.normal());
184 program_uniform(m_program, "mvpMatrix", mvp);
185
186 program_use_texture(m_program, "diffuse_color", 0, m_texture, 0);
187
188 // selectionne le buffer comme storage buffer, numero 0
189 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
190
191 glDrawArrays(GL_TRIANGLES, 0, m_mesh.vertex_count());
192
193 return 1;
194 }
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:126
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
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
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181

Member Data Documentation

◆ m_mesh

Mesh StorageBuffer::m_mesh
protected

Definition at line 197 of file tuto_storage_buffer.cpp.

◆ m_camera

Orbiter StorageBuffer::m_camera
protected

Definition at line 198 of file tuto_storage_buffer.cpp.

◆ m_vao

GLuint StorageBuffer::m_vao
protected

Definition at line 200 of file tuto_storage_buffer.cpp.

◆ m_buffer

GLuint StorageBuffer::m_buffer
protected

Definition at line 201 of file tuto_storage_buffer.cpp.

◆ m_program

GLuint StorageBuffer::m_program
protected

Definition at line 202 of file tuto_storage_buffer.cpp.

◆ m_texture

GLuint StorageBuffer::m_texture
protected

Definition at line 203 of file tuto_storage_buffer.cpp.


The documentation for this class was generated from the following file: