From d5c66f6b6736d7c6f90cdb2b26b0a3914a3316f0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 16:07:12 -0700 Subject: [PATCH] Default to diffuse/add mode, fix for interacting with ambient occlusion. Unfortunately, I managed to break the diffusion somehow. --- .../src/renderer/AmbientOcclusionEffect.cpp | 10 +++---- interface/src/renderer/GlowEffect.cpp | 29 +++++++++++++++++-- interface/src/renderer/GlowEffect.h | 6 ++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index ff86615b26..36b4dc2b3b 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -95,9 +95,9 @@ void AmbientOcclusionEffect::render() { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _rotationTextureID); - // render with the occlusion shader to the secondary buffer - QOpenGLFramebufferObject* secondaryFBO = Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(); - secondaryFBO->bind(); + // render with the occlusion shader to the secondary/tertiary buffer + QOpenGLFramebufferObject* freeFBO = Application::getInstance()->getGlowEffect()->getFreeFramebufferObject(); + freeFBO->bind(); float left, right, bottom, top, nearVal, farVal; glm::vec4 nearClipPlane, farClipPlane; @@ -117,7 +117,7 @@ void AmbientOcclusionEffect::render() { _occlusionProgram->release(); - secondaryFBO->release(); + freeFBO->release(); glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE0); @@ -128,7 +128,7 @@ void AmbientOcclusionEffect::render() { glEnable(GL_BLEND); glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); - glBindTexture(GL_TEXTURE_2D, secondaryFBO->texture()); + glBindTexture(GL_TEXTURE_2D, freeFBO->texture()); _blurProgram->bind(); diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index 85c4eb27b2..762ecd1271 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -15,7 +15,13 @@ #include "ProgramObject.h" #include "RenderUtil.h" -GlowEffect::GlowEffect() : _renderMode(BLUR_ADD_MODE) { +GlowEffect::GlowEffect() : _renderMode(DIFFUSE_ADD_MODE) { +} + +QOpenGLFramebufferObject* GlowEffect::getFreeFramebufferObject() const { + return (_renderMode == DIFFUSE_ADD_MODE && _isOddFrame) ? + Application::getInstance()->getTextureCache()->getTertiaryFramebufferObject() : + Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(); } static ProgramObject* createProgram(const QString& name) { @@ -58,6 +64,7 @@ void GlowEffect::prepare() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); _isEmpty = true; + _isOddFrame = !_isOddFrame; } void GlowEffect::begin(float intensity) { @@ -109,7 +116,7 @@ void GlowEffect::render() { Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(); QOpenGLFramebufferObject* newDiffusedFBO = Application::getInstance()->getTextureCache()->getTertiaryFramebufferObject(); - if ((_isOddFrame = !_isOddFrame)) { + if (_isOddFrame) { qSwap(oldDiffusedFBO, newDiffusedFBO); } newDiffusedFBO->bind(); @@ -204,5 +211,21 @@ void GlowEffect::render() { } void GlowEffect::cycleRenderMode() { - _renderMode = (RenderMode)((_renderMode + 1) % RENDER_MODE_COUNT); + switch(_renderMode = (RenderMode)((_renderMode + 1) % RENDER_MODE_COUNT)) { + case ADD_MODE: + qDebug() << "Glow mode: Add\n"; + break; + + case BLUR_ADD_MODE: + qDebug() << "Glow mode: Blur/add\n"; + break; + + case BLUR_PERSIST_ADD_MODE: + qDebug() << "Glow mode: Blur/persist/add\n"; + break; + + case DIFFUSE_ADD_MODE: + qDebug() << "Glow mode: Diffuse/add\n"; + break; + } } diff --git a/interface/src/renderer/GlowEffect.h b/interface/src/renderer/GlowEffect.h index 0d6e83a7a6..73ed9ed881 100644 --- a/interface/src/renderer/GlowEffect.h +++ b/interface/src/renderer/GlowEffect.h @@ -11,6 +11,8 @@ #include +class QOpenGLFramebufferObject; + class ProgramObject; /// A generic full screen glow effect. @@ -21,6 +23,10 @@ public: GlowEffect(); + /// Returns a pointer to the framebuffer object that the glow effect is *not* using for persistent state + /// (either the secondary or the tertiary). + QOpenGLFramebufferObject* getFreeFramebufferObject() const; + void init(); /// Prepares the glow effect for rendering the current frame. To be called before rendering the scene.