From 473c6be2e3b19205fb8dd6dc6764a2aee2cb7c64 Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Sat, 24 Feb 2024 20:36:27 +1100 Subject: [PATCH] shader optimisations --- assets/scene.blend | 4 ++-- assets/shader/main.fsh | 36 ++++++++++-------------------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/assets/scene.blend b/assets/scene.blend index 6c0b67d..adb4d3d 100644 --- a/assets/scene.blend +++ b/assets/scene.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aac24055bb22a36ac073e572d7d668d97b6ea9bfe4e08e912f4f021f57efcc20 -size 12241421 +oid sha256:1e02c14af3ac4cef4a7e844810cee21e78e71e487c89d80de6eeca41cf50f6c7 +size 12241645 diff --git a/assets/shader/main.fsh b/assets/shader/main.fsh index 4992239..8d5b4c0 100644 --- a/assets/shader/main.fsh +++ b/assets/shader/main.fsh @@ -75,38 +75,22 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) return ggx1 * ggx2; } -float LinRGB_To_sRGB(float c) -{ - if (c < 0.0031308f) { - return (c < 0.0f) ? 0.0f : c * 12.92f; - } - - return 1.055f * pow(c, 1.0f / 2.4f) - 0.055f; -} - vec3 LinRGB_To_sRGB(vec3 c) { - c.r = LinRGB_To_sRGB(c.r); - c.g = LinRGB_To_sRGB(c.g); - c.b = LinRGB_To_sRGB(c.b); - return c; -} + bvec3 th = lessThan(c, vec3(0.0031308f)); + vec3 high = pow(c, vec3(1.0f / 2.4f)) * vec3(1.055f) - vec3(0.055f); + vec3 low = c * vec3(12.92f); -float sRGB_To_LinRGB(float c) -{ - if (c < 0.04045f) { - return (c < 0.0f) ? 0.0f : c * (1.0f / 12.92f); - } - - return pow((c + 0.055f) * (1.0f / 1.055f), 2.4f); + return mix(high, low, th); } vec3 sRGB_To_LinRGB(vec3 c) { - c.r = sRGB_To_LinRGB(c.r); - c.g = sRGB_To_LinRGB(c.g); - c.b = sRGB_To_LinRGB(c.b); - return c; + bvec3 th = lessThan(c, vec3(0.04045f)); + vec3 high = pow((c + vec3(0.055f)) * vec3(1.0f / 1.055f), vec3(2.4f)); + vec3 low = c * vec3(1.0f / 12.92f); + + return mix(high, low, th); } void main() @@ -157,7 +141,7 @@ void main() vec3 ambient = vec3(0.03f) * albedo_lin * brightness; vec3 light = LinRGB_To_sRGB(ambient + Lo); - light = light * (1 - luminance) + albedo.rgb * luminance; + light = mix(light, albedo.rgb, luminance); frag_colour = vec4(light, albedo.a); if(frag_colour.a == 0.f) discard;