From dfa8cb5c80fd6617dbdc3a17b7544431acf1b74c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 3 Jun 2015 23:11:14 -0700 Subject: [PATCH 01/16] Fixing the skinned mesh rendering issue --- libraries/render-utils/src/Model.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 312890a188..2082b66a87 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2329,20 +2329,28 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran return; // FIXME! } - if (state.clusterMatrices.size() > 1) { + if (isSkinned) { + //if (state.clusterMatrices.size() > 1) { GLBATCH(glUniformMatrix4fv)(locations->clusterMatrices, state.clusterMatrices.size(), false, (const float*)state.clusterMatrices.constData()); - // batch.setModelTransform(Transform()); + + _transforms[0].setIdentity(); _transforms[0].setTranslation(_translation); + // batch.setModelTransform(Transform()); + batch.setModelTransform(_transforms[0]); + //_transforms[0] = _viewState->getViewTransform(); + // args->_viewFrustum->evalViewTransform(_transforms[0]); + // _transforms[0].preTranslate(-_translation); + // batch.setViewTransform(_transforms[0]); } else { _transforms[0] = Transform(state.clusterMatrices[0]); _transforms[0].preTranslate(_translation); //batch.setModelTransform(Transform(state.clusterMatrices[0])); + batch.setModelTransform(_transforms[0]); } - batch.setModelTransform(_transforms[0]); - + if (mesh.blendshapes.isEmpty()) { batch.setInputFormat(networkMesh._vertexFormat); From fabe8f1a7a2b6fa124e61edbc585b19737895dfa Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 3 Jun 2015 23:18:24 -0700 Subject: [PATCH 02/16] Fixing the skinned mesh rendering issue --- libraries/render-utils/src/Model.cpp | 33 ++++++---------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 2082b66a87..782b9f0143 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2264,24 +2264,7 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran gpu::Batch& batch = *(args->_batch); auto mode = args->_renderMode; - // Capture the view matrix once for the rendering of this model - if (_transforms.empty()) { - _transforms.push_back(Transform()); - } - - // _transforms[0] = _viewState->getViewTransform(); - // args->_viewFrustum->evalViewTransform(_transforms[0]); - - // apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space) - // _transforms[0].setTranslation(_translation); - - // batch.setViewTransform(_transforms[0]); - - - // const float OPAQUE_ALPHA_THRESHOLD = 0.5f; - // const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; - // auto alphaThreshold = translucent ? TRANSPARENT_ALPHA_THRESHOLD : OPAQUE_ALPHA_THRESHOLD; // FIX ME - auto alphaThreshold = args->_alphaThreshold; //translucent ? TRANSPARENT_ALPHA_THRESHOLD : OPAQUE_ALPHA_THRESHOLD; // FIX ME + auto alphaThreshold = args->_alphaThreshold; const FBXGeometry& geometry = _geometry->getFBXGeometry(); const QVector& networkMeshes = _geometry->getMeshes(); @@ -2328,21 +2311,19 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran // sanity check return; // FIXME! } + + // Transform stage + if (_transforms.empty()) { + _transforms.push_back(Transform()); + } if (isSkinned) { - //if (state.clusterMatrices.size() > 1) { GLBATCH(glUniformMatrix4fv)(locations->clusterMatrices, state.clusterMatrices.size(), false, (const float*)state.clusterMatrices.constData()); _transforms[0].setIdentity(); _transforms[0].setTranslation(_translation); - // batch.setModelTransform(Transform()); batch.setModelTransform(_transforms[0]); - - //_transforms[0] = _viewState->getViewTransform(); - // args->_viewFrustum->evalViewTransform(_transforms[0]); - // _transforms[0].preTranslate(-_translation); - // batch.setViewTransform(_transforms[0]); } else { _transforms[0] = Transform(state.clusterMatrices[0]); _transforms[0].preTranslate(_translation); @@ -2351,7 +2332,7 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran batch.setModelTransform(_transforms[0]); } - + // Input stage if (mesh.blendshapes.isEmpty()) { batch.setInputFormat(networkMesh._vertexFormat); batch.setInputStream(0, *networkMesh._vertexStream); From 329a3b4c7daf23b1c44c8fa59086882e542e7a6e Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 3 Jun 2015 23:29:32 -0700 Subject: [PATCH 03/16] force the worldbox to use the simple program which should fix its rendering --- interface/src/Application.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 573ac160ff..c8f7cedf6c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3190,12 +3190,15 @@ namespace render { template <> void payloadRender(const WorldBoxRenderData::Pointer& stuff, RenderArgs* args) { if (args->_renderMode != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { PerformanceTimer perfTimer("worldBox"); + + DependencyManager::get()->bindSimpleProgram((*args->_batch)); + renderWorldBox(args); // FIXME: there's currently a bug in the new render engine, if this origin dot is rendered out of view it will // screw up the state of textures on models so they all end up rendering in the incorrect tint/color/texture float originSphereRadius = 0.05f; - DependencyManager::get()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); + DependencyManager::get()->renderSphere((*args->_batch), originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); } } } From 08ea3368d731e71346ab81cca9b3567be9ef9cac Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 5 Jun 2015 13:10:51 -0700 Subject: [PATCH 04/16] hacking on DrawTask perf --- libraries/render/src/render/DrawTask.cpp | 120 +++++++++++++++++------ 1 file changed, 92 insertions(+), 28 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index c0a1639f8b..fe856c54e1 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -9,6 +9,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include + +#include + #include "DrawTask.h" #include @@ -19,9 +24,6 @@ #include "ViewFrustum.h" #include "RenderArgs.h" -#include -#include - using namespace render; DrawSceneTask::DrawSceneTask() : Task() { @@ -70,7 +72,12 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont // Culling / LOD for (auto id : inItems) { auto item = scene->getItem(id); - auto bound = item.getBound(); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + + bound = item.getBound(); + } if (bound.isNull()) { outItems.push_back(id); // One more Item to render @@ -79,9 +86,17 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont // TODO: some entity types (like lights) might want to be rendered even // when they are outside of the view frustum... - bool outOfView = args->_viewFrustum->boxInFrustum(bound) == ViewFrustum::OUTSIDE; + bool outOfView; + { + PerformanceTimer perfTimer("boxInFrustum"); + outOfView = args->_viewFrustum->boxInFrustum(bound) == ViewFrustum::OUTSIDE; + } if (!outOfView) { - bool bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; + bool bigEnoughToRender; + { + PerformanceTimer perfTimer("shouldRender"); + bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; + } if (bigEnoughToRender) { outItems.push_back(id); // One more Item to render } else { @@ -123,36 +138,85 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; + // Allocate and simply copy outItems.reserve(inItems.size()); - - // Make a local dataset of the center distance and closest point distance - std::vector itemBounds; - itemBounds.reserve(outItems.size()); - - for (auto id : inItems) { - auto item = scene->getItem(id); - auto bound = item.getBound(); - float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); - itemBounds.emplace_back(ItemBound(distance, distance, distance, id)); - } + #if 0 /// NEW WAY + { + PerformanceTimer perfTimer("newWay"); + + // TODO: use a QMap which would give us automatic sorting. + QMap depths; + QList sortedItems; + + { + PerformanceTimer perfTimer("part1"); - // sort against Z - if (frontToBack) { - FrontToBackSort frontToBackSort; - std::sort (itemBounds.begin(), itemBounds.end(), frontToBackSort); - } else { - BackToFrontSort backToFrontSort; - std::sort (itemBounds.begin(), itemBounds.end(), backToFrontSort); - } + for (auto id : inItems) { + auto item = scene->getItem(id); + auto bound = item.getBound(); + float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); + float key = frontToBack ? -distance : distance; + + depths.insertMulti(key, id); + } + } + { + PerformanceTimer perfTimer("part2"); + sortedItems = depths.values(); + } + + { + PerformanceTimer perfTimer("part3"); + for ( auto sortedID : sortedItems) { + outItems.emplace_back(sortedID); + } + } - // FInally once sorted result to a list of itemID - for (auto& itemBound : itemBounds) { - outItems.emplace_back(itemBound._id); } + #else /// OLD WAY + { + PerformanceTimer perfTimer("oldWay"); + + // Make a local dataset of the center distance and closest point distance + std::vector itemBounds; + { + PerformanceTimer perfTimer("part1"); + itemBounds.reserve(outItems.size()); + + for (auto id : inItems) { + auto item = scene->getItem(id); + auto bound = item.getBound(); + float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); + + itemBounds.emplace_back(ItemBound(distance, distance, distance, id)); + } + } + + { + PerformanceTimer perfTimer("part2"); + // sort against Z + if (frontToBack) { + FrontToBackSort frontToBackSort; + std::sort (itemBounds.begin(), itemBounds.end(), frontToBackSort); + } else { + BackToFrontSort backToFrontSort; + std::sort (itemBounds.begin(), itemBounds.end(), backToFrontSort); + } + } + + { + PerformanceTimer perfTimer("part3"); + // FInally once sorted result to a list of itemID + for (auto& itemBound : itemBounds) { + outItems.emplace_back(itemBound._id); + } + } + } + #endif } void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, int maxDrawnItems) { From 8d3a3221b030f979814765c44f617dd48cc51713 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sat, 6 Jun 2015 09:50:56 -0700 Subject: [PATCH 05/16] shuffling the rendering steps to get to render transparent and light it correctly --- examples/utilities/tools/renderEngineDebug.js | 6 +- libraries/gpu/src/gpu/Context.h | 10 +- libraries/gpu/src/gpu/Format.h | 6 +- libraries/gpu/src/gpu/Resource.cpp | 2 - libraries/gpu/src/gpu/Transform.slh | 16 +++ .../src/DeferredLightingEffect.cpp | 35 +++++-- .../render-utils/src/DeferredLightingEffect.h | 15 +-- libraries/render-utils/src/Model.cpp | 6 ++ .../render-utils/src/RenderDeferredTask.cpp | 99 ++++++++++++++++++- .../render-utils/src/RenderDeferredTask.h | 16 ++- libraries/render-utils/src/TextureCache.cpp | 10 ++ libraries/render-utils/src/TextureCache.h | 4 + libraries/render-utils/src/model.slv | 5 +- .../render-utils/src/model_translucent.slf | 71 ++++++++++++- libraries/render-utils/src/skin_model.slv | 5 +- .../src/skin_model_normal_map.slv | 9 +- 16 files changed, 271 insertions(+), 44 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 3893b8b90e..79b0010210 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -66,19 +66,19 @@ panel.newCheckbox("Enable Render Transparent", function(value) { return (value); } ); -panel.newSlider("Num Feed Transparents", 0, 1000, +panel.newSlider("Num Feed Transparents", 0, 100, function(value) { }, function() { return Scene.getEngineNumFeedTransparentItems(); }, function(value) { return (value); } ); -panel.newSlider("Num Drawn Transparents", 0, 1000, +panel.newSlider("Num Drawn Transparents", 0, 100, function(value) { }, function() { return Scene.getEngineNumDrawnTransparentItems(); }, function(value) { return (value); } ); -panel.newSlider("Max Drawn Transparents", -1, 1000, +panel.newSlider("Max Drawn Transparents", -1, 100, function(value) { Scene.setEngineMaxDrawnTransparentItems(value); }, function() { return Scene.getEngineMaxDrawnTransparentItems(); }, function(value) { return (value); } diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 99021d2731..98ddc7fb64 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -13,6 +13,8 @@ #include +#include "Batch.h" + #include "Resource.h" #include "Texture.h" #include "Pipeline.h" @@ -20,14 +22,6 @@ namespace gpu { -class GPUObject { -public: - GPUObject() {} - virtual ~GPUObject() {} -}; - -class Batch; - class Backend { public: diff --git a/libraries/gpu/src/gpu/Format.h b/libraries/gpu/src/gpu/Format.h index 3ee32ffc56..7cf913430d 100644 --- a/libraries/gpu/src/gpu/Format.h +++ b/libraries/gpu/src/gpu/Format.h @@ -16,7 +16,11 @@ namespace gpu { -class GPUObject; +class GPUObject { +public: + GPUObject() {} + virtual ~GPUObject() {} +}; typedef int Stamp; diff --git a/libraries/gpu/src/gpu/Resource.cpp b/libraries/gpu/src/gpu/Resource.cpp index 7d2757e15c..046cf9fe40 100644 --- a/libraries/gpu/src/gpu/Resource.cpp +++ b/libraries/gpu/src/gpu/Resource.cpp @@ -8,8 +8,6 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // - -#include "Context.h" #include "Resource.h" #include diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 57a367fdba..65f97981f1 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -103,6 +103,22 @@ TransformCamera getTransformCamera() { <@endif@> <@endfunc@> +<@func $transformModelToEyeAndClipPos(cameraTransform, objectTransform, modelPos, eyePos, clipPos)@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> + + { // transformModelToClipPos + vec4 _worldpos = (<$objectTransform$>._model * <$modelPos$>); + <$eyePos$> = (<$cameraTransform$>._viewInverse * _worldpos); + vec4 _eyepos =(<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0); + <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos; + } +<@else@> + <$eyePos$> = gl_ModelViewMatrix * <$modelPos$>; + <$clipPos$> = gl_ModelViewProjectionMatrix * <$modelPos$>; +<@endif@> +<@endfunc@> + <@func transformModelToEyeDir(cameraTransform, objectTransform, modelDir, eyeDir)@> <@if GPU_TRANSFORM_PROFILE == GPU_CORE@> { // transformModelToEyeDir diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 4398c1c3cc..c953107b79 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -219,6 +219,7 @@ void DeferredLightingEffect::render() { QSize framebufferSize = textureCache->getFrameBufferSize(); + // binding the first framebuffer auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(freeFBO)); @@ -489,11 +490,20 @@ void DeferredLightingEffect::render() { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); + // glDisable(GL_FRAMEBUFFER_SRGB); + // End of the Lighting pass +} + +void DeferredLightingEffect::copyBack(RenderArgs* args) { + auto textureCache = DependencyManager::get(); + QSize framebufferSize = textureCache->getFrameBufferSize(); + + auto freeFBO = DependencyManager::get()->getFreeFramebuffer(); + //freeFBO->release(); glBindFramebuffer(GL_FRAMEBUFFER, 0); - // glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_CULL_FACE); @@ -516,6 +526,18 @@ void DeferredLightingEffect::render() { glPushMatrix(); glLoadIdentity(); + int viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + const int VIEWPORT_X_INDEX = 0; + const int VIEWPORT_Y_INDEX = 1; + const int VIEWPORT_WIDTH_INDEX = 2; + const int VIEWPORT_HEIGHT_INDEX = 3; + + float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); + float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); + float tMin = viewport[VIEWPORT_Y_INDEX] / (float)framebufferSize.height(); + float tHeight = viewport[VIEWPORT_HEIGHT_INDEX] / (float)framebufferSize.height(); + renderFullscreenQuad(sMin, sMin + sWidth, tMin, tMin + tHeight); glBindTexture(GL_TEXTURE_2D, 0); @@ -531,12 +553,11 @@ void DeferredLightingEffect::render() { glMatrixMode(GL_MODELVIEW); glPopMatrix(); - - // now render the objects we held back until after deferred lighting - foreach (PostLightingRenderable* renderable, _postLightingRenderables) { - renderable->renderPostLighting(); - } - _postLightingRenderables.clear(); +} + +void DeferredLightingEffect::setupTransparent(RenderArgs* args) { + auto globalLight = _allocatedLights[_globalLights.front()]; + args->_batch->setUniformBuffer(4, globalLight->getSchemaBuffer()); } void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limited, ProgramObject& program, LightLocations& locations) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index 58e5e35829..e8e402f27a 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -23,7 +23,7 @@ #include "model/Stage.h" class AbstractViewStateInterface; -class PostLightingRenderable; +class RenderArgs; /// Handles deferred lighting for the bits that require it (voxels...) class DeferredLightingEffect : public Dependency { @@ -66,11 +66,11 @@ public: void addSpotLight(const glm::vec3& position, float radius, const glm::vec3& color = glm::vec3(1.0f, 1.0f, 1.0f), float intensity = 0.5f, const glm::quat& orientation = glm::quat(), float exponent = 0.0f, float cutoff = PI); - /// Adds an object to render after performing the deferred lighting for the current frame (e.g., a translucent object). - void addPostLightingRenderable(PostLightingRenderable* renderable) { _postLightingRenderables.append(renderable); } - void prepare(); void render(); + void copyBack(RenderArgs* args); + + void setupTransparent(RenderArgs* args); // update global lighting void setAmbientLightMode(int preset); @@ -153,7 +153,6 @@ private: std::vector _globalLights; std::vector _pointLights; std::vector _spotLights; - QVector _postLightingRenderables; AbstractViewStateInterface* _viewState; @@ -162,10 +161,4 @@ private: model::SkyboxPointer _skybox; }; -/// Simple interface for objects that require something to be rendered after deferred lighting. -class PostLightingRenderable { -public: - virtual void renderPostLighting() = 0; -}; - #endif // hifi_DeferredLightingEffect_h diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 473b843099..e1af8c69b2 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -112,6 +112,7 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), 1)); slotBindings.insert(gpu::Shader::Binding(std::string("specularMap"), 2)); slotBindings.insert(gpu::Shader::Binding(std::string("emissiveMap"), 3)); + slotBindings.insert(gpu::Shader::Binding(std::string("lightBuffer"), 4)); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); gpu::Shader::makeProgram(*program, slotBindings); @@ -2158,6 +2159,11 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran const FBXMeshPart& part = mesh.parts.at(partIndex); model::MaterialPointer material = part._material; + float shininess = 0; + if (translucent) { + shininess = material->getShininess(); + } + if (material == nullptr) { // qCDebug(renderutils) << "WARNING: material == nullptr!!!"; } diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 1fccb57cee..7fc27be5f2 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -10,7 +10,11 @@ // #include "RenderDeferredTask.h" +#include "gpu/Batch.h" #include "gpu/Context.h" +#include "DeferredLightingEffect.h" +#include "ViewFrustum.h" +#include "RenderArgs.h" #include @@ -22,9 +26,15 @@ template <> void render::jobRun(const PrepareDeferred& job, const SceneContextPo DependencyManager::get()->prepare(); } +template <> void render::jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + PerformanceTimer perfTimer("RenderDeferred"); + DependencyManager::get()->render(); +// renderContext->args->_context->syncCache(); +} + template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("ResolveDeferred"); - DependencyManager::get()->render(); + DependencyManager::get()->copyBack(renderContext->args); } @@ -34,10 +44,11 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(DrawBackground())); _jobs.push_back(Job(DrawOpaque())); _jobs.push_back(Job(DrawLight())); - _jobs.push_back(Job(DrawTransparent())); _jobs.push_back(Job(ResetGLState())); + _jobs.push_back(Job(RenderDeferred())); _jobs.push_back(Job(ResolveDeferred())); - + _jobs.push_back(Job(DrawTransparentDeferred())); + _jobs.push_back(Job(ResetGLState())); } RenderDeferredTask::~RenderDeferredTask() { @@ -62,3 +73,85 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend job.run(sceneContext, renderContext); } }; + + + +template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + PerformanceTimer perfTimer("DrawTransparentDeferred"); + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); + + // render transparents + auto& scene = sceneContext->_scene; + auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); + + ItemIDs inItems; + inItems.reserve(items.size()); + for (auto id : items) { + inItems.push_back(id); + } + ItemIDs& renderedItems = inItems; + + renderContext->_numFeedTransparentItems = renderedItems.size(); + + ItemIDs culledItems; + if (renderContext->_cullTransparent) { + cullItems(sceneContext, renderContext, inItems, culledItems); + renderedItems = culledItems; + } + + renderContext->_numDrawnTransparentItems = renderedItems.size(); + + ItemIDs sortedItems; + if (renderContext->_sortTransparent) { + depthSortItems(sceneContext, renderContext, false, renderedItems, sortedItems); // Sort Back to front transparent items! + renderedItems = sortedItems; + } + + if (renderContext->_renderTransparent) { + RenderArgs* args = renderContext->args; + gpu::Batch batch; + args->_batch = &batch; + + DependencyManager::get()->setupTransparent(renderContext->args); + + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + + args->_renderMode = RenderArgs::NORMAL_RENDER_MODE; + + const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; + const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; + + /* // render translucent meshes afterwards + { + GLenum buffers[2]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; + batch._glDrawBuffers(bufferCount, buffers); + args->_alphaThreshold = MOSTLY_OPAQUE_THRESHOLD; + } + + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); +*/ + { + GLenum buffers[3]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; + batch._glDrawBuffers(bufferCount, buffers); + args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; + } + + + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); + + args->_context->render((*args->_batch)); + args->_batch = nullptr; + } +} diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 318859e71c..17971dbfac 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -14,8 +14,6 @@ #include "render/DrawTask.h" -#include "DeferredLightingEffect.h" - class PrepareDeferred { public: }; @@ -23,6 +21,13 @@ namespace render { template <> void jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); } +class RenderDeferred { +public: +}; +namespace render { +template <> void jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +} + class ResolveDeferred { public: }; @@ -30,6 +35,13 @@ namespace render { template <> void jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); } +class DrawTransparentDeferred { +public: +}; +namespace render { +template <> void jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +} + class RenderDeferredTask : public render::Task { public: diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 97385cb060..354db7bc8d 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -52,6 +52,8 @@ void TextureCache::setFrameBufferSize(QSize frameBufferSize) { _primaryNormalTexture.reset(); _primarySpecularTexture.reset(); + _transparentFramebuffer.reset(); + _secondaryFramebuffer.reset(); _tertiaryFramebuffer.reset(); @@ -264,6 +266,14 @@ void TextureCache::setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool nor batch._glDrawBuffers(bufferCount, buffers); } +gpu::FramebufferPointer TextureCache::getTransparentFramebuffer() { + if (!_transparentFramebuffer) { + _transparentFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())); + _transparentFramebuffer->setDepthStencilBuffer(getPrimaryDepthTexture(), getPrimaryDepthTexture()->getTexelFormat()); + } + return _transparentFramebuffer; +} + gpu::FramebufferPointer TextureCache::getSecondaryFramebuffer() { if (!_secondaryFramebuffer) { _secondaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())); diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index ba7176b2a4..f5f9d976a8 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -71,6 +71,8 @@ public: gpu::TexturePointer getPrimaryNormalTexture(); gpu::TexturePointer getPrimarySpecularTexture(); + gpu::FramebufferPointer getTransparentFramebuffer(); + /// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering. GLuint getPrimaryDepthTextureID(); GLuint getPrimaryColorTextureID(); @@ -124,6 +126,8 @@ private: gpu::FramebufferPointer _primaryFramebuffer; void createPrimaryFramebuffer(); + gpu::FramebufferPointer _transparentFramebuffer; + gpu::FramebufferPointer _secondaryFramebuffer; gpu::FramebufferPointer _tertiaryFramebuffer; diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 97b5eb640b..2d22c0df51 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -19,6 +19,9 @@ const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; +// interpolated eye position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -35,7 +38,7 @@ void main(void) { // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 9b34951f88..9d39bf98a1 100755 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -11,8 +11,7 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // - -<@include DeferredBufferWrite.slh@> + <@include model/Material.slh@> @@ -39,4 +38,72 @@ void main(void) { // set the diffuse data // gl_FragData[0] = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].st); +}*/!> +<@include model/Material.slh@> + +// Everything about global lighting + +<@include DeferredLighting.slh@> +<@include gpu/Transform.slh@> +<$declareStandardTransform()$> + + +// Everything about light +<@include model/Light.slh@> + +// The view Matrix +//uniform mat4 invViewMat; + +vec3 evalAmbienGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) { + + // Need the light now + Light light = getLight(); + TransformCamera cam = getTransformCamera(); + mat4 invViewMat = cam._viewInverse; + + vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); + vec4 fragEyeVector = invViewMat * vec4(-position, 0.0); + vec3 fragEyeDir = normalize(fragEyeVector.xyz); + + vec3 color = diffuse.rgb * getLightColor(light) * getLightAmbientIntensity(light); + + vec4 shading = evalFragShading(fragNormal, -getLightDirection(light), fragEyeDir, specular, gloss); + + color += vec3(diffuse + shading.rgb) * shading.w * shadowAttenuation * getLightColor(light) * getLightIntensity(light); + + return color; +} + +// the diffuse texture +uniform sampler2D diffuseMap; + +// the interpolated view position +varying vec4 interpolatedPosition; + +// the interpolated normal +varying vec4 interpolatedNormal; + +varying vec3 color; + +void main(void) { + vec3 fragPosition = interpolatedPosition.xyz; + + // Fetch diffuse map + vec4 diffuse = texture2D(diffuseMap, gl_TexCoord[0].st); + + Material mat = getMaterial(); + vec3 fragNormal = normalize(interpolatedNormal.xyz); + float fragOpacity = getMaterialOpacity(mat) * diffuse.a; + vec3 fragDiffuse = getMaterialDiffuse(mat) * diffuse.rgb * color; + vec3 fragSpecular = getMaterialSpecular(mat); + float fragGloss = getMaterialShininess(mat); + + vec3 color = evalAmbienGlobalColor(1.0, + fragPosition, + fragNormal, + fragDiffuse, + fragSpecular, + fragGloss); + + gl_FragColor = vec4(color, fragOpacity); } diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index c94fc0d151..459072e747 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -25,6 +25,9 @@ uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; attribute vec4 clusterIndices; attribute vec4 clusterWeights; +// interpolated eye position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -49,7 +52,7 @@ void main(void) { // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, position, gl_Position)$> + <$transformModelToWorldAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index ed552a7aca..3f815ba47e 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -28,6 +28,9 @@ attribute vec3 tangent; attribute vec4 clusterIndices; attribute vec4 clusterWeights; +// interpolated eye position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -37,13 +40,13 @@ varying vec4 interpolatedTangent; varying vec3 color; void main(void) { - vec4 interpolatedPosition = vec4(0.0, 0.0, 0.0, 0.0); + vec4 position = vec4(0.0, 0.0, 0.0, 0.0); interpolatedNormal = vec4(0.0, 0.0, 0.0, 0.0); interpolatedTangent = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < INDICES_PER_VERTEX; i++) { mat4 clusterMatrix = clusterMatrices[int(clusterIndices[i])]; float clusterWeight = clusterWeights[i]; - interpolatedPosition += clusterMatrix * gl_Vertex * clusterWeight; + position += clusterMatrix * gl_Vertex * clusterWeight; interpolatedNormal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; interpolatedTangent += clusterMatrix * vec4(tangent, 0.0) * clusterWeight; } @@ -60,7 +63,7 @@ void main(void) { // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, interpolatedPosition, gl_Position)$> + <$transformModelToEyeAndClipPos(cam, obj, position, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> <$transformModelToEyeDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$> From 5e04b399d86f4bcf6c9c4e2dfa4de3b41aa47165 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 03:07:17 -0700 Subject: [PATCH 06/16] fixing the wrong matrix used --- libraries/gpu/src/gpu/Transform.slh | 8 +++++--- libraries/render-utils/src/model.slv | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 7d630f2f47..772a69b951 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -86,6 +86,8 @@ TransformCamera getTransformCamera() { return camera; } +uniform mat4 cameraTransform_viewInverse; + <@endif@> <@endfunc@> @@ -109,10 +111,10 @@ TransformCamera getTransformCamera() { //return camera._projection * camera._view * object._model * pos; !> { // transformModelToClipPos vec4 _worldpos = (<$objectTransform$>._model * <$modelPos$>); - // <$eyePos$> = (<$cameraTransform$>._viewInverse * _worldpos); + <$eyePos$> = (<$cameraTransform$>._view * _worldpos); vec4 _eyepos =(<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0); <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos; - <$eyePos$> = (<$cameraTransform$>._projectionInverse * <$clipPos$>); + // <$eyePos$> = (<$cameraTransform$>._projectionInverse * <$clipPos$>); } <@else@> <$eyePos$> = gl_ModelViewMatrix * <$modelPos$>; @@ -144,7 +146,7 @@ TransformCamera getTransformCamera() { <$worldDir$> = vec3(<$cameraTransform$>._viewInverse * vec4(<$eyeDir$>.xyz, 0.0)); } <@else@> - <$worldDir$> = vec3(gl_ModelViewMatrixInverse * vec4(<$eyeDir$>.xyz, 0.0)); + <$worldDir$> = vec3(cameraTransform_viewInverse * vec4(<$eyeDir$>.xyz, 0.0)); <@endif@> <@endfunc@> diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index c400f1e8bf..2d22c0df51 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -40,6 +40,6 @@ void main(void) { TransformObject obj = getTransformObject(); <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> - // interpolatedPosition = (gl_Vertex); + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); } From 3196c5ca77829dbdd7f1b83b727615f41eacf055 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 05:41:36 -0700 Subject: [PATCH 07/16] better highlights blending --- libraries/render-utils/src/Model.cpp | 8 ++------ libraries/render-utils/src/RenderDeferredTask.cpp | 15 +++------------ libraries/render-utils/src/model_translucent.slf | 8 ++++---- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index b3c8fa63cf..99d06129e2 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -140,7 +140,8 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, // Blend on transparent state->setBlendFunction(key.isTranslucent(), - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + // gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::ONE, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); // Good to go add the brand new pipeline @@ -2175,11 +2176,6 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran const FBXMeshPart& part = mesh.parts.at(partIndex); model::MaterialPointer material = part._material; - float shininess = 0; - if (translucent) { - shininess = material->getShininess(); - } - if (material == nullptr) { // qCDebug(renderutils) << "WARNING: material == nullptr!!!"; } diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index f6641f7d0d..94a89488b0 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -130,18 +130,6 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; - /* // render translucent meshes afterwards - { - GLenum buffers[2]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - batch._glDrawBuffers(bufferCount, buffers); - args->_alphaThreshold = MOSTLY_OPAQUE_THRESHOLD; - } - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); -*/ { GLenum buffers[3]; int bufferCount = 0; @@ -155,5 +143,8 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC args->_context->render((*args->_batch)); args->_batch = nullptr; + + // reset blend function to standard... + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } } diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 89183066da..806b77dc15 100755 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -73,7 +73,7 @@ vec4 evalNormalColor(vec3 dir, float opacity) { return vec4(0.5 * dir + vec3(0.5), opacity); } -vec4 evalAmbienGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss, float opacity) { +vec4 evalGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss, float opacity) { // Need the light now Light light = getLight(); @@ -85,7 +85,7 @@ vec4 evalAmbienGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 fragEyeDir; <$transformEyeToWorldDir(cam, fragEyeVectorView, fragEyeDir)$> - vec3 color = diffuse.rgb * getLightColor(light) * getLightAmbientIntensity(light); + vec3 color = opacity * diffuse.rgb * getLightColor(light) * getLightAmbientIntensity(light); vec4 shading = evalFragShading(fragNormal, -getLightDirection(light), fragEyeDir, specular, gloss); @@ -118,7 +118,7 @@ void main(void) { vec3 fragSpecular = getMaterialSpecular(mat); float fragGloss = getMaterialShininess(mat); - vec4 fragColor = evalAmbienGlobalColor(1.0, + vec4 fragColor = evalGlobalColor(1.0, fragPosition, fragNormal, fragDiffuse, @@ -126,5 +126,5 @@ void main(void) { fragGloss, fragOpacity); - gl_FragColor = fragColor; //vec4(fragColor, fragOpacity); + gl_FragColor = fragColor; } From 054809d57009ac5a5d02801c39d7e857f3c792db Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 05:51:23 -0700 Subject: [PATCH 08/16] clean code for PR --- libraries/render-utils/src/Model.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 99d06129e2..4fc8c6a1f4 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -140,8 +140,7 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, // Blend on transparent state->setBlendFunction(key.isTranslucent(), - // gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::ONE, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::ONE, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, // For transparent only, this keep the highlight intensity gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); // Good to go add the brand new pipeline From c47cee3f3bdc14ec8788b859ce823d1d6d16256b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 05:59:10 -0700 Subject: [PATCH 09/16] clean code for PR --- libraries/render-utils/src/TextureCache.cpp | 10 ---------- libraries/render-utils/src/TextureCache.h | 4 ---- 2 files changed, 14 deletions(-) diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 354db7bc8d..97385cb060 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -52,8 +52,6 @@ void TextureCache::setFrameBufferSize(QSize frameBufferSize) { _primaryNormalTexture.reset(); _primarySpecularTexture.reset(); - _transparentFramebuffer.reset(); - _secondaryFramebuffer.reset(); _tertiaryFramebuffer.reset(); @@ -266,14 +264,6 @@ void TextureCache::setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool nor batch._glDrawBuffers(bufferCount, buffers); } -gpu::FramebufferPointer TextureCache::getTransparentFramebuffer() { - if (!_transparentFramebuffer) { - _transparentFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())); - _transparentFramebuffer->setDepthStencilBuffer(getPrimaryDepthTexture(), getPrimaryDepthTexture()->getTexelFormat()); - } - return _transparentFramebuffer; -} - gpu::FramebufferPointer TextureCache::getSecondaryFramebuffer() { if (!_secondaryFramebuffer) { _secondaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())); diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index f5f9d976a8..ba7176b2a4 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -71,8 +71,6 @@ public: gpu::TexturePointer getPrimaryNormalTexture(); gpu::TexturePointer getPrimarySpecularTexture(); - gpu::FramebufferPointer getTransparentFramebuffer(); - /// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering. GLuint getPrimaryDepthTextureID(); GLuint getPrimaryColorTextureID(); @@ -126,8 +124,6 @@ private: gpu::FramebufferPointer _primaryFramebuffer; void createPrimaryFramebuffer(); - gpu::FramebufferPointer _transparentFramebuffer; - gpu::FramebufferPointer _secondaryFramebuffer; gpu::FramebufferPointer _tertiaryFramebuffer; From b7d88e264210b807d9489cf32f7e9600f6398961 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 06:46:45 -0700 Subject: [PATCH 10/16] add apotential fix to the issue with viewInverse for Legacy transform path support --- libraries/gpu/src/gpu/GLBackend.h | 10 ++++++++++ libraries/gpu/src/gpu/GLBackendPipeline.cpp | 19 +++++++++++++++++++ libraries/gpu/src/gpu/GLBackendShader.cpp | 5 +++++ 3 files changed, 34 insertions(+) diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 5e3177c6ea..14fa6574b2 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -87,6 +87,11 @@ public: GLuint _transformCameraSlot = -1; GLuint _transformObjectSlot = -1; +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) +#else + GLuint _transformCamera_viewInverse = -1; +#endif + GLShader(); ~GLShader(); }; @@ -311,6 +316,11 @@ protected: GLuint _program; bool _invalidProgram; +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) +#else + GLuint _program_transformCamera_viewInverse = -1; +#endif + State::Data _stateCache; State::Signature _stateSignatureCache; diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index ec9be957ae..1dd4ea4c2b 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -71,6 +71,11 @@ void GLBackend::do_setPipeline(Batch& batch, uint32 paramOffset) { _pipeline._program = 0; _pipeline._invalidProgram = true; +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) +#else + _pipeline._program_transformCamera_viewInverse = -1 +#endif + _pipeline._state = nullptr; _pipeline._invalidState = true; } else { @@ -83,6 +88,11 @@ void GLBackend::do_setPipeline(Batch& batch, uint32 paramOffset) { if (_pipeline._program != pipelineObject->_program->_program) { _pipeline._program = pipelineObject->_program->_program; _pipeline._invalidProgram = true; + +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) +#else + _pipeline._program_transformCamera_viewInverse = pipelineObject->_program->_transformCamera_viewInverse; +#endif } // Now for the state @@ -130,6 +140,15 @@ void GLBackend::updatePipeline() { } _pipeline._invalidState = false; } + +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) +#else + // If shader program needs the inverseView we need to provide it + // YES InverseView in the shade is called View on the Batch interface + if (_pipeline._program_transformCamera_viewInverse >= 0) { + glUniformMatrix4fv(_pipeline._program_transformCamera_viewInverse, 1, false, &_transform._view); + } +#endif } void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 75b3df3e33..e0ea2f2d98 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -106,6 +106,11 @@ void makeBindings(GLBackend::GLShader* shader) { glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_CAMERA_SLOT); shader->_transformCameraSlot = gpu::TRANSFORM_CAMERA_SLOT; } +#else + loc = glGetUniformLocation(glprogram, "transformCamera_viewInverse"); + if (loc >= 0) { + shader->_transformCamera_viewInverse = loc; + } #endif } From 862d6abd796d486014c05b872be52fec6de7532f Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 06:57:04 -0700 Subject: [PATCH 11/16] Typo on mac build --- libraries/gpu/src/gpu/GLBackendPipeline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index 1dd4ea4c2b..1e34ceae17 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -73,7 +73,7 @@ void GLBackend::do_setPipeline(Batch& batch, uint32 paramOffset) { #if (GPU_TRANSFORM_PROFILE == GPU_CORE) #else - _pipeline._program_transformCamera_viewInverse = -1 + _pipeline._program_transformCamera_viewInverse = -1; #endif _pipeline._state = nullptr; From 8a93db6f5abfb82a286fcb2779b2e3e2a1a32506 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Jun 2015 07:25:32 -0700 Subject: [PATCH 12/16] more typos and issues on mac --- libraries/gpu/src/gpu/GLBackend.h | 6 +++--- libraries/gpu/src/gpu/GLBackendPipeline.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 14fa6574b2..48262c9fe4 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -84,8 +84,8 @@ public: GLuint _shader; GLuint _program; - GLuint _transformCameraSlot = -1; - GLuint _transformObjectSlot = -1; + GLint _transformCameraSlot = -1; + GLint _transformObjectSlot = -1; #if (GPU_TRANSFORM_PROFILE == GPU_CORE) #else @@ -318,7 +318,7 @@ protected: #if (GPU_TRANSFORM_PROFILE == GPU_CORE) #else - GLuint _program_transformCamera_viewInverse = -1; + GLint _program_transformCamera_viewInverse = -1; #endif State::Data _stateCache; diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index 1e34ceae17..5e8cb56d9e 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -146,7 +146,7 @@ void GLBackend::updatePipeline() { // If shader program needs the inverseView we need to provide it // YES InverseView in the shade is called View on the Batch interface if (_pipeline._program_transformCamera_viewInverse >= 0) { - glUniformMatrix4fv(_pipeline._program_transformCamera_viewInverse, 1, false, &_transform._view); + glUniformMatrix4fv(_pipeline._program_transformCamera_viewInverse, 1, false, (const GLfloat*) &_transform._view); } #endif } From 1bff9a17e180bec94f6621929b8d71e74ea79c87 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 8 Jun 2015 17:05:28 +0200 Subject: [PATCH 13/16] Fixing compilation issues and shader issues on Mac, not fully fixing the transparency though --- libraries/gpu/src/gpu/Transform.slh | 4 ++-- libraries/render-utils/src/model_normal_map.slv | 5 ++++- libraries/render-utils/src/skin_model.slv | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 772a69b951..d01fe128ae 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -86,7 +86,7 @@ TransformCamera getTransformCamera() { return camera; } -uniform mat4 cameraTransform_viewInverse; +uniform mat4 transformCamera_viewInverse; <@endif@> <@endfunc@> @@ -146,7 +146,7 @@ uniform mat4 cameraTransform_viewInverse; <$worldDir$> = vec3(<$cameraTransform$>._viewInverse * vec4(<$eyeDir$>.xyz, 0.0)); } <@else@> - <$worldDir$> = vec3(cameraTransform_viewInverse * vec4(<$eyeDir$>.xyz, 0.0)); + <$worldDir$> = vec3(transformCamera_viewInverse * vec4(<$eyeDir$>.xyz, 0.0)); <@endif@> <@endfunc@> diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 2f493053dd..58eb03e564 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -23,6 +23,9 @@ uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; // the tangent vector attribute vec3 tangent; +// interpolated eye position +varying vec4 interpolatedPosition; + // the interpolated normal varying vec4 interpolatedNormal; @@ -45,7 +48,7 @@ void main(void) { // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 459072e747..9762d45f93 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -25,7 +25,7 @@ uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; attribute vec4 clusterIndices; attribute vec4 clusterWeights; -// interpolated eye position +// interpolated eye position varying vec4 interpolatedPosition; // the interpolated normal @@ -52,7 +52,7 @@ void main(void) { // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToWorldAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> + <$transformModelToEyeAndClipPos(cam, obj, gl_Vertex, interpolatedPosition, gl_Position)$> <$transformModelToEyeDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); From 46a8b831fc0110cbb8465eaf76897ec33c9b616c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Jun 2015 09:01:12 -0700 Subject: [PATCH 14/16] cache bounds with item ids in DrawTask --- libraries/render/src/render/DrawTask.cpp | 134 ++++++++--------------- libraries/render/src/render/DrawTask.h | 6 +- libraries/render/src/render/Scene.h | 11 ++ 3 files changed, 57 insertions(+), 94 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index fe856c54e1..fd4534384b 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -58,7 +58,7 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon Job::~Job() { } -void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, ItemIDs& outItems) { +void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { PerformanceTimer perfTimer("cullItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -70,8 +70,8 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont renderDetails->_considered += inItems.size(); // Culling / LOD - for (auto id : inItems) { - auto item = scene->getItem(id); + for (auto itemDetails : inItems) { + auto item = scene->getItem(itemDetails.id); AABox bound; { PerformanceTimer perfTimer("getBound"); @@ -80,7 +80,7 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont } if (bound.isNull()) { - outItems.push_back(id); // One more Item to render + outItems.push_back(ItemIDAndBounds(itemDetails.id)); // One more Item to render continue; } @@ -98,7 +98,7 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; } if (bigEnoughToRender) { - outItems.push_back(id); // One more Item to render + outItems.push_back(ItemIDAndBounds(itemDetails.id, bound)); // One more Item to render } else { renderDetails->_tooSmall++; } @@ -131,7 +131,7 @@ struct BackToFrontSort { } }; -void render::depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDs& inItems, ItemIDs& outItems) { +void render::depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { PerformanceTimer perfTimer("depthSortItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -144,95 +144,47 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende outItems.reserve(inItems.size()); - #if 0 /// NEW WAY - { - PerformanceTimer perfTimer("newWay"); - - // TODO: use a QMap which would give us automatic sorting. - QMap depths; - QList sortedItems; - - { - PerformanceTimer perfTimer("part1"); + // Make a local dataset of the center distance and closest point distance + std::vector itemBounds; + itemBounds.reserve(outItems.size()); - for (auto id : inItems) { - auto item = scene->getItem(id); - auto bound = item.getBound(); - float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); - float key = frontToBack ? -distance : distance; - - depths.insertMulti(key, id); - } - } - { - PerformanceTimer perfTimer("part2"); - sortedItems = depths.values(); - } - - { - PerformanceTimer perfTimer("part3"); - for ( auto sortedID : sortedItems) { - outItems.emplace_back(sortedID); - } - } + for (auto itemDetails : inItems) { + auto item = scene->getItem(itemDetails.id); + auto bound = itemDetails.bounds; // item.getBound(); + float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); + itemBounds.emplace_back(ItemBound(distance, distance, distance, itemDetails.id)); } - #else /// OLD WAY - { - PerformanceTimer perfTimer("oldWay"); - // Make a local dataset of the center distance and closest point distance - std::vector itemBounds; - { - PerformanceTimer perfTimer("part1"); - itemBounds.reserve(outItems.size()); - - for (auto id : inItems) { - auto item = scene->getItem(id); - auto bound = item.getBound(); - float distance = args->_viewFrustum->distanceToCamera(bound.calcCenter()); - - itemBounds.emplace_back(ItemBound(distance, distance, distance, id)); - } - } - - { - PerformanceTimer perfTimer("part2"); - // sort against Z - if (frontToBack) { - FrontToBackSort frontToBackSort; - std::sort (itemBounds.begin(), itemBounds.end(), frontToBackSort); - } else { - BackToFrontSort backToFrontSort; - std::sort (itemBounds.begin(), itemBounds.end(), backToFrontSort); - } - } - - { - PerformanceTimer perfTimer("part3"); - // FInally once sorted result to a list of itemID - for (auto& itemBound : itemBounds) { - outItems.emplace_back(itemBound._id); - } - } + // sort against Z + if (frontToBack) { + FrontToBackSort frontToBackSort; + std::sort (itemBounds.begin(), itemBounds.end(), frontToBackSort); + } else { + BackToFrontSort backToFrontSort; + std::sort (itemBounds.begin(), itemBounds.end(), backToFrontSort); + } + + // FInally once sorted result to a list of itemID + for (auto& itemBound : itemBounds) { + outItems.emplace_back(itemBound._id); } - #endif } -void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, int maxDrawnItems) { +void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems) { PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; // render if ((maxDrawnItems < 0) || (maxDrawnItems > inItems.size())) { - for (auto id : inItems) { - auto item = scene->getItem(id); + for (auto itemDetails : inItems) { + auto item = scene->getItem(itemDetails.id); item.render(args); } } else { int numItems = 0; - for (auto id : inItems) { - auto item = scene->getItem(id); + for (auto itemDetails : inItems) { + auto item = scene->getItem(itemDetails.id); item.render(args); numItems++; if (numItems >= maxDrawnItems) { @@ -294,16 +246,16 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); auto& renderDetails = renderContext->args->_details; - ItemIDs inItems; + ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.push_back(id); + inItems.push_back(ItemIDAndBounds(id)); } - ItemIDs& renderedItems = inItems; + ItemIDsBounds& renderedItems = inItems; renderContext->_numFeedOpaqueItems = renderedItems.size(); - ItemIDs culledItems; + ItemIDsBounds culledItems; if (renderContext->_cullOpaque) { renderDetails.pointTo(RenderDetails::OPAQUE_ITEM); cullItems(sceneContext, renderContext, renderedItems, culledItems); @@ -314,7 +266,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer renderContext->_numDrawnOpaqueItems = renderedItems.size(); - ItemIDs sortedItems; + ItemIDsBounds sortedItems; if (renderContext->_sortOpaque) { depthSortItems(sceneContext, renderContext, true, renderedItems, sortedItems); // Sort Front to back opaque items! renderedItems = sortedItems; @@ -360,16 +312,16 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); auto& renderDetails = renderContext->args->_details; - ItemIDs inItems; + ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { inItems.push_back(id); } - ItemIDs& renderedItems = inItems; + ItemIDsBounds& renderedItems = inItems; renderContext->_numFeedTransparentItems = renderedItems.size(); - ItemIDs culledItems; + ItemIDsBounds culledItems; if (renderContext->_cullTransparent) { renderDetails.pointTo(RenderDetails::TRANSLUCENT_ITEM); cullItems(sceneContext, renderContext, inItems, culledItems); @@ -379,7 +331,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo renderContext->_numDrawnTransparentItems = renderedItems.size(); - ItemIDs sortedItems; + ItemIDsBounds sortedItems; if (renderContext->_sortTransparent) { depthSortItems(sceneContext, renderContext, false, renderedItems, sortedItems); // Sort Back to front transparent items! renderedItems = sortedItems; @@ -440,13 +392,13 @@ template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& auto& items = scene->getMasterBucket().at(ItemFilter::Builder::light()); - ItemIDs inItems; + ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { inItems.push_back(id); } - ItemIDs culledItems; + ItemIDsBounds culledItems; cullItems(sceneContext, renderContext, inItems, culledItems); RenderArgs* args = renderContext->args; @@ -467,7 +419,7 @@ template <> void render::jobRun(const DrawBackground& job, const SceneContextPoi auto& items = scene->getMasterBucket().at(ItemFilter::Builder::background()); - ItemIDs inItems; + ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { inItems.push_back(id); diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 9f8efa2869..687287cd56 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -57,9 +57,9 @@ protected: typedef std::vector Jobs; -void cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, ItemIDs& outITems); -void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDs& inItems, ItemIDs& outITems); -void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, int maxDrawnItems = -1); +void cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); +void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); +void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems = -1); class DrawOpaque { diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 88ba2b478c..054fbeb602 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -333,6 +333,17 @@ typedef Item::ID ItemID; typedef std::vector ItemIDs; typedef std::set ItemIDSet; +class ItemIDAndBounds { +public: + ItemIDAndBounds(ItemID id) : id(id) { } + ItemIDAndBounds(ItemID id, const AABox& bounds) : id(id), bounds(bounds) { } + + ItemID id; + AABox bounds; +}; + +typedef std::vector< ItemIDAndBounds > ItemIDsBounds; + // A map of ItemIDSets allowing to create bucket lists of items which are filtering correctly class ItemBucketMap : public std::map { public: From 84c37bd301dd3c8308f9e128b55367c3fed67110 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Jun 2015 09:05:16 -0700 Subject: [PATCH 15/16] cache bounds with item ids in DrawTask --- libraries/render/src/render/DrawTask.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index fd4534384b..7a78ceec07 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -12,8 +12,6 @@ #include #include -#include - #include "DrawTask.h" #include From 5e351c032896b6b5d47c25925ebb732d9b860c58 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 8 Jun 2015 18:36:12 +0200 Subject: [PATCH 16/16] FIxing the transparent rendering on Mac --- libraries/gpu/src/gpu/GLBackend.h | 16 ++++++++++------ libraries/gpu/src/gpu/GLBackendPipeline.cpp | 3 +-- .../render-utils/src/DeferredLightingEffect.cpp | 4 ++-- .../render-utils/src/DeferredLightingEffect.h | 2 +- libraries/render-utils/src/Model.cpp | 8 ++++++++ libraries/render-utils/src/Model.h | 1 + .../render-utils/src/RenderDeferredTask.cpp | 2 +- libraries/render-utils/src/model_translucent.slf | 8 +++++--- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 48262c9fe4..e7a5e62df8 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -292,14 +292,18 @@ protected: _lastMode(GL_TEXTURE) {} } _transform; - // Pipeline Stage - void do_setPipeline(Batch& batch, uint32 paramOffset); - - void do_setStateBlendFactor(Batch& batch, uint32 paramOffset); - + // Uniform Stage void do_setUniformBuffer(Batch& batch, uint32 paramOffset); void do_setUniformTexture(Batch& batch, uint32 paramOffset); - + + struct UniformStageState { + + }; + + // Pipeline Stage + void do_setPipeline(Batch& batch, uint32 paramOffset); + void do_setStateBlendFactor(Batch& batch, uint32 paramOffset); + // Standard update pipeline check that the current Program and current State or good to go for a void updatePipeline(); // Force to reset all the state fields indicated by the 'toBeReset" signature diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index 5e8cb56d9e..f4449e9ea1 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -144,9 +144,8 @@ void GLBackend::updatePipeline() { #if (GPU_TRANSFORM_PROFILE == GPU_CORE) #else // If shader program needs the inverseView we need to provide it - // YES InverseView in the shade is called View on the Batch interface if (_pipeline._program_transformCamera_viewInverse >= 0) { - glUniformMatrix4fv(_pipeline._program_transformCamera_viewInverse, 1, false, (const GLfloat*) &_transform._view); + glUniformMatrix4fv(_pipeline._program_transformCamera_viewInverse, 1, false, (const GLfloat*) &_transform._transformCamera._viewInverse); } #endif } diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index c953107b79..f0a52af086 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -555,9 +555,9 @@ void DeferredLightingEffect::copyBack(RenderArgs* args) { glPopMatrix(); } -void DeferredLightingEffect::setupTransparent(RenderArgs* args) { +void DeferredLightingEffect::setupTransparent(RenderArgs* args, int lightBufferUnit) { auto globalLight = _allocatedLights[_globalLights.front()]; - args->_batch->setUniformBuffer(4, globalLight->getSchemaBuffer()); + args->_batch->setUniformBuffer(lightBufferUnit, globalLight->getSchemaBuffer()); } void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limited, ProgramObject& program, LightLocations& locations) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index e8e402f27a..bd7fcb286b 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -70,7 +70,7 @@ public: void render(); void copyBack(RenderArgs* args); - void setupTransparent(RenderArgs* args); + void setupTransparent(RenderArgs* args, int lightBufferUnit); // update global lighting void setAmbientLightMode(int preset); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 4fc8c6a1f4..aadc4bffbe 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -197,13 +197,17 @@ void Model::RenderPipelineLib::initLocations(gpu::ShaderPointer& program, Model: #if (GPU_FEATURE_PROFILE == GPU_CORE) locations.materialBufferUnit = program->getBuffers().findLocation("materialBuffer"); + locations.lightBufferUnit = program->getBuffers().findLocation("lightBuffer"); #else locations.materialBufferUnit = program->getUniforms().findLocation("materialBuffer"); + locations.lightBufferUnit = program->getUniforms().findLocation("lightBuffer"); #endif locations.clusterMatrices = program->getUniforms().findLocation("clusterMatrices"); locations.clusterIndices = program->getInputs().findLocation("clusterIndices");; locations.clusterWeights = program->getInputs().findLocation("clusterWeights");; + + } @@ -2251,6 +2255,10 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran batch.setUniformTexture(locations->emissiveTextureUnit, !emissiveMap ? textureCache->getWhiteTexture() : emissiveMap->getGPUTexture()); } + + if (translucent && locations->lightBufferUnit >= 0) { + DependencyManager::get()->setupTransparent(args, locations->lightBufferUnit); + } } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index b2b6e0dc7d..0367ad8d32 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -374,6 +374,7 @@ private: int clusterMatrices; int clusterIndices; int clusterWeights; + int lightBufferUnit; }; QHash, AABox> _calculatedMeshPartBoxes; // world coordinate AABoxes for all sub mesh part boxes diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 94a89488b0..2892120632 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -115,7 +115,7 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC gpu::Batch batch; args->_batch = &batch; - DependencyManager::get()->setupTransparent(renderContext->args); + glm::mat4 projMat; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 806b77dc15..179b7b9e28 100755 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -44,8 +44,8 @@ void main(void) { // Everything about global lighting <@include DeferredLighting.slh@> -<@include gpu/Transform.slh@> -<$declareStandardTransform()$> +<@include gpu/Transform.slh@> +<$declareStandardTransform()$> // Everything about light @@ -78,7 +78,6 @@ vec4 evalGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 d // Need the light now Light light = getLight(); TransformCamera cam = getTransformCamera(); - // mat4 viewMat = cam._viewInverse; vec3 fragNormal; <$transformEyeToWorldDir(cam, normal, fragNormal)$> vec3 fragEyeVectorView = normalize(-position); @@ -91,7 +90,10 @@ vec4 evalGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 d color += vec3(opacity * diffuse + shading.rgb) * shading.w * shadowAttenuation * getLightColor(light) * getLightIntensity(light); + //return vec4(color, opacity); return vec4(color, opacity); + //return vec4(diffuse.rgb, opacity); + //return evalNormalColor(fragEyeDir, opacity); } // the diffuse texture