void BaseApp::BlurHDR() { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_frameBuffer); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHDR.GetID(), 0); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_depthRenderBufferHDR); glViewport(0, 0, m_width / 1, m_height / 1); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glBindTexture(GL_TEXTURE_2D, g_texFP16.GetID()); m_shdHDR->enable(); RenderScreenCoveringQuad(); m_shdHDR->disable(); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBufferBlurdHDR); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHBluredHDR.GetID(), 0); glViewport(0, 0, m_width / 4, m_height / 4); m_shdBlur->enable(); g_texHDR.Activate(0); m_shdBlur->sendUniform2f("blur_offset", blurOffset, 0.0f); RenderScreenCoveringQuad(); g_texHDR.Deactivate(); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texVBluredHDR.GetID(), 0); g_texHBluredHDR.Activate(0); m_shdBlur->sendUniform2f("blur_offset", blurOffset/2.0f, 0.0f); RenderScreenCoveringQuad(); g_texHBluredHDR.Deactivate(); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHBluredHDR.GetID(), 0); g_texVBluredHDR.Activate(0); m_shdBlur->sendUniform2f("blur_offset", 0.0f, blurOffset); RenderScreenCoveringQuad(); g_texVBluredHDR.Deactivate(); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texVBluredHDR.GetID(), 0); g_texHBluredHDR.Activate(0); m_shdBlur->sendUniform2f("blur_offset", 0.0f, blurOffset/2.0f); RenderScreenCoveringQuad(); g_texHBluredHDR.Deactivate(); m_shdBlur->disable(); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); glViewport(0, 0, m_width, m_height); }
void BaseApp::RenderFrame() { m_fpsCounter.MarkFrameStart(); POINT mousePos; GetCursorPos(&mousePos); m_mouseX = mousePos.x - m_winPosX; m_mouseY = mousePos.y - m_winPosY; if(lockMouse) { m_camera.SetViewByMouse( float(m_mouseLockedX - m_mouseX) * 0.2f , float(m_mouseLockedY - m_mouseY) * 0.2f); CenterMouse(); } float height = g_heightMap->GetInterpolatedHeight(m_camera.m_vEye.x, m_camera.m_vEye.z); //if( m_camera.m_vEye.y <= height + 2.0f ) { float oldY = m_camera.m_vEye.y; m_camera.m_vEye.y = height + 12.0f; float newY = m_camera.m_vEye.y; m_camera.m_vCenter.y += newY - oldY; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_frameBuffer); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texFP16.GetID(), 0); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBuffer[0]); glClearColor(0.8f, 1.0f, 0.8f, 1.0f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); m_camera.BuildViewMatrix(&modelViewMat); glLoadMatrixf(modelViewMat); if(!m_freezeFrustum) frustum.ComputeFrustum(projMat, modelViewMat); glPushMatrix(); glTranslatef(m_camera.m_vEye.x, m_camera.m_vEye.y, m_camera.m_vEye.z); glDepthMask(GL_FALSE); m_shdSky->enable(); m_shdSky->sendUniform3f("color1", 2.0f, 2.0f, 2.0f); m_shdSky->sendUniform3f("color2", 0.5f, 0.7f, 2.0f); m_skydome.Render(); m_shdSky->disable(); //glDepthMask(GL_TRUE); glPopMatrix(); Vec3 sunPos = m_sunPos * 500.0f; glPopMatrix(); glPushMatrix(); glTranslatef(m_camera.m_vEye.x + sunPos.x, m_camera.m_vEye.y + sunPos.y, m_camera.m_vEye.z + sunPos.z); m_texSun.Activate(0); m_shdSimpleColor->enable(); m_shdSimpleColor->sendUniform3f("color", 4.0f, 4.0f, 2.0f); glEnable(GL_BLEND ); glBlendFunc(GL_SRC_COLOR, GL_ONE); RenderSprite(2000, &m_camera.m_vEye, modelViewMat); glDisable(GL_BLEND ); m_shdSimpleColor->disable(); m_texSun.Deactivate(); glDepthMask(GL_TRUE); glPopMatrix(); g_quadtree->Render(frustum, m_camera.m_vEye); /* glAlphaFunc(GL_GREATER,0.5f); glEnable(GL_ALPHA_TEST); Mat4 tmp; tmp.Identity(); tmp.Translate(Vec3(0.0f, g_heightMap->GetInterpolatedHeight(0.0f, 0.0f), 0.0f)); model.render(tmp, &frustum); tmp.Identity(); tmp.Translate(Vec3(50.0f, g_heightMap->GetInterpolatedHeight(50.0f, 0.0f), 0.0f)); model.render(tmp, &frustum); tmp.Identity(); tmp.Translate(Vec3(0.0f, g_heightMap->GetInterpolatedHeight(0.0f, 100.0f), 100.0f)); model.render(tmp, &frustum); tmp.Identity(); tmp.Translate(Vec3(-50.0f, g_heightMap->GetInterpolatedHeight(-50.0f, -200.0f), -200.0f)); model.render(tmp, &frustum); glDisable(GL_ALPHA_TEST); */ RenderWaterReflection(); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texFP16.GetID(), 0); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBuffer[0]); g_texFP162.Bind(0); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,0, 0, m_width, m_height); RenderWater(); RenderWaterSpecular(); RenderUnderwaterNormalMap(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // No wireframe glPushAttrib(GL_POLYGON_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); if(m_camera.m_vEye.y < 0) { m_shdUnderwater->enable(); m_shdUnderwater->sendUniform1i("g_texViewport", 0); m_shdUnderwater->sendUniform1i("g_texNormalMap", 1); LARGE_INTEGER time; QueryPerformanceCounter(&time); m_shdUnderwater->sendUniform1f("g_waterTranslation", float(time.QuadPart) * 0.000000008f); g_texWaterReflect.Bind(1); } g_texFP16.Activate(0); RenderScreenCoveringQuad(); g_texFP16.Deactivate(); /* g_texWaterReflect.Activate(0); RenderScreenCoveringQuad(); g_texWaterReflect.Deactivate(); */ if(m_camera.m_vEye.y < 0) { m_shdUnderwater->disable(); } BlurHDR(); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); g_texVBluredHDR.Activate(0); RenderScreenCoveringQuad(); g_texVBluredHDR.Deactivate(); glDisable(GL_BLEND); m_pGui->SetViewportDim(m_width, m_height); m_pGui->Render(m_mouseX, m_mouseY, this->m_mouseButton); m_pFont->Enable(m_width, m_height); m_pFont->SetAlignment(FONT_HORIZ_ALIGN_RIGHT, FONT_VERT_ALIGN_TOP); m_pFont->Print(m_width - 10, 10, "FPS: %d", (int)m_fpsCounter.GetFPS() ); m_pFont->Print(m_width - 10, 30, "Camera eye: %f, %f, %f", m_camera.m_vEye.x, m_camera.m_vEye.y, m_camera.m_vEye.z); m_pFont->Print(m_width - 10, 50, "Camera center: %f, %f, %f", m_camera.m_vCenter.x, m_camera.m_vCenter.y, m_camera.m_vCenter.z); m_pFont->Print(m_width - 10, 70, "Triangles rendered: %d", g_quadtree->GetNumTrisLastRendered()); m_pFont->Print(m_width - 10, 90, "VBOs data size: %d bytes", g_quadtree->m_vboDataSize); //m_pFont->Print(m_width - 10, 110, "Mouse coords: (%d, %d)", m_mouseX, m_mouseY); m_pFont->Disable(); /* RenderTexDebug(3, 3, 2, g_texVBluredHDR.GetID(), "Blured HDR"); RenderTexDebug(2, 3, 2, g_texHDR.GetID(), "HDR"); RenderTexDebug(1, 3, 2, g_texFP16.GetID(), "Water refraction"); RenderTexDebug(0, 3, 2, g_texWaterReflect.GetID(), "Water reflection"); */ glPopAttrib(); SwapBuffers(m_hDC); m_fpsCounter.MarkFrameEnd(); }