Cleaning up a bit

This commit is contained in:
samcake 2016-09-13 17:44:19 -07:00
parent fea5f8b03b
commit 124060d31a
7 changed files with 118 additions and 68 deletions

View file

@ -52,7 +52,7 @@ uniform clusterGridBuffer {
};
uniform clusterContentBuffer {
int _clusterGridContent[10000];
int _clusterGridContent[16384];
};
int clusterGrid_clusterToIndex(ivec3 pos) {

View file

@ -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<gpu::Buffer>()),
_clusterGridBuffer(std::make_shared<gpu::Buffer>(), gpu::Element::INDEX_INT32),
_clusterContentBuffer(std::make_shared<gpu::Buffer>(), 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;

View file

@ -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<uint32_t> _clusterGrid;
std::vector<uint32_t> _clusterContent;
std::vector<LightID> _clusterContent;
gpu::BufferView _clusterGridBuffer;
gpu::BufferView _clusterContentBuffer;
};

View file

@ -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));
}

View file

@ -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));
}
}

View file

@ -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(); });

View file

@ -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 }
}
}
}
}