native-pcf.chunk 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. // NDC shadowPos applied with normal bias and depth bias
  2. #pragma define CC_SHADOW_PCF_HARD 0
  3. #pragma define CC_SHADOW_PCF_SOFT 1
  4. #pragma define CC_SHADOW_PCF_SOFT_3X 2
  5. #pragma define CC_SHADOW_PCF_SOFT_5X 3
  6. #pragma extension([GL_EXT_shader_texture_lod, __VERSION__ < 130])
  7. vec4 shadowTexure(highp sampler2D shadowMap, vec2 coord) {
  8. #if defined(CC_USE_WGPU)
  9. return textureLod(shadowMap, coord, 0.0);
  10. #else
  11. return texture(shadowMap, coord);
  12. #endif
  13. }
  14. float SampleShadowMap (vec3 shadowNDCPos, highp sampler2D shadowMap)
  15. {
  16. #if CC_SHADOWMAP_FORMAT == SHADOWMAP_FORMAT_RGBA8
  17. return unpackRGBAToDepth(shadowTexure(shadowMap, shadowNDCPos.xy));
  18. #else
  19. return shadowTexure(shadowMap, shadowNDCPos.xy).x;
  20. #endif
  21. }
  22. // return averaged depth
  23. float SampleShadowMapSoft (vec3 shadowNDCPos, highp sampler2D shadowMap, vec2 shadowMapResolution)
  24. {
  25. vec2 oneTap = 1.0 / shadowMapResolution;
  26. vec2 shadowNDCPos_offset = shadowNDCPos.xy + oneTap;
  27. float block0 = SampleShadowMap(vec3(shadowNDCPos.x, shadowNDCPos.y, shadowNDCPos.z), shadowMap);
  28. float block1 = SampleShadowMap(vec3(shadowNDCPos_offset.x, shadowNDCPos.y, shadowNDCPos.z), shadowMap);
  29. float block2 = SampleShadowMap(vec3(shadowNDCPos.x, shadowNDCPos_offset.y, shadowNDCPos.z), shadowMap);
  30. float block3 = SampleShadowMap(vec3(shadowNDCPos_offset.x, shadowNDCPos_offset.y, shadowNDCPos.z), shadowMap);
  31. float coefX = mod(shadowNDCPos.x, oneTap.x) * shadowMapResolution.x;
  32. float resultX = mix(block0, block1, coefX);
  33. float resultY = mix(block2, block3, coefX);
  34. float coefY = mod(shadowNDCPos.y, oneTap.y) * shadowMapResolution.y;
  35. return mix(resultX, resultY, coefY);
  36. }
  37. float NativePCFShadowFactorHard (vec3 shadowNDCPos, highp sampler2D shadowMap, vec2 shadowMapResolution)
  38. {
  39. #if CC_SHADOWMAP_FORMAT == SHADOWMAP_FORMAT_RGBA8
  40. return step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, shadowNDCPos.xy)));
  41. #else
  42. return step(shadowNDCPos.z, shadowTexure(shadowMap, shadowNDCPos.xy).x);
  43. #endif
  44. }
  45. float NativePCFShadowFactorSoft (vec3 shadowNDCPos, highp sampler2D shadowMap, vec2 shadowMapResolution)
  46. {
  47. vec2 oneTap = 1.0 / shadowMapResolution;
  48. vec2 shadowNDCPos_offset = shadowNDCPos.xy + oneTap;
  49. float block0, block1, block2, block3;
  50. #if CC_SHADOWMAP_FORMAT == SHADOWMAP_FORMAT_RGBA8
  51. block0 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos.y))));
  52. block1 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset.x, shadowNDCPos.y))));
  53. block2 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset.y))));
  54. block3 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset.x, shadowNDCPos_offset.y))));
  55. #else
  56. block0 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos.y)).x);
  57. block1 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset.x, shadowNDCPos.y)).x);
  58. block2 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset.y)).x);
  59. block3 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset.x, shadowNDCPos_offset.y)).x);
  60. #endif
  61. float coefX = mod(shadowNDCPos.x, oneTap.x) * shadowMapResolution.x;
  62. float resultX = mix(block0, block1, coefX);
  63. float resultY = mix(block2, block3, coefX);
  64. float coefY = mod(shadowNDCPos.y, oneTap.y) * shadowMapResolution.y;
  65. return mix(resultX, resultY, coefY);
  66. }
  67. float NativePCFShadowFactorSoft3X (vec3 shadowNDCPos, highp sampler2D shadowMap, vec2 shadowMapResolution)
  68. {
  69. vec2 oneTap = 1.0 / shadowMapResolution;
  70. float shadowNDCPos_offset_L = shadowNDCPos.x - oneTap.x;
  71. float shadowNDCPos_offset_R = shadowNDCPos.x + oneTap.x;
  72. float shadowNDCPos_offset_U = shadowNDCPos.y - oneTap.y;
  73. float shadowNDCPos_offset_D = shadowNDCPos.y + oneTap.y;
  74. float block0, block1, block2, block3, block4, block5, block6, block7, block8;
  75. #if CC_SHADOWMAP_FORMAT == SHADOWMAP_FORMAT_RGBA8
  76. block0 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos_offset_U))));
  77. block1 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset_U))));
  78. block2 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos_offset_U))));
  79. block3 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos.y))));
  80. block4 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos.y))));
  81. block5 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos.y))));
  82. block6 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos_offset_D))));
  83. block7 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset_D))));
  84. block8 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos_offset_D))));
  85. #else
  86. block0 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos_offset_U)).x);
  87. block1 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset_U)).x);
  88. block2 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos_offset_U)).x);
  89. block3 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos.y)).x);
  90. block4 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos.y)).x);
  91. block5 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos.y)).x);
  92. block6 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_L, shadowNDCPos_offset_D)).x);
  93. block7 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos.x, shadowNDCPos_offset_D)).x);
  94. block8 = step(shadowNDCPos.z, shadowTexure(shadowMap, vec2(shadowNDCPos_offset_R, shadowNDCPos_offset_D)).x);
  95. #endif
  96. float coefX = mod(shadowNDCPos.x, oneTap.x) * shadowMapResolution.x;
  97. float coefY = mod(shadowNDCPos.y, oneTap.y) * shadowMapResolution.y;
  98. float shadow = 0.0;
  99. float resultX = mix(block0, block1, coefX);
  100. float resultY = mix(block3, block4, coefX);
  101. shadow += mix(resultX , resultY, coefY);
  102. resultX = mix(block1, block2, coefX);
  103. resultY = mix(block4, block5, coefX);
  104. shadow += mix(resultX , resultY, coefY);
  105. resultX = mix(block3, block4, coefX);
  106. resultY = mix(block6, block7, coefX);
  107. shadow += mix(resultX, resultY, coefY);
  108. resultX = mix(block4, block5, coefX);
  109. resultY = mix(block7, block8, coefX);
  110. shadow += mix(resultX, resultY, coefY);
  111. return shadow * 0.25;
  112. }
  113. float NativePCFShadowFactorSoft5X (vec3 shadowNDCPos, highp sampler2D shadowMap, vec2 shadowMapResolution)
  114. {
  115. vec2 oneTap = 1.0 / shadowMapResolution;
  116. vec2 twoTap = oneTap * 2.0;
  117. vec2 offset1 = shadowNDCPos.xy + vec2(-twoTap.x, -twoTap.y);
  118. vec2 offset2 = shadowNDCPos.xy + vec2(-oneTap.x, -twoTap.y);
  119. vec2 offset3 = shadowNDCPos.xy + vec2(0.0, -twoTap.y);
  120. vec2 offset4 = shadowNDCPos.xy + vec2(oneTap.x, -twoTap.y);
  121. vec2 offset5 = shadowNDCPos.xy + vec2(twoTap.x, -twoTap.y);
  122. vec2 offset6 = shadowNDCPos.xy + vec2(-twoTap.x, -oneTap.y);
  123. vec2 offset7 = shadowNDCPos.xy + vec2(-oneTap.x, -oneTap.y);
  124. vec2 offset8 = shadowNDCPos.xy + vec2(0.0, -oneTap.y);
  125. vec2 offset9 = shadowNDCPos.xy + vec2(oneTap.x, -oneTap.y);
  126. vec2 offset10 = shadowNDCPos.xy + vec2(twoTap.x, -oneTap.y);
  127. vec2 offset11 = shadowNDCPos.xy + vec2(-twoTap.x, 0.0);
  128. vec2 offset12 = shadowNDCPos.xy + vec2(-oneTap.x, 0.0);
  129. vec2 offset13 = shadowNDCPos.xy + vec2(0.0, 0.0);
  130. vec2 offset14 = shadowNDCPos.xy + vec2(oneTap.x, 0.0);
  131. vec2 offset15 = shadowNDCPos.xy + vec2(twoTap.x, 0.0);
  132. vec2 offset16 = shadowNDCPos.xy + vec2(-twoTap.x, oneTap.y);
  133. vec2 offset17 = shadowNDCPos.xy + vec2(-oneTap.x, oneTap.y);
  134. vec2 offset18 = shadowNDCPos.xy + vec2(0.0, oneTap.y);
  135. vec2 offset19 = shadowNDCPos.xy + vec2(oneTap.x, oneTap.y);
  136. vec2 offset20 = shadowNDCPos.xy + vec2(twoTap.x, oneTap.y);
  137. vec2 offset21 = shadowNDCPos.xy + vec2(-twoTap.x, twoTap.y);
  138. vec2 offset22 = shadowNDCPos.xy + vec2(-oneTap.x, twoTap.y);
  139. vec2 offset23 = shadowNDCPos.xy + vec2(0.0, twoTap.y);
  140. vec2 offset24 = shadowNDCPos.xy + vec2(oneTap.x, twoTap.y);
  141. vec2 offset25 = shadowNDCPos.xy + vec2(twoTap.x, twoTap.y);
  142. float block1, block2, block3, block4, block5, block6, block7, block8, block9, block10, block11, block12, block13, block14, block15, block16, block17, block18, block19, block20, block21, block22, block23, block24, block25;
  143. #if CC_SHADOWMAP_FORMAT == SHADOWMAP_FORMAT_RGBA8
  144. block1 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset1)));
  145. block2 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset2)));
  146. block3 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset3)));
  147. block4 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset4)));
  148. block5 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset5)));
  149. block6 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset6)));
  150. block7 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset7)));
  151. block8 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset8)));
  152. block9 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset9)));
  153. block10 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset10)));
  154. block11 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset11)));
  155. block12 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset12)));
  156. block13 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset13)));
  157. block14 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset14)));
  158. block15 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset15)));
  159. block16 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset16)));
  160. block17 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset17)));
  161. block18 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset18)));
  162. block19 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset19)));
  163. block20 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset20)));
  164. block21 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset21)));
  165. block22 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset22)));
  166. block23 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset23)));
  167. block24 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset24)));
  168. block25 = step(shadowNDCPos.z, unpackRGBAToDepth(shadowTexure(shadowMap, offset25)));
  169. #else
  170. block1 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset1).x);
  171. block2 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset2).x);
  172. block3 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset3).x);
  173. block4 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset4).x);
  174. block5 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset5).x);
  175. block6 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset6).x);
  176. block7 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset7).x);
  177. block8 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset8).x);
  178. block9 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset9).x);
  179. block10 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset10).x);
  180. block11 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset11).x);
  181. block12 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset12).x);
  182. block13 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset13).x);
  183. block14 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset14).x);
  184. block15 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset15).x);
  185. block16 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset16).x);
  186. block17 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset17).x);
  187. block18 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset18).x);
  188. block19 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset19).x);
  189. block20 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset20).x);
  190. block21 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset21).x);
  191. block22 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset22).x);
  192. block23 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset23).x);
  193. block24 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset24).x);
  194. block25 = step(shadowNDCPos.z, shadowTexure(shadowMap, offset25).x);
  195. #endif
  196. vec2 coef = fract(shadowNDCPos.xy * shadowMapResolution);
  197. vec2 v1X1 = mix(vec2(block1, block6), vec2(block2, block7), coef.xx);
  198. vec2 v1X2 = mix(vec2(block2, block7), vec2(block3, block8), coef.xx);
  199. vec2 v1X3 = mix(vec2(block3, block8), vec2(block4, block9), coef.xx);
  200. vec2 v1X4 = mix(vec2(block4, block9), vec2(block5, block10), coef.xx);
  201. float v1 = mix(v1X1.x, v1X1.y, coef.y) + mix(v1X2.x, v1X2.y, coef.y) + mix(v1X3.x, v1X3.y, coef.y) + mix(v1X4.x, v1X4.y, coef.y);
  202. vec2 v2X1 = mix(vec2(block6, block11), vec2(block7, block12), coef.xx);
  203. vec2 v2X2 = mix(vec2(block7, block12), vec2(block8, block13), coef.xx);
  204. vec2 v2X3 = mix(vec2(block8, block13), vec2(block9, block14), coef.xx);
  205. vec2 v2X4 = mix(vec2(block9, block14), vec2(block10, block15), coef.xx);
  206. float v2 = mix(v2X1.x, v2X1.y, coef.y) + mix(v2X2.x, v2X2.y, coef.y) + mix(v2X3.x, v2X3.y, coef.y) + mix(v2X4.x, v2X4.y, coef.y);
  207. vec2 v3X1 = mix(vec2(block11, block16), vec2(block12, block17), coef.xx);
  208. vec2 v3X2 = mix(vec2(block12, block17), vec2(block13, block18), coef.xx);
  209. vec2 v3X3 = mix(vec2(block13, block18), vec2(block14, block19), coef.xx);
  210. vec2 v3X4 = mix(vec2(block14, block19), vec2(block15, block20), coef.xx);
  211. float v3 = mix(v3X1.x, v3X1.y, coef.y) + mix(v3X2.x, v3X2.y, coef.y) + mix(v3X3.x, v3X3.y, coef.y) + mix(v3X4.x, v3X4.y, coef.y);
  212. vec2 v4X1 = mix(vec2(block16, block21), vec2(block17, block22), coef.xx);
  213. vec2 v4X2 = mix(vec2(block17, block22), vec2(block18, block23), coef.xx);
  214. vec2 v4X3 = mix(vec2(block18, block23), vec2(block19, block24), coef.xx);
  215. vec2 v4X4 = mix(vec2(block19, block24), vec2(block20, block25), coef.xx);
  216. float v4 = mix(v4X1.x, v4X1.y, coef.y) + mix(v4X2.x, v4X2.y, coef.y) + mix(v4X3.x, v4X3.y, coef.y) + mix(v4X4.x, v4X4.y, coef.y);
  217. float fAvg = (v1 + v2 + v3 + v4) * 0.0625;
  218. return fAvg;
  219. }