From 7bfba01954db18bcaa18150e75b62f6510348d9e Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Mon, 9 Oct 2023 14:51:07 -0400 Subject: [PATCH] vk: rt: add test for srgb-vs-linear model color --- ref/vk/shaders/bounce.comp | 9 +++++---- ref/vk/shaders/ray_primary.comp | 2 +- ref/vk/shaders/ray_primary_hit.glsl | 15 +++++++++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/ref/vk/shaders/bounce.comp b/ref/vk/shaders/bounce.comp index 094f24b0..59d5e57d 100644 --- a/ref/vk/shaders/bounce.comp +++ b/ref/vk/shaders/bounce.comp @@ -49,7 +49,7 @@ void readNormals(ivec2 uv, out vec3 geometry_normal, out vec3 shading_normal) { } -bool getHit(vec3 origin, vec3 direction, inout RayPayloadPrimary payload) { +bool getHit(vec3 origin, vec3 direction, inout RayPayloadPrimary payload, int test_val) { rayQueryEXT rq; const uint flags = 0 //| gl_RayFlagsCullFrontFacingTrianglesEXT @@ -84,10 +84,11 @@ bool getHit(vec3 origin, vec3 direction, inout RayPayloadPrimary payload) { if (rayQueryGetIntersectionTypeEXT(rq, true) != gl_RayQueryCommittedIntersectionTriangleEXT) return false; - primaryRayHit(rq, payload); + primaryRayHit(rq, payload, test_val); //L = rayQueryGetIntersectionTEXT(rq, true); return true; } +const int INDIRECT_SCALE = 2; void computeBounce(ivec2 pix, vec3 direction, out vec3 diffuse, out vec3 specular) { diffuse = vec3(0.); @@ -149,7 +150,8 @@ void computeBounce(ivec2 pix, vec3 direction, out vec3 diffuse, out vec3 specula payload.base_color_a = vec4(0.); payload.emissive = vec4(0.); const vec3 pos = imageLoad(position_t, pix).xyz + geometry_normal * ray_normal_fudge; - if (!getHit(pos, bounce_direction, payload)) + const ivec2 res = ivec2(imageSize(out_indirect_diffuse)) / INDIRECT_SCALE; + if (!getHit(pos, bounce_direction, payload, (pix.x < res.x / 2) ? 0 : 1)) return; throughput *= payload.base_color_a.rgb; @@ -180,7 +182,6 @@ void computeBounce(ivec2 pix, vec3 direction, out vec3 diffuse, out vec3 specula } } -const int INDIRECT_SCALE = 2; void main() { const ivec2 pix = ivec2(gl_GlobalInvocationID); diff --git a/ref/vk/shaders/ray_primary.comp b/ref/vk/shaders/ray_primary.comp index 2ecd36c3..399dae1d 100644 --- a/ref/vk/shaders/ray_primary.comp +++ b/ref/vk/shaders/ray_primary.comp @@ -103,7 +103,7 @@ void main() { if (rayQueryGetIntersectionTypeEXT(rq, true) == gl_RayQueryCommittedIntersectionTriangleEXT) { //debug_geometry_index = rayQueryGetIntersectionGeometryIndexEXT(rq, true); //debug_geometry_index = rayQueryGetIntersectionPrimitiveIndexEXT(rq, true); - primaryRayHit(rq, payload); + primaryRayHit(rq, payload, (pix.x < res.x / 2) ? 0 : 1); L = rayQueryGetIntersectionTEXT(rq, true); } else { // Draw skybox when nothing is hit diff --git a/ref/vk/shaders/ray_primary_hit.glsl b/ref/vk/shaders/ray_primary_hit.glsl index 2c0707f3..afadb6fb 100644 --- a/ref/vk/shaders/ray_primary_hit.glsl +++ b/ref/vk/shaders/ray_primary_hit.glsl @@ -20,7 +20,7 @@ vec4 sampleTexture(uint tex_index, vec2 uv, vec4 uv_lods) { #endif } -void primaryRayHit(rayQueryEXT rq, inout RayPayloadPrimary payload) { +void primaryRayHit(rayQueryEXT rq, inout RayPayloadPrimary payload, int test_value) { Geometry geom = readHitGeometry(rq, ubo.ubo.ray_cone_width, rayQueryGetIntersectionBarycentricsEXT(rq, true)); const float hitT = rayQueryGetIntersectionTEXT(rq, true); //gl_HitTEXT; const vec3 rayDirection = rayQueryGetWorldRayDirectionEXT(rq); //gl_WorldRayDirectionEXT @@ -99,7 +99,18 @@ void primaryRayHit(rayQueryEXT rq, inout RayPayloadPrimary payload) { const int model_index = rayQueryGetIntersectionInstanceIdEXT(rq, true); const ModelHeader model = getModelHeader(model_index); - const vec4 color = model.color * SRGBtoLINEAR(kusok.material.base_color); // FIXME why is material.base_color in gamma space? + +//#define TEST_COLORS_GAMMA +#ifdef TEST_COLORS_GAMMA + // FIXME: + // - should material.base_color (which we control) be linear or sRGB? + // - is model.color linear or sRGB? It's a value from the engine, which implies sRGB. Can we convert it once in the native code? + const vec4 color = test_value == 0 + ? SRGBtoLINEAR(model.color) * kusok.material.base_color + : model.color * kusok.material.base_color; +#else + const vec4 color = SRGBtoLINEAR(model.color) * kusok.material.base_color; +#endif payload.base_color_a *= color; payload.emissive.rgb *= color.rgb;