shadow_map.shader 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. include = [ "core/shaders/common.shader" ]
  2. render_states = {
  3. shadow = {
  4. states = {
  5. rgb_write_enable = false
  6. alpha_write_enable = false
  7. depth_write_enable = true
  8. }
  9. }
  10. }
  11. bgfx_shaders = {
  12. shadow_mapping = {
  13. includes = [ "common" ]
  14. code = """
  15. #define Sampler sampler2DShadow
  16. #define map_offt atlas_offset.xy
  17. #define map_size atlas_offset.z
  18. float hard_shadow(Sampler _sampler, vec4 shadow_coord, float bias, vec3 atlas_offset)
  19. {
  20. vec3 tex_coord = shadow_coord.xyz/shadow_coord.w;
  21. return shadow2D(_sampler, vec3(tex_coord.xy * map_size + map_offt, tex_coord.z - bias));
  22. }
  23. float PCF(Sampler _sampler, vec4 shadow_coord, float bias, vec2 texel_size, vec3 atlas_offset)
  24. {
  25. vec2 tex_coord = shadow_coord.xy/shadow_coord.w;
  26. tex_coord = tex_coord * atlas_offset.z + atlas_offset.xy;
  27. bool outside = any(greaterThan(tex_coord, map_offt + vec2_splat(map_size)))
  28. || any(lessThan (tex_coord, map_offt))
  29. ;
  30. if (outside)
  31. return 0.0;
  32. float result = 0.0;
  33. vec2 offset = texel_size * shadow_coord.w;
  34. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  35. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  36. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  37. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  38. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  39. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  40. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  41. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  42. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  43. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  44. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  45. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  46. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  47. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  48. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), bias, atlas_offset);
  49. result += hard_shadow(_sampler, shadow_coord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), bias, atlas_offset);
  50. return result / 16.0;
  51. }
  52. """
  53. }
  54. shadow = {
  55. includes = [ "common" ]
  56. varying = """
  57. vec3 a_position : POSITION;
  58. vec4 a_indices : BLENDINDICES;
  59. vec4 a_weight : BLENDWEIGHT;
  60. """
  61. vs_input_output = """
  62. #if defined(SKINNING)
  63. $input a_position, a_indices, a_weight
  64. #else
  65. $input a_position
  66. #endif
  67. """
  68. vs_code = """
  69. void main()
  70. {
  71. #if defined(SKINNING)
  72. mat4 model;
  73. model = a_weight.x * u_model[int(a_indices.x)];
  74. model += a_weight.y * u_model[int(a_indices.y)];
  75. model += a_weight.z * u_model[int(a_indices.z)];
  76. model += a_weight.w * u_model[int(a_indices.w)];
  77. gl_Position = mul(mul(u_modelViewProj, model), vec4(a_position, 1.0));
  78. #else
  79. gl_Position = mul(mul(u_viewProj, u_model[0]), vec4(a_position, 1.0));
  80. #endif
  81. }
  82. """
  83. fs_input_output = """
  84. """
  85. fs_code = """
  86. void main()
  87. {
  88. gl_FragColor = vec4_splat(0.0);
  89. }
  90. """
  91. }
  92. }
  93. shaders = {
  94. shadow = {
  95. bgfx_shader = "shadow"
  96. render_state = "shadow"
  97. }
  98. }
  99. static_compile = [
  100. { shader = "shadow" defines = [] }
  101. { shader = "shadow" defines = ["SKINNING"] }
  102. ]