From 124060d31af42bd87c8b909526a94cf544aa2363 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 13 Sep 2016 17:44:19 -0700 Subject: [PATCH] Cleaning up a bit --- .../render-utils/src/LightClusterGrid.slh | 2 +- libraries/render-utils/src/LightClusters.cpp | 55 ++++++--- libraries/render-utils/src/LightClusters.h | 9 +- .../src/lightClusters_drawClusterContent.slv | 5 +- .../lightClusters_drawClusterFromDepth.slf | 2 +- .../utilities/render/lightClustering.js | 4 +- .../utilities/render/lightClustering.qml | 109 +++++++++++------- 7 files changed, 118 insertions(+), 68 deletions(-) diff --git a/libraries/render-utils/src/LightClusterGrid.slh b/libraries/render-utils/src/LightClusterGrid.slh index c70d0d2c6b..af046ce11d 100644 --- a/libraries/render-utils/src/LightClusterGrid.slh +++ b/libraries/render-utils/src/LightClusterGrid.slh @@ -52,7 +52,7 @@ uniform clusterGridBuffer { }; uniform clusterContentBuffer { - int _clusterGridContent[10000]; + int _clusterGridContent[16384]; }; int clusterGrid_clusterToIndex(ivec3 pos) { diff --git a/libraries/render-utils/src/LightClusters.cpp b/libraries/render-utils/src/LightClusters.cpp index fabfffd439..4de51af6da 100644 --- a/libraries/render-utils/src/LightClusters.cpp +++ b/libraries/render-utils/src/LightClusters.cpp @@ -42,22 +42,43 @@ enum LightClusterGridShader_BufferSlot { #include "DeferredLightingEffect.h" +const glm::uvec4 LightClusters::MAX_GRID_DIMENSIONS { 16, 16, 15, 16384 }; + + LightClusters::LightClusters() : _lightIndicesBuffer(std::make_shared()), _clusterGridBuffer(std::make_shared(), gpu::Element::INDEX_INT32), _clusterContentBuffer(std::make_shared(), gpu::Element::INDEX_INT32) { - setDimensions(_frustumGridBuffer->dims, 10000); + setDimensions(_frustumGridBuffer->dims, MAX_GRID_DIMENSIONS.w); } void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) { - _frustumGridBuffer.edit().dims = gridDims; + ivec3 configDimensions; + configDimensions.x = std::min(MAX_GRID_DIMENSIONS.x, gridDims.x); + configDimensions.y = std::min(MAX_GRID_DIMENSIONS.y, gridDims.y); + configDimensions.z = std::min(MAX_GRID_DIMENSIONS.z, gridDims.z); - _numClusters = _frustumGridBuffer.edit().frustumGrid_numClusters(); + auto configListBudget = std::min(MAX_GRID_DIMENSIONS.w, listBudget); - _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t)); - _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(listBudget * sizeof(uint32_t)); - _clusterGrid.resize(_numClusters, EMPTY_CLUSTER); - _clusterContent.resize(listBudget, INVALID_LIGHT); + auto& dims = _frustumGridBuffer->dims; + if ((dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) { + _frustumGridBuffer.edit().dims = configDimensions; + } + + auto numClusters = _frustumGridBuffer.edit().frustumGrid_numClusters(); + if (numClusters != _numClusters) { + _numClusters = numClusters; + _clusterGrid.clear(); + _clusterGrid.resize(_numClusters, EMPTY_CLUSTER); + _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t)); + } + + + if (configListBudget != _clusterContentBuffer.getNumElements()) { + _clusterContent.clear(); + _clusterContent.resize(configListBudget, INVALID_LIGHT); + _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(configListBudget * sizeof(LightID)); + } } @@ -105,7 +126,7 @@ void LightClusters::updateLightFrame(const LightStage::Frame& lightFrame, bool p void LightClusters::updateClusters() { // Clean up last info - std::vector< std::vector< uint32_t > > clusterGrid(_numClusters); + std::vector< std::vector< LightID > > clusterGrid(_numClusters); _clusterGrid.resize(_numClusters, EMPTY_CLUSTER); uint32_t maxNumIndices = (uint32_t) _clusterContent.size(); @@ -228,6 +249,10 @@ void LightClusters::updateClusters() { } } } + + if (numClusterTouched >= maxNumIndices) { + break; + } } // Lights have been gathered now reexpress in terms of 2 sequential buffers @@ -241,7 +266,7 @@ void LightClusters::updateClusters() { _clusterGrid[i] = (uint32_t)((numLights << 16) | offset); if (numLights) { - memcpy(_clusterContent.data() + indexOffset, cluster.data(), numLights * sizeof(uint32_t)); + memcpy(_clusterContent.data() + indexOffset, cluster.data(), numLights * sizeof(LightID)); } indexOffset += numLights; @@ -249,7 +274,7 @@ void LightClusters::updateClusters() { // update the buffers _clusterGridBuffer._buffer->setData(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data()); - _clusterContentBuffer._buffer->setSubData(0, indexOffset * sizeof(uint32_t), (gpu::Byte*) _clusterContent.data()); + _clusterContentBuffer._buffer->setSubData(0, indexOffset * sizeof(LightID), (gpu::Byte*) _clusterContent.data()); } @@ -267,15 +292,7 @@ void LightClusteringPass::configure(const Config& config) { _lightClusters->_frustumGridBuffer.edit().rangeFar = config.rangeFar; } - ivec3 configDimensions; - configDimensions.x = std::max(0, std::min(16, config.dimX)); - configDimensions.y = std::max(0, std::min(16, config.dimY)); - configDimensions.z = std::max(0, std::min(15, config.dimZ)); - - auto& dims = _lightClusters->_frustumGridBuffer->dims; - if ((dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) { - _lightClusters->setDimensions(configDimensions, 10000); - } + _lightClusters->setDimensions(glm::uvec3(config.dimX, config.dimY, config.dimZ), 10000); } _freeze = config.freeze; diff --git a/libraries/render-utils/src/LightClusters.h b/libraries/render-utils/src/LightClusters.h index bef28a498a..5d64b17ca1 100644 --- a/libraries/render-utils/src/LightClusters.h +++ b/libraries/render-utils/src/LightClusters.h @@ -54,7 +54,10 @@ public: class LightClusters { public: - + using LightID = LightStage::Index; + + static const glm::uvec4 MAX_GRID_DIMENSIONS; + LightClusters(); void setDimensions(glm::uvec3 gridDims, uint32_t listBudget); @@ -81,10 +84,10 @@ public: uint32_t _numClusters { 0 }; const uint32_t EMPTY_CLUSTER { 0x0000FFFF }; - const uint32_t INVALID_LIGHT { 0xFFFFFFFF }; + const LightID INVALID_LIGHT { LightStage::INVALID_INDEX }; std::vector _clusterGrid; - std::vector _clusterContent; + std::vector _clusterContent; gpu::BufferView _clusterGridBuffer; gpu::BufferView _clusterContentBuffer; }; diff --git a/libraries/render-utils/src/lightClusters_drawClusterContent.slv b/libraries/render-utils/src/lightClusters_drawClusterContent.slv index f976c7e245..af3cf3e3ac 100644 --- a/libraries/render-utils/src/lightClusters_drawClusterContent.slv +++ b/libraries/render-utils/src/lightClusters_drawClusterContent.slv @@ -57,7 +57,8 @@ void main(void) { ivec2 cluster = clusterGrid_getCluster(gl_InstanceID); int numLights = cluster.x; - float numLightsScale = clamp(numLights * 0.1, 0.01, 1.0); + + float numLightsScale = clamp(numLights * 0.1, 0.0, 1.0); ivec3 clusterPos = clusterGrid_indexToCluster(gl_InstanceID); @@ -70,5 +71,5 @@ void main(void) { TransformCamera cam = getTransformCamera(); <$transformWorldToClipPos(cam, worldPos, gl_Position)$> - varColor = vec4(colorWheel(fract(float(gl_InstanceID) / float(frustumGrid_numClusters()))), 0.9); + varColor = vec4(colorWheel(fract(float(gl_InstanceID) / float(frustumGrid_numClusters()))), (numLights >0 ? 0.9 : 0.1)); } \ No newline at end of file diff --git a/libraries/render-utils/src/lightClusters_drawClusterFromDepth.slf b/libraries/render-utils/src/lightClusters_drawClusterFromDepth.slf index bf98595399..e711c6fc64 100644 --- a/libraries/render-utils/src/lightClusters_drawClusterFromDepth.slf +++ b/libraries/render-utils/src/lightClusters_drawClusterFromDepth.slf @@ -67,7 +67,7 @@ void main(void) { } else if (relClusterId >= 1.0) { _fragColor = vec4(vec3(1.0), 0.2); } else { - _fragColor = vec4(colorWheel(fract(relClusterId)), 0.05 + 0.95 * numLightsScale); + _fragColor = vec4(colorWheel(fract(relClusterId)), (numLights > 0 ? 0.05 + 0.95 * numLightsScale : 0.0)); } } diff --git a/scripts/developer/utilities/render/lightClustering.js b/scripts/developer/utilities/render/lightClustering.js index bad023a64f..7fb9416d40 100644 --- a/scripts/developer/utilities/render/lightClustering.js +++ b/scripts/developer/utilities/render/lightClustering.js @@ -15,7 +15,7 @@ var window = new OverlayWindow({ title: 'Light Clustering', source: qml, width: 400, - height: 200 + height: 300 }); -window.setPosition(Window.innerWidth - 420, 50 + 250 + 50); +window.setPosition(Window.innerWidth - 420, 50 + 250 + 50 + 250 + 50 ); window.closed.connect(function() { Script.stop(); }); \ No newline at end of file diff --git a/scripts/developer/utilities/render/lightClustering.qml b/scripts/developer/utilities/render/lightClustering.qml index 622d858c62..562e7c5556 100644 --- a/scripts/developer/utilities/render/lightClustering.qml +++ b/scripts/developer/utilities/render/lightClustering.qml @@ -10,6 +10,7 @@ import QtQuick 2.5 import QtQuick.Controls 1.4 import "configSlider" +import "../lib/plotperf" Column { spacing: 8 @@ -18,46 +19,73 @@ Column { spacing: 10 Column{ - ConfigSlider { - label: qsTr("Range Near [m]") - integral: false - config: Render.getConfig("LightClustering") - property: "rangeNear" - max: 20.0 - min: 0.1 - } - ConfigSlider { - label: qsTr("Range Far [m]") - integral: false - config: Render.getConfig("LightClustering") - property: "rangeFar" - max: 500.0 - min: 100.0 - } - ConfigSlider { - label: qsTr("Grid X") - integral: true - config: Render.getConfig("LightClustering") - property: "dimX" - max: 16 - min: 1 - } - ConfigSlider { - label: qsTr("Grid Y") - integral: true - config: Render.getConfig("LightClustering") - property: "dimY" - max: 16 - min: 1 - } - ConfigSlider { - label: qsTr("Grid Z") - integral: true - config: Render.getConfig("LightClustering") - property: "dimZ" - max: 15 - min: 1 - } + PlotPerf { + title: "Light CLustering Timing" + height: 50 + object: Render.getConfig("LightClustering") + valueUnit: "ms" + valueScale: 1 + valueNumDigits: "4" + plots: [ + { + object: Render.getConfig("LightClustering"), + prop: "cpuRunTime", + label: "time", + scale: 1, + color: "#FFFFFF" + }, + { + object: Render.getConfig("DrawLight"), + prop: "numDrawn", + unit: "", + scale: 0.01, + numDigits: 0, + label: "Lights", + color: "#FED959" + } + ] + } + + ConfigSlider { + label: qsTr("Range Near [m]") + integral: false + config: Render.getConfig("LightClustering") + property: "rangeNear" + max: 20.0 + min: 0.1 + } + ConfigSlider { + label: qsTr("Range Far [m]") + integral: false + config: Render.getConfig("LightClustering") + property: "rangeFar" + max: 500.0 + min: 100.0 + } + ConfigSlider { + label: qsTr("Grid X") + integral: true + config: Render.getConfig("LightClustering") + property: "dimX" + max: 16 + min: 1 + } + ConfigSlider { + label: qsTr("Grid Y") + integral: true + config: Render.getConfig("LightClustering") + property: "dimY" + max: 16 + min: 1 + } + ConfigSlider { + label: qsTr("Grid Z") + integral: true + config: Render.getConfig("LightClustering") + property: "dimZ" + max: 15 + min: 1 + } CheckBox { text: "Freeze" checked: Render.getConfig("LightClustering")["freeze"] @@ -78,6 +106,7 @@ Column { checked: Render.getConfig("DebugLightClusters")["doDrawContent"] onCheckedChanged: { Render.getConfig("DebugLightClusters")["doDrawContent"] = checked } } + } } }