|
@@ -16,8 +16,8 @@ const uint WORKGROUP_SIZE_Y = 16u;
|
|
|
const uint WORKGROUP_SIZE = WORKGROUP_SIZE_X * WORKGROUP_SIZE_Y;
|
|
const uint WORKGROUP_SIZE = WORKGROUP_SIZE_X * WORKGROUP_SIZE_Y;
|
|
|
|
|
|
|
|
layout(
|
|
layout(
|
|
|
- local_size_x = WORKGROUP_SIZE_X,
|
|
|
|
|
- local_size_y = WORKGROUP_SIZE_Y,
|
|
|
|
|
|
|
+ local_size_x = WORKGROUP_SIZE_X,
|
|
|
|
|
+ local_size_y = WORKGROUP_SIZE_Y,
|
|
|
local_size_z = 1) in;
|
|
local_size_z = 1) in;
|
|
|
|
|
|
|
|
const uint MIPMAP_WIDTH = ANKI_RENDERER_WIDTH / (2u << (IS_RT_MIPMAP - 1u));
|
|
const uint MIPMAP_WIDTH = ANKI_RENDERER_WIDTH / (2u << (IS_RT_MIPMAP - 1u));
|
|
@@ -42,17 +42,18 @@ void main()
|
|
|
uint yStart = gl_LocalInvocationID.y * PIXEL_READ_Y;
|
|
uint yStart = gl_LocalInvocationID.y * PIXEL_READ_Y;
|
|
|
uint xStart = gl_LocalInvocationID.x * PIXEL_READ_X;
|
|
uint xStart = gl_LocalInvocationID.x * PIXEL_READ_X;
|
|
|
for(uint y = 0; y < PIXEL_READ_Y; ++y)
|
|
for(uint y = 0; y < PIXEL_READ_Y; ++y)
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
for(uint x = 0; x < PIXEL_READ_X; ++x)
|
|
for(uint x = 0; x < PIXEL_READ_X; ++x)
|
|
|
{
|
|
{
|
|
|
vec3 color = texelFetchOffset(
|
|
vec3 color = texelFetchOffset(
|
|
|
u_isRt, ivec2(xStart, yStart), IS_RT_MIPMAP, ivec2(x, y)).rgb;
|
|
u_isRt, ivec2(xStart, yStart), IS_RT_MIPMAP, ivec2(x, y)).rgb;
|
|
|
float lum = computeLuminance(color);
|
|
float lum = computeLuminance(color);
|
|
|
- avgLum += log(lum);
|
|
|
|
|
|
|
+ //avgLum += log(lum);
|
|
|
|
|
+ avgLum += lum / float(MIPMAP_WIDTH * MIPMAP_HEIGHT);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- avgLum *= 1.0 / float(PIXEL_READ_X * PIXEL_READ_Y);
|
|
|
|
|
|
|
+ //avgLum *= 1.0 / float(PIXEL_READ_X * PIXEL_READ_Y);
|
|
|
g_avgLum[gl_LocalInvocationIndex] = avgLum;
|
|
g_avgLum[gl_LocalInvocationIndex] = avgLum;
|
|
|
|
|
|
|
|
memoryBarrierShared();
|
|
memoryBarrierShared();
|
|
@@ -63,7 +64,7 @@ void main()
|
|
|
{
|
|
{
|
|
|
if(gl_LocalInvocationIndex < s)
|
|
if(gl_LocalInvocationIndex < s)
|
|
|
{
|
|
{
|
|
|
- g_avgLum[gl_LocalInvocationIndex] +=
|
|
|
|
|
|
|
+ g_avgLum[gl_LocalInvocationIndex] +=
|
|
|
g_avgLum[gl_LocalInvocationIndex + s];
|
|
g_avgLum[gl_LocalInvocationIndex + s];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -74,13 +75,16 @@ void main()
|
|
|
// Write the result
|
|
// Write the result
|
|
|
if(gl_LocalInvocationIndex == 0)
|
|
if(gl_LocalInvocationIndex == 0)
|
|
|
{
|
|
{
|
|
|
- float crntLum = exp(g_avgLum[0] / float(WORKGROUP_SIZE));
|
|
|
|
|
-#if 0
|
|
|
|
|
|
|
+ float crntLum = g_avgLum[0];
|
|
|
|
|
+ //crntLum = exp(crntLum / float(WORKGROUP_SIZE));
|
|
|
|
|
+ crntLum = max(crntLum, 0.04);
|
|
|
|
|
+
|
|
|
|
|
+#if 1
|
|
|
float prevLum = u_averageLuminancePad3.x;
|
|
float prevLum = u_averageLuminancePad3.x;
|
|
|
|
|
|
|
|
// Lerp between previous and new L value
|
|
// Lerp between previous and new L value
|
|
|
const float INTERPOLATION_FACTOR = 0.05;
|
|
const float INTERPOLATION_FACTOR = 0.05;
|
|
|
- u_averageLuminancePad3.x = prevLum * (1.0 - INTERPOLATION_FACTOR)
|
|
|
|
|
|
|
+ u_averageLuminancePad3.x = prevLum * (1.0 - INTERPOLATION_FACTOR)
|
|
|
+ crntLum * INTERPOLATION_FACTOR;
|
|
+ crntLum * INTERPOLATION_FACTOR;
|
|
|
#else
|
|
#else
|
|
|
u_averageLuminancePad3.x = crntLum;
|
|
u_averageLuminancePad3.x = crntLum;
|