From 25df2d8a0217b7c35c74c9841077e9897936e2d8 Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Wed, 29 Apr 2026 19:25:12 +0200 Subject: [PATCH] Adds resolve PBR compute shader Also fixes sky shader as it was writing negative values for -Y direction. --- .../shaders/effects/compute_resolve_pbr.xml | 8 +++++ .../mod/shaders/glsl/compute_resolve_pbr.cs | 34 +++++++++++++++++++ .../mod/shaders/glsl/compute_resolve_pbr.xml | 4 +++ binaries/data/mods/mod/shaders/glsl/sky.fs | 4 +-- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 binaries/data/mods/mod/shaders/effects/compute_resolve_pbr.xml create mode 100644 binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.cs create mode 100644 binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.xml diff --git a/binaries/data/mods/mod/shaders/effects/compute_resolve_pbr.xml b/binaries/data/mods/mod/shaders/effects/compute_resolve_pbr.xml new file mode 100644 index 0000000000..1f0f8cb940 --- /dev/null +++ b/binaries/data/mods/mod/shaders/effects/compute_resolve_pbr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.cs b/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.cs new file mode 100644 index 0000000000..382218c546 --- /dev/null +++ b/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.cs @@ -0,0 +1,34 @@ +#version 430 + +#include "common/compute.h" + +BEGIN_DRAW_TEXTURES + TEXTURE_2D(0, inTex) +END_DRAW_TEXTURES + +BEGIN_DRAW_UNIFORMS + UNIFORM(vec4, screenSize) + // Premultiplied exposure, already contains 2^exposure. + UNIFORM(float, exposure) +END_DRAW_UNIFORMS + +STORAGE_2D(0, rgba8, outTex); + +vec3 applyTonemapper(vec3 color) +{ + float whitePoint = 10.0; + // Extendend Reinhard: + // https://www-old.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf + return color * (vec3(1.0) + color / (whitePoint * whitePoint)) / (vec3(1.0) + color); +} + +layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; +void main() +{ + ivec2 position = ivec2(gl_GlobalInvocationID.xy); + if (any(greaterThanEqual(position, ivec2(screenSize.xy)))) + return; + vec3 hdrColor = texelFetch(GET_DRAW_TEXTURE_2D(inTex), position, 0).rgb; + vec3 sdrColor = applyTonemapper(hdrColor * exposure); + imageStore(outTex, position, vec4(sdrColor, 1.0)); +} diff --git a/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.xml b/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.xml new file mode 100644 index 0000000000..a2ed6b5d5a --- /dev/null +++ b/binaries/data/mods/mod/shaders/glsl/compute_resolve_pbr.xml @@ -0,0 +1,4 @@ + + + + diff --git a/binaries/data/mods/mod/shaders/glsl/sky.fs b/binaries/data/mods/mod/shaders/glsl/sky.fs index 5b76e6078c..5d6972e1bf 100644 --- a/binaries/data/mods/mod/shaders/glsl/sky.fs +++ b/binaries/data/mods/mod/shaders/glsl/sky.fs @@ -6,10 +6,10 @@ void main() { - vec4 tex = SAMPLE_CUBE(GET_DRAW_TEXTURE_CUBE(baseTex), v_tex); + vec3 color = SAMPLE_CUBE(GET_DRAW_TEXTURE_CUBE(baseTex), v_tex).rgb; float m = (1.0 - v_tex.y) - 0.75; m *= 4.0; - OUTPUT_FRAGMENT_SINGLE_COLOR((v_tex.y > 0.0) ? (tex * m) : tex); + OUTPUT_FRAGMENT_SINGLE_COLOR(vec4((v_tex.y > 0.0) ? clamp(color * m, 0.0, 1.0) : color, 1.0)); }