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)); }