using System; namespace UnityEngine.Rendering.PostProcessing { /// /// This class holds settings for the Light Meter monitor. /// [Serializable] public sealed class LightMeterMonitor : Monitor { /// /// The width of the rendered light meter. /// public int width = 512; /// /// The height of the rendered light meter. /// public int height = 256; /// /// Should we display grading and tonemapping curves on top? /// /// /// This only works when is active. /// public bool showCurves = true; internal override bool ShaderResourcesAvailable(PostProcessRenderContext context) { return context.resources.shaders.lightMeter && context.resources.shaders.lightMeter.isSupported; } internal override void Render(PostProcessRenderContext context) { CheckOutput(width, height); var histogram = context.logHistogram; var sheet = context.propertySheets.Get(context.resources.shaders.lightMeter); sheet.ClearKeywords(); sheet.properties.SetBuffer(ShaderIDs.HistogramBuffer, histogram.data); var scaleOffsetRes = histogram.GetHistogramScaleOffsetRes(context); scaleOffsetRes.z = 1f / width; scaleOffsetRes.w = 1f / height; sheet.properties.SetVector(ShaderIDs.ScaleOffsetRes, scaleOffsetRes); if (context.logLut != null && showCurves) { sheet.EnableKeyword("COLOR_GRADING_HDR"); sheet.properties.SetTexture(ShaderIDs.Lut3D, context.logLut); } var autoExpo = context.autoExposure; if (autoExpo != null) { // Make sure filtering values are correct to avoid apocalyptic consequences float lowPercent = autoExpo.filtering.value.x; float highPercent = autoExpo.filtering.value.y; const float kMinDelta = 1e-2f; highPercent = Mathf.Clamp(highPercent, 1f + kMinDelta, 99f); lowPercent = Mathf.Clamp(lowPercent, 1f, highPercent - kMinDelta); var parameters = new Vector4( lowPercent * 0.01f, highPercent * 0.01f, RuntimeUtilities.Exp2(autoExpo.minLuminance.value), RuntimeUtilities.Exp2(autoExpo.maxLuminance.value) ); sheet.EnableKeyword("AUTO_EXPOSURE"); sheet.properties.SetVector(ShaderIDs.Params, parameters); } var cmd = context.command; cmd.BeginSample("LightMeter"); cmd.BlitFullscreenTriangle(BuiltinRenderTextureType.None, output, sheet, 0); cmd.EndSample("LightMeter"); } } }