90845313fb
* Fixed log2 shaper equations. Added bspline sampling for lut. Added options for custom log2 or linear lut with custom exposure ranges. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Added support for PQ shaper. Added shader option & cvar for lut sampling quality. Fixed issues in the blend lut shader that were causing considerable quality loss. No longer always changing to the log2 1000 nit shaper when blending luts - if the source luts all use the same shaper, keep using that shaper in the blended lut. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Fixed an integer -> float Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Minor PR reveiw updates Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>
64 lines
2.1 KiB
Plaintext
64 lines
2.1 KiB
Plaintext
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#include <Atom/Features/SrgSemantics.azsli>
|
|
|
|
#include <Atom/Features/PostProcessing/FullscreenPixelInfo.azsli>
|
|
#include <Atom/Features/PostProcessing/FullscreenVertex.azsli>
|
|
#include <Atom/Features/PostProcessing/PostProcessUtil.azsli>
|
|
#include <Atom/Features/PostProcessing/Shapers.azsli>
|
|
|
|
ShaderResourceGroup PassSrg : SRG_PerPass
|
|
{
|
|
Texture2D<float4> m_colorTexture;
|
|
Texture3D<float4> m_lut;
|
|
Sampler LinearSampler
|
|
{
|
|
MinFilter = Linear;
|
|
MagFilter = Linear;
|
|
MipFilter = Linear;
|
|
AddressU = Clamp;
|
|
AddressV = Clamp;
|
|
AddressW = Clamp;
|
|
};
|
|
|
|
int m_shaperType;
|
|
float m_shaperBias;
|
|
float m_shaperScale;
|
|
}
|
|
|
|
PSOutput MainPS(VSOutput IN)
|
|
{
|
|
PSOutput OUT;
|
|
|
|
float2 uvCoord = float2(IN.m_texCoord.x, IN.m_texCoord.y);
|
|
float3 color = PassSrg::m_colorTexture.Sample(PassSrg::LinearSampler, uvCoord).rgb;
|
|
|
|
ShaperType shaperType = (ShaperType)PassSrg::m_shaperType;
|
|
|
|
// Convert from working color space to lut coordinates by applying the shaper function
|
|
float3 lutCoordinate = LinearToShaper(color, shaperType, PassSrg::m_shaperBias, PassSrg::m_shaperScale);
|
|
|
|
// Adjust coordinate to the domain excluding the outer half texel in all directions
|
|
uint3 outputDimensions;
|
|
PassSrg::m_lut.GetDimensions(outputDimensions.x, outputDimensions.y, outputDimensions.z);
|
|
float3 coordBias = 1.0 / (2.0 * outputDimensions);
|
|
float3 coordScale = (outputDimensions - 1.0) / outputDimensions;
|
|
lutCoordinate = (lutCoordinate * coordScale) + coordBias;
|
|
|
|
float3 lutColor = PassSrg::m_lut.Sample(PassSrg::LinearSampler, lutCoordinate).rgb;
|
|
|
|
// Apply the inverse of the shaper function to give the color in the working color space
|
|
float3 finalColor = ShaperToLinear(lutColor, shaperType, PassSrg::m_shaperBias, PassSrg::m_shaperScale);
|
|
|
|
OUT.m_color.rgb = finalColor;
|
|
OUT.m_color.a = 1.0;
|
|
|
|
return OUT;
|
|
}
|