From 96b179386fcc506454706a95d38550aa7abafcc0 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 28 Jul 2017 16:56:07 -0700 Subject: [PATCH] working on fixing non-AA overlays --- interface/src/ui/overlays/OverlaysPayload.cpp | 8 ++--- .../render-utils/src/AntialiasingEffect.cpp | 1 + libraries/render-utils/src/GeometryCache.cpp | 19 ++++++------ libraries/render-utils/src/GeometryCache.h | 5 --- .../render-utils/src/RenderDeferredTask.cpp | 28 ++++++++++------- .../render-utils/src/StencilMaskPass.cpp | 4 +++ libraries/render-utils/src/StencilMaskPass.h | 1 + libraries/render-utils/src/simple.slv | 3 +- .../src/simple_opaque_web_browser_overlay.slf | 30 ------------------ ...simple_transparent_web_browser_overlay.slf | 31 ------------------- libraries/render/src/render/FilterTask.cpp | 17 +++++++++- libraries/render/src/render/FilterTask.h | 15 +++++++++ 12 files changed, 66 insertions(+), 96 deletions(-) delete mode 100644 libraries/render-utils/src/simple_opaque_web_browser_overlay.slf delete mode 100644 libraries/render-utils/src/simple_transparent_web_browser_overlay.slf diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index d14805c1ba..34b7d29b0d 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -37,9 +37,6 @@ namespace render { if (std::static_pointer_cast(overlay)->getDrawInFront()) { builder.withLayered(); } - if (!std::static_pointer_cast(overlay)->isAA()) { - builder.withLayered(); - } if (overlay->getAlphaPulse() != 0.0f || overlay->getAlpha() != 1.0f) { builder.withTransparent(); } @@ -60,14 +57,15 @@ namespace render { if (overlay->is3D()) { auto overlay3D = std::dynamic_pointer_cast(overlay); - if (overlay3D->isAA()) + if (overlay3D->isAA()) { if (overlay3D->getDrawInFront()) { return LAYER_3D_FRONT; } else { return LAYER_3D; } - else + } else { return LAYER_NO_AA; + } } else { return LAYER_2D; } diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 55a46a526f..f4d2bc5e40 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -131,6 +131,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const // FXAA step auto pipeline = getAntialiasingPipeline(renderContext->args); + _antialiasingBuffer->setDepthStencilBuffer(sourceBuffer->getDepthStencilBuffer(), sourceBuffer->getDepthStencilBufferFormat()); batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(pipeline); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 5f2acff16f..60b0bd8adb 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -38,9 +38,7 @@ #include "simple_textured_frag.h" #include "simple_textured_unlit_frag.h" #include "simple_opaque_web_browser_frag.h" -#include "simple_opaque_web_browser_overlay_frag.h" #include "simple_transparent_web_browser_frag.h" -#include "simple_transparent_web_browser_overlay_frag.h" #include "glowLine_vert.h" #include "glowLine_frag.h" @@ -1814,7 +1812,7 @@ inline bool operator==(const SimpleProgramKey& a, const SimpleProgramKey& b) { return a.getRaw() == b.getRaw(); } -static void buildWebShader(const std::string& vertShaderText, const std::string& fragShaderText, bool blendEnable, +static void buildWebShader(const std::string& vertShaderText, const std::string& fragShaderText, bool blendEnable, bool isAA, gpu::ShaderPointer& shaderPointerOut, gpu::PipelinePointer& pipelinePointerOut) { auto VS = gpu::Shader::createVertex(vertShaderText); auto PS = gpu::Shader::createPixel(fragShaderText); @@ -1835,6 +1833,10 @@ static void buildWebShader(const std::string& vertShaderText, const std::string& PrepareStencil::testMaskDrawShape(*state); } + if (!isAA) { + PrepareStencil::drawMaskDepth(*state); + } + pipelinePointerOut = gpu::Pipeline::create(shaderPointerOut, state); } @@ -1846,11 +1848,10 @@ gpu::PipelinePointer GeometryCache::getOpaqueWebBrowserProgram(bool isAA) { static std::once_flag once; std::call_once(once, [&]() { const bool BLEND_ENABLE = false; - buildWebShader(simple_vert, simple_opaque_web_browser_frag, BLEND_ENABLE, _simpleOpaqueWebBrowserShader, _simpleOpaqueWebBrowserPipeline); - buildWebShader(simple_vert, simple_opaque_web_browser_overlay_frag, BLEND_ENABLE, _simpleOpaqueWebBrowserOverlayShader, _simpleOpaqueWebBrowserOverlayPipeline); + buildWebShader(simple_vert, simple_opaque_web_browser_frag, BLEND_ENABLE, isAA, _simpleOpaqueWebBrowserShader, _simpleOpaqueWebBrowserPipeline); }); - return isAA ? _simpleOpaqueWebBrowserPipeline : _simpleOpaqueWebBrowserOverlayPipeline; + return _simpleOpaqueWebBrowserPipeline; } void GeometryCache::bindTransparentWebBrowserProgram(gpu::Batch& batch, bool isAA) { @@ -1860,13 +1861,11 @@ void GeometryCache::bindTransparentWebBrowserProgram(gpu::Batch& batch, bool isA gpu::PipelinePointer GeometryCache::getTransparentWebBrowserProgram(bool isAA) { static std::once_flag once; std::call_once(once, [&]() { - const bool BLEND_ENABLE = true; - buildWebShader(simple_vert, simple_transparent_web_browser_frag, BLEND_ENABLE, _simpleTransparentWebBrowserShader, _simpleTransparentWebBrowserPipeline); - buildWebShader(simple_vert, simple_transparent_web_browser_overlay_frag, BLEND_ENABLE, _simpleTransparentWebBrowserOverlayShader, _simpleTransparentWebBrowserOverlayPipeline); + buildWebShader(simple_vert, simple_transparent_web_browser_frag, BLEND_ENABLE, isAA, _simpleTransparentWebBrowserShader, _simpleTransparentWebBrowserPipeline); }); - return isAA ? _simpleTransparentWebBrowserPipeline : _simpleTransparentWebBrowserOverlayPipeline; + return _simpleTransparentWebBrowserPipeline; } void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool transparent, bool culled, bool unlit, bool depthBiased) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index fa558a1151..69759b311e 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -430,11 +430,6 @@ private: gpu::PipelinePointer _simpleOpaqueWebBrowserPipeline; gpu::ShaderPointer _simpleTransparentWebBrowserShader; gpu::PipelinePointer _simpleTransparentWebBrowserPipeline; - - gpu::ShaderPointer _simpleOpaqueWebBrowserOverlayShader; - gpu::PipelinePointer _simpleOpaqueWebBrowserOverlayPipeline; - gpu::ShaderPointer _simpleTransparentWebBrowserOverlayShader; - gpu::PipelinePointer _simpleTransparentWebBrowserOverlayPipeline; }; #endif // hifi_GeometryCache_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 20c999019b..547e9de5b8 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -66,7 +66,10 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Filter the non antialiaased overlays const int LAYER_NO_AA = 3; - const auto nonAAOverlays = task.addJob("Filter2DWebOverlays", overlayOpaques, LAYER_NO_AA); + const auto overlaysOpaqueAA = task.addJob("FilterAAOverlaysOpaque", overlayOpaques, LAYER_NO_AA); + const auto overlaysOpaqueNonAA = task.addJob("FilterNonAAOverlaysOpaque", overlayOpaques, LAYER_NO_AA); + const auto overlaysTransparentAA = task.addJob("FilterAAOverlaysTransparent", overlayTransparents, LAYER_NO_AA); + const auto overlaysTransparentNonAA = task.addJob("FilterNonAAOverlaysTransparent", overlayTransparents, LAYER_NO_AA); // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); @@ -164,14 +167,20 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren } // Overlays - const auto overlayOpaquesInputs = DrawOverlay3D::Inputs(overlayOpaques, lightingModel).hasVarying(); - const auto overlayTransparentsInputs = DrawOverlay3D::Inputs(overlayTransparents, lightingModel).hasVarying(); - task.addJob("DrawOverlay3DOpaque", overlayOpaquesInputs, true); - task.addJob("DrawOverlay3DTransparent", overlayTransparentsInputs, false); + const auto overlaysOpaqueAAInputs = DrawOverlay3D::Inputs(overlaysOpaqueAA, lightingModel).hasVarying(); + const auto overlaysOpaqueNonAAInputs = DrawOverlay3D::Inputs(overlaysOpaqueNonAA, lightingModel).hasVarying(); + const auto overlaysTransparentAAInputs = DrawOverlay3D::Inputs(overlaysTransparentAA, lightingModel).hasVarying(); + const auto overlaysTransparentNonAAInputs = DrawOverlay3D::Inputs(overlaysTransparentNonAA, lightingModel).hasVarying(); + task.addJob("DrawOverlay3DOpaqueAA", overlaysOpaqueAAInputs, true); + task.addJob("DrawOverlay3DOpaqueNonAA", overlaysOpaqueNonAAInputs, true); + task.addJob("DrawOverlay3DTransparentAA", overlaysTransparentAAInputs, false); + task.addJob("DrawOverlay3DTransparentNonAA", overlaysTransparentNonAAInputs, false); { // DEbug the bounds of the rendered OVERLAY items, still look at the zbuffer - task.addJob("DrawOverlayOpaqueBounds", overlayOpaques); - task.addJob("DrawOverlayTransparentBounds", overlayTransparents); + task.addJob("DrawOverlayOpaqueBounds", overlaysOpaqueAA); + task.addJob("DrawOverlayOpaqueNonAABounds", overlaysOpaqueNonAA); + task.addJob("DrawOverlayTransparentAABounds", overlaysTransparentAA); + task.addJob("DrawOverlayTransparentNonAABounds", overlaysTransparentNonAA); } // Debugging stages @@ -204,14 +213,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawZoneStack", deferredFrameTransform); } - // AA job to be revisited task.addJob("Antialiasing", primaryFramebuffer); - // Draw 2DWeb non AA - const auto nonAAOverlaysInputs = DrawOverlay3D::Inputs(nonAAOverlays, lightingModel).hasVarying(); - task.addJob("Draw2DWebSurfaces", nonAAOverlaysInputs, false); - task.addJob("ToneAndPostRangeTimer", toneAndPostRangeTimer); // Blit! diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index 2d4efc0573..59e4cc6e59 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -108,6 +108,10 @@ void PrepareStencil::drawMask(gpu::State& state) { state.setStencilTest(true, 0xFF, gpu::State::StencilTest(PrepareStencil::STENCIL_MASK, 0xFF, gpu::ALWAYS, gpu::State::STENCIL_OP_REPLACE, gpu::State::STENCIL_OP_REPLACE, gpu::State::STENCIL_OP_REPLACE)); } +void PrepareStencil::drawMaskDepth(gpu::State& state) { + state.setStencilTest(true, 0xFF, gpu::State::StencilTest(PrepareStencil::STENCIL_MASK, 0xFF, gpu::ALWAYS, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_REPLACE)); +} + void PrepareStencil::testMask(gpu::State& state) { state.setStencilTest(true, 0x00, gpu::State::StencilTest(PrepareStencil::STENCIL_MASK, 0xFF, gpu::NOT_EQUAL, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); } diff --git a/libraries/render-utils/src/StencilMaskPass.h b/libraries/render-utils/src/StencilMaskPass.h index 01601d1ae6..19224369ff 100644 --- a/libraries/render-utils/src/StencilMaskPass.h +++ b/libraries/render-utils/src/StencilMaskPass.h @@ -47,6 +47,7 @@ public: static void drawMask(gpu::State& state); + static void drawMaskDepth(gpu::State& state); static void testMask(gpu::State& state); static void testBackground(gpu::State& state); static void testMaskDrawShape(gpu::State& state); diff --git a/libraries/render-utils/src/simple.slv b/libraries/render-utils/src/simple.slv index 64d3e24192..c9fa761ebc 100644 --- a/libraries/render-utils/src/simple.slv +++ b/libraries/render-utils/src/simple.slv @@ -27,12 +27,11 @@ out vec4 _position; void main(void) { _color = colorToLinearRGBA(inColor); _texCoord0 = inTexCoord0.st; - _position = inPosition; _modelNormal = inNormal.xyz; // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> + <$transformModelToEyeAndClipPos(cam, obj, inPosition, _position, gl_Position)$> <$transformModelToWorldDir(cam, obj, inNormal.xyz, _normal)$> } \ No newline at end of file diff --git a/libraries/render-utils/src/simple_opaque_web_browser_overlay.slf b/libraries/render-utils/src/simple_opaque_web_browser_overlay.slf deleted file mode 100644 index 6d4d35591f..0000000000 --- a/libraries/render-utils/src/simple_opaque_web_browser_overlay.slf +++ /dev/null @@ -1,30 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// simple_opaque_web_browser_overlay.slf -// fragment shader -// -// Created by Anthony Thibault on 1/30/17. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -// Same as simple_opaque_web_browser.slf except frame buffer is sRGB, so colorToLinearRGBA is not necessary. - -<@include gpu/Color.slh@> -<@include DeferredBufferWrite.slh@> - -// the albedo texture -uniform sampler2D originalTexture; - -// the interpolated normal -in vec3 _normal; -in vec4 _color; -in vec2 _texCoord0; - -void main(void) { - vec4 texel = texture(originalTexture, _texCoord0.st); - _fragColor0 = vec4(_color.rgb * texel.rgb, 1.0); -} diff --git a/libraries/render-utils/src/simple_transparent_web_browser_overlay.slf b/libraries/render-utils/src/simple_transparent_web_browser_overlay.slf deleted file mode 100644 index af52389d5b..0000000000 --- a/libraries/render-utils/src/simple_transparent_web_browser_overlay.slf +++ /dev/null @@ -1,31 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// simple_transparent_web_browser_overlay.slf -// fragment shader -// -// Created by Anthony Thibault on 1/30/17. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -// Same as simple_transparent_web_browser.slf except frame buffer is sRGB, So colorToLinearRGBA is not necessary. -// - -<@include gpu/Color.slh@> -<@include DeferredBufferWrite.slh@> - -// the albedo texture -uniform sampler2D originalTexture; - -// the interpolated normal -in vec3 _normal; -in vec4 _color; -in vec2 _texCoord0; - -void main(void) { - vec4 texel = texture(originalTexture, _texCoord0.st); - _fragColor0 = vec4(_color.rgb * texel.rgb, _color.a); -} diff --git a/libraries/render/src/render/FilterTask.cpp b/libraries/render/src/render/FilterTask.cpp index f6b765cd9d..fe3aea94f6 100644 --- a/libraries/render/src/render/FilterTask.cpp +++ b/libraries/render/src/render/FilterTask.cpp @@ -27,7 +27,7 @@ void FilterLayeredItems::run(const RenderContextPointer& renderContext, const It // Clear previous values outItems.clear(); - // For each item, filter it into one bucket + // Filter matches into one bucket for (auto itemBound : inItems) { auto& item = scene->getItem(itemBound.id); if (item.getLayer() == _keepLayer) { @@ -36,6 +36,21 @@ void FilterLayeredItems::run(const RenderContextPointer& renderContext, const It } } +void FilterOutLayeredItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + auto& scene = renderContext->_scene; + + // Clear previous values + outItems.clear(); + + // Filter non-matches into one bucket + for (auto itemBound : inItems) { + auto& item = scene->getItem(itemBound.id); + if (item.getLayer() != _removeLayer) { + outItems.emplace_back(itemBound); + } + } +} + void SliceItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { outItems.clear(); std::static_pointer_cast(renderContext->jobConfig)->setNumItems((int)inItems.size()); diff --git a/libraries/render/src/render/FilterTask.h b/libraries/render/src/render/FilterTask.h index 1c4611ee9f..19883e03cd 100644 --- a/libraries/render/src/render/FilterTask.h +++ b/libraries/render/src/render/FilterTask.h @@ -76,6 +76,21 @@ namespace render { void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; + // Filter the items not belonging to the job's remove layer + class FilterOutLayeredItems { + public: + using JobModel = Job::ModelIO; + + FilterOutLayeredItems() {} + FilterOutLayeredItems(int removeLayer) : + _removeLayer(removeLayer) { + } + + int _removeLayer { 0 }; + + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + }; + // SliceItems job config defining the slice range class SliceItemsConfig : public Job::Config { Q_OBJECT