void FeatureDemo::onFrameRender() { beginTestFrame(); if (mpSceneRenderer) { beginFrame(); { PROFILE(updateScene); mpSceneRenderer->update(mCurrentTime); } depthPass(); shadowPass(); mpState->setFbo(mpMainFbo); renderSkyBox(); lightingPass(); antiAliasing(); postProcess(); ambientOcclusion(); endFrame(); } else { mpRenderContext->clearFbo(mpDefaultFBO.get(), vec4(0.2f, 0.4f, 0.5f, 1), 1, 0); } endTestFrame(); }
void render() { static const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 1.0f }; static const GLfloat ones[] = { 1.0f }; static const GLfloat green[] = { 0.0f, 0.8f, 0.0f, 1.0f }; glBindFramebuffer(GL_FRAMEBUFFER, fbo); glClearBufferfv(GL_COLOR, 0, black); glClearBufferfv(GL_DEPTH, 0, ones); shadowPass(); glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearBufferfv(GL_COLOR, 0, green); glClearBufferfv(GL_DEPTH, 0, ones); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glEnable(GL_DEPTH_TEST); //glDepthFunc(GL_LEQUAL); float x = (float)rand() / (float)(RAND_MAX); const GLfloat col[] = { x, 0.f, 0.0f, 1.0f }; //glPolygonMode(GL_FRONT_AND_BACK, renderMode_); //RenderManager.render(); //shadowPass(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// shaderShadow_.bind(); shaderShadow_.shadowTex_ = &renderTex_; shaderShadow_.eyePos_ = camera_.getPos(); shaderShadow_.setMatrices(perspective_.getPerspectiveTransform(), camera_.getCameraTranslationTransform(), camera_.getCameraCoordinateTransform() ); shaderShadow_.lightMatrix_ = perspective_.getPerspectiveTransform() * cameraShadow_.getCameraCoordinateTransform() * cameraShadow_.getCameraTranslationTransform(); //shaderShadow_.lightMatrix_ = perspective_.getPerspectiveTransform() * cameraShadow_.getCameraTranslationTransform() * cameraShadow_.getCameraCoordinateTransform(); //shaderShadow_.lightMatrix_.setIdentity(); //shaderShadow_.setTransform(room_.transform_.getMatrix()); //shaderShadow_.bindMaterial(room_.material_); //shaderShadow_.updateUniforms(); //room_.render(); shaderShadow_.setTransform(wall_.transform_.getMatrix()); shaderShadow_.bindMaterial(wall_.material_); shaderShadow_.updateUniforms(); wall_.render(); shaderShadow_.setTransform(wall2_.transform_.getMatrix()); shaderShadow_.bindMaterial(wall2_.material_); shaderShadow_.updateUniforms(); wall2_.render(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// shaderShadow_.setTransform(quad_.transform_.getMatrix()); shaderShadow_.bindMaterial(quad_.material_); shaderShadow_.updateUniforms(); quad_.render(); glActiveTexture(GL_TEXTURE0); #ifndef _MSC_VER struct timeval start, end; long mtime, seconds, useconds; gettimeofday(&start, NULL); #endif SDL_GL_SwapWindow(window); #ifndef _MSC_VER gettimeofday(&end, NULL); seconds = end.tv_sec - start.tv_sec; useconds = end.tv_usec - start.tv_usec; mtime = ((seconds)* 1000 + useconds / 1000.0) + 0.5; #endif frame++; }
int main(int argc, char * argv[]) { char path[256]; engine = new Engine(argc, argv); ShaderProgram* defergbufferShader = new ShaderProgram(); FBO g_buffer(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT), 1); FBO shadow_buffer(2000, 2000, 1); GET_SHADER_VISBUFFER_PATH(path, 256, "defergbuffer.vert"); if (!defergbufferShader->AddVertexShaderPath(path)) return 0; GET_SHADER_VISBUFFER_PATH(path, 256, "defergbuffer.frag"); if (!defergbufferShader->AddFragmentShaderPath(path)) return 0; if (!defergbufferShader->Link()) return 0; defergbufferShader->SetAttribVertex("vertex_coord"); defergbufferShader->SetAttribNormal("normal_coord"); ShaderProgram* shadowMapShader = new ShaderProgram(); GET_SHADER_VISBUFFER_PATH(path, 256, "shadow.vert"); if (!shadowMapShader->AddVertexShaderPath(path)) return 0; GET_SHADER_VISBUFFER_PATH(path, 256, "shadow.frag"); if (!shadowMapShader->AddFragmentShaderPath(path)) return 0; if (!shadowMapShader->Link()) return 0; shadowMapShader->SetAttribVertex("vertex"); ShaderProgram* shadowRenderShader = new ShaderProgram(); GET_SHADER_VISBUFFER_PATH(path, 256, "shadowRender.vert"); if (!shadowRenderShader->AddVertexShaderPath(path)) return 0; GET_SHADER_VISBUFFER_PATH(path, 256, "shadowRender.frag"); if (!shadowRenderShader->AddFragmentShaderPath(path)) return 0; if (!shadowRenderShader->Link()) return 0; shadowRenderShader->SetAttribVertex("vertex"); shadowRenderShader->SetAttribTexture("texture_coordinate"); // --------------SHADER LOADING-------------------------- GET_MODEL_PATH(path, 256, "bunny_smooth.ply"); Mesh bunny1, bunny2, bunny3; Mesh shadowBunny1, shadowBunny2, shadowBunny3; Mesh square1, square2, square3, square4, square5, square6; Mesh shadowSquare1, shadowSquare2, shadowSquare3, shadowSquare4, shadowSquare5, shadowSquare6; bunny1.Load(path); bunny2.Load(path); bunny3.Load(path); shadowBunny1.Load(path); shadowBunny2.Load(path); shadowBunny3.Load(path); square1.LoadSquare(); square2.LoadSquare(); square3.LoadSquare(); square4.LoadSquare(); square5.LoadSquare(); square6.LoadSquare(); shadowSquare1.LoadSquare(); shadowSquare2.LoadSquare(); shadowSquare3.LoadSquare(); shadowSquare4.LoadSquare(); shadowSquare5.LoadSquare(); shadowSquare6.LoadSquare(); GET_MODEL_PATH(path, 256, "sphere.ply"); Mesh Light1, Light2, Light3; Light1.Load(path); Light2.Load(path); Light3.Load(path); Mesh AmbientFSQ; AmbientFSQ.LoadSquare(); Mesh ShadowRenderFSQ; ShadowRenderFSQ.LoadSquare(); Mesh DeferredBRDFFSQ; DeferredBRDFFSQ.LoadSquare(); // ---------------MODEL LOADING-------------------------- Scene bunnyScene; bunnyScene.addObject(&bunny1); bunnyScene.addObject(&bunny2); bunnyScene.addObject(&bunny3); bunnyScene.addObject(&Light1); bunnyScene.addObject(&Light2); bunnyScene.addObject(&Light3); bunnyScene.addObject(&square1); bunnyScene.addObject(&square2); bunnyScene.addObject(&square3); bunnyScene.addObject(&square4); bunnyScene.addObject(&square5); bunnyScene.addObject(&square6); Scene ambientScene; ambientScene.addObject(&AmbientFSQ); Scene shadowMapScene; shadowMapScene.addObject(&shadowBunny1); shadowMapScene.addObject(&shadowBunny2); shadowMapScene.addObject(&shadowBunny3); shadowMapScene.addObject(&shadowSquare1); shadowMapScene.addObject(&shadowSquare2); shadowMapScene.addObject(&shadowSquare3); shadowMapScene.addObject(&shadowSquare4); shadowMapScene.addObject(&shadowSquare5); shadowMapScene.addObject(&shadowSquare6); Scene shadowRenderScene; shadowRenderScene.addObject(&ShadowRenderFSQ); Scene deferredBRDFScene; deferredBRDFScene.addObject(&DeferredBRDFFSQ); // --------------SCENE LOADING -------------------------- Pass gbufferPass(defergbufferShader, &bunnyScene); Pass shadowPass(shadowMapShader, &shadowMapScene); Pass shadowRenderPass(shadowRenderShader, &shadowRenderScene); gbufferPass.BindAttribNormal(); gbufferPass.BindAttribVertex(); shadowPass.BindAttribVertex(); shadowRenderPass.BindAttribVertex(); shadowRenderPass.BindAttribTexture(); // --------------- BIND ATTRIBUTES --------------------- gbufferPass.BindUniformMatrix4("ViewMatrix", &ViewMatrixPtr); gbufferPass.BindUniformMatrix4("ProjectionMatrix", &ProjectionMatrixPtr); shadowPass.BindUniformMatrix4("ViewMatrix", &Light1ViewMatrixPtr); shadowPass.BindUniformMatrix4("ProjectionMatrix", &ProjectionMatrixPtr); shadowRenderPass.BindUniformMatrix4("shadowMatrix", &Light1ShadowMatrixPtr); shadowRenderPass.BindUniformVec3("lightPos", &Light1PosPtr); shadowRenderPass.BindUniformVec3("eyePos", &EyePosPtr); shadowRenderPass.BindUniformVec3("lightValue", &Light1DiffusePtr); // ------------- BIND PASS-WISE UNIFORMS--------------- gbufferPass.MeshBindUniformMatrix4(&bunny1, "ModelMatrix", &Bunny1ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&bunny1, "NormalMatrix", &Bunny1NormalMatrixPtr); shadowRenderPass.MeshBindUniformVec3(&bunny1, "diffuse", &Bunny1DiffusePtr); shadowRenderPass.MeshBindUniformVec3(&bunny1, "specular", &Bunny1SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&bunny2, "ModelMatrix", &Bunny2ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&bunny2, "NormalMatrix", &Bunny2NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&bunny2, "diffuse", &Bunny2DiffusePtr); gbufferPass.MeshBindUniformVec3(&bunny2, "specular", &Bunny2SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&bunny3, "ModelMatrix", &Bunny3ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&bunny3, "NormalMatrix", &Bunny3NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&bunny3, "diffuse", &Bunny3DiffusePtr); gbufferPass.MeshBindUniformVec3(&bunny3, "specular", &Bunny3SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&Light1, "ModelMatrix", &Light1ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&Light1, "NormalMatrix", &Light1NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&Light1, "diffuse", &Light1DiffusePtr); gbufferPass.MeshBindUniformVec3(&Light1, "specular", &Light1SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&Light2, "ModelMatrix", &Light2ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&Light2, "NormalMatrix", &Light2NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&Light2, "diffuse", &Light2DiffusePtr); gbufferPass.MeshBindUniformVec3(&Light2, "specular", &Light2SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&Light3, "ModelMatrix", &Light3ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&Light3, "NormalMatrix", &Light3NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&Light3, "diffuse", &Light3DiffusePtr); gbufferPass.MeshBindUniformVec3(&Light3, "specular", &Light3SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square1, "ModelMatrix", &Square1ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square1, "NormalMatrix", &Square1NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square1, "diffuse", &Square1DiffusePtr); gbufferPass.MeshBindUniformVec3(&square1, "specular", &Square1SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square2, "ModelMatrix", &Square2ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square2, "NormalMatrix", &Square2NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square2, "diffuse", &Square2DiffusePtr); gbufferPass.MeshBindUniformVec3(&square2, "specular", &Square2SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square3, "ModelMatrix", &Square3ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square3, "NormalMatrix", &Square3NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square3, "diffuse", &Square3DiffusePtr); gbufferPass.MeshBindUniformVec3(&square3, "specular", &Square3SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square4, "ModelMatrix", &Square4ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square4, "NormalMatrix", &Square4NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square4, "diffuse", &Square4DiffusePtr); gbufferPass.MeshBindUniformVec3(&square4, "specular", &Square4SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square5, "ModelMatrix", &Square5ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square5, "NormalMatrix", &Square5NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square5, "diffuse", &Square5DiffusePtr); gbufferPass.MeshBindUniformVec3(&square5, "specular", &Square5SpecularPtr); gbufferPass.MeshBindUniformMatrix4(&square6, "ModelMatrix", &Square6ModelMatrixPtr); gbufferPass.MeshBindUniformMatrix4(&square6, "NormalMatrix", &Square6NormalMatrixPtr); gbufferPass.MeshBindUniformVec3(&square6, "diffuse", &Square6DiffusePtr); gbufferPass.MeshBindUniformVec3(&square6, "specular", &Square6SpecularPtr); shadowPass.MeshBindUniformMatrix4(&shadowBunny1, "ModelMatrix", &Bunny1ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowBunny2, "ModelMatrix", &Bunny2ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowBunny3, "ModelMatrix", &Bunny3ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare1, "ModelMatrix", &Square1ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare2, "ModelMatrix", &Square2ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare3, "ModelMatrix", &Square3ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare4, "ModelMatrix", &Square4ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare5, "ModelMatrix", &Square5ModelMatrixPtr); shadowPass.MeshBindUniformMatrix4(&shadowSquare6, "ModelMatrix", &Square6ModelMatrixPtr); // ------------BIND MESH-WISE UNIFORMS---------------- gbufferPass.SetTarget(&g_buffer); shadowPass.SetTarget(&shadow_buffer); Texture* visibilityTex = g_buffer.GetTexture(0); Texture* shadowTex = shadow_buffer.GetTexture(0); shadowRenderPass.BindTexture("visibilityTexture", visibilityTex); shadowRenderPass.BindTexture("shadowTexture", shadowTex); gbufferPass.SetBlend(false); gbufferPass.SetDepthTest(true); gbufferPass.SetClear(true); shadowPass.SetBlend(false); shadowPass.SetDepthTest(true); shadowPass.SetClear(true); shadowRenderPass.SetBlend(true); shadowRenderPass.SetDepthTest(false); shadowRenderPass.SetClear(false); // ---------------PASS CONFIG -------------------------- engine->addPass(&gbufferPass); engine->addPass(&shadowPass); engine->addPass(&shadowRenderPass); // ----------------ENGINE------------------------------ #ifdef _WIN32 glutMouseWheelFunc(mouseWheel); #endif glutDisplayFunc(Draw); glutMouseFunc(mouseClick); glutMotionFunc(mouseMove); glutKeyboardUpFunc(keyboardPress); glutMainLoop(); return 0; }