From b802d22dc0b78b0b5142219014fbd3f328ba2900 Mon Sep 17 00:00:00 2001 From: kearwood Date: Tue, 11 Sep 2012 07:23:54 +0000 Subject: [PATCH] Implemented Deferred Point light visualization --HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%4093 --- KREngine/KREngine/Classes/KRCamera.cpp | 3 ++- KREngine/KREngine/Classes/KRCamera.h | 1 + .../KREngine/Classes/KRDirectionalLight.cpp | 1 - KREngine/KREngine/Classes/KREngine.mm | 27 ++++++++++++------- KREngine/KREngine/Classes/KRPointLight.cpp | 21 +++++++++++++-- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/KREngine/KREngine/Classes/KRCamera.cpp b/KREngine/KREngine/Classes/KRCamera.cpp index 6957a20..e9dfd28 100644 --- a/KREngine/KREngine/Classes/KRCamera.cpp +++ b/KREngine/KREngine/Classes/KRCamera.cpp @@ -48,6 +48,7 @@ KRCamera::KRCamera(KRContext &context, GLint width, GLint height) : KRNotified(c bShowShadowBuffer = false; bShowOctree = false; + bShowDeferred = false; bEnablePerPixel = true; bEnableDiffuseMap = true; bEnableNormalMap = true; @@ -416,7 +417,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD glDepthMask(GL_TRUE); - fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i Kbyte\n", (int)m_pContext->getModelManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024); + //fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i Kbyte\n", (int)m_pContext->getModelManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024); } diff --git a/KREngine/KREngine/Classes/KRCamera.h b/KREngine/KREngine/Classes/KRCamera.h index 41cc367..fd34276 100644 --- a/KREngine/KREngine/Classes/KRCamera.h +++ b/KREngine/KREngine/Classes/KRCamera.h @@ -79,6 +79,7 @@ public: bool bDebugSuperShiny; bool bShowShadowBuffer; bool bShowOctree; + bool bShowDeferred; bool bEnableAmbient; bool bEnableDiffuse; bool bEnableSpecular; diff --git a/KREngine/KREngine/Classes/KRDirectionalLight.cpp b/KREngine/KREngine/Classes/KRDirectionalLight.cpp index 3b41a4a..4ef1d6e 100644 --- a/KREngine/KREngine/Classes/KRDirectionalLight.cpp +++ b/KREngine/KREngine/Classes/KRDirectionalLight.cpp @@ -52,7 +52,6 @@ void KRDirectionalLight::render(KRCamera *pCamera, KRContext *pContext, KRBoundi KRLight::render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); - if(renderPass == KRNode::RENDER_PASS_DEFERRED_LIGHTS) { // Lights are rendered on the second pass of the deferred renderer diff --git a/KREngine/KREngine/Classes/KREngine.mm b/KREngine/KREngine/Classes/KREngine.mm index 3af9c1c..46602ef 100644 --- a/KREngine/KREngine/Classes/KREngine.mm +++ b/KREngine/KREngine/Classes/KREngine.mm @@ -90,7 +90,8 @@ double const PI = 3.141592653589793f; @"debug_enable_specular" : @28, @"debug_super_shiny" : @29, @"debug_octree" : @30, - @"enable_deferred_lighting" : @31 + @"debug_deferred" : @31, + @"enable_deferred_lighting" : @32 } copy]; [self loadShaders]; @@ -152,7 +153,7 @@ double const PI = 3.141592653589793f; -(int)getParameterCount { - return 32; + return 33; } -(NSString *)getParameterNameWithIndex: (int)i @@ -162,7 +163,7 @@ double const PI = 3.141592653589793f; -(NSString *)getParameterLabelWithIndex: (int)i { - NSString *parameter_labels[32] = { + NSString *parameter_labels[33] = { @"Camera FOV", @"Shadow Quality (0 - 2)", @"Enable per-pixel lighting", @@ -194,13 +195,14 @@ double const PI = 3.141592653589793f; @"Debug - Enable Specular", @"Debug - Super Shiny", @"Debug - Octree Visualize", + @"Debug - Deferred Lights Visualize", @"Enable Deferred Lighting" }; return parameter_labels[i]; } -(KREngineParameterType)getParameterTypeWithIndex: (int)i { - KREngineParameterType types[32] = { + KREngineParameterType types[33] = { KRENGINE_PARAMETER_FLOAT, KRENGINE_PARAMETER_INT, @@ -233,13 +235,14 @@ double const PI = 3.141592653589793f; KRENGINE_PARAMETER_BOOL, KRENGINE_PARAMETER_BOOL, KRENGINE_PARAMETER_BOOL, + KRENGINE_PARAMETER_BOOL, KRENGINE_PARAMETER_BOOL }; return types[i]; } -(double)getParameterValueWithIndex: (int)i { - double values[32] = { + double values[33] = { _camera->perspective_fov, (double)_camera->m_cShadowBuffers, _camera->bEnablePerPixel ? 1.0f : 0.0f, @@ -271,6 +274,7 @@ double const PI = 3.141592653589793f; _camera->bEnableSpecular ? 1.0f : 0.0f, _camera->bDebugSuperShiny ? 1.0f : 0.0f, _camera->bShowOctree ? 1.0f : 0.0f, + _camera->bShowDeferred ? 1.0f : 0.0f, _camera->bEnableDeferredLighting ? 1.0f : 0.0f }; return values[i]; @@ -418,6 +422,11 @@ double const PI = 3.141592653589793f; } break; case 31: + if(_camera->bShowDeferred != bNewBoolVal) { + _camera->bShowDeferred = bNewBoolVal; + } + break; + case 32: if(_camera->bEnableDeferredLighting != bNewBoolVal) { _camera->bEnableDeferredLighting = bNewBoolVal; } @@ -427,22 +436,22 @@ double const PI = 3.141592653589793f; -(double)getParameterMinWithIndex: (int)i { - double minValues[32] = { + double minValues[33] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f + 0.0f, 0.0f, 0.0f }; return minValues[i]; } -(double)getParameterMaxWithIndex: (int)i { - double maxValues[32] = { + double maxValues[33] = { PI, 3.0f, 1.0f, 1.0, 1.0f, 1.0f, 1.0f, 1.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 2.0f, 1.0f, 1.0f, 1.0f, 5.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, - 1.0f, 1.0f + 1.0f, 1.0f, 1.0f }; return maxValues[i]; diff --git a/KREngine/KREngine/Classes/KRPointLight.cpp b/KREngine/KREngine/Classes/KRPointLight.cpp index 09605b6..bb26383 100644 --- a/KREngine/KREngine/Classes/KRPointLight.cpp +++ b/KREngine/KREngine/Classes/KRPointLight.cpp @@ -41,7 +41,9 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolu KRLight::render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); - if(renderPass == KRNode::RENDER_PASS_DEFERRED_LIGHTS) { + bool bVisualize = renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && pCamera->bShowDeferred; + + if(renderPass == KRNode::RENDER_PASS_DEFERRED_LIGHTS || bVisualize) { // Lights are rendered on the second pass of the deferred renderer KRMat4 projectionMatrix = pCamera->getProjectionMatrix(); @@ -78,8 +80,10 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolu bool bInsideLight = view_light_position.sqrMagnitude() <= (influence_radius + pCamera->perspective_nearz) * (influence_radius + pCamera->perspective_nearz); - KRShader *pShader = pContext->getShaderManager()->getShader(bInsideLight ? "light_point_inside" : "light_point", pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, false, renderPass); + KRShader *pShader = pContext->getShaderManager()->getShader(bVisualize ? "visualize_overlay" : (bInsideLight ? "light_point_inside" : "light_point"), pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, false, renderPass); pShader->bind(pCamera, matModelToView, mvpmatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass); + + glUniform3f( pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_LIGHT_COLOR], m_color.x, @@ -126,6 +130,13 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolu matInvProjection.invert(); glUniformMatrix4fv(pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_INVP], 1, GL_FALSE, matInvProjection.getPointer()); + + if(bVisualize) { + // Enable additive blending + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + } + // Disable z-buffer write glDepthMask(GL_FALSE); @@ -160,6 +171,12 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolu glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); glDrawArrays(GL_TRIANGLES, 0, m_cVertices); } + + if(bVisualize) { + // Enable alpha blending + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } } } }