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

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 update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
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)
 constructeur, dimensions de la fenetre et version d'openGL.
int run ()
 execution de l'application.

Protected Attributes

Transform m_model
Orbiter m_camera
Orbiter m_framebuffer_camera
GLuint m_vao
GLuint m_buffer
GLuint m_texture_program
int m_vertex_count
GLuint m_color_texture
GLuint color_sampler
GLuint m_color_buffer
GLuint m_depth_buffer
GLuint m_framebuffer
int m_framebuffer_width
int m_framebuffer_height
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 20 of file tuto_framebuffer.cpp.

Constructor & Destructor Documentation

◆ TPFramebuffer()

TPFramebuffer::TPFramebuffer ( )
inline

Definition at line 24 of file tuto_framebuffer.cpp.

24: App(1024, 640) {}
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

Member Function Documentation

◆ init()

int TPFramebuffer::init ( )
inlinevirtual

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

Implements App.

Definition at line 26 of file tuto_framebuffer.cpp.

27 {
28 m_framebuffer_width= 512;
29 m_framebuffer_height= 512;
30
31 // etape 1 : creer une texture couleur...
32 glGenTextures(1, &m_color_buffer);
33 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
34
35 glTexImage2D(GL_TEXTURE_2D, 0,
36 GL_RGBA, m_framebuffer_width, m_framebuffer_height, 0,
37 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
38
39 // ... et tous ses mipmaps
40 glGenerateMipmap(GL_TEXTURE_2D);
41
42 // et son sampler
43 glGenSamplers(1, &color_sampler);
44
45 glSamplerParameteri(color_sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
46 glSamplerParameteri(color_sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
47 glSamplerParameteri(color_sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
48 glSamplerParameteri(color_sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
49
50 // etape 1 : creer aussi une texture depth, sinon pas de zbuffer...
51 glGenTextures(1, &m_depth_buffer);
52 glBindTexture(GL_TEXTURE_2D, m_depth_buffer);
53
54 glTexImage2D(GL_TEXTURE_2D, 0,
55 GL_DEPTH_COMPONENT, m_framebuffer_width, m_framebuffer_height, 0,
56 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
57
58 // etape 2 : creer et configurer un framebuffer object
59 glGenFramebuffers(1, &m_framebuffer);
60 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
61 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, /* attachment */ GL_COLOR_ATTACHMENT0, /* texture */ m_color_buffer, /* mipmap level */ 0);
62 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, /* attachment */ GL_DEPTH_ATTACHMENT, /* texture */ m_depth_buffer, /* mipmap level */ 0);
63
64 // le fragment shader ne declare qu'une seule sortie, indice 0
65 GLenum buffers[]= { GL_COLOR_ATTACHMENT0 };
66 glDrawBuffers(1, buffers);
67
68 // nettoyage
69 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
70
71 // charge un mesh
72 Mesh mesh= read_mesh("data/cube.obj");
73 if(mesh.vertex_count() == 0)
74 return -1;
75
76 Point pmin, pmax;
77 mesh.bounds(pmin, pmax);
78 m_camera.lookat(pmin, pmax);
79 m_framebuffer_camera.lookat(pmin, pmax);
80
81 m_vertex_count= mesh.vertex_count();
82
83 m_color_texture= read_texture(0, "data/debug2x2red.png");
84
85 // cree les buffers et le vao
86 glGenVertexArrays(1, &m_vao);
87 glBindVertexArray(m_vao);
88
89 // buffer : positions + texcoords + normals
90 glGenBuffers(1, &m_buffer);
91 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
92
93 size_t size= mesh.vertex_buffer_size() + mesh.texcoord_buffer_size() + mesh.normal_buffer_size();
94 glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
95
96 // transfere les positions des sommets
97 size_t offset= 0;
98 size= mesh.vertex_buffer_size();
99 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.vertex_buffer());
100 // configure l'attribut 0, vec3 position
101 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
102 glEnableVertexAttribArray(0);
103
104 // transfere les texcoords des sommets
105 offset= offset + size;
106 size= mesh.texcoord_buffer_size();
107 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.texcoord_buffer());
108 // configure l'attribut 1, vec2 texcoord
109 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
110 glEnableVertexAttribArray(1);
111
112 // transfere les normales des sommets
113 offset= offset + size;
114 size= mesh.normal_buffer_size();
115 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.normal_buffer());
116 // configure l'attribut 2, vec3 normal
117 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
118 glEnableVertexAttribArray(2);
119
120 //
121 mesh.release();
122 glBindVertexArray(0);
123 glBindBuffer(GL_ARRAY_BUFFER, 0);
124
125 // shaders
126 m_texture_program= read_program("gkit2_tutos/texcoords.glsl");
127 program_print_errors(m_texture_program);
128
129 // etat openGL par defaut
130 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
131
132 glClearDepthf(1.f); // profondeur par defaut
133 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
134 glEnable(GL_DEPTH_TEST); // activer le ztest
135
136 return 0; // ras, pas d'erreur
137 }
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
Definition mesh.h:317
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition mesh.h:305
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:489
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2,...
Definition mesh.h:315
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition mesh.h:307
int vertex_count() const
renvoie le nombre de sommets.
Definition mesh.h:300
void release()
detruit les objets openGL.
Definition mesh.cpp:50
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3,...
Definition mesh.h:310
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
Definition mesh.h:312
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
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133

◆ quit()

int TPFramebuffer::quit ( )
inlinevirtual

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

Implements App.

Definition at line 140 of file tuto_framebuffer.cpp.

141 {
142 glDeleteTextures(1, &m_color_buffer);
143 glDeleteTextures(1, &m_depth_buffer);
144 glDeleteFramebuffers(1, &m_framebuffer);
145 glDeleteSamplers(1, &color_sampler);
146
147 release_program(m_texture_program);
148 glDeleteTextures(1, &m_color_texture);
149 glDeleteVertexArrays(1, &m_vao);
150 glDeleteBuffers(1, &m_buffer);
151 return 0;
152 }
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240

◆ update()

int TPFramebuffer::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from App.

Definition at line 154 of file tuto_framebuffer.cpp.

155 {
156 m_model= RotationY(time / 20);
157 return 0;
158 }
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242

◆ render()

int TPFramebuffer::render ( )
inlinevirtual

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

Implements App.

Definition at line 161 of file tuto_framebuffer.cpp.

162 {
163 // gestion mouvements camera
164 update_camera( m_camera );
165
166 {
167 /* passe 1 : dessiner dans le framebuffer
168 */
169
170 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
171 glViewport(0, 0, m_framebuffer_width, m_framebuffer_height);
172 glClearColor(1, 1, 0, 1);
173 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
174
175 // draw "classique"
176 glBindVertexArray(m_vao);
177 glUseProgram(m_texture_program);
178
179 Transform m= m_model;
180 Transform v= m_framebuffer_camera.view();
181 Transform p= m_framebuffer_camera.projection(m_framebuffer_width, m_framebuffer_height, 45);
182 Transform mvp= p * v * m;
183 Transform mv= v * m;
184
185 program_uniform(m_texture_program, "mvpMatrix", mvp);
186 program_uniform(m_texture_program, "mvMatrix", mv);
187 program_uniform(m_texture_program, "normalMatrix", mv.normal());
188 program_use_texture(m_texture_program, "color_texture", 0, m_color_texture, 0);
189
190 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
191 }
192
193 if(key_state(' '))
194 {
195 /* montrer le resultat de la passe 1
196 copie le framebuffer sur la fenetre
197 */
198
199 glBindFramebuffer(GL_READ_FRAMEBUFFER, m_framebuffer);
200 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
201 glViewport(0, 0, window_width(), window_height());
202 glClearColor(0, 0, 0, 1);
203 glClear(GL_COLOR_BUFFER_BIT);
204
205 glBlitFramebuffer(
206 0, 0, m_framebuffer_width, m_framebuffer_height, // rectangle origine dans READ_FRAMEBUFFER
207 0, 0, m_framebuffer_width, m_framebuffer_height, // rectangle destination dans DRAW_FRAMEBUFFER
208 GL_COLOR_BUFFER_BIT, GL_LINEAR); // ne copier que la couleur (+ interpoler)
209 }
210 else
211 {
212 /* passe 2 : utiliser la texture du framebuffer
213 */
214
215 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
216 glViewport(0, 0, window_width(), window_height());
217 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
218 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
219
220 // draw "classique"
221 glBindVertexArray(m_vao);
222 glUseProgram(m_texture_program);
223
224 Transform m= m_model;
225 Transform v= m_camera.view();
226 Transform p= m_camera.projection(window_width(), window_height(), 45);
227 Transform mvp= p * v * m;
228 Transform mv= v * m;
229
230 program_uniform(m_texture_program, "mvpMatrix", mvp);
231 program_uniform(m_texture_program, "mvMatrix", mv);
232 program_uniform(m_texture_program, "normalMatrix", mv.normal());
233
234 // utilise la texture attachee au framebuffer
235 program_uniform(m_texture_program, "color_texture", 0); // utilise la texture configuree sur l'unite 0
236
237 // configure l'unite 0
238 glActiveTexture(GL_TEXTURE0);
239 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
240 glBindSampler(0, color_sampler);
241
242 // SOIT :
243 // bloque le filtrage de la texture pour n'utiliser que le mipmap 0
244 //~ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
245
246 // OU :
247 // recalcule les mipmaps de la texture... ils sont necessaires pour afficher le cube texture,
248 // pourquoi ? un draw dans un framebuffer ne modifie que le mipmap 0, pas les autres, donc il faut les recalculer...
249 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, miplevels(m_framebuffer_width, m_framebuffer_height));
250 glGenerateMipmap(GL_TEXTURE_2D);
251
252 // go
253 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
254 }
255
256 return 1;
257 }
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:53
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
int miplevels(const int width, const int height)
renvoie le nombre de mipmap d'une image width x height.
Definition image_io.cpp:537
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_model

