From 7d58c9a741d0eca2b46326847e79170a17ed8652 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 8 Jun 2017 17:09:08 +0200 Subject: [PATCH] Fixed fade for shadow job --- .../render-utils/src/RenderDeferredTask.cpp | 2 +- .../render-utils/src/RenderShadowTask.cpp | 34 ++++++++++++++++--- .../src/skin_model_normal_map_fade.slv | 2 +- .../render-utils/src/skin_model_shadow.slf | 2 +- .../src/skin_model_shadow_fade.slf | 27 +++++++++++++++ .../src/skin_model_shadow_fade.slv | 2 +- libraries/render/src/render/ShapePipeline.cpp | 2 +- libraries/render/src/render/ShapePipeline.h | 4 +-- 8 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 libraries/render-utils/src/skin_model_shadow_fade.slf diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 8b2a232c87..df27f48271 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -308,7 +308,7 @@ void DrawStateSortDeferred::run(const RenderContextPointer& renderContext, const const auto& lightingModel = inputs.get1(); RenderArgs* args = renderContext->args; - ShapeKey::Builder defaultKeyBuilder = DependencyManager::get()->getKeyBuilder(); + ShapeKey::Builder defaultKeyBuilder = DependencyManager::get()->getKeyBuilder(); gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index d7ec087174..33d260c2da 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -14,6 +14,7 @@ #include #include +#include "FadeEffect.h" #include #include @@ -28,6 +29,12 @@ #include "model_shadow_frag.h" #include "skin_model_shadow_frag.h" +#include "model_shadow_fade_vert.h" +#include "skin_model_shadow_fade_vert.h" + +#include "model_shadow_fade_frag.h" +#include "skin_model_shadow_fade_frag.h" + using namespace render; void RenderShadowMap::run(const render::RenderContextPointer& renderContext, @@ -46,6 +53,8 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, const auto& fbo = shadow->framebuffer; RenderArgs* args = renderContext->args; + ShapeKey::Builder defaultKeyBuilder = DependencyManager::get()->getKeyBuilder(); + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; @@ -61,8 +70,11 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, batch.setProjectionTransform(shadow->getProjection()); batch.setViewTransform(shadow->getView(), false); - auto shadowPipeline = _shapePlumber->pickPipeline(args, ShapeKey()); - auto shadowSkinnedPipeline = _shapePlumber->pickPipeline(args, ShapeKey::Builder().withSkinned()); + auto shadowPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder); + auto shadowSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned()); + + // Prepare fade effect + DependencyManager::get()->bindPerBatch(batch); std::vector skinnedShapeKeys{}; @@ -103,15 +115,29 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende auto modelPixel = gpu::Shader::createPixel(std::string(model_shadow_frag)); gpu::ShaderPointer modelProgram = gpu::Shader::createProgram(modelVertex, modelPixel); shapePlumber->addPipeline( - ShapeKey::Filter::Builder().withoutSkinned(), + ShapeKey::Filter::Builder().withoutSkinned().withoutFade(), modelProgram, state); auto skinVertex = gpu::Shader::createVertex(std::string(skin_model_shadow_vert)); auto skinPixel = gpu::Shader::createPixel(std::string(skin_model_shadow_frag)); gpu::ShaderPointer skinProgram = gpu::Shader::createProgram(skinVertex, skinPixel); shapePlumber->addPipeline( - ShapeKey::Filter::Builder().withSkinned(), + ShapeKey::Filter::Builder().withSkinned().withoutFade(), skinProgram, state); + + auto modelFadeVertex = gpu::Shader::createVertex(std::string(model_shadow_fade_vert)); + auto modelFadePixel = gpu::Shader::createPixel(std::string(model_shadow_fade_frag)); + gpu::ShaderPointer modelFadeProgram = gpu::Shader::createProgram(modelFadeVertex, modelFadePixel); + shapePlumber->addPipeline( + ShapeKey::Filter::Builder().withoutSkinned().withFade(), + modelFadeProgram, state); + + auto skinFadeVertex = gpu::Shader::createVertex(std::string(skin_model_shadow_fade_vert)); + auto skinFadePixel = gpu::Shader::createPixel(std::string(skin_model_shadow_fade_frag)); + gpu::ShaderPointer skinFadeProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel); + shapePlumber->addPipeline( + ShapeKey::Filter::Builder().withSkinned().withFade(), + skinFadeProgram, state); } const auto cachedMode = task.addJob("Setup"); diff --git a/libraries/render-utils/src/skin_model_normal_map_fade.slv b/libraries/render-utils/src/skin_model_normal_map_fade.slv index 5169aa5d75..7c88c68537 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade.slv @@ -55,7 +55,7 @@ void main(void) { TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); <$transformModelToEyeAndClipPos(cam, obj, position, _position, gl_Position)$> - <$transformModelToFadePos(obj, inPosition, _worldFadePosition)$> + <$transformModelToFadePos(obj, position, _worldFadePosition)$> <$transformModelToWorldDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> <$transformModelToWorldDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$> diff --git a/libraries/render-utils/src/skin_model_shadow.slf b/libraries/render-utils/src/skin_model_shadow.slf index 178ea7b387..e464d6e6c8 100644 --- a/libraries/render-utils/src/skin_model_shadow.slf +++ b/libraries/render-utils/src/skin_model_shadow.slf @@ -2,7 +2,7 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -// model_shadow.frag +// skin_model_shadow.frag // fragment shader // // Created by Andrzej Kapolka on 3/24/14. diff --git a/libraries/render-utils/src/skin_model_shadow_fade.slf b/libraries/render-utils/src/skin_model_shadow_fade.slf new file mode 100644 index 0000000000..7b164f5db1 --- /dev/null +++ b/libraries/render-utils/src/skin_model_shadow_fade.slf @@ -0,0 +1,27 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// skin_model_shadow_fade.frag +// fragment shader +// +// Created by Olivier Prat on 06/08/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 +// + +<@include Fade.slh@> +<$declareFadeFragment()$> + +in vec4 _worldFadePosition; + +layout(location = 0) out vec4 _fragColor; + +void main(void) { + applyFade(_worldFadePosition.xyz); + + // pass-through to set z-buffer + _fragColor = vec4(1.0, 1.0, 1.0, 0.0); +} diff --git a/libraries/render-utils/src/skin_model_shadow_fade.slv b/libraries/render-utils/src/skin_model_shadow_fade.slv index 84d50ae754..03b060b59b 100644 --- a/libraries/render-utils/src/skin_model_shadow_fade.slv +++ b/libraries/render-utils/src/skin_model_shadow_fade.slv @@ -30,5 +30,5 @@ void main(void) { TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); <$transformModelToClipPos(cam, obj, position, gl_Position)$> - <$transformModelToFadePos(obj, inPosition, _worldFadePosition)$> + <$transformModelToFadePos(obj, position, _worldFadePosition)$> } diff --git a/libraries/render/src/render/ShapePipeline.cpp b/libraries/render/src/render/ShapePipeline.cpp index b521ff12ee..6a52f90297 100644 --- a/libraries/render/src/render/ShapePipeline.cpp +++ b/libraries/render/src/render/ShapePipeline.cpp @@ -103,7 +103,7 @@ const ShapePipelinePointer ShapePlumber::pickPipeline(RenderArgs* args, const Ke PerformanceTimer perfTimer("ShapePlumber::pickPipeline"); - const auto& pipelineIterator = _pipelineMap.find(key); + auto pipelineIterator = _pipelineMap.find(key); if (pipelineIterator == _pipelineMap.end()) { // The first time we can't find a pipeline, we should log it if (_missingKeys.find(key) == _missingKeys.end()) { diff --git a/libraries/render/src/render/ShapePipeline.h b/libraries/render/src/render/ShapePipeline.h index 1c18f2a26e..cfcd358287 100644 --- a/libraries/render/src/render/ShapePipeline.h +++ b/libraries/render/src/render/ShapePipeline.h @@ -128,8 +128,8 @@ public: Builder& withCullFace() { _flags.reset(NO_CULL_FACE); _mask.set(NO_CULL_FACE); return (*this); } Builder& withoutCullFace() { _flags.set(NO_CULL_FACE); _mask.set(NO_CULL_FACE); return (*this); } - Builder& withFade() { _flags.reset(FADE); _mask.set(FADE); return (*this); } - Builder& withoutFade() { _flags.set(FADE); _mask.set(FADE); return (*this); } + Builder& withFade() { _flags.set(FADE); _mask.set(FADE); return (*this); } + Builder& withoutFade() { _flags.reset(FADE); _mask.set(FADE); return (*this); } protected: friend class Filter;