From 0e66ca1dfda51fc19290e0e24cab877d5fc5fff4 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 18 May 2018 13:25:08 -0700 Subject: [PATCH] Fixing the procedural shader flickering key lighting, this is due to the LightingMOdel binding slot not assigned --- .../procedural/src/procedural/Procedural.cpp | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index f93605b730..7bf020094a 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -272,24 +272,29 @@ 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)); + 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)); + + // TODO: THis is a simple fix, we need a cleaner way to provide the "hosting" program for procedural custom shaders to be defined together with the required bindings. + const int PROCEDURAL_PROGRAM_LIGHTING_MODEL_SLOT = 3; + slotBindings.insert(gpu::Shader::Binding(std::string("lightingModelBuffer"), PROCEDURAL_PROGRAM_LIGHTING_MODEL_SLOT)); _opaqueFragmentShader = gpu::Shader::createPixel(opaqueShaderSource); _opaqueShader = gpu::Shader::createProgram(_vertexShader, _opaqueFragmentShader); - gpu::Shader::makeProgram(*_opaqueShader, slotBindings); + gpu::Shader::makeProgram(*_opaqueShader, 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; - } + 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);