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 glGenSamplers(1, &color_sampler);
43 glSamplerParameteri(color_sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
44 glSamplerParameteri(color_sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
45 glSamplerParameteri(color_sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
46 glSamplerParameteri(color_sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
49 glGenTextures(1, &m_depth_buffer);
50 glBindTexture(GL_TEXTURE_2D, m_depth_buffer);
52 glTexImage2D(GL_TEXTURE_2D, 0,
53 GL_DEPTH_COMPONENT, m_framebuffer_width, m_framebuffer_height, 0,
54 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
nullptr);
57 glGenFramebuffers(1, &m_framebuffer);
58 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
59 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_color_buffer, 0);
60 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_buffer, 0);
63 GLenum
buffers[]= { GL_COLOR_ATTACHMENT0 };
67 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
75 m_camera.
lookat(pmin, pmax);
76 m_framebuffer_camera.
lookat(pmin, pmax);
80 m_color_texture=
read_texture(0,
"data/debug2x2red.png");
83 glGenVertexArrays(1, &m_vao);
84 glBindVertexArray(m_vao);
87 glGenBuffers(1, &m_buffer);
88 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
91 glBufferData(GL_ARRAY_BUFFER, size,
nullptr, GL_STATIC_DRAW);
96 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
vertex_buffer());
98 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
99 glEnableVertexAttribArray(0);
102 offset= offset + size;
104 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
texcoord_buffer());
106 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
107 glEnableVertexAttribArray(1);
110 offset= offset + size;
112 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
normal_buffer());
114 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
115 glEnableVertexAttribArray(2);
119 glBindVertexArray(0);
120 glBindBuffer(GL_ARRAY_BUFFER, 0);
123 m_texture_program=
read_program(
"tutos/texcoords.glsl");
127 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
130 glDepthFunc(GL_LESS);
131 glEnable(GL_DEPTH_TEST);
139 glDeleteTextures(1, &m_color_buffer);
140 glDeleteTextures(1, &m_depth_buffer);
141 glDeleteFramebuffers(1, &m_framebuffer);
142 glDeleteSamplers(1, &color_sampler);
145 glDeleteTextures(1, &m_color_texture);
146 glDeleteVertexArrays(1, &m_vao);
147 glDeleteBuffers(1, &m_buffer);
151 int update(
const float time,
const float delta )
162 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
163 if(mb & SDL_BUTTON(1))
165 else if(mb & SDL_BUTTON(3))
167 else if(mb & SDL_BUTTON(2))
174 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
175 glViewport(0, 0, m_framebuffer_width, m_framebuffer_height);
176 glClearColor(1, 1, 0, 1);
177 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
180 glBindVertexArray(m_vao);
181 glUseProgram(m_texture_program);
185 Transform p= m_framebuffer_camera.
projection(m_framebuffer_width, m_framebuffer_height, 45);
194 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
203 glBindFramebuffer(GL_READ_FRAMEBUFFER, m_framebuffer);
204 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
206 glClearColor(0, 0, 0, 1);
207 glClear(GL_COLOR_BUFFER_BIT);
210 0, 0, m_framebuffer_width, m_framebuffer_height,
211 0, 0, m_framebuffer_width, m_framebuffer_height,
212 GL_COLOR_BUFFER_BIT, GL_LINEAR);
219 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
221 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
222 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
225 glBindVertexArray(m_vao);
226 glUseProgram(m_texture_program);
242 glActiveTexture(GL_TEXTURE0);
243 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
244 glBindSampler(0, color_sampler);
253 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,
miplevels(m_framebuffer_width, m_framebuffer_height));
254 glGenerateMipmap(GL_TEXTURE_2D);
257 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
270 GLuint m_texture_program;
273 GLuint m_color_texture;
274 GLuint color_sampler;
276 GLuint m_color_buffer;
277 GLuint m_depth_buffer;
278 GLuint m_framebuffer;
279 int m_framebuffer_width;
280 int m_framebuffer_height;
284 int main(
int argc,
char **argv )
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.
int run()
execution de l'application.
representation d'un objet / maillage.
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
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) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2,...
int vertex_count() const
renvoie le nombre de sommets.
void release()
detruit les objets openGL.
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
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.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
void move(const float z)
rapproche / eloigne la camera du centre.
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
void translation(const float x, const float y)
deplace le centre / le point observe.
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Transform view() const
renvoie la transformation vue.
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.
int window_height()
renvoie la hauteur de la fenetre de l'application.
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
int window_width()
renvoie la largeur de la fenetre de l'application.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
GLuint read_program(const char *filename, const char *definitions)
void program_uniform(const GLuint program, const char *uniform, const std::vector< unsigned > &v)
affecte un tableau de valeurs a un uniform du shader program.
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
int release_program(const GLuint program)
detruit les shaders et le program.
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,...
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
int miplevels(const int width, const int height)
renvoie le nombre de mipmap d'une image width x height.
MeshBuffer buffers(const MeshData &data)
construction a partir des donnees d'un maillage.
representation d'un point 3d.