diff --git a/Content/Shaders/Histogram.flax b/Content/Shaders/Histogram.flax index 31ffdd42d..c23d93973 100644 --- a/Content/Shaders/Histogram.flax +++ b/Content/Shaders/Histogram.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af6e12eef9b70f29ed31bfbd30197e69e14202b9e2b71cf0391d03387e77d84d -size 2522 +oid sha256:c0f6f453083d99451586af7591f17275413c431281847ad8c267eb9b4c8d9136 +size 2792 diff --git a/Source/Shaders/Histogram.shader b/Source/Shaders/Histogram.shader index a8da71d5b..ab1fa1850 100644 --- a/Source/Shaders/Histogram.shader +++ b/Source/Shaders/Histogram.shader @@ -46,20 +46,28 @@ groupshared uint SharedHistogram[HISTOGRAM_SIZE]; // Generates the histogram META_CS(true, FEATURE_LEVEL_SM5) [numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, 1)] -void CS_GenerateHistogram(uint3 groupId : SV_GroupID, uint3 dispatchThreadId : SV_DispatchThreadID, uint3 groupThreadId : SV_GroupThreadID, uint groupIndex : SV_GroupIndex) +void CS_GenerateHistogram(uint3 dispatchThreadId : SV_DispatchThreadID, uint3 groupThreadId : SV_GroupThreadID) { - const uint localThreadId = groupThreadId.y * THREADGROUP_SIZE_X + groupThreadId.x; + const uint threadId = groupThreadId.y * THREADGROUP_SIZE_X + groupThreadId.x; // Clear the histogram - if (localThreadId < HISTOGRAM_SIZE) - SharedHistogram[localThreadId] = 0u; + if (threadId < HISTOGRAM_SIZE) + SharedHistogram[threadId] = 0u; GroupMemoryBarrierWithGroupSync(); // Gather local group histogram if (dispatchThreadId.x < InputSize.x && dispatchThreadId.y < InputSize.y) { +#if 1 + // Screen vignette to put more weight into samples in the center of the image + float2 uv = (float2)dispatchThreadId.xy / float2(InputSize.x, InputSize.y); + float2 center = abs(uv - float2(0.5f, 0.5f)); + float scale = saturate(1 - dot(center, center)); + uint weight = (uint)(scale * scale * 64.0f); +#else uint weight = 1u; +#endif float3 color = Input[dispatchThreadId.xy].xyz; float luminance = Luminance(color); float logLuminance = ComputeHistogramPositionFromLuminance(luminance); @@ -70,8 +78,8 @@ void CS_GenerateHistogram(uint3 groupId : SV_GroupID, uint3 dispatchThreadId : S GroupMemoryBarrierWithGroupSync(); // Merge everything - if (localThreadId < HISTOGRAM_SIZE) - InterlockedAdd(HistogramBuffer[localThreadId], SharedHistogram[localThreadId]); + if (threadId < HISTOGRAM_SIZE) + InterlockedAdd(HistogramBuffer[threadId], SharedHistogram[threadId]); } #endif