summaryrefslogtreecommitdiff
path: root/slideshow/opengl/honeycombFragmentShader.glsl
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <emmanuel.peyrot@collabora.com>2016-02-24 20:21:13 +0000
committerTomaž Vajngerl <quikee@gmail.com>2016-02-25 11:16:45 +0000
commit3ed1e68a79e8dcc623eb9165577e0571cebf4709 (patch)
tree38b036104201c6888b3f6f49be4ac1fb3e256196 /slideshow/opengl/honeycombFragmentShader.glsl
parent1a9b62dc661a26c02db34ab5075b4e209a70b196 (diff)
slideshow: Blur the shadows the further they are from the object
Change-Id: I63f4fda670b86db2ee1ea66d8755d71697fac0c7 Reviewed-on: https://gerrit.libreoffice.org/22678 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'slideshow/opengl/honeycombFragmentShader.glsl')
-rw-r--r--slideshow/opengl/honeycombFragmentShader.glsl30
1 files changed, 26 insertions, 4 deletions
diff --git a/slideshow/opengl/honeycombFragmentShader.glsl b/slideshow/opengl/honeycombFragmentShader.glsl
index c207203a1ce3..e4ce8e31f91e 100644
--- a/slideshow/opengl/honeycombFragmentShader.glsl
+++ b/slideshow/opengl/honeycombFragmentShader.glsl
@@ -29,6 +29,18 @@ bool isBorder(vec2 point)
void main()
{
+ const vec2 samplingPoints[9] = vec2[](
+ vec2(0, 0),
+ vec2(-1, -1),
+ vec2(-1, 0),
+ vec2(-1, 1),
+ vec2(0, 1),
+ vec2(1, 1),
+ vec2(1, 0),
+ vec2(1, -1),
+ vec2(0, -1)
+ );
+
vec4 fragment = vec4(texture(slideTexture, texturePosition).rgb, 1.0);
vec3 lightVector = vec3(0.0, 0.0, 1.0);
float light = max(dot(lightVector, normal), 0.0);
@@ -73,13 +85,23 @@ void main()
fragment.rgb *= actualTime;
}
}
+
+ // Compute the shadow.
float visibility = 1.0;
const float epsilon = 0.0001;
- if (texture(depthShadowTexture, shadowCoordinate.xy).r < shadowCoordinate.z - epsilon)
- visibility *= 0.7 + 0.3 * (1.0 - texture(colorShadowTexture, shadowCoordinate.xy).a);
+ if (selectedTexture < 0.5) {
+ float depthShadow = texture(depthShadowTexture, shadowCoordinate.xy).z;
+ float shadowRadius = (1.0 / (shadowCoordinate.z - depthShadow)) * 1000.0;
+ // Only the entering slide.
+ for (int i = 0; i < 9; ++i) {
+ vec2 coordinate = shadowCoordinate.xy + samplingPoints[i] / shadowRadius;
+ if (depthShadow < shadowCoordinate.z - epsilon) {
+ visibility -= 0.05 * texture(colorShadowTexture, coordinate).a;
+ }
+ }
+ }
+
vec4 black = vec4(0.0, 0.0, 0.0, fragment.a);
- if (fragment.a < 0.001)
- discard;
gl_FragColor = mix(black, fragment, visibility * light);
}