From 0f09c36aa2f7f649e1bb95a2a792a500cdbe0a91 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 15 Jul 2019 10:31:08 -0400 Subject: [PATCH] Bring back changes for transparency and added new error protection for big components. --- data/assets/scene/solarsystem/sun/glare.asset | 4 +- .../openspace/rendering/framebufferrenderer.h | 5 +++ include/openspace/rendering/renderable.h | 1 + modules/base/rendering/renderableplane.cpp | 8 +++- modules/base/rendering/renderableplane.h | 4 +- .../rendering/renderableplaneimagelocal.cpp | 2 + modules/base/rendering/renderabletrail.cpp | 6 ++- .../base/rendering/renderabletrailorbit.cpp | 6 +-- shaders/framebuffer/renderframebuffer.frag | 4 +- src/rendering/framebufferrenderer.cpp | 37 ++++++++++++++----- src/rendering/renderable.cpp | 9 +++++ 11 files changed, 66 insertions(+), 20 deletions(-) diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index 61b8da7423..e61537b1d2 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -13,10 +13,10 @@ local SunGlare = { Size = 1.3*10^10.5, Origin = "Center", Billboard = true, - Texture = textures .. "/halo.png", + Texture = textures .. "/test6.png", BlendMode = "Additive", Opacity = 0.65, - RenderableType = "Transparent" + RenderableType = "Transparency" }, Transform = { Translation = { diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index e5bfea78d3..1a38bdbbed 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -73,6 +73,11 @@ private: GL_COLOR_ATTACHMENT1 }; + inline static const GLenum ColorAttachment03Array[2] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT3 + }; + inline static const GLenum ColorAttachment012Array[3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index 30b820a24c..0e6f0896ee 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -96,6 +96,7 @@ protected: properties::FloatProperty _opacity; properties::StringProperty _renderableType; + void setRenderBinFromOpacity(); void registerUpdateRenderBinFromOpacity(); private: diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 277c9ccd0a..922e040a7f 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -127,7 +127,7 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) _blendMode.onChange([&]() { switch (_blendMode) { case BlendModeNormal: - setRenderBin(Renderable::RenderBin::Opaque); + setRenderBinFromOpacity(); break; case BlendModeAdditive: setRenderBin(Renderable::RenderBin::Transparent); @@ -137,6 +137,12 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) } }); + _opacity.onChange([&]() { + if (_blendMode == BlendModeNormal) { + setRenderBinFromOpacity(); + } + }); + if (dictionary.hasKey(BlendModeInfo.identifier)) { const std::string v = dictionary.value(BlendModeInfo.identifier); if (v == "Normal") { diff --git a/modules/base/rendering/renderableplane.h b/modules/base/rendering/renderableplane.h index 184d3f637a..a8be7ebe90 100644 --- a/modules/base/rendering/renderableplane.h +++ b/modules/base/rendering/renderableplane.h @@ -67,12 +67,14 @@ protected: virtual void bindTexture(); virtual void unbindTexture(); +protected: + properties::OptionProperty _blendMode; + private: void createPlane(); properties::BoolProperty _billboard; properties::FloatProperty _size; - properties::OptionProperty _blendMode; ghoul::opengl::ProgramObject* _shader = nullptr; diff --git a/modules/base/rendering/renderableplaneimagelocal.cpp b/modules/base/rendering/renderableplaneimagelocal.cpp index 170282cf89..a7ea7baf1d 100644 --- a/modules/base/rendering/renderableplaneimagelocal.cpp +++ b/modules/base/rendering/renderableplaneimagelocal.cpp @@ -85,6 +85,8 @@ RenderablePlaneImageLocal::RenderablePlaneImageLocal(const ghoul::Dictionary& di "RenderablePlaneImageLocal" ); + addProperty(_blendMode); + _texturePath = absPath(dictionary.value(TextureInfo.identifier)); _textureFile = std::make_unique(_texturePath); diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 2fff2bc6a9..aa834b544e 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -178,8 +178,10 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) properties::OptionProperty::DisplayType::Dropdown ) { + + setRenderBin(RenderBin::Overlay); addProperty(_opacity); - registerUpdateRenderBinFromOpacity(); + //registerUpdateRenderBinFromOpacity(); _translation = Translation::createFromDictionary( dictionary.value(KeyTranslation) @@ -289,7 +291,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { if (usingFramebufferRenderer) { glDepthMask(false); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); } const bool renderLines = (_renderingModes == RenderingModeLines) | diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index e00156ec72..b4ad1da19e 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -100,8 +100,8 @@ namespace { constexpr openspace::properties::Property::PropertyInfo RenderableTypeInfo = { "RenderableType", "RenderableType", - "This value specifies if the plane should be rendered in the Background," - "Opaque, Transparent, or Overlay rendering step." + "This value specifies if the orbit should be rendered in the Background," + "Opaque, Transparent, or Overlay rendering step. Default is Transparent." }; } // namespace @@ -192,7 +192,7 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary) } } else { - setRenderBin(Renderable::RenderBin::Opaque); + setRenderBin(Renderable::RenderBin::Overlay); } } diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index ce52803c72..a152004a86 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -30,6 +30,8 @@ #define bloom_thresh_min #{rendererData.bloom_thresh_min} #define bloom_thresh_max #{rendererData.bloom_thresh_max} +#define deltaError 0.00001 + layout(location = 0) out vec4 _out_color_; layout(location = 1) out vec4 gPosition; layout(location = 2) out vec4 gNormal; @@ -37,7 +39,7 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - _out_color_ = vec4((log2(vec3(1.0) - f.color.rgb)/(-exposure)), f.color.a); + _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(deltaError)))/(-exposure)), f.color.a); //_out_color_ = f.color; gPosition = f.gPosition; gNormal = f.gNormal; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 2dd31b76a1..a70a0030de 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -264,6 +263,13 @@ void FramebufferRenderer::initialize() { _pingPongBuffers.colorTexture[1], 0 ); + glFramebufferTexture2D( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT3, + GL_TEXTURE_2D_MULTISAMPLE, + _gBuffers._filterTexture, + 0 + ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, @@ -530,6 +536,16 @@ void FramebufferRenderer::captureAndSetOpenGLDefaultState() { glDisablei(GL_BLEND, 2); glDisablei(GL_BLEND, 3); + glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); + + // JCC: From OpenGL Registry + // Note that the FrontFace and ClampColor commands in section 12.2 are not + // deprecated, as they still affect other non - deprecated functionality; however, + // the ClampColor targets CLAMP_VERTEX_COLOR and CLAMP_FRAGMENT_ - + // COLOR are deprecated. + //glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); + //glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); + _osDefaultGLState.blendEnabled = true; _osDefaultGLState.blend0Enabled = true; _osDefaultGLState.blend1Enabled = false; @@ -1860,10 +1876,11 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac scene->render(data, tasks); data.renderBinMask = static_cast(Renderable::RenderBin::Opaque); scene->render(data, tasks); + + glDrawBuffers(2, ColorAttachment03Array); + data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); scene->render(data, tasks); - data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); - scene->render(data, tasks); // Run Volume Tasks { @@ -1876,19 +1893,12 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performRaycasterTasks(tasks.raycasterTasks); } - // If no Deferred Task are present, the resolve step - // is executed in a separated step if (!tasks.deferredcasterTasks.empty()) { // We use ping pong rendering in order to be able to // render to the same final buffer, multiple // deferred tasks at same time (e.g. more than 1 ATM being seen at once) glBindFramebuffer(GL_FRAMEBUFFER, _pingPongBuffers.framebuffer); glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); - // JCC: next commands should be in the cache.... - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - glDisablei(GL_BLEND, 3); std::unique_ptr perfInternal; if (doPerformanceMeasurements) { @@ -1899,6 +1909,13 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac performDeferredTasks(tasks.deferredcasterTasks); } + glDrawBuffers(4, ColorAttachment0123Array); + + data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); + scene->render(data, tasks); + + glDrawBuffer(GL_COLOR_ATTACHMENT0); + // Disabling depth test for filtering and hdr glDisable(GL_DEPTH_TEST); diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index efd779f686..ac019c4aca 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -211,6 +211,15 @@ void Renderable::onEnabledChange(std::function callback) { }); } +void Renderable::setRenderBinFromOpacity() { + if (_opacity > 0.f && _opacity < 1.f) { + setRenderBin(Renderable::RenderBin::Transparent); + } + else { + setRenderBin(Renderable::RenderBin::Opaque); + } +} + void Renderable::registerUpdateRenderBinFromOpacity() { _opacity.onChange([this](){ if (_opacity > 0.f && _opacity < 1.f) {