Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: data/branches/Shader_HS18/programs/GLSL150/DepthShadowmapNormalMapReceiverFp.glsl @ 12302

Last change on this file since 12302 was 12115, checked in by wiesep, 6 years ago

Changed folder structure, deletet some unused files and cleaned up code

File size: 2.4 KB
Line 
1#version 150
2
3uniform float inverseShadowmapSize;
4uniform float fixedDepthBias;
5uniform float gradientClamp;
6uniform float gradientScaleBias;
7uniform float shadowFuzzyWidth;
8uniform vec4 lightColour;
9
10uniform sampler2D shadowMap;
11uniform sampler2D normalMap;
12
13in vec3 tangentLightDir;
14in vec4 oUv0;
15in vec4 oUv1;
16out vec4 fragColour;
17
18// Expand a range-compressed vector
19vec3 expand(vec3 v)
20{
21        return (v - 0.5) * 2.0;
22}
23
24void main()
25{
26        // get the new normal and diffuse values
27        vec3 normal = normalize(expand(texture(normalMap, oUv1.xy).xyz));
28       
29        vec4 vertexColour = clamp(dot(normal, tangentLightDir),0.0,1.0) * lightColour;
30
31        vec4 shadowUV = oUv0;
32        // point on shadowmap
33#if LINEAR_RANGE
34        shadowUV.xy = shadowUV.xy / shadowUV.w;
35#else
36        shadowUV = shadowUV / shadowUV.w;
37#endif
38        float centerdepth = texture(shadowMap, shadowUV.xy).x;
39   
40    // gradient calculation
41        float pixeloffset = inverseShadowmapSize;
42    vec4 depths = vec4(
43        texture(shadowMap, shadowUV.xy + vec2(-pixeloffset, 0)).x,
44        texture(shadowMap, shadowUV.xy + vec2(+pixeloffset, 0)).x,
45        texture(shadowMap, shadowUV.xy + vec2(0, -pixeloffset)).x,
46        texture(shadowMap, shadowUV.xy + vec2(0, +pixeloffset)).x);
47
48        vec2 differences = abs( depths.yw - depths.xz );
49        float gradient = min(gradientClamp, max(differences.x, differences.y));
50        float gradientFactor = gradient * gradientScaleBias;
51
52        // visibility function
53        float depthAdjust = gradientFactor + (fixedDepthBias * centerdepth);
54        float finalCenterDepth = centerdepth + depthAdjust;
55
56        // shadowUV.z contains lightspace position of current object
57
58#if FUZZY_TEST
59        // fuzzy test - introduces some ghosting in result and doesn't appear to be needed?
60        //float visibility = saturate(1 + delta_z / (gradient * shadowFuzzyWidth));
61        float visibility = saturate(1 + (finalCenterDepth - shadowUV.z) * shadowFuzzyWidth * shadowUV.w);
62
63        fragColour = vertexColour * visibility;
64#else
65        // hard test
66#if PCF
67        // use depths from prev, calculate diff
68        depths += depthAdjust;
69        float final = (finalCenterDepth > shadowUV.z) ? 1.0 : 0.0;
70        final += (depths.x > shadowUV.z) ? 1.0 : 0.0;
71        final += (depths.y > shadowUV.z) ? 1.0 : 0.0;
72        final += (depths.z > shadowUV.z) ? 1.0 : 0.0;
73        final += (depths.w > shadowUV.z) ? 1.0 : 0.0;
74       
75        final *= 0.2;
76
77        fragColour = vec4(vertexColour.xyz * final, 1);
78#else
79        fragColour = (finalCenterDepth > shadowUV.z) ? vertexColour : vec4(0,0,0,1);
80#endif
81#endif
82}
Note: See TracBrowser for help on using the repository browser.