From fb84f058d6856784ea5fe8b74b0519c35f23674f Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 25 Jul 2016 15:56:05 -0700 Subject: [PATCH 1/5] Fix alpha cut-outs and incorrect gamma on Web3DOverlays --- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- libraries/render-utils/src/GeometryCache.cpp | 41 +++++++++++++++++++ libraries/render-utils/src/GeometryCache.h | 9 ++++ ...imple_srgb_textured_unlit_no_dst_alpha.slf | 34 +++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index c9c24d3ab6..b224b3a047 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -101,7 +101,7 @@ void Web3DOverlay::render(RenderArgs* args) { batch.setModelTransform(transform); auto geometryCache = DependencyManager::get(); - geometryCache->bindSimpleProgram(batch, true, false, true, false); + geometryCache->bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(batch); geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color); batch.setResourceTexture(0, args->_whiteTexture); // restore default white color after me } diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index cebd8ad37f..7c4172b8e5 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -35,6 +35,7 @@ #include "simple_vert.h" #include "simple_textured_frag.h" #include "simple_textured_unlit_frag.h" +#include "simple_srgb_textured_unlit_no_dst_alpha_frag.h" #include "glowLine_vert.h" #include "glowLine_geom.h" #include "glowLine_frag.h" @@ -1748,6 +1749,46 @@ inline bool operator==(const SimpleProgramKey& a, const SimpleProgramKey& b) { return a.getRaw() == b.getRaw(); } +void GeometryCache::bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(gpu::Batch& batch) { + batch.setPipeline(getSimpleSRGBTexturedUnlitNoDstAlphaPipeline()); + // Set a default normal map + batch.setResourceTexture(render::ShapePipeline::Slot::MAP::NORMAL_FITTING, + DependencyManager::get()->getNormalFittingTexture()); +} + +gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline() { + // Compile the shaders, once + static std::once_flag once; + std::call_once(once, [&]() { + auto VS = gpu::Shader::createVertex(std::string(simple_vert)); + auto PS = gpu::Shader::createPixel(std::string(simple_srgb_textured_unlit_no_dst_alpha_frag)); + + _simpleSRGBTexturedUnlitNoDstAlphaShader = gpu::Shader::createProgram(VS, PS); + + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("normalFittingMap"), render::ShapePipeline::Slot::MAP::NORMAL_FITTING)); + gpu::Shader::makeProgram(*_simpleSRGBTexturedUnlitNoDstAlphaShader, slotBindings); + }); + + if (_simpleSRGBTexturedUnlitNoDstAlphaPipeline) { + return _simpleSRGBTexturedUnlitNoDstAlphaPipeline; + } + + // If the pipeline did not exist, make it + auto state = std::make_shared(); + state->setCullMode(gpu::State::CULL_NONE); + + state->setDepthTest(true, true, gpu::LESS_EQUAL); + state->setBlendFunction(false, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + + gpu::ShaderPointer program = _simpleSRGBTexturedUnlitNoDstAlphaShader; + gpu::PipelinePointer pipeline = gpu::Pipeline::create(program, state); + _simpleSRGBTexturedUnlitNoDstAlphaPipeline = pipeline; + return pipeline; +} + void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool culled, bool unlit, bool depthBiased) { batch.setPipeline(getSimplePipeline(textured, culled, unlit, depthBiased)); diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index bab0942672..3d987939d4 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -157,6 +157,11 @@ public: // Get the pipeline to render static geometry gpu::PipelinePointer getSimplePipeline(bool textured = false, bool culled = true, bool unlit = false, bool depthBias = false); + + + void bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(gpu::Batch& batch); + gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline(); + render::ShapePipelinePointer getShapePipeline() { return GeometryCache::_simplePipeline; } render::ShapePipelinePointer getWireShapePipeline() { return GeometryCache::_simpleWirePipeline; } @@ -416,6 +421,10 @@ private: static render::ShapePipelinePointer _simpleWirePipeline; gpu::PipelinePointer _glowLinePipeline; QHash _simplePrograms; + + gpu::ShaderPointer _simpleSRGBTexturedUnlitNoDstAlphaShader; + gpu::PipelinePointer _simpleSRGBTexturedUnlitNoDstAlphaPipeline; + }; #endif // hifi_GeometryCache_h diff --git a/libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf b/libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf new file mode 100644 index 0000000000..e2109973db --- /dev/null +++ b/libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf @@ -0,0 +1,34 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// simple.frag +// fragment shader +// +// Created by Anthony Thibault on 7/25/16. +// Copyright 2016 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 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); + texel = colorToLinearRGBA(texel); + + packDeferredFragmentUnlit( + normalize(_normal), + 1.0, + _color.rgb * texel.rgb); +} From 0a35c13a94cd805955b8e24cd4f8dc9f8e0e80dd Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 25 Jul 2016 16:30:29 -0700 Subject: [PATCH 2/5] Moved creation of pipeline into call_once block --- libraries/render-utils/src/GeometryCache.cpp | 26 +++++++------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 7c4172b8e5..7ec2a84cf9 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1768,25 +1768,17 @@ gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("normalFittingMap"), render::ShapePipeline::Slot::MAP::NORMAL_FITTING)); gpu::Shader::makeProgram(*_simpleSRGBTexturedUnlitNoDstAlphaShader, slotBindings); + auto state = std::make_shared(); + state->setCullMode(gpu::State::CULL_NONE); + state->setDepthTest(true, true, gpu::LESS_EQUAL); + state->setBlendFunction(false, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + + _simpleSRGBTexturedUnlitNoDstAlphaPipeline = gpu::Pipeline::create(_simpleSRGBTexturedUnlitNoDstAlphaShader, state); }); - if (_simpleSRGBTexturedUnlitNoDstAlphaPipeline) { - return _simpleSRGBTexturedUnlitNoDstAlphaPipeline; - } - - // If the pipeline did not exist, make it - auto state = std::make_shared(); - state->setCullMode(gpu::State::CULL_NONE); - - state->setDepthTest(true, true, gpu::LESS_EQUAL); - state->setBlendFunction(false, - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - - gpu::ShaderPointer program = _simpleSRGBTexturedUnlitNoDstAlphaShader; - gpu::PipelinePointer pipeline = gpu::Pipeline::create(program, state); - _simpleSRGBTexturedUnlitNoDstAlphaPipeline = pipeline; - return pipeline; + return _simpleSRGBTexturedUnlitNoDstAlphaPipeline; } void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool culled, bool unlit, bool depthBiased) { From 6b8e912114deae537794700816f72955b2bf9b8b Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Thu, 28 Jul 2016 10:02:19 -0700 Subject: [PATCH 3/5] Fix for mac and linux builds --- libraries/render-utils/src/GeometryCache.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 3d987939d4..ce4277b141 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -158,9 +158,8 @@ public: gpu::PipelinePointer getSimplePipeline(bool textured = false, bool culled = true, bool unlit = false, bool depthBias = false); - void bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(gpu::Batch& batch); - gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline(); + gpu::PipelinePointer getSimpleSRGBTexturedUnlitNoDstAlphaPipeline(); render::ShapePipelinePointer getShapePipeline() { return GeometryCache::_simplePipeline; } render::ShapePipelinePointer getWireShapePipeline() { return GeometryCache::_simpleWirePipeline; } From ea310bcc43dc5edce629fd8d5dde629f59e1076a Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Thu, 28 Jul 2016 14:11:19 -0700 Subject: [PATCH 4/5] Web Entities now render correctly as well --- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- .../src/RenderableWebEntityItem.cpp | 6 +++--- libraries/render-utils/src/GeometryCache.cpp | 18 +++++++++--------- libraries/render-utils/src/GeometryCache.h | 8 ++++---- ...imple_srgb_textured_unlit_no_tex_alpha.slf} | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) rename libraries/render-utils/src/{simple_srgb_textured_unlit_no_dst_alpha.slf => simple_srgb_textured_unlit_no_tex_alpha.slf} (94%) diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index b224b3a047..1c84e71fa7 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -101,7 +101,7 @@ void Web3DOverlay::render(RenderArgs* args) { batch.setModelTransform(transform); auto geometryCache = DependencyManager::get(); - geometryCache->bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(batch); + geometryCache->bindSimpleSRGBTexturedUnlitNoTexAlphaProgram(batch); geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color); batch.setResourceTexture(0, args->_whiteTexture); // restore default white color after me } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 8298dbcec5..6fa3a319d7 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -208,9 +208,9 @@ void RenderableWebEntityItem::render(RenderArgs* args) { batch._glActiveBindTexture(GL_TEXTURE0, GL_TEXTURE_2D, _texture); textured = emissive = true; } - - DependencyManager::get()->bindSimpleProgram(batch, textured, culled, emissive); - DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texMin, texMax, glm::vec4(1.0f, 1.0f, 1.0f, 0.0f)); + + DependencyManager::get()->bindSimpleSRGBTexturedUnlitNoTexAlphaProgram(batch); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texMin, texMax, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); } void RenderableWebEntityItem::setSourceUrl(const QString& value) { diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 7ec2a84cf9..1251c3b5b5 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -35,7 +35,7 @@ #include "simple_vert.h" #include "simple_textured_frag.h" #include "simple_textured_unlit_frag.h" -#include "simple_srgb_textured_unlit_no_dst_alpha_frag.h" +#include "simple_srgb_textured_unlit_no_tex_alpha_frag.h" #include "glowLine_vert.h" #include "glowLine_geom.h" #include "glowLine_frag.h" @@ -1749,25 +1749,25 @@ inline bool operator==(const SimpleProgramKey& a, const SimpleProgramKey& b) { return a.getRaw() == b.getRaw(); } -void GeometryCache::bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(gpu::Batch& batch) { - batch.setPipeline(getSimpleSRGBTexturedUnlitNoDstAlphaPipeline()); +void GeometryCache::bindSimpleSRGBTexturedUnlitNoTexAlphaProgram(gpu::Batch& batch) { + batch.setPipeline(getSimpleSRGBTexturedUnlitNoTexAlphaPipeline()); // Set a default normal map batch.setResourceTexture(render::ShapePipeline::Slot::MAP::NORMAL_FITTING, DependencyManager::get()->getNormalFittingTexture()); } -gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline() { +gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoTexAlphaPipeline() { // Compile the shaders, once static std::once_flag once; std::call_once(once, [&]() { auto VS = gpu::Shader::createVertex(std::string(simple_vert)); - auto PS = gpu::Shader::createPixel(std::string(simple_srgb_textured_unlit_no_dst_alpha_frag)); + auto PS = gpu::Shader::createPixel(std::string(simple_srgb_textured_unlit_no_tex_alpha_frag)); - _simpleSRGBTexturedUnlitNoDstAlphaShader = gpu::Shader::createProgram(VS, PS); + _simpleSRGBTexturedUnlitNoTexAlphaShader = gpu::Shader::createProgram(VS, PS); gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("normalFittingMap"), render::ShapePipeline::Slot::MAP::NORMAL_FITTING)); - gpu::Shader::makeProgram(*_simpleSRGBTexturedUnlitNoDstAlphaShader, slotBindings); + gpu::Shader::makeProgram(*_simpleSRGBTexturedUnlitNoTexAlphaShader, slotBindings); auto state = std::make_shared(); state->setCullMode(gpu::State::CULL_NONE); state->setDepthTest(true, true, gpu::LESS_EQUAL); @@ -1775,10 +1775,10 @@ gpu::PipelinePointer GeometryCache::getSimpleSRGBTexturedUnlitNoDstAlphaPipeline gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - _simpleSRGBTexturedUnlitNoDstAlphaPipeline = gpu::Pipeline::create(_simpleSRGBTexturedUnlitNoDstAlphaShader, state); + _simpleSRGBTexturedUnlitNoTexAlphaPipeline = gpu::Pipeline::create(_simpleSRGBTexturedUnlitNoTexAlphaShader, state); }); - return _simpleSRGBTexturedUnlitNoDstAlphaPipeline; + return _simpleSRGBTexturedUnlitNoTexAlphaPipeline; } void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool culled, bool unlit, bool depthBiased) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index ce4277b141..e28e76a766 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -158,8 +158,8 @@ public: gpu::PipelinePointer getSimplePipeline(bool textured = false, bool culled = true, bool unlit = false, bool depthBias = false); - void bindSimpleSRGBTexturedUnlitNoDstAlphaProgram(gpu::Batch& batch); - gpu::PipelinePointer getSimpleSRGBTexturedUnlitNoDstAlphaPipeline(); + void bindSimpleSRGBTexturedUnlitNoTexAlphaProgram(gpu::Batch& batch); + gpu::PipelinePointer getSimpleSRGBTexturedUnlitNoTexAlphaPipeline(); render::ShapePipelinePointer getShapePipeline() { return GeometryCache::_simplePipeline; } render::ShapePipelinePointer getWireShapePipeline() { return GeometryCache::_simpleWirePipeline; } @@ -421,8 +421,8 @@ private: gpu::PipelinePointer _glowLinePipeline; QHash _simplePrograms; - gpu::ShaderPointer _simpleSRGBTexturedUnlitNoDstAlphaShader; - gpu::PipelinePointer _simpleSRGBTexturedUnlitNoDstAlphaPipeline; + gpu::ShaderPointer _simpleSRGBTexturedUnlitNoTexAlphaShader; + gpu::PipelinePointer _simpleSRGBTexturedUnlitNoTexAlphaPipeline; }; diff --git a/libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf b/libraries/render-utils/src/simple_srgb_textured_unlit_no_tex_alpha.slf similarity index 94% rename from libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf rename to libraries/render-utils/src/simple_srgb_textured_unlit_no_tex_alpha.slf index e2109973db..bab18b970b 100644 --- a/libraries/render-utils/src/simple_srgb_textured_unlit_no_dst_alpha.slf +++ b/libraries/render-utils/src/simple_srgb_textured_unlit_no_tex_alpha.slf @@ -2,7 +2,7 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -// simple.frag +// simple_srgb_texture_unlit_no_tex_alpha.frag // fragment shader // // Created by Anthony Thibault on 7/25/16. From 8e3bc97ef9323a5e9e19d5960fa92897feafa5a3 Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Fri, 29 Jul 2016 08:10:10 -0700 Subject: [PATCH 5/5] fix for unused variable warnings --- libraries/entities-renderer/src/RenderableWebEntityItem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 6fa3a319d7..82c142db37 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -203,10 +203,8 @@ void RenderableWebEntityItem::render(RenderArgs* args) { if (!success) { return; } - bool textured = false, culled = false, emissive = false; if (_texture) { batch._glActiveBindTexture(GL_TEXTURE0, GL_TEXTURE_2D, _texture); - textured = emissive = true; } DependencyManager::get()->bindSimpleSRGBTexturedUnlitNoTexAlphaProgram(batch);