diff --git a/libraries/render-utils/src/LightClusterGrid.slh b/libraries/render-utils/src/LightClusterGrid.slh index c0e067ca3e..722d37814d 100644 --- a/libraries/render-utils/src/LightClusterGrid.slh +++ b/libraries/render-utils/src/LightClusterGrid.slh @@ -13,18 +13,18 @@ struct FrustumGrid { - mat4 eyeToGridProj; - mat4 worldToEyeMat; - mat4 eyeToWorldMat; float frustumNear; float rangeNear; float rangeFar; float frustumFar; - vec4 dims; - // float spare; + ivec3 dims; + float spare; + mat4 eyeToGridProj; + mat4 worldToEyeMat; + mat4 eyeToWorldMat; }; -uniform frustumGridBuffer { +layout(std140) uniform frustumGridBuffer { FrustumGrid frustumGrid; }; @@ -51,16 +51,20 @@ float projection_getFar(mat4 projection) { #define GRID_INDEX_TYPE ivec4 #define GRID_FETCH_BUFFER(i) i / 4][i % 4 <@else@> -#define GRID_NUM_ELEMENTS 16384 +#define GRID_NUM_ELEMENTS 4096 +#define GRID_INDEX_TYPE ivec4 +#define GRID_FETCH_BUFFER(i) i / 4][i % 4 + + <@endif@> -uniform clusterGridBuffer { +layout(std140) uniform clusterGridBuffer { GRID_INDEX_TYPE _clusterGridTable[GRID_NUM_ELEMENTS]; }; -uniform clusterContentBuffer { +layout(std140) uniform clusterContentBuffer { GRID_INDEX_TYPE _clusterGridContent[GRID_NUM_ELEMENTS]; }; diff --git a/libraries/render-utils/src/LightClusterGrid_shared.slh b/libraries/render-utils/src/LightClusterGrid_shared.slh index 70d4ba30ff..ed0ed8d04d 100644 --- a/libraries/render-utils/src/LightClusterGrid_shared.slh +++ b/libraries/render-utils/src/LightClusterGrid_shared.slh @@ -73,14 +73,14 @@ vec3 frustumGrid_eyeToVolume(vec3 epos, mat4 projection, float rangeNear, float int frustumGrid_numClusters() { - return int(frustumGrid.dims.x) * int(frustumGrid.dims.y) * (int(frustumGrid.dims.z) + 1); + return frustumGrid.dims.x * frustumGrid.dims.y * (frustumGrid.dims.z + 1); } int frustumGrid_clusterToIndex(ivec3 pos) { - return int(pos.x + (pos.y + pos.z * int(frustumGrid.dims.y)) * int(frustumGrid.dims.x)); + return pos.x + (pos.y + pos.z * frustumGrid.dims.y) * frustumGrid.dims.x; } ivec3 frustumGrid_indexToCluster(int index) { - ivec3 summedDims = ivec3(int(frustumGrid.dims.x) * int(frustumGrid.dims.y), int(frustumGrid.dims.x), 1); + ivec3 summedDims = ivec3(frustumGrid.dims.x * frustumGrid.dims.y, frustumGrid.dims.x, 1); int layer = index / summedDims.x; int offsetInLayer = index % summedDims.x; ivec3 clusterPos = ivec3(offsetInLayer % summedDims.y, offsetInLayer / summedDims.y, layer); @@ -92,7 +92,7 @@ vec3 frustumGrid_clusterPosToEye(vec3 clusterPos) { vec3 cvpos = clusterPos; - vec3 volumePos = frustumGrid_gridToVolume(cvpos, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z)); + vec3 volumePos = frustumGrid_gridToVolume(cvpos, frustumGrid.dims); vec3 eyePos = frustumGrid_volumeToEye(volumePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar); @@ -115,7 +115,7 @@ int frustumGrid_eyeDepthToClusterLayer(float eyeZ) { float volumeZ = frustumGrid_eyeToVolumeDepth(eyeZ, frustumGrid.rangeNear, frustumGrid.rangeFar); - float gridZ = frustumGrid_volumeToGridDepth(volumeZ, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z)); + float gridZ = frustumGrid_volumeToGridDepth(volumeZ, frustumGrid.dims); if (gridZ >= frustumGrid.dims.z) { gridZ = frustumGrid.dims.z; @@ -137,7 +137,7 @@ ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) { vec3 volumePos = frustumGrid_eyeToVolume(eyePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar); - vec3 gridPos = frustumGrid_volumeToGrid(volumePos, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z)); + vec3 gridPos = frustumGrid_volumeToGrid(volumePos, frustumGrid.dims); if (gridPos.z >= frustumGrid.dims.z) { gridPos.z = frustumGrid.dims.z; @@ -149,7 +149,7 @@ ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) { int frustumGrid_eyeToClusterDirH(vec3 eyeDir) { if (eyeDir.z >= 0.0f) { - return (eyeDir.x > 0 ? int(frustumGrid.dims.x) : -1); + return (eyeDir.x > 0 ? frustumGrid.dims.x : -1); } float eyeDepth = -eyeDir.z; @@ -163,7 +163,7 @@ int frustumGrid_eyeToClusterDirH(vec3 eyeDir) { int frustumGrid_eyeToClusterDirV(vec3 eyeDir) { if (eyeDir.z >= 0.0f) { - return (eyeDir.y > 0 ? int(frustumGrid.dims.y) : -1); + return (eyeDir.y > 0 ? frustumGrid.dims.y : -1); } float eyeDepth = -eyeDir.z; diff --git a/libraries/render-utils/src/LightClusters.h b/libraries/render-utils/src/LightClusters.h index 0839f774b0..d27a6e1d92 100644 --- a/libraries/render-utils/src/LightClusters.h +++ b/libraries/render-utils/src/LightClusters.h @@ -21,20 +21,17 @@ class FrustumGrid { public: - - glm::mat4 eyeToGridProj; - glm::mat4 worldToEyeMat; - glm::mat4 eyeToWorldMat; - float frustumNear { 0.1f }; float rangeNear { 0.1f }; float rangeFar { 200.0f }; float frustumFar { 10000.0f }; - // glm::ivec4 dims { 1, 1, 1, 1 }; glm::ivec3 dims { 1, 1, 1 }; float spare; + glm::mat4 eyeToGridProj; + glm::mat4 worldToEyeMat; + glm::mat4 eyeToWorldMat; FrustumGrid() = default; FrustumGrid(const FrustumGrid& source); diff --git a/libraries/render-utils/src/local_lights_shading.slf b/libraries/render-utils/src/local_lights_shading.slf index 43461c13ee..4f5459e0ef 100644 --- a/libraries/render-utils/src/local_lights_shading.slf +++ b/libraries/render-utils/src/local_lights_shading.slf @@ -58,11 +58,6 @@ void main(void) { vec3 gridPos = frustumGrid_volumeToGrid(volumePos, dims); - _fragColor = vec4(fract(volumePos.xyz), 1.0); - // _fragColor = vec4(fract(gridPos / vec3(dims)), 1.0); - - return; - ivec3 cluster = clusterGrid_getCluster(frustumGrid_clusterToIndex(clusterPos)); int numLights = cluster.x + cluster.y;