Files
UnrealEngineUWP/Engine/Shaders/Private/PostProcessLocalExposure.usf
tiago costa 28c79f2360 Control local exposure constract scale for highlights and shadows independently.
#rb Guillaume.Abadie
#preflight 62bc5528e353c20ac245329d

#ROBOMERGE-AUTHOR: tiago.costa
#ROBOMERGE-SOURCE: CL 20874253 via CL 20874263 via CL 20874279
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v971-20777995)

[CL 20876979 by tiago costa in ue5-main branch]
2022-06-29 12:31:43 -04:00

56 lines
2.1 KiB
Plaintext

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Common.ush"
#include "ScreenPass.ush"
#include "PostProcessHistogramCommon.ush"
SCREEN_PASS_TEXTURE_VIEWPORT(Input)
SCREEN_PASS_TEXTURE_VIEWPORT(Output)
Texture2D InputTexture;
Texture2D EyeAdaptationTexture;
Texture3D LumBilateralGrid;
Texture2D BlurredLogLum;
SamplerState TextureSampler;
RWTexture2D<float> OutputFloat;
RWTexture2D<float4> OutputFloat4;
[numthreads(THREADGROUP_SIZEX, THREADGROUP_SIZEY, 1)]
void SetupLogLuminanceCS(uint3 DispatchThreadId : SV_DispatchThreadID)
{
float3 SceneColor = InputTexture.Load(uint3(Input_ViewportMin + DispatchThreadId.xy, 0)).rgb * View.OneOverPreExposure;
float LuminanceVal = CalculateEyeAdaptationLuminance(SceneColor);
OutputFloat[DispatchThreadId.xy] = log2(LuminanceVal);
}
[numthreads(THREADGROUP_SIZEX, THREADGROUP_SIZEY, 1)]
void ApplyLocalExposureCS(uint2 DispatchThreadId : SV_DispatchThreadID)
{
uint2 OutputPixelPos = DispatchThreadId + Output_ViewportMin;
if (all(OutputPixelPos < Output_ViewportMax))
{
const float2 UV = (DispatchThreadId + 0.5f) * Output_ExtentInverse;
float2 ExposureScaleMiddleGrey = EyeAdaptationTexture.Load(int3(0, 0, 0)).xw;
float ExposureScale = ExposureScaleMiddleGrey.x;
float MiddleGreyLumValue = log2(0.18 * ExposureScaleMiddleGrey.y * EyeAdaptation_LocalExposureMiddleGreyExposureCompensation);
float4 SceneColor = InputTexture.Load(uint3(DispatchThreadId + Input_ViewportMin, 0));
float LuminanceVal = CalculateEyeAdaptationLuminance(SceneColor.rgb * View.OneOverPreExposure);
float LogLuminance = log2(LuminanceVal);
float BaseLogLum = CalculateBaseLogLuminance(LogLuminance, EyeAdaptation_LocalExposureBlurredLuminanceBlend, ExposureScale, UV, LumBilateralGrid, BlurredLogLum, TextureSampler, TextureSampler);
float LocalExposure = CalculateLocalExposure(LogLuminance + log2(ExposureScale), BaseLogLum, MiddleGreyLumValue, EyeAdaptation_LocalExposureHighlightContrastScale, EyeAdaptation_LocalExposureShadowContrastScale, EyeAdaptation_LocalExposureDetailStrength);
SceneColor.rgb *= LocalExposure;
OutputFloat4[OutputPixelPos] = SceneColor;
}
}