UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/ShaderLibrary/Debug/DebuggingFullscreen.hlsl
2024-10-27 10:53:47 +03:00

215 lines
7.3 KiB
HLSL

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/DebuggingCommon.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Debug.hlsl"
#if defined(DEBUG_DISPLAY)
int _DebugMaxPixelCost;
int _ValidationChannels;
float _RangeMinimum;
float _RangeMaximum;
TEXTURE2D_X(_DebugTexture);
TEXTURE2D(_DebugTextureNoStereo);
// 2023.3 Deprecated. This is for backwards compatibility. Remove in the future.
#define sampler_DebugTexture sampler_PointClamp
half4 _DebugTextureDisplayRect;
int _DebugRenderTargetSupportsStereo;
float4 _DebugRenderTargetRangeRemap;
// CPU parametrized, non-clamping, range remap. (RangeRemap in common.hlsl saturates!)
half4 RemapSourceRange(half4 source)
{
float4 r = _DebugRenderTargetRangeRemap;
float4 s = source;
// Remap(float origFrom, float origTo, float targetFrom, float targetTo, float value)
s.r = Remap(r.x, r.y, r.z, r.w, s.r);
s.g = Remap(r.x, r.y, r.z, r.w, s.g);
s.b = Remap(r.x, r.y, r.z, r.w, s.b);
s.a = Remap(r.x, r.y, r.z, r.w, s.a);
return half4(s);
}
bool CalculateDebugColorRenderingSettings(half4 color, float2 uv, inout half4 debugColor)
{
if (_DebugSceneOverrideMode == DEBUGSCENEOVERRIDEMODE_OVERDRAW)
{
// color.r is (Number of overdraw / Max displayed overdraw count)
debugColor.rgb = GetOverdrawColor(color.r * _DebugMaxPixelCost, _DebugMaxPixelCost).rgb;
DrawOverdrawLegend(uv, _DebugMaxPixelCost, _ScreenSize, debugColor.rgb);
return true;
}
if (_DebugMipInfoMode != DEBUGMIPINFOMODE_NONE)
{
debugColor = color; // just passing through
// draw legend
switch(_DebugMipInfoMode)
{
case DEBUGMIPINFOMODE_MIP_COUNT:
DrawMipCountLegend(uv, _ScreenSize, debugColor.rgb);
break;
case DEBUGMIPINFOMODE_MIP_RATIO:
DrawMipRatioLegend(uv, _ScreenSize, debugColor.rgb);
break;
case DEBUGMIPINFOMODE_MIP_STREAMING_STATUS:
if (_DebugMipMapStatusMode == DEBUGMIPMAPSTATUSMODE_TEXTURE)
DrawMipStreamingStatusLegend(uv, _ScreenSize, _DebugMipMapShowStatusCode, debugColor.rgb);
else
DrawMipStreamingStatusPerMaterialLegend(uv, _ScreenSize, debugColor.rgb);
break;
case DEBUGMIPINFOMODE_MIP_STREAMING_PERFORMANCE:
DrawTextureStreamingPerformanceLegend(uv, _ScreenSize, debugColor.rgb);
break;
case DEBUGMIPINFOMODE_MIP_STREAMING_PRIORITY:
DrawMipPriorityLegend(uv, _ScreenSize, debugColor.rgb);
break;
case DEBUGMIPINFOMODE_MIP_STREAMING_ACTIVITY:
DrawMipRecentlyUpdatedLegend(uv, _ScreenSize, _DebugMipMapStatusMode == DEBUGMIPMAPSTATUSMODE_MATERIAL, debugColor.rgb);
break;
}
return true;
}
switch(_DebugFullScreenMode)
{
case DEBUGFULLSCREENMODE_DEPTH:
case DEBUGFULLSCREENMODE_MOTION_VECTOR:
case DEBUGFULLSCREENMODE_MAIN_LIGHT_SHADOW_MAP:
case DEBUGFULLSCREENMODE_ADDITIONAL_LIGHTS_SHADOW_MAP:
case DEBUGFULLSCREENMODE_ADDITIONAL_LIGHTS_COOKIE_ATLAS:
case DEBUGFULLSCREENMODE_REFLECTION_PROBE_ATLAS:
case DEBUGFULLSCREENMODE_STP:
{
float2 uvOffset = half2(uv.x - _DebugTextureDisplayRect.x, uv.y - _DebugTextureDisplayRect.y);
if ((uvOffset.x >= 0) && (uvOffset.x < _DebugTextureDisplayRect.z) &&
(uvOffset.y >= 0) && (uvOffset.y < _DebugTextureDisplayRect.w))
{
float2 debugTextureUv = float2(uvOffset.x / _DebugTextureDisplayRect.z, uvOffset.y / _DebugTextureDisplayRect.w);
half4 sampleColor = (half4)0;
if (_DebugRenderTargetSupportsStereo == 1)
sampleColor = SAMPLE_TEXTURE2D_X(_DebugTexture, sampler_DebugTexture, debugTextureUv);
else
sampleColor = SAMPLE_TEXTURE2D(_DebugTextureNoStereo, sampler_DebugTexture, debugTextureUv);
// Optionally remap source to valid visualization range.
if(any(_DebugRenderTargetRangeRemap != 0))
{
sampleColor.rgb = RemapSourceRange(sampleColor).rgb;
}
if (_DebugFullScreenMode == DEBUGFULLSCREENMODE_DEPTH)
{
debugColor = half4(sampleColor.rrr, 1);
}
else if (_DebugFullScreenMode == DEBUGFULLSCREENMODE_MOTION_VECTOR)
{
// Motion vector is RG only.
debugColor = half4(sampleColor.rg, 0, 1);
}
else if (_DebugFullScreenMode == DEBUGFULLSCREENMODE_STP)
{
// This is encoded in gamma 2.0 (so the square is needed to get it back to linear).
debugColor = sampleColor * sampleColor;
}
else
{
debugColor = sampleColor;
}
return true;
}
else
{
return false;
}
}
default:
{
return false;
}
} // End of switch.
}
bool CalculateDebugColorValidationSettings(half4 color, float2 uv, inout half4 debugColor)
{
switch(_DebugValidationMode)
{
case DEBUGVALIDATIONMODE_HIGHLIGHT_NAN_INF_NEGATIVE:
{
if (AnyIsNaN(color))
{
debugColor = half4(1, 0, 0, 1);
}
else if (AnyIsInf(color))
{
debugColor = half4(0, 1, 0, 1);
}
else if (color.r < 0 || color.g < 0 || color.b < 0 || color.a < 0)
{
debugColor = half4(0, 0, 1, 1);
}
else
{
debugColor = half4(Luminance(color).rrr, 1);
}
return true;
}
case DEBUGVALIDATIONMODE_HIGHLIGHT_OUTSIDE_OF_RANGE:
{
float val;
if (_ValidationChannels == PIXELVALIDATIONCHANNELS_RGB)
{
val = Luminance(color.rgb);
}
else if (_ValidationChannels == PIXELVALIDATIONCHANNELS_R)
{
val = color.r;
}
else if (_ValidationChannels == PIXELVALIDATIONCHANNELS_G)
{
val = color.g;
}
else if (_ValidationChannels == PIXELVALIDATIONCHANNELS_B)
{
val = color.b;
}
else if (_ValidationChannels == PIXELVALIDATIONCHANNELS_A)
{
val = color.a;
}
if (val < _RangeMinimum)
debugColor = _DebugValidateBelowMinThresholdColor;
else if (val > _RangeMaximum)
debugColor = _DebugValidateAboveMaxThresholdColor;
else
debugColor = half4(Luminance(color.rgb).rrr, 1);
return true;
}
default:
{
return false;
}
} // End of switch.
}
bool CanDebugOverrideOutputColor(half4 color, float2 uv, inout half4 debugColor)
{
return CalculateDebugColorRenderingSettings(color, uv, debugColor) ||
CalculateDebugColorValidationSettings(color, uv, debugColor);
}
#endif