25a90a0c26f4393df42eea3b3592352152614854
[occt.git] / src / Shaders / DirectionalLightShadow.glsl
1 #if (__VERSION__ >= 120)
2 //! Coefficients for gathering close samples for antialiasing.
3 //! Use only with decent OpenGL (array constants cannot be initialized with GLSL 1.1 / GLSL ES 1.1)
4 const vec2 occPoissonDisk16[16] = vec2[](
5  vec2(-0.94201624,-0.39906216), vec2( 0.94558609,-0.76890725), vec2(-0.09418410,-0.92938870), vec2( 0.34495938, 0.29387760),
6  vec2(-0.91588581, 0.45771432), vec2(-0.81544232,-0.87912464), vec2(-0.38277543, 0.27676845), vec2( 0.97484398, 0.75648379),
7  vec2( 0.44323325,-0.97511554), vec2( 0.53742981,-0.47373420), vec2(-0.26496911,-0.41893023), vec2( 0.79197514, 0.19090188),
8  vec2(-0.24188840, 0.99706507), vec2(-0.81409955, 0.91437590), vec2( 0.19984126, 0.78641367), vec2( 0.14383161,-0.14100790)
9 );
10 #endif
11
12 //! Function computes directional light shadow attenuation (1.0 means no shadow).
13 float occDirectionalLightShadow (in sampler2D theShadow,
14                                  in int  theId,
15                                  in vec3 theNormal)
16 {
17   vec4 aPosLightSpace = PosLightSpace[occLight_Index(theId)];
18   vec3 aLightDir = vec3 (occWorldViewMatrix * vec4 (occLight_Position (theId), 0.0));
19   vec3 aProjCoords = (aPosLightSpace.xyz / aPosLightSpace.w) * 0.5 + vec3 (0.5);
20   float aCurrentDepth = aProjCoords.z;
21   if (aProjCoords.x < 0.0 || aProjCoords.x > 1.0
22    || aProjCoords.y < 0.0 || aProjCoords.y > 1.0
23    || aCurrentDepth > 1.0)
24   {
25     return 1.0;
26   }
27
28   vec2 aTexelSize = vec2 (occShadowMapSizeBias.x);
29   float aBias = max (occShadowMapSizeBias.y * (1.0 - dot (theNormal, aLightDir)), occShadowMapSizeBias.y * 0.1);
30 #if (__VERSION__ >= 120)
31   float aShadow = 0.0;
32   for (int aPosIter = 0; aPosIter < 16; ++aPosIter)
33   {
34     float aClosestDepth = occTexture2D (theShadow, aProjCoords.xy + occPoissonDisk16[aPosIter] * aTexelSize).r;
35     aShadow += (aCurrentDepth - aBias) > aClosestDepth ? 1.0 : 0.0;
36   }
37   return 1.0 - aShadow / 16.0;
38 #else
39   float aClosestDepth = occTexture2D (theShadow, aProjCoords.xy).r;
40   float aShadow = (aCurrentDepth - aBias) > aClosestDepth ? 1.0 : 0.0;
41   return 1.0 - aShadow;
42 #endif
43 }