Transform TPFramebuffer::m_model
protected

Definition at line 260 of file tuto_framebuffer.cpp.

◆ m_camera

Orbiter TPFramebuffer::m_camera
protected

Definition at line 261 of file tuto_framebuffer.cpp.

◆ m_framebuffer_camera

Orbiter TPFramebuffer::m_framebuffer_camera
protected

Definition at line 262 of file tuto_framebuffer.cpp.

◆ m_vao

GLuint TPFramebuffer::m_vao
protected

Definition at line 264 of file tuto_framebuffer.cpp.

◆ m_buffer

GLuint TPFramebuffer::m_buffer
protected

Definition at line 265 of file tuto_framebuffer.cpp.

◆ m_texture_program

GLuint TPFramebuffer::m_texture_program
protected

Definition at line 266 of file tuto_framebuffer.cpp.

◆ m_vertex_count

int TPFramebuffer::m_vertex_count
protected

Definition at line 267 of file tuto_framebuffer.cpp.

◆ m_color_texture

GLuint TPFramebuffer::m_color_texture
protected

Definition at line 269 of file tuto_framebuffer.cpp.

◆ color_sampler

GLuint TPFramebuffer::color_sampler
protected

Definition at line 270 of file tuto_framebuffer.cpp.

◆ m_color_buffer

GLuint TPFramebuffer::m_color_buffer
protected

Definition at line 272 of file tuto_framebuffer.cpp.

◆ m_depth_buffer

GLuint TPFramebuffer::m_depth_buffer
protected

Definition at line 273 of file tuto_framebuffer.cpp.

◆ m_framebuffer

GLuint TPFramebuffer::m_framebuffer
protected

Definition at line 274 of file tuto_framebuffer.cpp.

◆ m_framebuffer_width

int TPFramebuffer::m_framebuffer_width
protected

Definition at line 275 of file tuto_framebuffer.cpp.

◆ m_framebuffer_height

int TPFramebuffer::m_framebuffer_height
protected

Definition at line 276 of file tuto_framebuffer.cpp.


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