slang-shaders/reshade/shaders/bloom/LightingCombine.slang

102 lines
3.6 KiB
Plaintext
Raw Normal View History

#version 450
layout(push_constant) uniform Push
{
vec4 SourceSize;
vec4 OriginalSize;
vec4 OutputSize;
uint FrameCount;
} params;
#include "params.inc"
#pragma stage vertex
layout(location = 0) in vec4 Position;
layout(location = 1) in vec2 TexCoord;
layout(location = 0) out vec2 vTexCoord;
void main()
{
gl_Position = global.MVP * Position;
vTexCoord = TexCoord;
}
#pragma stage fragment
layout(location = 0) in vec2 vTexCoord;
layout(location = 0) out vec4 FragColor;
layout(set = 0, binding = 2) uniform sampler2D Source;
layout(set = 0, binding = 3) uniform sampler2D Original;
layout(set = 0, binding = 4) uniform sampler2D Bloom3;
layout(set = 0, binding = 5) uniform sampler2D Bloom5;
layout(set = 0, binding = 6) uniform sampler2D Dirt;
layout(set = 0, binding = 7) uniform sampler2D Sprite;
layout(set = 0, binding = 8) uniform sampler2D LensFlare1;
#include "frag_funcs.inc"
#define saturate(c) clamp(c, 0., 1.)
void main()
{
vec4 color = vec4(0.);
color = texture(Original, vTexCoord.xy);
// Bloom
vec3 colorbloom = vec3(0.);
colorbloom += texture(Bloom3, vTexCoord.xy).rgb * 1.0;
colorbloom += texture(Bloom5, vTexCoord.xy).rgb * 9.0;
colorbloom *= 0.1;
colorbloom = saturate(colorbloom);
float colorbloomgray = dot(colorbloom, vec3(0.333));
colorbloom = mix(vec3(colorbloomgray), colorbloom, vec3(global.fBloomSaturation));
colorbloom *= fBloomTint;
if (global.iBloomMixmode == 0.)
color.rgb += colorbloom;
else if (global.iBloomMixmode == 1.)
color.rgb = 1. - (1. - color.rgb) * (1. - colorbloom);
else if (global.iBloomMixmode == 2.)
color.rgb = max(vec3(0.0), max(color.rgb, mix(color.rgb, (1. - (1. - saturate(colorbloom)) * (1. - saturate(colorbloom))), 1.0)));
else if (global.iBloomMixmode == 3.)
color.rgb = max(color.rgb, colorbloom);
// Anamorphic flare
if (global.bAnamFlareEnable > 0.5)
{
vec3 anamflare = texture(Bloom5, vTexCoord.xy).w * 2. * fAnamFlareColor;
anamflare = max(anamflare, 0.0);
color.rgb += pow(anamflare, vec3(1.0 / global.fAnamFlareCurve));
}
// Lens dirt
if (global.bLensdirtEnable > 0.5)
{
float lensdirtmult = dot(texture(Bloom5, vTexCoord).rgb, vec3(0.333));
vec3 dirttex = texture(Dirt, vTexCoord).rgb;
vec3 lensdirt = dirttex * lensdirtmult * global.fLensdirtIntensity;
lensdirt = mix(vec3(dot(lensdirt.xyz, vec3(0.333))), lensdirt.xyz, vec3(global.fLensdirtSaturation));
if (global.iLensdirtMixmode == 0.)
color.rgb += lensdirt;
else if (global.iLensdirtMixmode == 1.)
color.rgb = 1. - (1. - color.rgb) * (1. - lensdirt);
else if (global.iLensdirtMixmode == 2.)
color.rgb = max(vec3(0.0), max(color.rgb, mix(color.rgb, (1. - (1. - saturate(lensdirt)) * (1. - saturate(lensdirt))), 1.0)));
else if (global.iLensdirtMixmode == 3.)
color.rgb = max(color.rgb, lensdirt);
}
// Lens flares
if (global.bAnamFlareEnable > 0.5 || global.bLenzEnable > 0.5 || global.bGodrayEnable > 0.5 || global.bChapFlareEnable > 0.5)
{
vec3 lensflareSample = texture(LensFlare1, vTexCoord.xy).rgb, lensflareMask;
lensflareMask = texture(Sprite, vTexCoord + vec2( 0.5, 0.5) * (vTexCoord.xy * params.SourceSize.zw)).rgb;
lensflareMask += texture(Sprite, vTexCoord + vec2(-0.5, 0.5) * (vTexCoord.xy * params.SourceSize.zw)).rgb;
lensflareMask += texture(Sprite, vTexCoord + vec2( 0.5, -0.5) * (vTexCoord.xy * params.SourceSize.zw)).rgb;
lensflareMask += texture(Sprite, vTexCoord + vec2(-0.5, -0.5) * (vTexCoord.xy * params.SourceSize.zw)).rgb;
color.rgb += lensflareMask * 0.25 * lensflareSample;
}
FragColor = color;
}