mirror of
https://github.com/lubosz/overte.git
synced 2025-04-24 02:53:43 +02:00
Cleaning up a bit
This commit is contained in:
parent
fea5f8b03b
commit
124060d31a
7 changed files with 118 additions and 68 deletions
|
@ -52,7 +52,7 @@ uniform clusterGridBuffer {
|
|||
};
|
||||
|
||||
uniform clusterContentBuffer {
|
||||
int _clusterGridContent[10000];
|
||||
int _clusterGridContent[16384];
|
||||
};
|
||||
|
||||
int clusterGrid_clusterToIndex(ivec3 pos) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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(); });
|
|
@ -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 }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue