I'm trying to use an orthographic camera, and it makes the FBO repeat itself on the screen. Any ideas on how to go about fixing this? I will eventually be making an orthographic camera using raw matrices.
![](https://uploads.gamedev.net/forums/monthly_2020_04/72db9db83d494293962059f34bdfc1e4.error.png)
void display_func(void)
{
glClearColor(1, 0.5f, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_BLEND);
const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
static const GLfloat one = 1.0f;
static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
//glViewport(0, 0, win_x, win_y);
glBindFramebuffer(GL_FRAMEBUFFER, render_fbo);
glEnable(GL_DEPTH_TEST);
glClearBufferfv(GL_COLOR, 0, black);
glClearBufferfv(GL_COLOR, 1, black);
glClearBufferfv(GL_DEPTH, 0, &one);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, points_buffer);
glUseProgram(render.get_program());
main_camera.calculate_camera_matrices(win_x, win_y);
glUniformMatrix4fv(uniforms.render.proj_matrix, 1, GL_FALSE, main_camera.projection_mat);
glUniformMatrix4fv(uniforms.render.mv_matrix, 1, GL_FALSE, main_camera.view_mat);
glUniform1f(uniforms.render.shading_level, show_shading ? (show_ao ? 0.7f : 1.0f) : 0.0f);
if (draw_axis_checkbox->get_int_val())
{
// ...
}
if (STATE_FINISHED == jsm.get_state() && jsm.vertex_data.size() > 0)
{
// ...
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(ssao.get_program());
glUniform1f(uniforms.ssao.ssao_radius, ssao_radius * float(win_x) / 1000.0f);
glUniform1f(uniforms.ssao.ssao_level, show_ao ? (show_shading ? 0.3f : 1.0f) : 0.0f);
glUniform1i(uniforms.ssao.weight_by_angle, weight_by_angle ? 1 : 0);
glUniform1i(uniforms.ssao.randomize_points, randomize_points ? 1 : 0);
glUniform1ui(uniforms.ssao.point_count, point_count);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo_textures[0]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, fbo_textures[1]);
monochrome_image img = mimgs[64];
// set up ortho camera
// draw textured quad
GLuint text_tex = 0;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &text_tex);
//glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, text_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, font.width, font.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &font.Pixels[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, text_tex);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1, 0);
glVertex2f(1, 0);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glTexCoord2f(0, 1);
glVertex2f(0, 1);
glEnd();
glPopMatrix();
glDisable(GL_DEPTH_TEST);
glBindVertexArray(quad_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
if (draw_console_checkbox->get_int_val() && log_system.get_contents_size() > 0)
{
// ..
}
glutSwapBuffers();
}