diff --git a/libraries/render-utils/src/LightClusterGrid_shared.slh b/libraries/render-utils/src/LightClusterGrid_shared.slh index ed0ed8d04d..50499cf31a 100644 --- a/libraries/render-utils/src/LightClusterGrid_shared.slh +++ b/libraries/render-utils/src/LightClusterGrid_shared.slh @@ -58,7 +58,6 @@ float frustumGrid_eyeToVolumeDepth(float eposZ, float rangeNear, float rangeFar) return (-eposZ - rangeNear) / (rangeFar - rangeNear); } - vec3 frustumGrid_eyeToVolume(vec3 epos, mat4 projection, float rangeNear, float rangeFar) { vec4 clipPos = vec4(epos.x * projection[0][0] + epos.z * projection[2][0], epos.y * projection[1][1] + epos.z * projection[2][1], @@ -126,15 +125,11 @@ int frustumGrid_eyeDepthToClusterLayer(float eyeZ) { } ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) { - if ((eyePos.z > -frustumGrid.frustumNear) || (eyePos.z < -frustumGrid.frustumFar)) { - return ivec3(-2); - } - - if (eyePos.z > -frustumGrid.rangeNear) { - return ivec3(0,0,-1); - } - - vec3 volumePos = frustumGrid_eyeToVolume(eyePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar); + + // make sure the frontEyePos is always in the front to eval the grid pos correctly + vec3 frontEyePos = eyePos; + frontEyePos.z = (eyePos.z > 0.0f ? -eyePos.z : eyePos.z); + vec3 volumePos = frustumGrid_eyeToVolume(frontEyePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar); vec3 gridPos = frustumGrid_volumeToGrid(volumePos, frustumGrid.dims); @@ -143,10 +138,20 @@ ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) { gridPos.z = frustumGrid.dims.z; } + ivec3 igridPos = ivec3(floor(gridPos)); - return ivec3(floor(gridPos)); + if ((eyePos.z > -frustumGrid.frustumNear) || (eyePos.z < -frustumGrid.frustumFar)) { + return ivec3(igridPos.x, igridPos.y, - 2); + } + + if (eyePos.z > -frustumGrid.rangeNear) { + return ivec3(igridPos.x, igridPos.y, -1); + } + + return igridPos; } + int frustumGrid_eyeToClusterDirH(vec3 eyeDir) { if (eyeDir.z >= 0.0f) { return (eyeDir.x > 0 ? frustumGrid.dims.x : -1); diff --git a/libraries/render-utils/src/LightClusters.cpp b/libraries/render-utils/src/LightClusters.cpp index 8dc95da65b..b9ba309fd5 100644 --- a/libraries/render-utils/src/LightClusters.cpp +++ b/libraries/render-utils/src/LightClusters.cpp @@ -279,6 +279,7 @@ uint32_t scanLightVolumeSphere(FrustumGrid& grid, const FrustumGrid::Planes plan // FInd the light origin cluster auto centerCluster = grid.frustumGrid_eyeToClusterPos(glm::vec3(eyePosRadius)); + int center_z = centerCluster.z; int center_y = centerCluster.y;