shadows.fs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #version 120
  2. /* Prototypes */
  3. float shadow_amount(vec3 position, mat4 light_view, mat4 light_proj, sampler2D light_depth, float kernel, vec2 seed);
  4. float shadow_amount_soft_pcf25(vec4 light_pos, sampler2D light_depth, float hardness);
  5. /* End */
  6. float linear_depth(float depth, float near, float far){
  7. return (2.0 * near) / (far + near - depth * (far - near));
  8. }
  9. float shadow_amount(vec3 position, mat4 light_view, mat4 light_proj, sampler2D light_depth, float kernel, vec2 seed) {
  10. vec4 light_pos = light_proj * light_view * vec4(position, 1.0);
  11. light_pos = light_pos / light_pos.w;
  12. float pixel_depth = light_pos.z / 2 + 0.5;
  13. vec2 pixel_coords = vec2(light_pos.x, light_pos.y) / 2.0 + 0.5;
  14. float shade = 1.0;
  15. vec2 offset0 = reflect(vec2(-0.00, 0.02), seed);
  16. vec2 offset1 = reflect(vec2( 0.35, -0.04), seed);
  17. vec2 offset2 = reflect(vec2( 0.66, -0.32), seed);
  18. vec2 offset3 = reflect(vec2(-0.04, -0.04), seed);
  19. vec2 offset4 = reflect(vec2( 0.24, -0.22), seed);
  20. vec2 offset5 = reflect(vec2(-0.09, 0.10), seed);
  21. vec2 offset6 = reflect(vec2( 0.24, 0.04), seed);
  22. vec2 offset7 = reflect(vec2( 0.37, 0.88), seed);
  23. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset0 * kernel).r - 0.001) * (1.0 / 8.0);
  24. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset1 * kernel).r - 0.001) * (1.0 / 8.0);
  25. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset2 * kernel).r - 0.001) * (1.0 / 8.0);
  26. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset3 * kernel).r - 0.001) * (1.0 / 8.0);
  27. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset4 * kernel).r - 0.001) * (1.0 / 8.0);
  28. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset5 * kernel).r - 0.001) * (1.0 / 8.0);
  29. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset6 * kernel).r - 0.001) * (1.0 / 8.0);
  30. shade -= sign(pixel_depth - texture2D(light_depth, pixel_coords + offset7 * kernel).r - 0.001) * (1.0 / 8.0);
  31. return shade;
  32. }
  33. float shadow_amount_soft_pcf25(vec4 light_pos, sampler2D light_depth, float hardness) {
  34. light_pos = vec4(light_pos.xyz / light_pos.w, 1);
  35. if ((abs(light_pos.x) > 1) || (abs(light_pos.y) > 1) || (abs(light_pos.z) > 1)) {
  36. return 1.0;
  37. }
  38. vec4 shadow_coord = light_pos / 2.0 + 0.5;
  39. float our_depth = shadow_coord.z;
  40. float pixel_depth = texture2D( light_depth, shadow_coord.xy ).r;
  41. float dkernel = 0.01;
  42. vec2 disc_samples[25] = vec2[25]( vec2(-2.0*dkernel, -2.0*dkernel),
  43. vec2(-2.0*dkernel, -dkernel),
  44. vec2(-2.0*dkernel, dkernel),
  45. vec2(-2.0*dkernel, 2.0*dkernel),
  46. vec2(-2.0*dkernel, 0.0),
  47. vec2(-dkernel, -2.0*dkernel),
  48. vec2(-dkernel, -dkernel),
  49. vec2(-dkernel, dkernel),
  50. vec2(-dkernel, 2.0*dkernel),
  51. vec2(-dkernel, 0.0),
  52. vec2( 0.0, -2.0*dkernel),
  53. vec2( 0.0, -dkernel),
  54. vec2( 0.0, dkernel),
  55. vec2( 0.0, 2.0*dkernel),
  56. vec2( 0.0, 0.0),
  57. vec2( dkernel, -2.0*dkernel),
  58. vec2( dkernel, -dkernel),
  59. vec2( dkernel, dkernel),
  60. vec2( dkernel, 2.0*dkernel),
  61. vec2( dkernel, 0.0),
  62. vec2( 2.0*dkernel, -2.0*dkernel),
  63. vec2( 2.0*dkernel, -dkernel),
  64. vec2( 2.0*dkernel, dkernel),
  65. vec2( 2.0*dkernel, 2.0*dkernel),
  66. vec2( 2.0*dkernel, 0.0)
  67. );
  68. float blocked_depth = 0.0;
  69. for(int i = 0; i < 25; i++) {
  70. vec2 offset = disc_samples[i];
  71. float sample_depth = texture2D( light_depth, shadow_coord.xy + offset ).r;
  72. blocked_depth += min(sample_depth, our_depth);
  73. }
  74. blocked_depth = blocked_depth / 25;
  75. float prenumbra = max((our_depth - blocked_depth) / blocked_depth, 0.0);
  76. float kernel = prenumbra * hardness * 3000.0 + 0.00025;
  77. vec2 samples[25] = vec2[25]( vec2(-2.0*kernel, -2.0*kernel),
  78. vec2(-2.0*kernel, -kernel),
  79. vec2(-2.0*kernel, kernel),
  80. vec2(-2.0*kernel, 2.0*kernel),
  81. vec2(-2.0*kernel, 0.0),
  82. vec2(-kernel, -2.0*kernel),
  83. vec2(-kernel, -kernel),
  84. vec2(-kernel, kernel),
  85. vec2(-kernel, 2.0*kernel),
  86. vec2(-kernel, 0.0),
  87. vec2( 0.0, -2.0*kernel),
  88. vec2( 0.0, -kernel),
  89. vec2( 0.0, kernel),
  90. vec2( 0.0, 2.0*kernel),
  91. vec2( 0.0, 0.0),
  92. vec2( kernel, -2.0*kernel),
  93. vec2( kernel, -kernel),
  94. vec2( kernel, kernel),
  95. vec2( kernel, 2.0*kernel),
  96. vec2( kernel, 0.0),
  97. vec2( 2.0*kernel, -2.0*kernel),
  98. vec2( 2.0*kernel, -kernel),
  99. vec2( 2.0*kernel, kernel),
  100. vec2( 2.0*kernel, 2.0*kernel),
  101. vec2( 2.0*kernel, 0.0)
  102. );
  103. float shadow = 1.0;
  104. for(int i = 0; i < 25; i++) {
  105. vec2 offset = samples[i];
  106. float shadow_depth = texture2D( light_depth, shadow_coord.xy + offset ).r;
  107. if (our_depth >= shadow_depth + 0.001) {
  108. shadow = shadow - (1.0 / 25.0);
  109. }
  110. }
  111. return shadow;
  112. }