#pragma kernel DebugLightCluster #pragma only_renderers d3d11 xboxseries ps5 #define DEBUG_LIGHT_CLUSTER_TILE_SIZE 8 #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/ShaderVariablesRaytracingLightLoop.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RayTracingLightCluster.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Debug.hlsl" // Color gradient texture used for the lightcount heatmap TEXTURE2D(_DebugColorGradientTexture); // The output texture for the cluster debug RW_TEXTURE2D_X(float4, _DebutLightClusterTexture); int _ClusterLightCategoryDebug = 0; [numthreads(DEBUG_LIGHT_CLUSTER_TILE_SIZE, DEBUG_LIGHT_CLUSTER_TILE_SIZE, 1)] void DebugLightCluster(uint2 groupThreadId : SV_GroupThreadID, uint2 groupId : SV_GroupID) { // Fetch the current pixel coordinate uint2 currentPixelCoordinate = groupId * DEBUG_LIGHT_CLUSTER_TILE_SIZE + groupThreadId; // Convert this to a world space position float depth = LoadCameraDepth(currentPixelCoordinate.xy); // If this is a background set it to black if (depth == UNITY_RAW_FAR_CLIP_VALUE) { _DebutLightClusterTexture[COORD_TEXTURE2D_X(currentPixelCoordinate)] = float4(0.0, 0.0, 0.0, 1.0f); return; } // Compute the real world space position of this pixel PositionInputs posInput = GetPositionInput(currentPixelCoordinate, 1.0 / _ScreenSize.xy, depth, UNITY_MATRIX_I_VP, GetWorldToViewMatrix(), 0); // If this position is outside of the cluster, color is gray if(!PointInsideCluster(posInput.positionWS)) { _DebutLightClusterTexture[COORD_TEXTURE2D_X(currentPixelCoordinate)] = float4(0.1, 0.1, 0.1, 1.0f); return; } uint cellIndex = GetClusterCellIndex(posInput.positionWS); // Fetch the light count for the specified light category uint numLights; if (_ClusterLightCategoryDebug < LIGHTCATEGORY_COUNT) { uint lightStart, lightEnd; GetLightCountAndStartCluster(posInput.positionWS, _ClusterLightCategoryDebug, lightStart, lightEnd, cellIndex); numLights = lightEnd - lightStart; } else { numLights = GetTotalLightClusterCellCount(cellIndex); } // If this pixel has no lights, let the color to gray if(numLights == 0) { _DebutLightClusterTexture[COORD_TEXTURE2D_X(currentPixelCoordinate)] = float4(0.1, 0.1, 0.1, 1.0f); return; } // Get the heatmap color from numLights. float3 cellColor = numLights >= _LightPerCellCount || numLights >= DEBUG_COLORS_COUNT ? float3(0.7, 0.0, 0.0) // red : kDebugColorGradient[numLights].xyz; // Return the color _DebutLightClusterTexture[COORD_TEXTURE2D_X(currentPixelCoordinate)] = float4(cellColor, 1.0); }