diff --git a/src/modules/capture/accumulate.comp b/src/modules/capture/accumulate.comp index ae697211..8edc04ac 100644 --- a/src/modules/capture/accumulate.comp +++ b/src/modules/capture/accumulate.comp @@ -10,6 +10,17 @@ layout (push_constant) uniform push_constants { float weight; }; +// Transfer functions are the sRGB reference monitor EOTF of x^2.2, explicitly +// not the piecewise functions. +// https://en.wikipedia.org/wiki/SRGB#Transfer_function_(%22gamma%22) +// definitions of terms: https://cie.co.at/e-ilv + +// sRGB electro-optical transfer function +vec3 sRGB_EOTF(vec3 value) +{ + return pow(value, vec3(2.2)); +} + void main() { ivec2 size = imageSize(image_frame); uint width = uint(size.x), height = uint(size.y); @@ -23,6 +34,9 @@ void main() { vec4 frameColor = imageLoad(image_frame, coords); vec4 sampleColor = imageLoad(image_sample, coords); - vec4 newColor = sampleColor + frameColor * weight; + vec4 newColor = vec4( + sampleColor.rgb + sRGB_EOTF(frameColor.rgb) * weight, + sampleColor + frameColor * weight // alpha channel isn't encoded + ); imageStore(image_sample, coords, newColor); } diff --git a/src/modules/capture/accumulate.spv b/src/modules/capture/accumulate.spv index 4eec7c17..c28377bc 100644 Binary files a/src/modules/capture/accumulate.spv and b/src/modules/capture/accumulate.spv differ diff --git a/src/modules/capture/color_conversion.comp b/src/modules/capture/color_conversion.comp index 5fff3ebb..4e76c1b9 100644 --- a/src/modules/capture/color_conversion.comp +++ b/src/modules/capture/color_conversion.comp @@ -11,6 +11,12 @@ layout (binding = 1) buffer OutputBuffer { uint8_t output_buffer[]; }; +// sRGB opto-electronic transfer function +vec3 sRGB_OETF(vec3 value) +{ + return pow(value, vec3(1.0 / 2.2)); +} + void main() { vec2 size = textureSize(image_sample, 0); uint width = uint(size.x), height = uint(size.y); @@ -20,6 +26,7 @@ void main() { return; vec4 color = texture(image_sample, vec2(x + 0.5, y + 0.5)); + color.rgb = sRGB_OETF(color.rgb); // The OpenGL coordinate system is upside-down compared to the usual video coordinate systems. // Let's invert it here in the shader. diff --git a/src/modules/capture/color_conversion.spv b/src/modules/capture/color_conversion.spv index aed68d6d..121f9194 100644 Binary files a/src/modules/capture/color_conversion.spv and b/src/modules/capture/color_conversion.spv differ