From 9e462e777cd027db0b3d277eefde709b370da1e7 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 11 May 2018 11:01:24 +0200 Subject: [PATCH 1/2] Fixed compilation error with transparent procedurals --- .../procedural/src/procedural/Procedural.cpp | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index c155d5bd7f..259da163dd 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -270,18 +270,24 @@ void Procedural::prepare(gpu::Batch& batch, const glm::vec3& position, const glm // Leave this here for debugging // qCDebug(procedural) << "FragmentShader:\n" << fragmentShaderSource.c_str(); + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("iChannel0"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("iChannel1"), 1)); + slotBindings.insert(gpu::Shader::Binding(std::string("iChannel2"), 2)); + slotBindings.insert(gpu::Shader::Binding(std::string("iChannel3"), 3)); + _opaqueFragmentShader = gpu::Shader::createPixel(opaqueShaderSource); _opaqueShader = gpu::Shader::createProgram(_vertexShader, _opaqueFragmentShader); - _transparentFragmentShader = gpu::Shader::createPixel(transparentShaderSource); - _transparentShader = gpu::Shader::createProgram(_vertexShader, _transparentFragmentShader); + gpu::Shader::makeProgram(*_opaqueShader, slotBindings); - gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("iChannel0"), 0)); - slotBindings.insert(gpu::Shader::Binding(std::string("iChannel1"), 1)); - slotBindings.insert(gpu::Shader::Binding(std::string("iChannel2"), 2)); - slotBindings.insert(gpu::Shader::Binding(std::string("iChannel3"), 3)); - gpu::Shader::makeProgram(*_opaqueShader, slotBindings); - gpu::Shader::makeProgram(*_transparentShader, slotBindings); + if (!transparentShaderSource.empty() && transparentShaderSource != opaqueShaderSource) { + _transparentFragmentShader = gpu::Shader::createPixel(transparentShaderSource); + _transparentShader = gpu::Shader::createProgram(_vertexShader, _transparentFragmentShader); + gpu::Shader::makeProgram(*_transparentShader, slotBindings); + } else { + _transparentFragmentShader = _opaqueFragmentShader; + _transparentShader = _opaqueShader; + } _opaquePipeline = gpu::Pipeline::create(_opaqueShader, _opaqueState); _transparentPipeline = gpu::Pipeline::create(_transparentShader, _transparentState); From ff88911f93ef0df2d0ae8f9a7cd2bdcf780c4753 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 11 May 2018 12:26:03 +0200 Subject: [PATCH 2/2] Protected procedural skyboxes from NaNs and negative values returned by procedural shader --- libraries/graphics/src/graphics/skybox.slf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/graphics/src/graphics/skybox.slf b/libraries/graphics/src/graphics/skybox.slf index 7b25e36af7..153e73b9ef 100755 --- a/libraries/graphics/src/graphics/skybox.slf +++ b/libraries/graphics/src/graphics/skybox.slf @@ -35,8 +35,11 @@ void main(void) { #ifdef PROCEDURAL vec3 color = getSkyboxColor(); - // Procedural Shaders are expected to be Gamma corrected so let's bring back the RGB in linear space for the rest of the pipeline - color = pow(color, vec3(2.2)); + // Protect from NaNs and negative values + color = mix(color, vec3(0), isnan(color)); + color = max(color, vec3(0)); + // Procedural Shaders are expected to be Gamma corrected so let's bring back the RGB in linear space for the rest of the pipeline + color = pow(color, vec3(2.2)); _fragColor = vec4(color, 0.0); // FIXME: scribe does not yet scrub out else statements