26 m_framebuffer_width= 512;
27 m_framebuffer_height= 512;
30 glGenTextures(1, &m_color_buffer);
31 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
33 glTexImage2D(GL_TEXTURE_2D, 0,
34 GL_RGBA, m_framebuffer_width, m_framebuffer_height, 0,
35 GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
38 glGenerateMipmap(GL_TEXTURE_2D);
41 glGenTextures(1, &m_depth_buffer);
42 glBindTexture(GL_TEXTURE_2D, m_depth_buffer);
44 glTexImage2D(GL_TEXTURE_2D, 0,
45 GL_DEPTH_COMPONENT, m_framebuffer_width, m_framebuffer_height, 0,
46 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
nullptr);
49 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
52 glGenFramebuffers(1, &m_framebuffer);
53 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
54 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_color_buffer, 0);
55 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_buffer, 0);
57 GLenum buffers[]= { GL_COLOR_ATTACHMENT0 };
58 glDrawBuffers(1, buffers);
61 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
69 m_camera.
lookat(pmin, pmax);
70 m_framebuffer_camera.
lookat(pmin, pmax);
74 m_color_texture=
read_texture(0,
"data/debug2x2red.png");
77 glGenVertexArrays(1, &m_vao);
78 glBindVertexArray(m_vao);
81 glGenBuffers(1, &m_buffer);
82 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
85 glBufferData(GL_ARRAY_BUFFER, size,
nullptr, GL_STATIC_DRAW);
90 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
vertex_buffer());
92 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
93 glEnableVertexAttribArray(0);
96 offset= offset + size;
100 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
101 glEnableVertexAttribArray(1);
104 offset= offset + size;
106 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
normal_buffer());
108 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
109 glEnableVertexAttribArray(2);
113 glBindVertexArray(0);
114 glBindBuffer(GL_ARRAY_BUFFER, 0);
117 m_texture_program=
read_program(
"tutos/texcoords.glsl");
121 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
124 glDepthFunc(GL_LESS);
125 glEnable(GL_DEPTH_TEST);
133 glDeleteTextures(1, &m_color_buffer);
134 glDeleteTextures(1, &m_depth_buffer);
135 glDeleteFramebuffers(1, &m_framebuffer);
138 glDeleteTextures(1, &m_color_texture);
139 glDeleteVertexArrays(1, &m_vao);
140 glDeleteBuffers(1, &m_buffer);
144 int update(
const float time,
const float delta )
153 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
157 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
158 if(mb & SDL_BUTTON(1))
160 else if(mb & SDL_BUTTON(3))
162 else if(mb & SDL_BUTTON(2))
169 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
170 glViewport(0, 0, m_framebuffer_width, m_framebuffer_height);
171 glClearColor(1, 1, 0, 1);
172 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
175 glBindVertexArray(m_vao);
176 glUseProgram(m_texture_program);
180 Transform p= m_framebuffer_camera.
projection(m_framebuffer_width, m_framebuffer_height, 45);
189 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
198 glBindFramebuffer(GL_READ_FRAMEBUFFER, m_framebuffer);
199 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
201 glClearColor(0, 0, 0, 1);
202 glClear(GL_COLOR_BUFFER_BIT);
204 glBlitFramebuffer(0, 0, m_framebuffer_width, m_framebuffer_height,
205 0, 0, m_framebuffer_width, m_framebuffer_height,
206 GL_COLOR_BUFFER_BIT, GL_LINEAR);
213 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
215 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
216 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
219 glBindVertexArray(m_vao);
220 glUseProgram(m_texture_program);
235 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
238 glGenerateMipmap(GL_TEXTURE_2D);
240 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
253 GLuint m_texture_program;
255 GLuint m_color_texture;
257 GLuint m_color_buffer;
258 GLuint m_depth_buffer;
259 GLuint m_framebuffer;
260 int m_framebuffer_width;
261 int m_framebuffer_height;
265 int main(
int argc,
char **argv )
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3...
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL...
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
int render()
a deriver pour afficher les objets.
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
representation d'un objet / maillage.
void move(const float z)
rapproche / eloigne la camera du centre.
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
int run()
execution de l'application.
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2...
void program_uniform(const GLuint program, const char *uniform, const unsigned int v)
affecte une valeur a un uniform du shader program. uint.
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 filtrages...
Transform view() const
renvoie la transformation vue.
int window_width()
renvoie la largeur de la fenetre de l'application.
int quit()
a deriver pour detruire les objets openGL.
void release()
detruit les objets openGL.
Transform projection(const float width, const float height, const float fov) const
renvoie la projection reglee pour une image d'aspect width / height, et une ouverture de fov degres...
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
App(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
GLuint read_program(const char *filename, const char *definitions)
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
void translation(const float x, const float y)
deplace le centre / le point observe.
int init()
a deriver pour creer les objets openGL.
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
int window_height()
renvoie la hauteur de la fenetre de l'application.
int release_program(const GLuint program)
detruit les shaders et le program.
representation d'un point 3d.
int vertex_count() const
renvoie le nombre de sommets.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).