I need help rendering an inverted scene in a framebuffer. I want to make a mirror effect. What I got as a result:
Frame buffer initialization:
GLuint FramebufferName = 0; glGenFramebuffers(1, &FramebufferName); glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); GLuint renderedTexture; glGenTextures(1, &renderedTexture); glBindTexture(GL_TEXTURE_2D, renderedTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0); glDrawBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_NONE);
Draw the scene into the frame buffer:
mView = camera.getViewMatrix(); mProjection = perspective(45.0f, 4.0f / 3.0f, 0.1f, 300.0f) * scale(mat4(1.0f), vec3(1.0f, -1.0f, 1.0f)); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName); glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCullFace(GL_FRONT); glEnable(GL_CULL_FACE); mWorld = rotate(mWorld, -15.0f, vec3(1, 0, 0)); mWorld = rotate(mWorld, -30.0f, vec3(0, 1, 0)); cubemap.Draw(mView, mProjection, mWorld); glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glUseProgram(program); mWorld = translate(mat4(1.0f), vec3(0, -10, 0)); glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); cannon.Draw(program); mWorld = mat4(1.0f); mWorld = translate(mat4(1.0f), vec3(50, -10, 0)); mWorld = rotate(mWorld, 90.0f, vec3(0, 1, 0)); glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); cannon.Draw(program); mWorld = mat4(1.0f); mWorld = translate(mat4(1.0f), vec3(0, -10, 50)); mWorld = rotate(mWorld, 140.0f, vec3(0, 1, 0)); glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); cannon.Draw(program); glDisable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, 0);
I looked through several tutorials that use glScalef (1.0, -1.0, 1.0) to invert a scene. glScalef was used in older versions of opengl. How can I invert the scene in new versions of opengl? I multiplied the projection matrix by scale (mat4 (1.0f), vec3 (1.0, -1.0, 1.0)) for this effect. Right?