28 m_framebuffer_width= 512;
29 m_framebuffer_height= 512;
32 glGenTextures(1, &m_color_buffer);
33 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
35 glTexImage2D(GL_TEXTURE_2D, 0,
36 GL_RGBA, m_framebuffer_width, m_framebuffer_height, 0,
37 GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
40 glGenerateMipmap(GL_TEXTURE_2D);
43 glGenSamplers(1, &color_sampler);
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);
51 glGenTextures(1, &m_depth_buffer);
52 glBindTexture(GL_TEXTURE_2D, m_depth_buffer);
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);
59 glGenFramebuffers(1, &m_framebuffer);
60 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer);
61 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_color_buffer, 0);
62 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_buffer, 0);
65 GLenum buffers[]= { GL_COLOR_ATTACHMENT0 };
66 glDrawBuffers(1, buffers);
69 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
73 if(mesh.vertex_count() == 0)
77 mesh.bounds(pmin, pmax);
78 m_camera.lookat(pmin, pmax);
79 m_framebuffer_camera.lookat(pmin, pmax);
81 m_vertex_count= mesh.vertex_count();
83 m_color_texture=
read_texture(0,
"data/debug2x2red.png");
86 glGenVertexArrays(1, &m_vao);
87 glBindVertexArray(m_vao);
90 glGenBuffers(1, &m_buffer);
91 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
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);
98 size= mesh.vertex_buffer_size();
99 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.vertex_buffer());
101 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
102 glEnableVertexAttribArray(0);
105 offset= offset + size;
106 size= mesh.texcoord_buffer_size();
107 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.texcoord_buffer());
109 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
110 glEnableVertexAttribArray(1);
113 offset= offset + size;
114 size= mesh.normal_buffer_size();
115 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.normal_buffer());
117 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
118 glEnableVertexAttribArray(2);
122 glBindVertexArray(0);
123 glBindBuffer(GL_ARRAY_BUFFER, 0);
126 m_texture_program=
read_program(
"gkit2_tutos/texcoords.glsl");
130 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
133 glDepthFunc(GL_LESS);
134 glEnable(GL_DEPTH_TEST);
164 update_camera( m_camera );
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);
176 glBindVertexArray(m_vao);
177 glUseProgram(m_texture_program);
180 Transform v= m_framebuffer_camera.view();
181 Transform p= m_framebuffer_camera.projection(m_framebuffer_width, m_framebuffer_height, 45);
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());
190 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);
199 glBindFramebuffer(GL_READ_FRAMEBUFFER, m_framebuffer);
200 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
202 glClearColor(0, 0, 0, 1);
203 glClear(GL_COLOR_BUFFER_BIT);
206 0, 0, m_framebuffer_width, m_framebuffer_height,
207 0, 0, m_framebuffer_width, m_framebuffer_height,
208 GL_COLOR_BUFFER_BIT, GL_LINEAR);
215 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
217 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
218 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
221 glBindVertexArray(m_vao);
222 glUseProgram(m_texture_program);
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());
235 program_uniform(m_texture_program,
"color_texture", 0);
238 glActiveTexture(GL_TEXTURE0);
239 glBindTexture(GL_TEXTURE_2D, m_color_buffer);
240 glBindSampler(0, color_sampler);
249 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,
miplevels(m_framebuffer_width, m_framebuffer_height));
250 glGenerateMipmap(GL_TEXTURE_2D);
253 glDrawArrays(GL_TRIANGLES, 0, m_vertex_count);