Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl')
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl176
1 files changed, 88 insertions, 88 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
index 6ac379c3845..299cb2094c1 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
@@ -49,172 +49,172 @@ out vec4 FragColor;
vec3 safe_color(vec3 c)
{
- /* Clamp to avoid black square artifacts if a pixel goes NaN. */
- return clamp(c, vec3(0.0), vec3(1e20)); /* 1e20 arbitrary. */
+ /* Clamp to avoid black square artifacts if a pixel goes NaN. */
+ return clamp(c, vec3(0.0), vec3(1e20)); /* 1e20 arbitrary. */
}
float brightness(vec3 c)
{
- return max(max(c.r, c.g), c.b);
+ return max(max(c.r, c.g), c.b);
}
/* 3-tap median filter */
vec3 median(vec3 a, vec3 b, vec3 c)
{
- return a + b + c - min(min(a, b), c) - max(max(a, b), c);
+ return a + b + c - min(min(a, b), c) - max(max(a, b), c);
}
/* ------------- Filters ------------ */
vec3 downsample_filter_high(sampler2D tex, vec2 uv, vec2 texelSize)
{
- /* Downsample with a 4x4 box filter + anti-flicker filter */
- vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1);
-
- vec3 s1 = textureLod(tex, uv + d.xy, 0.0).rgb;
- vec3 s2 = textureLod(tex, uv + d.zy, 0.0).rgb;
- vec3 s3 = textureLod(tex, uv + d.xw, 0.0).rgb;
- vec3 s4 = textureLod(tex, uv + d.zw, 0.0).rgb;
-
- /* Karis's luma weighted average (using brightness instead of luma) */
- float s1w = 1.0 / (brightness(s1) + 1.0);
- float s2w = 1.0 / (brightness(s2) + 1.0);
- float s3w = 1.0 / (brightness(s3) + 1.0);
- float s4w = 1.0 / (brightness(s4) + 1.0);
- float one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w);
-
- return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum;
+ /* Downsample with a 4x4 box filter + anti-flicker filter */
+ vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1);
+
+ vec3 s1 = textureLod(tex, uv + d.xy, 0.0).rgb;
+ vec3 s2 = textureLod(tex, uv + d.zy, 0.0).rgb;
+ vec3 s3 = textureLod(tex, uv + d.xw, 0.0).rgb;
+ vec3 s4 = textureLod(tex, uv + d.zw, 0.0).rgb;
+
+ /* Karis's luma weighted average (using brightness instead of luma) */
+ float s1w = 1.0 / (brightness(s1) + 1.0);
+ float s2w = 1.0 / (brightness(s2) + 1.0);
+ float s3w = 1.0 / (brightness(s3) + 1.0);
+ float s4w = 1.0 / (brightness(s4) + 1.0);
+ float one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w);
+
+ return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum;
}
vec3 downsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
{
- /* Downsample with a 4x4 box filter */
- vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1);
+ /* Downsample with a 4x4 box filter */
+ vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1);
- vec3 s;
- s = textureLod(tex, uv + d.xy, 0.0).rgb;
- s += textureLod(tex, uv + d.zy, 0.0).rgb;
- s += textureLod(tex, uv + d.xw, 0.0).rgb;
- s += textureLod(tex, uv + d.zw, 0.0).rgb;
+ vec3 s;
+ s = textureLod(tex, uv + d.xy, 0.0).rgb;
+ s += textureLod(tex, uv + d.zy, 0.0).rgb;
+ s += textureLod(tex, uv + d.xw, 0.0).rgb;
+ s += textureLod(tex, uv + d.zw, 0.0).rgb;
- return s * (1.0 / 4);
+ return s * (1.0 / 4);
}
vec3 upsample_filter_high(sampler2D tex, vec2 uv, vec2 texelSize)
{
- /* 9-tap bilinear upsampler (tent filter) */
- vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0) * sampleScale;
+ /* 9-tap bilinear upsampler (tent filter) */
+ vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0) * sampleScale;
- vec3 s;
- s = textureLod(tex, uv - d.xy, 0.0).rgb;
- s += textureLod(tex, uv - d.wy, 0.0).rgb * 2;
- s += textureLod(tex, uv - d.zy, 0.0).rgb;
+ vec3 s;
+ s = textureLod(tex, uv - d.xy, 0.0).rgb;
+ s += textureLod(tex, uv - d.wy, 0.0).rgb * 2;
+ s += textureLod(tex, uv - d.zy, 0.0).rgb;
- s += textureLod(tex, uv + d.zw, 0.0).rgb * 2;
- s += textureLod(tex, uv , 0.0).rgb * 4;
- s += textureLod(tex, uv + d.xw, 0.0).rgb * 2;
+ s += textureLod(tex, uv + d.zw, 0.0).rgb * 2;
+ s += textureLod(tex, uv, 0.0).rgb * 4;
+ s += textureLod(tex, uv + d.xw, 0.0).rgb * 2;
- s += textureLod(tex, uv + d.zy, 0.0).rgb;
- s += textureLod(tex, uv + d.wy, 0.0).rgb * 2;
- s += textureLod(tex, uv + d.xy, 0.0).rgb;
+ s += textureLod(tex, uv + d.zy, 0.0).rgb;
+ s += textureLod(tex, uv + d.wy, 0.0).rgb * 2;
+ s += textureLod(tex, uv + d.xy, 0.0).rgb;
- return s * (1.0 / 16.0);
+ return s * (1.0 / 16.0);
}
vec3 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
{
- /* 4-tap bilinear upsampler */
- vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * (sampleScale * 0.5);
+ /* 4-tap bilinear upsampler */
+ vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * (sampleScale * 0.5);
- vec3 s;
- s = textureLod(tex, uv + d.xy, 0.0).rgb;
- s += textureLod(tex, uv + d.zy, 0.0).rgb;
- s += textureLod(tex, uv + d.xw, 0.0).rgb;
- s += textureLod(tex, uv + d.zw, 0.0).rgb;
+ vec3 s;
+ s = textureLod(tex, uv + d.xy, 0.0).rgb;
+ s += textureLod(tex, uv + d.zy, 0.0).rgb;
+ s += textureLod(tex, uv + d.xw, 0.0).rgb;
+ s += textureLod(tex, uv + d.zw, 0.0).rgb;
- return s * (1.0 / 4.0);
+ return s * (1.0 / 4.0);
}
/* ----------- Steps ----------- */
vec4 step_blit(void)
{
- vec2 uv = uvcoordsvar.xy + sourceBufferTexelSize.xy * 0.5;
+ vec2 uv = uvcoordsvar.xy + sourceBufferTexelSize.xy * 0.5;
#ifdef HIGH_QUALITY /* Anti flicker */
- vec3 d = sourceBufferTexelSize.xyx * vec3(1, 1, 0);
- vec3 s0 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy, 0.0).rgb);
- vec3 s1 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy - d.xz, 0.0).rgb);
- vec3 s2 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy + d.xz, 0.0).rgb);
- vec3 s3 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy - d.zy, 0.0).rgb);
- vec3 s4 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy + d.zy, 0.0).rgb);
- vec3 m = median(median(s0.rgb, s1, s2), s3, s4);
+ vec3 d = sourceBufferTexelSize.xyx * vec3(1, 1, 0);
+ vec3 s0 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy, 0.0).rgb);
+ vec3 s1 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy - d.xz, 0.0).rgb);
+ vec3 s2 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy + d.xz, 0.0).rgb);
+ vec3 s3 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy - d.zy, 0.0).rgb);
+ vec3 s4 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy + d.zy, 0.0).rgb);
+ vec3 m = median(median(s0.rgb, s1, s2), s3, s4);
#else
- vec3 s0 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy, 0.0).rgb);
- vec3 m = s0.rgb;
+ vec3 s0 = safe_color(textureLod(sourceBuffer, uvcoordsvar.xy, 0.0).rgb);
+ vec3 m = s0.rgb;
#endif
- /* Pixel brightness */
- float br = brightness(m);
+ /* Pixel brightness */
+ float br = brightness(m);
- /* Under-threshold part: quadratic curve */
- float rq = clamp(br - curveThreshold.x, 0, curveThreshold.y);
- rq = curveThreshold.z * rq * rq;
+ /* Under-threshold part: quadratic curve */
+ float rq = clamp(br - curveThreshold.x, 0, curveThreshold.y);
+ rq = curveThreshold.z * rq * rq;
- /* Combine and apply the brightness response curve. */
- m *= max(rq, br - curveThreshold.w) / max(1e-5, br);
+ /* Combine and apply the brightness response curve. */
+ m *= max(rq, br - curveThreshold.w) / max(1e-5, br);
- /* Clamp pixel intensity if clamping enabled */
- if (clampIntensity > 0.0) {
- br = max(1e-5, brightness(m));
- m *= 1.0 - max(0.0, br - clampIntensity) / br;
- }
+ /* Clamp pixel intensity if clamping enabled */
+ if (clampIntensity > 0.0) {
+ br = max(1e-5, brightness(m));
+ m *= 1.0 - max(0.0, br - clampIntensity) / br;
+ }
- return vec4(m, 1.0);
+ return vec4(m, 1.0);
}
vec4 step_downsample(void)
{
#ifdef HIGH_QUALITY /* Anti flicker */
- vec3 sample = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 sample = downsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#else
- vec3 sample = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 sample = downsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#endif
- return vec4(sample, 1.0);
+ return vec4(sample, 1.0);
}
vec4 step_upsample(void)
{
#ifdef HIGH_QUALITY
- vec3 blur = upsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 blur = upsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#else
- vec3 blur = upsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 blur = upsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#endif
- vec3 base = textureLod(baseBuffer, uvcoordsvar.xy, 0.0).rgb;
- return vec4(base + blur, 1.0);
+ vec3 base = textureLod(baseBuffer, uvcoordsvar.xy, 0.0).rgb;
+ return vec4(base + blur, 1.0);
}
vec4 step_resolve(void)
{
#ifdef HIGH_QUALITY
- vec3 blur = upsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 blur = upsample_filter_high(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#else
- vec3 blur = upsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
+ vec3 blur = upsample_filter(sourceBuffer, uvcoordsvar.xy, sourceBufferTexelSize);
#endif
- vec4 base = textureLod(baseBuffer, uvcoordsvar.xy, 0.0);
- vec3 cout = base.rgb + blur * bloomColor;
- return vec4(cout, base.a);
+ vec4 base = textureLod(baseBuffer, uvcoordsvar.xy, 0.0);
+ vec3 cout = base.rgb + blur * bloomColor;
+ return vec4(cout, base.a);
}
void main(void)
{
#if defined(STEP_BLIT)
- FragColor = step_blit();
+ FragColor = step_blit();
#elif defined(STEP_DOWNSAMPLE)
- FragColor = step_downsample();
+ FragColor = step_downsample();
#elif defined(STEP_UPSAMPLE)
- FragColor = step_upsample();
+ FragColor = step_upsample();
#elif defined(STEP_RESOLVE)
- FragColor = step_resolve();
+ FragColor = step_resolve();
#endif
}