0u; s >>= 1u) { if(gl_LocalInvocationIndex < s) { s_avgLum[gl_LocalInvocationIndex] += s_avgLum[gl_LocalInvocationIndex + s]; } memoryBarrierShared(); barrier(); } // Write the result ANKI_BRANCH if(gl_LocalInvocationIndex == 0) { #if LOG_AVG float crntLum = exp(s_avgLum[0] * (1.0 / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y))); #else float crntLum = s_avgLum[0] * (1.0 / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y)); #endif #if 1 float prevLum = u_averageLuminance; // Lerp between previous and new L value const float INTERPOLATION_FACTOR = 0.05; float finalAvgLum = mix(prevLum, crntLum, INTERPOLATION_FACTOR); #else float finalAvgLum = crntLum; #endif // This is a workaround because sometimes the avg lum becomes nan finalAvgLum = clamp(finalAvgLum, EPSILON, FLT_MAX); u_averageLuminance = finalAvgLum; u_exposureThreshold0 = computeExposure(u_averageLuminance, 0.0); } } ]]>