mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-12-02 04:11:30 +11:00
102 lines
3.6 KiB
Plaintext
102 lines
3.6 KiB
Plaintext
|
#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;
|
||
|
}
|