From d76d6429d09b3a9774e362df910d92230c12af3b Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Mon, 9 Oct 2023 14:51:29 -0400 Subject: [PATCH] =?UTF-8?q?vk:=20rt:=20ensure=20that=20base=5Fcolor=5Fa=20?= =?UTF-8?q?is=20stored=20in=20sRGB-=CE=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Storing it linearly was a mistake: it is 8-bit only, and lacks enough precision for dark values. It also doesn't really need any more precision, and should be limited to 0..1 range. Therefore, it makes sense to treat it as sRGB explicitly. --- ref/vk/shaders/bounce.comp | 2 +- ref/vk/shaders/denoiser.comp | 7 ++++++- ref/vk/shaders/ray_primary.comp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ref/vk/shaders/bounce.comp b/ref/vk/shaders/bounce.comp index 59d5e57d..00e2e5cb 100644 --- a/ref/vk/shaders/bounce.comp +++ b/ref/vk/shaders/bounce.comp @@ -95,7 +95,7 @@ void computeBounce(ivec2 pix, vec3 direction, out vec3 diffuse, out vec3 specula specular = vec3(0.); const vec4 material_data = imageLoad(material_rmxx, pix); - const vec4 base_a = imageLoad(base_color_a, pix); + const vec4 base_a = SRGBtoLINEAR(imageLoad(base_color_a, pix)); MaterialProperties material; material.baseColor = vec3(1.f); diff --git a/ref/vk/shaders/denoiser.comp b/ref/vk/shaders/denoiser.comp index 2baabad6..eee7f46c 100644 --- a/ref/vk/shaders/denoiser.comp +++ b/ref/vk/shaders/denoiser.comp @@ -36,11 +36,13 @@ layout(set = 0, binding = 15, rgba16f) uniform image2D prev_temporal_diffuse; layout(set = 0, binding = 16, rgba16f) uniform image2D out_temporal_specular; layout(set = 0, binding = 17, rgba16f) uniform image2D prev_temporal_specular; +//layout(set = 0, binding = 19) uniform sampler2D textures[MAX_TEXTURES]; const int INDIRECT_SCALE = 2; //#define DEBUG_TEXTURE normals_gs //#define DEBUG_TEXTURE emissive +//#define DEBUG_TEXTURE base_color_a //#define DEBUG_TEXTURE light_point_diffuse //#define DEBUG_NORMAL //layout(set = 0, binding = 18, rgba8) uniform readonly image2D material_rmxx; @@ -194,6 +196,9 @@ void main() { /* } */ #if defined(DEBUG_TEXTURE) + //if (pix.x < res.x / 2) { + //imageStore(out_dest, pix, vec4(LINEARtoSRGB(texture(textures[161], vec2(pix)/vec2(res)).rgb), 0.)); return; + //} imageStore(out_dest, pix, vec4(LINEARtoSRGB(imageLoad(DEBUG_TEXTURE, pix).rgb), 0.)); return; #endif @@ -270,7 +275,7 @@ void main() { //imageStore(out_dest, pix, vec4(LINEARtoSRGB(diffuse), 0.)); return; } - const vec4 base_color_a = imageLoad(base_color_a, pix); + const vec4 base_color_a = SRGBtoLINEAR(imageLoad(base_color_a, pix)); colour *= base_color_a.rgb; colour += imageLoad(emissive, pix).rgb; colour = LINEARtoSRGB(colour); diff --git a/ref/vk/shaders/ray_primary.comp b/ref/vk/shaders/ray_primary.comp index 399dae1d..03e0f27b 100644 --- a/ref/vk/shaders/ray_primary.comp +++ b/ref/vk/shaders/ray_primary.comp @@ -113,7 +113,7 @@ void main() { traceSimpleBlending(ray.origin, ray.direction, L, payload.emissive.rgb, payload.base_color_a.rgb); imageStore(out_position_t, pix, payload.hit_t); - imageStore(out_base_color_a, pix, payload.base_color_a); + imageStore(out_base_color_a, pix, LINEARtoSRGB(payload.base_color_a)); imageStore(out_normals_gs, pix, payload.normals_gs); //imageStore(out_material_rmxx, pix, vec4(payload.material_rmxx.rg, 0, uintToFloat01(xxhash32(debug_geometry_index)))); imageStore(out_material_rmxx, pix, payload.material_rmxx);