diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LutGeneration.pass b/Gems/Atom/Feature/Common/Assets/Passes/LutGeneration.pass index e95a9872a5..4a8735cf7c 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LutGeneration.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LutGeneration.pass @@ -40,158 +40,6 @@ "$type": "FullscreenTrianglePassData", "ShaderAsset": { "FilePath": "Shaders/ColorGrading/LutGeneration.shader" - }, - "ShaderDataMappings": { - "FloatMappings": [ - { - "Name": "m_colorGradingExposure", - "Value": 0.0 // unconstrained, log2 stops - }, - { - "Name": "m_colorGradingContrast", - "Value": 0.0 // -100 ... 100 - }, - { - "Name": "m_colorGradingHueShift", - "Value": 0.0 // 0 ... 1, can wrap - }, - { - "Name": "m_colorGradingPreSaturation", - "Value": 1.0 // -100 ... 100 - }, - { - "Name": "m_colorFilterIntensity", - "Value": 1.0 // unconstrained, log2 stops - }, - { - "Name": "m_colorFilterMultiply", - "Value": 0.0 // modulate, 0 ... 1 - }, - { - "Name": "m_whiteBalanceKelvin", - "Value": 6600.0 // 1000.0f ... 40000.0f kelvin - }, - { - "Name": "m_whiteBalanceTint", - "Value": 0.0 // -100 ... 100 - }, - { - "Name": "m_splitToneBalance", - "Value": 0.0 // -1 ... 1 - }, - { - "Name": "m_splitToneWeight", - "Value": 0.0 // 0 ... 1 - }, - { - "Name": "m_colorGradingPostSaturation", - "Value": 1.0 // -100 ... 100 - }, - { - "Name": "m_smhShadowsStart", - "Value": 0.0 // 0 ... 1 - }, - { - "Name": "m_smhShadowsEnd", - "Value": 0.3 // 0 ... 1 - }, - { - "Name": "m_smhHighlightsStart", - "Value": 0.55 // 0 ... 1 - }, - { - "Name": "m_smhHighlightsEnd", - "Value": 1.0 // 0 ... 1 - }, - { - "Name": "m_smhWeight", - "Value": 0.0 // 0 ... 1 - } - ], - // The colors defined here are expected to be in linear rgb color space. - // These are converted to ACEScg color space within the HDRColorGrading.azsl shader - "ColorMappings": [ - { - "Name": "m_colorFilterSwatch", - "Value": [ - 1.0, - 0.5, - 0.5, - 1.0 - ] - }, - { - "Name": "m_splitToneShadowsColor", - "Value": [ - 1.0, - 0.1, - 0.1, - 1.0 - ] - }, - { - "Name": "m_splitToneHighlightsColor", - "Value": [ - 0.1, - 1.0, - 0.1, - 1.0 - ] - }, - { - "Name": "m_smhShadowsColor", - "Value": [ - 1.0, - 0.25, - 0.25, - 1.0 - ] - }, - { - "Name": "m_smhMidtonesColor", - "Value": [ - 0.1, - 0.1, - 1.0, - 1.0 - ] - }, - { - "Name": "m_smhHighlightsColor", - "Value": [ - 1.0, - 0.0, - 1.0, - 1.0 - ] - } - ], - "Float3Mappings": [ - { - "Name": "m_channelMixingRed", - "Value": [ - 1.0, - 0.0, - 0.0 - ] - }, - { - "Name": "m_channelMixingGreen", - "Value": [ - 0.0, - 1.0, - 0.0 - ] - }, - { - "Name": "m_channelMixingBlue", - "Value": [ - 0.0, - 0.0, - 1.0 - ] - } - ] } } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PostProcessing/HDRColorGradingCommon.azsl b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PostProcessing/HDRColorGradingCommon.azsl index 501aac7e79..eaf5d54ab9 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PostProcessing/HDRColorGradingCommon.azsl +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PostProcessing/HDRColorGradingCommon.azsl @@ -127,3 +127,28 @@ float3 ColorGradeShadowsMidtonesHighlights (float3 frameColor, float shadowsStar frameColor * highlightsColorACEScg * highlightsWeight; return lerp(frameColor.rgb, frameSmh.rgb, weight); } + +// perform color grading in ACEScg space +float3 ColorGrade(float3 frameColor) +{ + frameColor = ColorGradePostExposure(frameColor, PassSrg::m_colorGradingExposure); + frameColor = ColorGradeKelvinColorTemp(frameColor, PassSrg::m_whiteBalanceKelvin); + frameColor = ColorGradingContrast(frameColor, AcesCcMidGrey, PassSrg::m_colorGradingContrast); + frameColor = ColorGradeColorFilter(frameColor, PassSrg::m_colorFilterSwatch.rgb, + PassSrg::m_colorFilterMultiply, PassSrg::m_colorFilterIntensity); + frameColor = max(frameColor, 0.0); + frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPreSaturation); + + frameColor = ColorGradeSplitTone(frameColor, PassSrg::m_splitToneBalance, PassSrg::m_splitToneWeight, + PassSrg::m_splitToneShadowsColor, PassSrg::m_splitToneHighlightsColor); + frameColor = ColorGradeChannelMixer(frameColor, PassSrg::m_channelMixingRed, PassSrg::m_channelMixingGreen, PassSrg::m_channelMixingBlue); + frameColor = max(frameColor, 0.0); + frameColor = ColorGradeShadowsMidtonesHighlights(frameColor, PassSrg::m_smhShadowsStart, PassSrg::m_smhShadowsEnd, + PassSrg::m_smhHighlightsStart, PassSrg::m_smhHighlightsEnd, PassSrg::m_smhWeight, + PassSrg::m_smhShadowsColor, PassSrg::m_smhMidtonesColor, PassSrg::m_smhHighlightsColor); + + frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPostSaturation); + + frameColor = ColorGradeHueShift(frameColor, PassSrg::m_colorGradingHueShift); + return max(frameColor.rgb, 0.0); +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/ColorGrading/LutGeneration.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/ColorGrading/LutGeneration.azsl index e2f7137514..2581e4c039 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/ColorGrading/LutGeneration.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/ColorGrading/LutGeneration.azsl @@ -16,7 +16,6 @@ #include #include -#include float3 convert2Dto3DLutCoords(float2 uv, float width, float height) { @@ -95,31 +94,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass_WithFallback float4 m_smhHighlightsColor; } -float3 ColorGrade(float3 linearColor) -{ - float3 color = TransformColor(linearColor, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); - color = ColorGradePostExposure(color, PassSrg::m_colorGradingExposure); - //color = ColorGradeKelvinColorTemp(color, PassSrg::m_whiteBalanceKelvin); - color = ColorGradingContrast(color, AcesCcMidGrey, PassSrg::m_colorGradingContrast); - color = ColorGradeColorFilter(color, PassSrg::m_colorFilterSwatch.rgb, - PassSrg::m_colorFilterMultiply, PassSrg::m_colorFilterIntensity); - color = max(color, 0.0); - color = ColorGradeSaturation(color, PassSrg::m_colorGradingPreSaturation); - - color = ColorGradeSplitTone(color, PassSrg::m_splitToneBalance, PassSrg::m_splitToneWeight, - PassSrg::m_splitToneShadowsColor, PassSrg::m_splitToneHighlightsColor); - color = ColorGradeChannelMixer(color, PassSrg::m_channelMixingRed, PassSrg::m_channelMixingGreen, PassSrg::m_channelMixingBlue); - color = max(color, 0.0); - color = ColorGradeShadowsMidtonesHighlights(color, PassSrg::m_smhShadowsStart, PassSrg::m_smhShadowsEnd, - PassSrg::m_smhHighlightsStart, PassSrg::m_smhHighlightsEnd, PassSrg::m_smhWeight, - PassSrg::m_smhShadowsColor, PassSrg::m_smhMidtonesColor, PassSrg::m_smhHighlightsColor); - - color = ColorGradeSaturation(color, PassSrg::m_colorGradingPostSaturation); - - color = ColorGradeHueShift(color, PassSrg::m_colorGradingHueShift); - color = TransformColor(color, ColorSpaceId::ACEScg, ColorSpaceId::LinearSRGB); - return max(color.rgb, 0.0); -} +#include struct PSOutput { @@ -130,39 +105,43 @@ PSOutput MainPS(VSOutput IN) { ShaperType shaperType = (ShaperType)PassSrg::m_shaperType; - PSOutput OUT; + // baseCoords are from 0-1 float3 baseCoords = float3(0.0, 0.0, 0.0); - float3 lutColor = float3(0.0, 0.0, 0.0); LutResolution lutRes = (LutResolution)PassSrg::m_lutResolution; switch(lutRes) { case LutResolution::Lut16x16x16: { baseCoords = convert2Dto3DLutCoords(IN.m_texCoord, 256, 16); - lutColor = PassSrg::m_identityLut16x16x16.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; + baseCoords = PassSrg::m_identityLut16x16x16.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; break; } case LutResolution::Lut32x32x32: { - // This seems correct intuitively, but is turning grey into green! baseCoords = convert2Dto3DLutCoords(IN.m_texCoord, 1024, 32); - lutColor = PassSrg::m_identityLut32x32x32.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; + baseCoords = PassSrg::m_identityLut32x32x32.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; break; } case LutResolution::Lut64x64x64: { baseCoords = convert2Dto3DLutCoords(IN.m_texCoord, 4096, 64); - lutColor = PassSrg::m_identityLut64x64x64.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; + baseCoords = PassSrg::m_identityLut64x64x64.Sample(PassSrg::PointSampler, baseCoords, 0.0).rgb; break; } } - float3 gradedColor = ColorGrade(lutColor); + float3 linearColor = ShaperToLinear(baseCoords, shaperType, PassSrg::m_shaperBias, PassSrg::m_shaperScale); - gradedColor = ShaperToLinear(gradedColor, shaperType, PassSrg::m_shaperBias, PassSrg::m_shaperScale); + linearColor = TransformColor(linearColor, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + float3 gradedColor = ColorGrade(linearColor); + gradedColor = TransformColor(gradedColor, ColorSpaceId::ACEScg, ColorSpaceId::LinearSRGB); - OUT.m_lutOutput = float4(gradedColor, 1.0); + // Bring back coordinates into 0-1 + float3 shapedColor = LinearToShaper(gradedColor, shaperType, PassSrg::m_shaperBias, PassSrg::m_shaperScale); + shapedColor = saturate(shapedColor); + + OUT.m_lutOutput = float4(shapedColor, 1.0); return OUT; } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl index 666fc3c815..9f08da3c60 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl @@ -12,7 +12,6 @@ #include #include -#include ShaderResourceGroup PassSrg : SRG_PerPass_WithFallback { @@ -60,27 +59,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass_WithFallback float4 m_smhHighlightsColor; } -// perform color grading in ACEScg space -float3 ColorGrade(float3 frameColor) -{ - frameColor = ColorGradePostExposure(frameColor, PassSrg::m_colorGradingExposure); - //frameColor = ColorGradeKelvinColorTemp(frameColor, PassSrg::m_whiteBalanceKelvin); - frameColor = ColorGradingContrast(frameColor, AcesCcMidGrey, PassSrg::m_colorGradingContrast); - frameColor = ColorGradeColorFilter(frameColor, PassSrg::m_colorFilterSwatch.rgb, - PassSrg::m_colorFilterMultiply, PassSrg::m_colorFilterIntensity); - frameColor = max(frameColor, 0.0); - frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPreSaturation); - frameColor = ColorGradeSplitTone(frameColor, PassSrg::m_splitToneBalance, PassSrg::m_splitToneWeight, - PassSrg::m_splitToneShadowsColor, PassSrg::m_splitToneHighlightsColor); - frameColor = ColorGradeChannelMixer(frameColor, PassSrg::m_channelMixingRed, PassSrg::m_channelMixingGreen, PassSrg::m_channelMixingBlue); - frameColor = max(frameColor, 0.0); - frameColor = ColorGradeShadowsMidtonesHighlights(frameColor, PassSrg::m_smhShadowsStart, PassSrg::m_smhShadowsEnd, - PassSrg::m_smhHighlightsStart, PassSrg::m_smhHighlightsEnd, PassSrg::m_smhWeight, - PassSrg::m_smhShadowsColor, PassSrg::m_smhMidtonesColor, PassSrg::m_smhHighlightsColor); - frameColor = ColorGradeHueShift(frameColor, PassSrg::m_colorGradingHueShift); - frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPostSaturation); - return max(frameColor.rgb, 0.0); -} +#include PSOutput MainPS(VSOutput IN) { diff --git a/Gems/Atom/Feature/Common/Code/Source/ColorGrading/LutGenerationPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ColorGrading/LutGenerationPass.cpp index 81edb3887b..c911258894 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ColorGrading/LutGenerationPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ColorGrading/LutGenerationPass.cpp @@ -104,9 +104,8 @@ namespace AZ bool LutGenerationPass::IsEnabled() const { - //const auto* colorGradingSettings = GetHDRColorGradingSettings(); - //return colorGradingSettings ? colorGradingSettings->GetGenerateLut() : false; - return true; + const auto* colorGradingSettings = GetHDRColorGradingSettings(); + return colorGradingSettings ? colorGradingSettings->GetGenerateLut() : false; } void LutGenerationPass::SetViewportScissorFromImageSize(const RHI::Size& imageSize) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.cpp index ce40bb0e96..32bb69766a 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.cpp @@ -104,7 +104,7 @@ namespace AZ ->Attribute(Edit::Attributes::Min, 0.0f) ->Attribute(Edit::Attributes::Max, 1.0f) ->DataElement(AZ::Edit::UIHandlers::Slider, &HDRColorGradingComponentConfig::m_splitToneBalance, "Split Tone Balance", "Split Tone Balance Value") - ->Attribute(Edit::Attributes::Min, 0.0f) + ->Attribute(Edit::Attributes::Min, -1.0f) ->Attribute(Edit::Attributes::Max, 1.0f) ->DataElement(AZ::Edit::UIHandlers::Color, &HDRColorGradingComponentConfig::m_splitToneShadowsColor, "Split Tone Shadows Color", "Split Tone Shadows Color") ->DataElement(AZ::Edit::UIHandlers::Color, &HDRColorGradingComponentConfig::m_splitToneHighlightsColor, "Split Tone Highlights Color", "Split Tone Highlights Color") @@ -175,36 +175,35 @@ namespace AZ void EditorHDRColorGradingComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) { - if (m_controller.m_configuration.m_generateLut && m_frameCounter) + if (m_waitOneFrame) { - --m_frameCounter; + m_waitOneFrame = false; return; } - else if (m_controller.m_configuration.m_generateLut && m_lutGenerationInProgress) + + const char* LutAttachment = "LutOutput"; + const AZStd::vector LutGenerationPassHierarchy{ "LutGenerationPass" }; + + char resolvedOutputFilePath[AZ_MAX_PATH_LEN] = { 0 }; + AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(m_currentTiffFilePath.c_str(), resolvedOutputFilePath, AZ_MAX_PATH_LEN); + + AZStd::string lutGenerationCacheFolder; + AzFramework::StringFunc::Path::GetFolderPath(resolvedOutputFilePath, lutGenerationCacheFolder); + AZ::IO::SystemFile::CreateDir(lutGenerationCacheFolder.c_str()); + + bool startedCapture = false; + AZ::Render::FrameCaptureRequestBus::BroadcastResult( + startedCapture, + &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, + LutGenerationPassHierarchy, + AZStd::string(LutAttachment), + m_currentTiffFilePath, + AZ::RPI::PassAttachmentReadbackOption::Output); + + if (startedCapture) { - const char* LutAttachment = "LutOutput"; - const AZStd::vector LutGenerationPassHierarchy{ "LutGenerationPass" }; - - char resolvedOutputFilePath[AZ_MAX_PATH_LEN] = { 0 }; - AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(m_currentTiffFilePath.c_str(), resolvedOutputFilePath, AZ_MAX_PATH_LEN); - - AZStd::string lutGenerationCacheFolder; - AzFramework::StringFunc::Path::GetFolderPath(resolvedOutputFilePath, lutGenerationCacheFolder); - AZ::IO::SystemFile::CreateDir(lutGenerationCacheFolder.c_str()); - - // capture frame + AZ::TickBus::Handler::BusDisconnect(); AZ::Render::FrameCaptureNotificationBus::Handler::BusConnect(); - - bool startedCapture = false; - AZ::Render::FrameCaptureRequestBus::BroadcastResult( - startedCapture, - &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, - LutGenerationPassHierarchy, - AZStd::string(LutAttachment), - m_currentTiffFilePath, - AZ::RPI::PassAttachmentReadbackOption::Output); - - m_lutGenerationInProgress = !startedCapture; } } @@ -238,7 +237,6 @@ namespace AZ &AzToolsFramework::PropertyEditorGUIMessages::RequestRefresh, AzToolsFramework::PropertyModificationRefreshLevel::Refresh_EntireTree); - AZ::TickBus::Handler::BusDisconnect(); AZ::Render::FrameCaptureNotificationBus::Handler::BusDisconnect(); } @@ -252,11 +250,10 @@ namespace AZ m_currentTiffFilePath = AZStd::string::format(TempTiffFilePath, uuidString.c_str()); m_currentLutFilePath = "@projectroot@/" + AZStd::string::format(GeneratedLutRelativePath, uuidString.c_str()); - m_lutGenerationInProgress = true; - m_controller.m_configuration.m_generateLut = true; + m_controller.SetGenerateLut(true); m_controller.OnConfigChanged(); - m_frameCounter = FramesToWait; + m_waitOneFrame = true; AZ::TickBus::Handler::BusConnect(); } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.h index ee2bebf2ef..ebd2f70b96 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/ColorGrading/EditorHDRColorGradingComponent.h @@ -34,10 +34,6 @@ namespace AZ static void Reflect(AZ::ReflectContext* context); - static const int FramesToWait = 5; - //static const char* LutAttachment; - //static const AZStd::vector LutGenerationPassHierarchy; - EditorHDRColorGradingComponent() = default; EditorHDRColorGradingComponent(const HDRColorGradingComponentConfig& config); @@ -55,8 +51,7 @@ namespace AZ AZ::u32 ActivateLut(); bool GetGeneratedLutVisibilitySettings(); - AZStd::atomic_bool m_lutGenerationInProgress = false; - int m_frameCounter; + bool m_waitOneFrame = false; AZStd::string m_currentTiffFilePath; AZStd::string m_currentLutFilePath;