Advertisement
Guest User

ShadowsMS15.glsllib

a guest
Oct 30th, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.48 KB | None | 0 0
  1. // Because gpu_shader5 is actually where those
  2. // gather functions are declared to work on shadowmaps
  3. #extension GL_ARB_gpu_shader5 : enable
  4.  
  5. #ifdef HARDWARE_SHADOWS
  6. #define SHADOWMAP sampler2DShadow
  7. #define SHADOWCOMPAREOFFSET(tex,coord,offset) textureProjOffset(tex, coord, offset)
  8. #define SHADOWCOMPARE(tex,coord) textureProj(tex, coord)
  9. #define SHADOWGATHER(tex,coord) textureGather(tex, coord.xy, coord.z)
  10. #else
  11. #define SHADOWMAP sampler2D
  12. #define SHADOWCOMPAREOFFSET(tex,coord,offset) step(coord.z, textureProjOffset(tex, coord, offset).r)
  13. #define SHADOWCOMPARE(tex,coord) step(coord.z, textureProj(tex, coord).r)
  14. #define SHADOWGATHER(tex,coord) step(coord.z, textureGather(tex, coord.xy))
  15. #endif
  16.  
  17.  
  18. #if FILTER_MODE == 0
  19. #define GETSHADOW Shadow_Nearest
  20. #define KERNEL 1.0
  21. #elif FILTER_MODE == 1
  22. #ifdef HARDWARE_SHADOWS
  23. #define GETSHADOW Shadow_Nearest
  24. #else
  25. #define GETSHADOW Shadow_DoBilinear_2x2
  26. #endif
  27. #define KERNEL 1.0
  28. #elif FILTER_MODE == 2
  29. #define GETSHADOW Shadow_DoDither_2x2
  30. #define KERNEL 1.0
  31. #elif FILTER_MODE == 3
  32. #define GETSHADOW Shadow_DoPCF
  33. #define KERNEL 4.0
  34. #elif FILTER_MODE == 4
  35. #define GETSHADOW Shadow_DoPCFPoisson
  36. #define KERNEL 4.0
  37. #elif FILTER_MODE == 5
  38. #define GETSHADOW Shadow_DoPCF
  39. #define KERNEL 8.0
  40. #endif
  41.  
  42.  
  43.  
  44. uniform SHADOWMAP m_ShadowMap0;
  45. uniform SHADOWMAP m_ShadowMap1;
  46. uniform SHADOWMAP m_ShadowMap2;
  47. uniform SHADOWMAP m_ShadowMap3;
  48. #ifdef POINTLIGHT
  49. uniform SHADOWMAP m_ShadowMap4;
  50. uniform SHADOWMAP m_ShadowMap5;
  51. #endif
  52.  
  53. #ifdef PSSM
  54. uniform vec4 m_Splits;
  55. #endif
  56. uniform float m_ShadowIntensity;
  57.  
  58. const vec2 pixSize2 = vec2(1.0 / SHADOWMAP_SIZE);
  59. float shadowBorderScale = 1.0;
  60.  
  61. float Shadow_BorderCheck(in vec2 coord)
  62. {
  63. // Fastest, "hack" method (uses 4-5 instructions)
  64. vec4 t = vec4(coord.xy, 0.0, 1.0);
  65. t = step(t.wwxy, t.xyzz);
  66. return dot(t,t);
  67. }
  68.  
  69. float Shadow_Nearest(in SHADOWMAP tex, in vec4 projCoord){
  70. float border = Shadow_BorderCheck(projCoord.xy);
  71. if (border > 0.0){
  72. return 1.0;
  73. }
  74. return SHADOWCOMPARE(tex,projCoord);
  75. }
  76.  
  77. float Shadow_DoDither_2x2(in SHADOWMAP tex, in vec4 projCoord){
  78. float border = Shadow_BorderCheck(projCoord.xy);
  79. if (border > 0.0)
  80. return 1.0;
  81.  
  82. vec2 pixSize = pixSize2 * shadowBorderScale;
  83.  
  84. float shadow = 0.0;
  85. ivec2 o = ivec2(mod(floor(gl_FragCoord.xy), 2.0));
  86. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy+pixSize*(vec2(-1.5, 1.5)+o), projCoord.zw));
  87. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy+pixSize*(vec2( 0.5, 1.5)+o), projCoord.zw));
  88. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy+pixSize*(vec2(-1.5, -0.5)+o), projCoord.zw));
  89. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy+pixSize*(vec2( 0.5, -0.5)+o), projCoord.zw));
  90. shadow *= 0.25;
  91. return shadow;
  92. }
  93.  
  94. float Shadow_DoBilinear_2x2(in SHADOWMAP tex, in vec4 projCoord){
  95. float border = Shadow_BorderCheck(projCoord.xy);
  96. if (border > 0.0)
  97. return 1.0;
  98.  
  99. #ifdef GL_ARB_gpu_shader5
  100. vec4 coord = vec4(projCoord.xyz / projCoord.www,0.0);
  101. vec4 gather = SHADOWGATHER(tex, coord);
  102. #else
  103. vec4 gather = vec4(0.0);
  104. gather.x = SHADOWCOMPAREOFFSET(tex, projCoord, ivec2(0, 0));
  105. gather.y = SHADOWCOMPAREOFFSET(tex, projCoord, ivec2(1, 0));
  106. gather.z = SHADOWCOMPAREOFFSET(tex, projCoord, ivec2(0, 1));
  107. gather.w = SHADOWCOMPAREOFFSET(tex, projCoord, ivec2(1, 1));
  108. #endif
  109.  
  110. vec2 f = fract( projCoord.xy * SHADOWMAP_SIZE );
  111. vec2 mx = mix( gather.xz, gather.yw, f.x );
  112. return mix( mx.x, mx.y, f.y );
  113. }
  114.  
  115. float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){
  116.  
  117. vec2 pixSize = pixSize2 * shadowBorderScale;
  118. float shadow = 0.0;
  119. float border = Shadow_BorderCheck(projCoord.xy);
  120. if (border > 0.0)
  121. return 1.0;
  122.  
  123. float bound = KERNEL * 0.5 - 0.5;
  124. bound *= PCFEDGE;
  125. for (float y = -bound; y <= bound; y += PCFEDGE){
  126. for (float x = -bound; x <= bound; x += PCFEDGE){
  127. vec4 coord = vec4(projCoord.xy + vec2(x,y) * pixSize, projCoord.zw);
  128. shadow += SHADOWCOMPARE(tex, coord);
  129. }
  130. }
  131.  
  132. shadow = shadow / (KERNEL * KERNEL);
  133. return shadow;
  134. }
  135.  
  136.  
  137. //12 tap poisson disk
  138. const vec2 poissonDisk0 = vec2(-0.1711046, -0.425016);
  139. const vec2 poissonDisk1 = vec2(-0.7829809, 0.2162201);
  140. const vec2 poissonDisk2 = vec2(-0.2380269, -0.8835521);
  141. const vec2 poissonDisk3 = vec2(0.4198045, 0.1687819);
  142. const vec2 poissonDisk4 = vec2(-0.684418, -0.3186957);
  143. const vec2 poissonDisk5 = vec2(0.6026866, -0.2587841);
  144. const vec2 poissonDisk6 = vec2(-0.2412762, 0.3913516);
  145. const vec2 poissonDisk7 = vec2(0.4720655, -0.7664126);
  146. const vec2 poissonDisk8 = vec2(0.9571564, 0.2680693);
  147. const vec2 poissonDisk9 = vec2(-0.5238616, 0.802707);
  148. const vec2 poissonDisk10 = vec2(0.5653144, 0.60262);
  149. const vec2 poissonDisk11 = vec2(0.0123658, 0.8627419);
  150.  
  151.  
  152. float Shadow_DoPCFPoisson(in SHADOWMAP tex, in vec4 projCoord){
  153.  
  154. float shadow = 0.0;
  155. float border = Shadow_BorderCheck(projCoord.xy);
  156. if (border > 0.0){
  157. return 1.0;
  158. }
  159.  
  160. vec2 texelSize = pixSize2 * 4.0 * PCFEDGE * shadowBorderScale;
  161.  
  162. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk0 * texelSize, projCoord.zw));
  163. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk1 * texelSize, projCoord.zw));
  164. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk2 * texelSize, projCoord.zw));
  165. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk3 * texelSize, projCoord.zw));
  166. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk4 * texelSize, projCoord.zw));
  167. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk5 * texelSize, projCoord.zw));
  168. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk6 * texelSize, projCoord.zw));
  169. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk7 * texelSize, projCoord.zw));
  170. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk8 * texelSize, projCoord.zw));
  171. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk9 * texelSize, projCoord.zw));
  172. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk10 * texelSize, projCoord.zw));
  173. shadow += SHADOWCOMPARE(tex, vec4(projCoord.xy + poissonDisk11 * texelSize, projCoord.zw));
  174.  
  175. //this is divided by 12
  176. return shadow * 0.08333333333;
  177. }
  178.  
  179. #ifdef POINTLIGHT
  180. float getPointLightShadows(in vec4 worldPos,in vec3 lightPos,
  181. in SHADOWMAP shadowMap0,in SHADOWMAP shadowMap1,in SHADOWMAP shadowMap2,in SHADOWMAP shadowMap3,in SHADOWMAP shadowMap4,in SHADOWMAP shadowMap5,
  182. in vec4 projCoord0,in vec4 projCoord1,in vec4 projCoord2,in vec4 projCoord3,in vec4 projCoord4,in vec4 projCoord5){
  183. float shadow = 1.0;
  184. vec3 vect = worldPos.xyz - lightPos;
  185. vec3 absv= abs(vect);
  186. float maxComp = max(absv.x,max(absv.y,absv.z));
  187. if(maxComp == absv.y)
  188. {
  189. if(vect.y < 0.0)
  190. {
  191. shadow = GETSHADOW(shadowMap0, projCoord0 / projCoord0.w);
  192. }
  193. else
  194. {
  195. shadow = GETSHADOW(shadowMap1, projCoord1 / projCoord1.w);
  196. }
  197. }
  198. else if(maxComp == absv.z)
  199. {
  200. if(vect.z < 0.0)
  201. {
  202. shadow = GETSHADOW(shadowMap2, projCoord2 / projCoord2.w);
  203. }
  204. else
  205. {
  206. shadow = GETSHADOW(shadowMap3, projCoord3 / projCoord3.w);
  207. }
  208. }
  209. else if(maxComp == absv.x)
  210. {
  211. if(vect.x < 0.0)
  212. {
  213. shadow = GETSHADOW(shadowMap4, projCoord4 / projCoord4.w);
  214. }
  215. else
  216. {
  217. shadow = GETSHADOW(shadowMap5, projCoord5 / projCoord5.w);
  218. }
  219. }
  220. return shadow;
  221. }
  222. #else
  223. #ifdef PSSM
  224. float getDirectionalLightShadows(in vec4 splits,in float shadowPosition,
  225. in SHADOWMAP shadowMap0,in SHADOWMAP shadowMap1,in SHADOWMAP shadowMap2,in SHADOWMAP shadowMap3,
  226. in vec4 projCoord0,in vec4 projCoord1,in vec4 projCoord2,in vec4 projCoord3){
  227. float shadow = 1.0;
  228. if(shadowPosition < splits.x){
  229. shadow = GETSHADOW(shadowMap0, projCoord0 );
  230. }else if( shadowPosition < splits.y){
  231. shadowBorderScale = 0.5;
  232. shadow = GETSHADOW(shadowMap1, projCoord1);
  233. }else if( shadowPosition < splits.z){
  234. shadowBorderScale = 0.25;
  235. shadow = GETSHADOW(shadowMap2, projCoord2);
  236. }else if( shadowPosition < splits.w){
  237. shadowBorderScale = 0.125;
  238. shadow = GETSHADOW(shadowMap3, projCoord3);
  239. }
  240. return shadow;
  241. }
  242. #else
  243. float getSpotLightShadows(in SHADOWMAP shadowMap,in vec4 projCoord){
  244. float shadow = 1.0;
  245. projCoord /= projCoord.w;
  246. shadow = GETSHADOW(shadowMap,projCoord);
  247.  
  248. //a small falloff to make the shadow blend nicely into the not lighten
  249. //we translate the texture coordinate value to a -1,1 range so the length
  250. //of the texture coordinate vector is actually the radius of the lighten area on the ground
  251. projCoord = projCoord * 2.0 - 1.0;
  252. float fallOff = ( length(projCoord.xy) - 0.9 ) / 0.1;
  253. return mix(shadow,1.0,clamp(fallOff,0.0,1.0));
  254.  
  255. }
  256. #endif
  257. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement