@zephyr3d/scene 0.9.21 → 0.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/dist/animation/joint_dynamics/collision.js +1 -7
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/joint_dynamics/constraints.js +2 -17
  4. package/dist/animation/joint_dynamics/constraints.js.map +1 -1
  5. package/dist/animation/joint_dynamics/controller.js +2 -20
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
  8. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  9. package/dist/animation/joint_dynamics/solver.js +14 -60
  10. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  11. package/dist/animation/joint_dynamics/types.js +3 -3
  12. package/dist/animation/joint_dynamics/types.js.map +1 -1
  13. package/dist/app/app.js +23 -0
  14. package/dist/app/app.js.map +1 -1
  15. package/dist/app/scriptregistry.js +16 -53
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +2 -0
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +22 -0
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/blitter/bilateralblur.js +3 -1
  22. package/dist/blitter/bilateralblur.js.map +1 -1
  23. package/dist/blitter/blitter.js +3 -3
  24. package/dist/blitter/blitter.js.map +1 -1
  25. package/dist/camera/camera.js +398 -45
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/camera/perspectivecamera.js +69 -2
  28. package/dist/camera/perspectivecamera.js.map +1 -1
  29. package/dist/index.d.ts +9100 -8712
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/material/blinn.js +1 -1
  33. package/dist/material/blinn.js.map +1 -1
  34. package/dist/material/lambert.js +3 -3
  35. package/dist/material/lambert.js.map +1 -1
  36. package/dist/material/material.js +8 -5
  37. package/dist/material/material.js.map +1 -1
  38. package/dist/material/meshmaterial.js +17 -10
  39. package/dist/material/meshmaterial.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  41. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  43. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
  45. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
  47. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  48. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
  49. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  50. package/dist/material/mixins/lit.js +33 -11
  51. package/dist/material/mixins/lit.js.map +1 -1
  52. package/dist/material/mixins/pbr/brdf.js +44 -12
  53. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  54. package/dist/material/mixins/pbr/common.js +149 -14
  55. package/dist/material/mixins/pbr/common.js.map +1 -1
  56. package/dist/material/mtoon.js +7 -4
  57. package/dist/material/mtoon.js.map +1 -1
  58. package/dist/material/pbrblueprint.js +5 -1
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +1 -1
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +186 -11
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/skin.js +2 -2
  67. package/dist/material/skin.js.map +1 -1
  68. package/dist/material/terrain-cm.js +5 -5
  69. package/dist/material/terrain-cm.js.map +1 -1
  70. package/dist/material/water.js +6 -4
  71. package/dist/material/water.js.map +1 -1
  72. package/dist/posteffect/bloom.js +54 -4
  73. package/dist/posteffect/bloom.js.map +1 -1
  74. package/dist/posteffect/compositor.js +41 -0
  75. package/dist/posteffect/compositor.js.map +1 -1
  76. package/dist/posteffect/posteffect.js +51 -0
  77. package/dist/posteffect/posteffect.js.map +1 -1
  78. package/dist/posteffect/sao.js +7 -6
  79. package/dist/posteffect/sao.js.map +1 -1
  80. package/dist/posteffect/skinsss.js +3 -3
  81. package/dist/posteffect/skinsss.js.map +1 -1
  82. package/dist/posteffect/ssgi.js +1196 -0
  83. package/dist/posteffect/ssgi.js.map +1 -0
  84. package/dist/posteffect/ssr.js +83 -45
  85. package/dist/posteffect/ssr.js.map +1 -1
  86. package/dist/posteffect/sss.js +137 -49
  87. package/dist/posteffect/sss.js.map +1 -1
  88. package/dist/posteffect/taa.js +5 -4
  89. package/dist/posteffect/taa.js.map +1 -1
  90. package/dist/posteffect/tonemap.js +15 -3
  91. package/dist/posteffect/tonemap.js.map +1 -1
  92. package/dist/render/abuffer_oit.js +2 -2
  93. package/dist/render/abuffer_oit.js.map +1 -1
  94. package/dist/render/cluster_light.js +12 -6
  95. package/dist/render/cluster_light.js.map +1 -1
  96. package/dist/render/drawable_mixin.js +8 -5
  97. package/dist/render/drawable_mixin.js.map +1 -1
  98. package/dist/render/dualdepthpeeling_oit.js +10 -5
  99. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  100. package/dist/render/envlight.js +298 -5
  101. package/dist/render/envlight.js.map +1 -1
  102. package/dist/render/gpu_picking.js +7 -5
  103. package/dist/render/gpu_picking.js.map +1 -1
  104. package/dist/render/hzb.js +28 -19
  105. package/dist/render/hzb.js.map +1 -1
  106. package/dist/render/lightpass.js +18 -4
  107. package/dist/render/lightpass.js.map +1 -1
  108. package/dist/render/render_queue.js +37 -4
  109. package/dist/render/render_queue.js.map +1 -1
  110. package/dist/render/renderer.js +8 -3
  111. package/dist/render/renderer.js.map +1 -1
  112. package/dist/render/rendergraph/blackboard.js +20 -48
  113. package/dist/render/rendergraph/blackboard.js.map +1 -1
  114. package/dist/render/rendergraph/device_pool_allocator.js +18 -58
  115. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  116. package/dist/render/rendergraph/executor.js +89 -115
  117. package/dist/render/rendergraph/executor.js.map +1 -1
  118. package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
  119. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  120. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  121. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  122. package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
  123. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
  124. package/dist/render/rendergraph/history_resource_manager.js +74 -140
  125. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  126. package/dist/render/rendergraph/history_resources.js +7 -5
  127. package/dist/render/rendergraph/history_resources.js.map +1 -1
  128. package/dist/render/rendergraph/render_context.js +19 -0
  129. package/dist/render/rendergraph/render_context.js.map +1 -0
  130. package/dist/render/rendergraph/render_pipeline.js +315 -0
  131. package/dist/render/rendergraph/render_pipeline.js.map +1 -0
  132. package/dist/render/rendergraph/rendergraph.js +158 -141
  133. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  134. package/dist/render/rendergraph/scene_render_context.js +267 -0
  135. package/dist/render/rendergraph/scene_render_context.js.map +1 -0
  136. package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
  137. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
  138. package/dist/render/rendergraph/types.js +19 -31
  139. package/dist/render/rendergraph/types.js.map +1 -1
  140. package/dist/render/renderpass.js +3 -3
  141. package/dist/render/renderpass.js.map +1 -1
  142. package/dist/render/shadow_mask_pass.js +10 -6
  143. package/dist/render/shadow_mask_pass.js.map +1 -1
  144. package/dist/render/sky.js +197 -35
  145. package/dist/render/sky.js.map +1 -1
  146. package/dist/render/weightedblended_oit.js +4 -3
  147. package/dist/render/weightedblended_oit.js.map +1 -1
  148. package/dist/scene/basesprite.js +2 -0
  149. package/dist/scene/basesprite.js.map +1 -1
  150. package/dist/scene/batchgroup.js +10 -0
  151. package/dist/scene/batchgroup.js.map +1 -1
  152. package/dist/scene/environment.js +61 -2
  153. package/dist/scene/environment.js.map +1 -1
  154. package/dist/scene/light.js +178 -10
  155. package/dist/scene/light.js.map +1 -1
  156. package/dist/scene/meshdrawable.js +89 -2
  157. package/dist/scene/meshdrawable.js.map +1 -1
  158. package/dist/scene/msdftext.js +2 -0
  159. package/dist/scene/msdftext.js.map +1 -1
  160. package/dist/scene/msdftextsprite.js +2 -0
  161. package/dist/scene/msdftextsprite.js.map +1 -1
  162. package/dist/scene/particlesys.js +2 -0
  163. package/dist/scene/particlesys.js.map +1 -1
  164. package/dist/scene/scene.js +34 -1
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/terrain-cm/grass.js +2 -1
  167. package/dist/scene/terrain-cm/grass.js.map +1 -1
  168. package/dist/scene/terrain-cm/terrain-cm.js +2 -0
  169. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  170. package/dist/scene/water.js +2 -0
  171. package/dist/scene/water.js.map +1 -1
  172. package/dist/shaders/atmosphere.js +5 -4
  173. package/dist/shaders/atmosphere.js.map +1 -1
  174. package/dist/shaders/fog.js +10 -3
  175. package/dist/shaders/fog.js.map +1 -1
  176. package/dist/shaders/shadow.js +96 -29
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shaders/ssgi.js +63 -0
  179. package/dist/shaders/ssgi.js.map +1 -0
  180. package/dist/shaders/ssgi_reprojection.js +118 -0
  181. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  182. package/dist/shaders/ssr.js +322 -154
  183. package/dist/shaders/ssr.js.map +1 -1
  184. package/dist/shadow/esm.js +13 -8
  185. package/dist/shadow/esm.js.map +1 -1
  186. package/dist/shadow/pcf_opt.js +15 -12
  187. package/dist/shadow/pcf_opt.js.map +1 -1
  188. package/dist/shadow/pcf_pd.js +15 -12
  189. package/dist/shadow/pcf_pd.js.map +1 -1
  190. package/dist/shadow/pcss.js +17 -11
  191. package/dist/shadow/pcss.js.map +1 -1
  192. package/dist/shadow/shadow_impl.js +20 -2
  193. package/dist/shadow/shadow_impl.js.map +1 -1
  194. package/dist/shadow/shadowmapper.js +10 -3
  195. package/dist/shadow/shadowmapper.js.map +1 -1
  196. package/dist/shadow/ssm.js +16 -13
  197. package/dist/shadow/ssm.js.map +1 -1
  198. package/dist/shadow/vsm.js +10 -8
  199. package/dist/shadow/vsm.js.map +1 -1
  200. package/dist/utility/physical.js +74 -0
  201. package/dist/utility/physical.js.map +1 -0
  202. package/dist/utility/rendermipmap.js +2 -2
  203. package/dist/utility/rendermipmap.js.map +1 -1
  204. package/dist/utility/serialization/manager.js +3 -1
  205. package/dist/utility/serialization/manager.js.map +1 -1
  206. package/dist/utility/serialization/scene/animation.js +3 -1
  207. package/dist/utility/serialization/scene/animation.js.map +1 -1
  208. package/dist/utility/serialization/scene/batch.js +3 -1
  209. package/dist/utility/serialization/scene/batch.js.map +1 -1
  210. package/dist/utility/serialization/scene/camera.js +598 -2
  211. package/dist/utility/serialization/scene/camera.js.map +1 -1
  212. package/dist/utility/serialization/scene/light.js +180 -9
  213. package/dist/utility/serialization/scene/light.js.map +1 -1
  214. package/dist/utility/serialization/scene/material.js +43 -3
  215. package/dist/utility/serialization/scene/material.js.map +1 -1
  216. package/dist/utility/serialization/scene/mesh.js +3 -1
  217. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  218. package/dist/utility/serialization/scene/node.js +3 -1
  219. package/dist/utility/serialization/scene/node.js.map +1 -1
  220. package/dist/utility/serialization/scene/particle.js +3 -1
  221. package/dist/utility/serialization/scene/particle.js.map +1 -1
  222. package/dist/utility/serialization/scene/primitive.js +2 -0
  223. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  224. package/dist/utility/serialization/scene/scene.js +70 -0
  225. package/dist/utility/serialization/scene/scene.js.map +1 -1
  226. package/dist/utility/serialization/scene/sprite.js +3 -1
  227. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  228. package/dist/utility/serialization/scene/terrain.js +3 -1
  229. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  230. package/dist/utility/serialization/scene/text.js +3 -0
  231. package/dist/utility/serialization/scene/text.js.map +1 -1
  232. package/dist/utility/serialization/scene/water.js +3 -1
  233. package/dist/utility/serialization/scene/water.js.map +1 -1
  234. package/dist/values.js +2 -3
  235. package/dist/values.js.map +1 -1
  236. package/package.json +3 -3
  237. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  238. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.js","sources":["../../src/shaders/ssr.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\nconst MAX_FLOAT_VALUE = 3.402823466e38;\r\n\r\n/** @internal */\r\nexport function SSR_calcJitter(scope: PBInsideFunctionScope, viewPos: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('SSR_calcJitter', [pb.vec3('viewPos'), pb.float('roughness')], function () {\r\n this.$l.h = pb.fract(pb.mul(this.viewPos, 0.8));\r\n this.h = pb.add(this.h, pb.dot(this.h, pb.add(this.h.yxz, pb.vec3(19.19))));\r\n this.h = pb.fract(pb.mul(pb.add(this.h.xxy, this.h.yxx), this.h.zyx));\r\n this.h = pb.sub(this.h, pb.vec3(0.5));\r\n this.$return(pb.mix(pb.vec3(0), this.h, this.roughness));\r\n });\r\n return scope.SSR_calcJitter(viewPos, roughness);\r\n}\r\n\r\n/** @internal */\r\n// source: https://github.com/blender/blender/blob/594f47ecd2d5367ca936cf6fc6ec8168c2b360d0/source/blender/gpu/shaders/material/gpu_shader_material_fresnel.glsl\r\nexport function SSR_fresnel(\r\n scope: PBInsideFunctionScope,\r\n viewVec: PBShaderExp,\r\n normal: PBShaderExp,\r\n eta: PBShaderExp | number = 1.5\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('SSR_fresnel', [pb.vec3('viewVec'), pb.vec3('viewNormal'), pb.float('eta')], function () {\r\n this.$l.cos = pb.dot(this.viewVec, this.viewNormal);\r\n this.$l.c = pb.abs(this.cos);\r\n this.$l.g = pb.add(pb.sub(pb.mul(this.eta, this.eta), 1), pb.mul(this.c, this.c));\r\n this.$l.r = pb.float();\r\n this.$if(pb.greaterThan(this.g, 0), function () {\r\n this.g = pb.sqrt(this.g);\r\n this.$l.A = pb.div(pb.sub(this.g, this.c), pb.add(this.g, this.c));\r\n this.$l.B = pb.div(\r\n pb.sub(pb.mul(this.c, pb.add(this.g, this.c)), 1),\r\n pb.add(pb.mul(this.c, pb.sub(this.g, this.c)), 1)\r\n );\r\n this.r = pb.mul(this.A, this.A, 0.5, pb.add(pb.mul(this.B, this.B), 1));\r\n }).$else(function () {\r\n this.r = 1;\r\n });\r\n this.$return(pb.min(1, pb.mul(this.r, 5)));\r\n });\r\n return scope.SSR_fresnel(viewVec, normal, eta);\r\n}\r\n\r\n/** @internal */\r\nexport function SSR_dither(scope: PBInsideFunctionScope, uv: PBShaderExp) {\r\n const pb = scope.$builder;\r\n if (pb.getDevice().type === 'webgl') {\r\n return pb.float(0);\r\n }\r\n if (!pb.getGlobalScope().Z_dither) {\r\n pb.getGlobalScope().Z_dither = [\r\n pb.float(0),\r\n pb.float(0.5),\r\n pb.float(0.125),\r\n pb.float(0.625),\r\n pb.float(0.75),\r\n pb.float(0.25),\r\n pb.float(0.875),\r\n pb.float(0.375),\r\n pb.float(0.187),\r\n pb.float(0.687),\r\n pb.float(0.0625),\r\n pb.float(0.562),\r\n pb.float(0.937),\r\n pb.float(0.437),\r\n pb.float(0.812),\r\n pb.float(0.312)\r\n ];\r\n pb.func('SSR_dither', [pb.vec2('uv')], function () {\r\n this.$l.ditherUV = pb.mod(this.uv, pb.vec2(4));\r\n this.$return(this.Z_dither.at(pb.uint(pb.add(pb.mul(this.ditherUV.x, 4), this.ditherUV.y))));\r\n });\r\n return scope.SSR_dither(uv);\r\n }\r\n}\r\n/** @internal */\r\nfunction invProjectPosition(scope: PBInsideFunctionScope, pos: PBShaderExp, mat: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('invProjectPosition', [pb.vec3('p'), pb.mat4('mat')], function () {\r\n this.$l.c = pb.sub(pb.mul(this.p, 2), pb.vec3(1));\r\n this.$l.u = pb.mul(this.mat, pb.vec4(this.c, 1));\r\n this.u = pb.div(this.u, this.u.w);\r\n this.$return(this.u.xyz);\r\n });\r\n return scope.invProjectPosition(pos, mat);\r\n}\r\n\r\n/** @internal */\r\nfunction validateHit(\r\n scope: PBInsideFunctionScope,\r\n hit2D: PBShaderExp,\r\n hit3D: Nullable<PBShaderExp>,\r\n surfaceZ: PBShaderExp,\r\n thickness: Nullable<PBShaderExp>,\r\n uv: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n textureSize: PBShaderExp,\r\n normalTexture?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = hit3D ? 'SSR_validateHit_HiZ' : 'SSR_validateHit';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('hit2d'),\r\n ...(hit3D ? [pb.vec3('hit3d')] : []),\r\n ...(hit3D ? [pb.float('thickness')] : []),\r\n pb.float('surfaceZ'),\r\n pb.vec2('uv'),\r\n pb.vec3('viewSpaceRayDirection'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.vec4('textureSize')\r\n ],\r\n function () {\r\n this.$if(\r\n pb.or(pb.any(pb.lessThan(this.hit2d, pb.vec2(0))), pb.any(pb.greaterThan(this.hit2d, pb.vec2(1)))),\r\n function () {\r\n this.$return(pb.float(0));\r\n }\r\n );\r\n this.$l.manhattanDist = pb.abs(pb.sub(this.hit2d, this.uv));\r\n this.$if(\r\n pb.all(pb.lessThan(this.manhattanDist, pb.vec2(pb.div(pb.vec2(2), this.textureSize.xy)))),\r\n function () {\r\n this.$return(pb.float(0));\r\n }\r\n );\r\n if (normalTexture) {\r\n this.$l.hitNormalWS = pb.sub(\r\n pb.mul(pb.textureSampleLevel(normalTexture, this.hit2d, 0).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n this.$l.hitNormalVS = pb.mul(this.viewMatrix, pb.vec4(this.hitNormalWS, 0)).xyz;\r\n this.$if(pb.greaterThan(pb.dot(this.hitNormalVS, this.viewSpaceRayDirection), 0), function () {\r\n this.$return(pb.float(0));\r\n });\r\n }\r\n this.$l.viewSpaceSurface = invProjectPosition(\r\n this,\r\n pb.vec3(this.hit2d, this.surfaceZ),\r\n this.invProjMatrix\r\n );\r\n this.$l.fov = pb.mul(pb.vec2(pb.div(this.textureSize.y, this.textureSize.x), 1), 0.05);\r\n this.$l.border = pb.mul(\r\n pb.smoothStep(pb.vec2(0), this.fov, this.hit2d),\r\n pb.sub(pb.vec2(1), pb.smoothStep(pb.sub(pb.vec2(1), this.fov), pb.vec2(1), this.hit2d))\r\n );\r\n this.$l.vignette = pb.mul(this.border.x, this.border.y);\r\n if (this.hit3d) {\r\n this.$l.distance = pb.distance(this.viewSpaceSurface, this.hit3d);\r\n this.$l.confidence = pb.sub(1, pb.smoothStep(0, this.thickness, this.distance));\r\n this.$return(pb.mul(this.vignette, this.confidence, this.confidence));\r\n } else {\r\n this.$return(this.vignette);\r\n }\r\n }\r\n );\r\n return hit3D\r\n ? scope[funcName](hit2D, hit3D, thickness, surfaceZ, uv, traceRay, viewMatrix, invProjMatrix, textureSize)\r\n : scope[funcName](hit2D, surfaceZ, uv, traceRay, viewMatrix, invProjMatrix, textureSize);\r\n}\r\n\r\nexport function screenSpaceRayTracing_Linear2D(\r\n scope: PBInsideFunctionScope,\r\n viewPos: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n projMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n cameraNearFar: PBShaderExp,\r\n maxDistance: PBShaderExp | number,\r\n maxIterations: PBShaderExp | number,\r\n thickness: PBShaderExp | number,\r\n stride: PBShaderExp | number,\r\n textureSize: PBShaderExp,\r\n linearDepthTex: PBShaderExp,\r\n normalTexture?: PBShaderExp,\r\n useBackfaceDepth?: boolean\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('distanceSquared', [pb.vec2('a'), pb.vec2('b')], function () {\r\n this.$l.x = pb.sub(this.a, this.b);\r\n this.$return(pb.dot(this.x, this.x));\r\n });\r\n pb.func(\r\n 'rayIntersectDepth',\r\n [pb.float('zA'), pb.float('zB'), pb.float('thickness'), pb.vec2('uv'), pb.float('cameraFar')],\r\n function () {\r\n let thickness = this.thickness;\r\n if (useBackfaceDepth) {\r\n this.$l.sceneZ = ShaderHelper.sampleLinearDepthWithBackface(this, linearDepthTex, this.uv, 0);\r\n this.$l.sceneZMax01 = this.sceneZ.x;\r\n thickness = pb.max(this.thickness, pb.mul(pb.sub(this.sceneZ.y, this.sceneZ.x), this.cameraFar));\r\n } else {\r\n this.$l.sceneZMax01 = ShaderHelper.sampleLinearDepth(this, linearDepthTex, this.uv, 0);\r\n }\r\n this.sceneZMax = pb.neg(pb.mul(this.sceneZMax01, this.cameraFar));\r\n this.$return(\r\n pb.and(\r\n pb.lessThan(this.sceneZMax01, 1),\r\n pb.greaterThanEqual(this.zA, pb.sub(this.sceneZMax, thickness)),\r\n pb.lessThanEqual(this.zB, this.sceneZMax)\r\n )\r\n );\r\n }\r\n );\r\n pb.func(\r\n 'traceRayLinear2D',\r\n [\r\n pb.vec3('rayOrigin'),\r\n pb.vec3('rayDirection'),\r\n pb.float('stride'),\r\n pb.float('maxDistance'),\r\n pb.float('maxIterations'),\r\n pb.float('thickness'),\r\n pb.vec2('cameraNearFar'),\r\n pb.mat4('projMatrix'),\r\n pb.vec4('textureSize'),\r\n pb.vec3('hit2D').out(),\r\n pb.vec3('hit3D').out(),\r\n pb.vec2('origin').out(),\r\n pb.float('numIterations').out()\r\n ],\r\n function () {\r\n this.$l.rayLen = this.$choice(\r\n pb.greaterThan(\r\n pb.add(this.rayOrigin.z, pb.mul(this.rayDirection.z, this.maxDistance)),\r\n pb.neg(this.cameraNearFar.x)\r\n ),\r\n pb.div(pb.sub(pb.neg(this.cameraNearFar.x), this.rayOrigin.z), this.rayDirection.z),\r\n this.maxDistance\r\n );\r\n this.$l.rayEnd = pb.add(this.rayOrigin, pb.mul(this.rayDirection, this.rayLen));\r\n this.$l.zMin = pb.min(this.rayOrigin.z, this.rayEnd.z);\r\n this.$l.zMax = pb.max(this.rayOrigin.z, this.rayEnd.z);\r\n this.$l.rayOriginH = pb.mul(this.projMatrix, pb.vec4(this.rayOrigin, 1));\r\n this.$l.rayEndH = pb.mul(this.projMatrix, pb.vec4(this.rayEnd, 1));\r\n this.$l.k0 = pb.div(1, this.rayOriginH.w);\r\n this.$l.k1 = pb.div(1, this.rayEndH.w);\r\n this.$l.Q0 = pb.mul(this.rayOrigin, this.k0);\r\n this.$l.Q1 = pb.mul(this.rayEnd, this.k1);\r\n this.$l.rayOriginNDC = pb.mul(this.rayOriginH, this.k0);\r\n this.$l.rayEndNDC = pb.mul(this.rayEndH, this.k1);\r\n this.origin = pb.add(pb.mul(this.rayOriginNDC.xy, 0.5), pb.vec2(0.5));\r\n this.$l.P0 = pb.mul(this.origin, this.textureSize.zw);\r\n this.$l.P1 = pb.mul(pb.add(pb.mul(this.rayEndNDC.xy, 0.5), pb.vec2(0.5)), this.textureSize.zw);\r\n this.$l.xMin = 0.5;\r\n this.$l.xMax = pb.sub(this.textureSize.z, 0.5);\r\n this.$l.yMin = 0.5;\r\n this.$l.yMax = pb.sub(this.textureSize.w, 0.5);\r\n this.$l.t = pb.float();\r\n this.$if(pb.or(pb.greaterThan(this.P1.y, this.yMax), pb.lessThan(this.P1.y, this.yMin)), function () {\r\n this.t = pb.div(\r\n pb.sub(this.P1.y, this.$choice(pb.greaterThan(this.P1.y, this.yMax), this.yMax, this.yMin)),\r\n pb.sub(this.P1.y, this.P0.y)\r\n );\r\n });\r\n this.$if(pb.or(pb.greaterThan(this.P1.x, this.xMax), pb.lessThan(this.P1.x, this.xMin)), function () {\r\n this.t2 = pb.div(\r\n pb.sub(this.P1.x, this.$choice(pb.greaterThan(this.P1.x, this.xMax), this.xMax, this.xMin)),\r\n pb.sub(this.P1.x, this.P0.x)\r\n );\r\n this.t = pb.max(this.t, this.t2);\r\n });\r\n this.P1 = pb.mix(this.P1, this.P0, this.t);\r\n this.k1 = pb.mix(this.k1, this.k0, this.t);\r\n this.Q1 = pb.mix(this.Q1, this.Q0, this.t);\r\n this.P1 = this.$choice(\r\n pb.lessThan(this.distanceSquared(this.P0, this.P1), 0.0001),\r\n pb.add(this.P1, pb.vec2(0.01)),\r\n this.P1\r\n );\r\n this.$l.delta = pb.sub(this.P1, this.P0);\r\n this.$l.permute = false;\r\n this.$if(pb.lessThan(pb.abs(this.delta.x), pb.abs(this.delta.y)), function () {\r\n this.permute = true;\r\n this.delta = this.delta.yx;\r\n this.P0 = this.P0.yx;\r\n this.P1 = this.P1.yx;\r\n });\r\n this.$l.stepDir = pb.sign(this.delta.x);\r\n this.$l.invdx = pb.div(this.stepDir, this.delta.x);\r\n this.$l.dQ = pb.mul(pb.sub(this.Q1, this.Q0), this.invdx);\r\n this.$l.dK = pb.mul(pb.sub(this.k1, this.k0), this.invdx);\r\n this.$l.dP = pb.vec2(this.stepDir, pb.mul(this.delta.y, this.invdx));\r\n //this.$l.strideScalar = pb.sub(1, pb.min(1, pb.div(pb.neg(this.rayOrigin.z), this.strideZCutoff)));\r\n //this.$l.pixelStride = pb.add(1, pb.mul(this.strideScalar, this.stride));\r\n this.$l.pixelStride = this.stride;\r\n this.dP = pb.mul(this.dP, this.pixelStride);\r\n this.dQ = pb.mul(this.dQ, this.pixelStride);\r\n this.dK = pb.mul(this.dK, this.pixelStride);\r\n this.$l.jitter = pb.float(1); //dither(this, this.P0);\r\n this.P0 = pb.add(this.P0, pb.mul(this.dP, this.jitter));\r\n this.Q0 = pb.add(this.Q0, pb.mul(this.dQ, this.jitter));\r\n this.k0 = pb.add(this.k0, pb.mul(this.dK, this.jitter));\r\n this.$l.prevZMaxEstimate = this.rayOrigin.z;\r\n this.$l.zA = this.prevZMaxEstimate;\r\n this.$l.zB = this.prevZMaxEstimate;\r\n this.$l.pqk = pb.vec4(this.P0, this.Q0.z, this.k0);\r\n this.$l.dpqk = pb.vec4(this.dP, this.dQ.z, this.dK);\r\n this.$l.invRenderTargetSize = pb.div(pb.vec2(1), this.textureSize.zw);\r\n this.$l.intersected = false;\r\n this.$l.hitUV = pb.vec2();\r\n this.$l.hitZ = pb.float();\r\n this.numIterations = 0;\r\n this.skippedIterations = pb.min(this.maxIterations, 1);\r\n this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? 1000 : this.maxIterations, function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.maxIterations), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$if(pb.and(this.intersected, pb.greaterThanEqual(this.i, this.skippedIterations)), function () {\r\n this.$break();\r\n });\r\n this.numIterations = pb.add(this.numIterations, 1);\r\n this.pqk = pb.add(this.pqk, this.dpqk);\r\n this.zA = this.prevZMaxEstimate;\r\n this.zB = pb.div(\r\n pb.add(pb.mul(this.dpqk.z, 0.5), this.pqk.z),\r\n pb.add(pb.mul(this.dpqk.w, 0.5), this.pqk.w)\r\n );\r\n this.zB = pb.clamp(this.zB, this.zMin, this.zMax);\r\n this.prevZMaxEstimate = this.zB;\r\n this.hitZ = this.zB;\r\n this.$if(pb.greaterThan(this.zB, this.zA), function () {\r\n this.$l.t = this.zB;\r\n this.zB = this.zA;\r\n this.zA = this.t;\r\n });\r\n this.hitUV = this.$choice(this.permute, this.pqk.yx, this.pqk.xy);\r\n this.hitUV = pb.mul(this.hitUV, this.invRenderTargetSize);\r\n this.intersected = this.rayIntersectDepth(\r\n this.zA,\r\n this.zB,\r\n this.thickness,\r\n this.hitUV,\r\n this.cameraNearFar.y\r\n );\r\n });\r\n this.hit2D = pb.vec3(this.hitUV, this.hitZ);\r\n this.Q0 = pb.vec3(pb.add(this.Q0.xy, pb.mul(this.dQ.xy, this.numIterations)), this.pqk.z);\r\n this.hit3D = pb.div(this.Q0, this.pqk.w);\r\n this.$return(this.intersected);\r\n }\r\n );\r\n pb.func(\r\n 'SSR_Linear2D',\r\n [\r\n pb.vec3('rayOrigin'),\r\n pb.vec3('rayDirection'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('projMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.float('stride'),\r\n pb.float('maxDistance'),\r\n pb.float('maxIterations'),\r\n pb.float('thickness'),\r\n pb.vec2('cameraNearFar'),\r\n pb.vec4('textureSize')\r\n ],\r\n function () {\r\n this.$l.hit2D = pb.vec3();\r\n this.$l.hit3D = pb.vec3();\r\n this.$l.origin = pb.vec2();\r\n this.$l.numIterations = pb.float();\r\n this.$l.intersected = this.traceRayLinear2D(\r\n this.rayOrigin,\r\n this.rayDirection,\r\n this.stride,\r\n this.maxDistance,\r\n this.maxIterations,\r\n this.thickness,\r\n this.cameraNearFar,\r\n this.projMatrix,\r\n this.textureSize,\r\n this.hit2D,\r\n this.hit3D,\r\n this.origin,\r\n this.numIterations\r\n );\r\n this.$if(pb.not(this.intersected), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.surfaceZ01 = ShaderHelper.sampleLinearDepth(this, linearDepthTex, this.hit2D.xy, 0);\r\n this.$if(pb.equal(this.surfaceZ01, 1), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.surfaceZ = ShaderHelper.linearDepthToNonLinear(\r\n this,\r\n pb.mul(this.surfaceZ01, this.cameraNearFar.y),\r\n this.cameraNearFar\r\n );\r\n this.$l.confidence = validateHit(\r\n this,\r\n this.hit2D.xy,\r\n null,\r\n this.surfaceZ,\r\n null,\r\n this.origin,\r\n this.rayDirection,\r\n this.viewMatrix,\r\n this.invProjMatrix,\r\n this.textureSize,\r\n normalTexture\r\n );\r\n this.$l.iterationAttenuation = pb.sub(1, pb.smoothStep(0, this.maxIterations, this.numIterations));\r\n //this.$l.iterationAttenuation = pb.smoothStep(this.maxIterations, 1, this.numIterations);\r\n this.confidence = pb.mul(this.confidence, this.iterationAttenuation);\r\n this.$l.hitPixel = pb.mul(this.hit2D.xy, this.textureSize.zw);\r\n this.$l.startPixel = pb.mul(this.origin.xy, this.textureSize.zw);\r\n this.$l.hitDistance = pb.length(pb.sub(this.hitPixel, this.startPixel));\r\n this.$return(pb.vec4(this.hit2D.xy, this.hitDistance, this.confidence));\r\n }\r\n );\r\n return scope.SSR_Linear2D(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n stride,\r\n maxDistance,\r\n maxIterations,\r\n thickness,\r\n cameraNearFar,\r\n textureSize\r\n );\r\n}\r\n\r\nexport function screenSpaceRayTracing_HiZ(\r\n scope: PBInsideFunctionScope,\r\n viewPos: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n projMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n cameraNearFar: PBShaderExp,\r\n maxMipLevel: PBShaderExp | number,\r\n maxIterations: PBShaderExp | number,\r\n maxDistance: PBShaderExp | number,\r\n thickness: PBShaderExp | number,\r\n textureSize: PBShaderExp,\r\n HiZTexture: PBShaderExp,\r\n normalTexture?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('getMipResolution', [pb.int('mipLevel')], function () {\r\n this.$return(pb.vec2(pb.textureDimensions(HiZTexture, this.mipLevel)));\r\n });\r\n pb.func('SSR_loadDepth', [pb.vec2('uv'), pb.float('level')], function () {\r\n this.$return(pb.textureSampleLevel(HiZTexture, this.uv, this.level).r);\r\n });\r\n pb.func('invProjectPosition', [pb.vec3('p'), pb.mat4('mat')], function () {\r\n this.$l.c = pb.sub(pb.mul(this.p, 2), pb.vec3(1));\r\n this.$l.u = pb.mul(this.mat, pb.vec4(this.c, 1));\r\n this.u = pb.div(this.u, this.u.w);\r\n this.$return(this.u.xyz);\r\n });\r\n pb.func('projectPosition', [pb.vec3('p'), pb.mat4('mat')], function () {\r\n this.$l.projected = pb.mul(this.mat, pb.vec4(this.p, 1));\r\n this.projected = pb.div(this.projected, this.projected.w);\r\n this.projected = pb.add(pb.mul(this.projected, 0.5), pb.vec4(0.5));\r\n this.$return(this.projected.xyz);\r\n });\r\n pb.func(\r\n 'projectDirection',\r\n [pb.vec3('p'), pb.vec3('d'), pb.vec3('screenSpacePos'), pb.mat4('mat')],\r\n function () {\r\n this.$return(pb.sub(this.projectPosition(pb.add(this.p, this.d), this.mat), this.screenSpacePos));\r\n }\r\n );\r\n pb.func(\r\n 'SSR_initialAdvanceRay',\r\n [\r\n pb.vec3('origin'),\r\n pb.vec3('direction'),\r\n pb.vec3('invDirection'),\r\n pb.vec2('currentMipResolution'),\r\n pb.vec2('invCurrentMipResolution'),\r\n pb.vec2('floorOffset'),\r\n pb.vec2('uvOffset'),\r\n pb.vec3('position').out(),\r\n pb.float('currentT').out()\r\n ],\r\n function () {\r\n this.$l.currentMipPosition = pb.mul(this.currentMipResolution, this.origin.xy);\r\n this.$l.xyPlane = pb.add(pb.floor(this.currentMipPosition), this.floorOffset);\r\n this.xyPlane = pb.add(pb.mul(this.xyPlane, this.invCurrentMipResolution), this.uvOffset);\r\n this.$l.t = pb.mul(pb.sub(this.xyPlane, this.origin.xy), this.invDirection.xy);\r\n this.currentT = pb.min(this.t.x, this.t.y);\r\n this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));\r\n }\r\n );\r\n pb.func(\r\n 'SSR_advanceRay',\r\n [\r\n pb.vec3('origin'),\r\n pb.vec3('direction'),\r\n pb.vec3('invDirection'),\r\n pb.vec2('currentMipPosition'),\r\n pb.vec2('invCurrentMipResolution'),\r\n pb.vec2('floorOffset'),\r\n pb.vec2('uvOffset'),\r\n pb.float('surfaceZ'),\r\n pb.float('surfaceZMax'),\r\n pb.int('currentMip'),\r\n pb.vec3('position').inout(),\r\n pb.float('currentT').inout()\r\n ],\r\n function () {\r\n this.$l.xyPlane = pb.add(pb.floor(this.currentMipPosition), this.floorOffset);\r\n this.xyPlane = pb.add(pb.mul(this.xyPlane, this.invCurrentMipResolution), this.uvOffset);\r\n this.$l.skippedTile = pb.bool();\r\n this.$if(pb.greaterThan(this.direction.z, 0), function () {\r\n // Preserve the proven min-depth traversal for rays moving away from the camera.\r\n this.$l.boundaryPlanes = pb.vec3(this.xyPlane, this.surfaceZ);\r\n this.$l.forwardT = pb.mul(pb.sub(this.boundaryPlanes, this.origin), this.invDirection);\r\n this.$l.tMin = pb.min(pb.min(this.forwardT.x, this.forwardT.y), this.forwardT.z);\r\n this.$l.aboveSurface = pb.greaterThan(this.surfaceZ, this.position.z);\r\n this.skippedTile = pb.and(\r\n pb.notEqual(pb.floatBitsToUint(this.tMin), pb.floatBitsToUint(this.forwardT.z)),\r\n this.aboveSurface\r\n );\r\n this.currentT = this.$choice(this.aboveSurface, this.tMin, this.currentT);\r\n this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));\r\n }).$else(function () {\r\n this.$l.reverseT = pb.mul(pb.sub(this.xyPlane, this.origin.xy), this.invDirection.xy);\r\n this.$l.tExit = pb.min(this.reverseT.x, this.reverseT.y);\r\n this.$l.exitZ = pb.add(this.origin.z, pb.mul(this.direction.z, this.tExit));\r\n this.$l.rayMinZ = pb.min(this.position.z, this.exitZ);\r\n this.$l.rayMaxZ = pb.max(this.position.z, this.exitZ);\r\n this.$l.overlapsDepth = pb.and(\r\n pb.greaterThanEqual(this.rayMaxZ, this.surfaceZ),\r\n pb.lessThanEqual(this.rayMinZ, this.surfaceZMax)\r\n );\r\n this.skippedTile = pb.not(this.overlapsDepth);\r\n this.$if(this.skippedTile, function () {\r\n this.currentT = this.tExit;\r\n this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));\r\n }).$elseif(pb.equal(this.currentMip, 0), function () {\r\n this.$if(pb.greaterThan(pb.abs(this.direction.z), 1e-6), function () {\r\n this.currentT = pb.div(pb.sub(this.surfaceZMax, this.origin.z), this.direction.z);\r\n this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));\r\n });\r\n });\r\n });\r\n this.$return(this.skippedTile);\r\n }\r\n );\r\n pb.func(\r\n 'SSR_RaymarchHiZ',\r\n [\r\n pb.vec3('screenSpacePos'),\r\n pb.vec3('screenSpaceDirection'),\r\n pb.vec2('cameraNearFar'),\r\n pb.vec2('screenSize'),\r\n pb.int('mostDetailMip'),\r\n pb.int('maxMipLevel'),\r\n pb.float('maxIterations'),\r\n pb.float('maxT'),\r\n pb.float('numIterations').out()\r\n ],\r\n function () {\r\n this.$l.invDirection = pb.vec3(\r\n this.$choice(\r\n pb.greaterThan(pb.abs(this.screenSpaceDirection.x), 1e-8),\r\n pb.div(1, this.screenSpaceDirection.x),\r\n MAX_FLOAT_VALUE\r\n ),\r\n this.$choice(\r\n pb.greaterThan(pb.abs(this.screenSpaceDirection.y), 1e-8),\r\n pb.div(1, this.screenSpaceDirection.y),\r\n MAX_FLOAT_VALUE\r\n ),\r\n this.$choice(\r\n pb.greaterThan(pb.abs(this.screenSpaceDirection.z), 1e-8),\r\n pb.div(1, this.screenSpaceDirection.z),\r\n MAX_FLOAT_VALUE\r\n )\r\n );\r\n this.$l.currentMip = this.mostDetailMip;\r\n this.$l.currentMipResolution = this.getMipResolution(this.currentMip);\r\n this.$l.invCurrentMipResolution = pb.div(pb.vec2(1), this.currentMipResolution);\r\n this.$l.uvOffset = pb.div(pb.mul(0.005, pb.exp2(pb.float(this.mostDetailMip))), this.screenSize);\r\n this.uvOffset = pb.vec2(\r\n this.$choice(pb.lessThan(this.screenSpaceDirection.x, 0), pb.neg(this.uvOffset.x), this.uvOffset.x),\r\n this.$choice(pb.lessThan(this.screenSpaceDirection.y, 0), pb.neg(this.uvOffset.y), this.uvOffset.y)\r\n );\r\n this.$l.floorOffset = pb.vec2(\r\n this.$choice(pb.lessThan(this.screenSpaceDirection.x, 0), pb.float(0), pb.float(1)),\r\n this.$choice(pb.lessThan(this.screenSpaceDirection.y, 0), pb.float(0), pb.float(1))\r\n );\r\n this.$l.currentT = pb.float();\r\n this.$l.position = pb.vec3();\r\n this.SSR_initialAdvanceRay(\r\n this.screenSpacePos,\r\n this.screenSpaceDirection,\r\n this.invDirection,\r\n this.currentMipResolution,\r\n this.invCurrentMipResolution,\r\n this.floorOffset,\r\n this.uvOffset,\r\n this.position,\r\n this.currentT\r\n );\r\n this.numIterations = pb.float(0);\r\n this.$while(\r\n pb.and(\r\n pb.and(\r\n pb.lessThan(this.numIterations, this.maxIterations),\r\n pb.greaterThanEqual(this.currentMip, this.mostDetailMip)\r\n ),\r\n pb.and(\r\n pb.lessThanEqual(this.currentT, this.maxT),\r\n pb.all(pb.greaterThanEqual(this.position.xy, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.position.xy, pb.vec2(1)))\r\n )\r\n ),\r\n function () {\r\n this.$l.currentMipPosition = pb.mul(this.currentMipResolution, this.position.xy);\r\n this.$l.depthRange = pb.textureLoad(\r\n HiZTexture,\r\n pb.ivec2(this.currentMipPosition),\r\n this.currentMip\r\n ).rg;\r\n this.$l.skippedTile = this.SSR_advanceRay(\r\n this.screenSpacePos,\r\n this.screenSpaceDirection,\r\n this.invDirection,\r\n this.currentMipPosition,\r\n this.invCurrentMipResolution,\r\n this.floorOffset,\r\n this.uvOffset,\r\n this.depthRange.x,\r\n this.depthRange.y,\r\n this.currentMip,\r\n this.position,\r\n this.currentT\r\n );\r\n this.$l.nextMipIsOutOfRange = pb.and(\r\n this.skippedTile,\r\n pb.greaterThanEqual(this.currentMip, this.maxMipLevel)\r\n );\r\n this.$if(pb.not(this.nextMipIsOutOfRange), function () {\r\n this.currentMip = pb.add(this.currentMip, this.$choice(this.skippedTile, pb.int(1), pb.int(-1)));\r\n this.currentMipResolution = pb.mul(\r\n this.currentMipResolution,\r\n this.$choice(this.skippedTile, 0.5, 2)\r\n );\r\n this.invCurrentMipResolution = pb.mul(\r\n this.invCurrentMipResolution,\r\n this.$choice(this.skippedTile, 2, 0.5)\r\n );\r\n });\r\n this.numIterations = pb.add(this.numIterations, 1);\r\n }\r\n );\r\n this.$l.validHit = this.$choice(\r\n pb.and(\r\n pb.lessThan(this.currentMip, this.mostDetailMip),\r\n pb.and(pb.greaterThanEqual(this.currentT, 0), pb.lessThanEqual(this.currentT, this.maxT))\r\n ),\r\n pb.float(1),\r\n pb.float(0)\r\n );\r\n this.$return(pb.vec4(this.position, this.validHit));\r\n }\r\n );\r\n pb.func(\r\n 'SSR_HiZ',\r\n [\r\n pb.vec3('viewPos'),\r\n pb.vec3('traceRay'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('projMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.vec2('cameraNearFar'),\r\n pb.float('maxDistance'),\r\n pb.float('thickness'),\r\n pb.vec4('textureSize'),\r\n pb.int('maxMipLevel'),\r\n pb.float('maxIterations')\r\n ],\r\n function () {\r\n this.$l.rayDirection = pb.normalize(this.traceRay);\r\n this.$l.reverseRay = pb.greaterThan(this.rayDirection.z, 1e-6);\r\n this.$l.rayLength = this.maxDistance;\r\n this.$if(this.reverseRay, function () {\r\n this.rayLength = pb.min(\r\n this.rayLength,\r\n pb.div(pb.sub(pb.neg(this.cameraNearFar.x), this.viewPos.z), this.rayDirection.z)\r\n );\r\n });\r\n this.$if(pb.lessThanEqual(this.rayLength, 0), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.originH = pb.mul(this.projMatrix, pb.vec4(this.viewPos, 1));\r\n this.$l.originCS = pb.div(this.originH.xyz, this.originH.w);\r\n this.$l.originTS = pb.add(pb.mul(this.originCS, 0.5), pb.vec3(0.5));\r\n this.$l.endTS = this.projectPosition(\r\n pb.add(this.viewPos, pb.mul(this.rayDirection, this.rayLength)),\r\n this.projMatrix\r\n );\r\n this.$l.directionTS = this.$choice(\r\n this.reverseRay,\r\n pb.sub(this.endTS, this.originTS),\r\n this.projectDirection(this.viewPos, this.rayDirection, this.originTS, this.projMatrix)\r\n );\r\n this.$l.maxT = this.$choice(this.reverseRay, pb.float(1), pb.float(MAX_FLOAT_VALUE));\r\n this.$l.mostDetailMip = pb.int(0);\r\n this.$l.numIterations = pb.float();\r\n this.$l.hit = this.SSR_RaymarchHiZ(\r\n this.originTS,\r\n this.directionTS,\r\n this.cameraNearFar,\r\n this.textureSize.zw,\r\n this.mostDetailMip,\r\n this.maxMipLevel,\r\n this.maxIterations,\r\n this.maxT,\r\n this.numIterations\r\n );\r\n this.$l.confidence = pb.float(0);\r\n this.$if(pb.notEqual(this.hit.w, 0), function () {\r\n this.$l.surfaceZ = pb.textureSampleLevel(HiZTexture, this.hit.xy, 0).r;\r\n this.$if(pb.equal(this.surfaceZ, 1), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.hit3D = invProjectPosition(this, this.hit.xyz, this.invProjMatrix);\r\n this.confidence = validateHit(\r\n this,\r\n this.hit.xy,\r\n this.hit3D,\r\n this.surfaceZ,\r\n this.thickness,\r\n this.originTS.xy,\r\n this.rayDirection,\r\n this.viewMatrix,\r\n this.invProjMatrix,\r\n this.textureSize,\r\n normalTexture\r\n );\r\n });\r\n this.$l.iterationAttenuation = pb.sub(1, pb.smoothStep(0, this.maxIterations, this.numIterations));\r\n //this.$l.iterationAttenuation = pb.smoothStep(this.maxIterations, 1, this.numIterations);\r\n this.confidence = pb.mul(this.confidence, this.iterationAttenuation);\r\n this.$l.hitPixel = pb.mul(this.hit.xy, this.textureSize.zw);\r\n this.$l.startPixel = pb.mul(this.originTS.xy, this.textureSize.zw);\r\n this.$l.hitDistance = pb.length(pb.sub(this.hitPixel, this.startPixel));\r\n this.$return(pb.vec4(this.hit.xy, this.hitDistance, this.confidence));\r\n }\r\n );\r\n return scope.SSR_HiZ(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n cameraNearFar,\r\n maxDistance,\r\n thickness,\r\n textureSize,\r\n pb.sub(maxMipLevel, 1),\r\n maxIterations\r\n ) as PBShaderExp;\r\n}\r\n\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n\treturn floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n\treturn input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n\tfloat2 cell_size = 1.0 / cell_count;\r\n\tfloat2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n\tfloat2 solutions = (planes - pos)/dir.xy;\r\n\tfloat3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n\tintersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n\treturn intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n\treturn (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n\treturn input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n\tfloat level = HIZ_START_LEVEL;\r\n\tfloat3 v_z = v/v.z;\r\n\tfloat2 hi_z_size = cell_count(level);\r\n\tfloat3 ray = p;\r\n\r\n\tfloat2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n\tfloat2 cross_offset = cross_step * 0.00001;\r\n\tcross_step = saturate(cross_step);\r\n\r\n\tfloat2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n\tray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n\titerations = 0;\r\n\twhile(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n\t\t// get the cell number of the current ray\r\n\t\tfloat2 current_cell_count = cell_count(level);\r\n\t\tfloat2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n\t\t// get the minimum depth plane in which the current ray resides\r\n\t\tfloat min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n\t\t// intersect only if ray depth is below the minimum depth plane\r\n\t\tfloat3 tmp_ray = ray;\r\n\t\tif(v.z > 0) {\r\n\t\t\tfloat min_minus_ray = min_z - ray.z;\r\n\t\t\ttmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n\t\t\tfloat2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n\t\t\tif(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n\t\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\t\tlevel = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n\t\t\t}else{\r\n\t\t\t\tif(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n\t\t\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\t\t\tlevel = 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if(ray.z < min_z) {\r\n\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\tlevel = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n\t\t}\r\n\r\n\t\tray.xyz = tmp_ray.xyz;\r\n\t\t--level;\r\n\r\n\t\t++iterations;\r\n\t}\r\n\treturn ray;\r\n}\r\n*/\r\n"],"names":["MAX_FLOAT_VALUE","SSR_calcJitter","scope","viewPos","roughness","pb","$builder","func","vec3","float","$l","h","fract","mul","add","dot","yxz","xxy","yxx","zyx","sub","$return","mix","invProjectPosition","pos","mat","mat4","c","p","u","vec4","div","w","xyz","validateHit","hit2D","hit3D","surfaceZ","thickness","uv","traceRay","viewMatrix","invProjMatrix","textureSize","normalTexture","funcName","vec2","$if","or","any","lessThan","hit2d","greaterThan","manhattanDist","abs","all","xy","hitNormalWS","textureSampleLevel","rgb","hitNormalVS","viewSpaceRayDirection","viewSpaceSurface","fov","y","x","border","smoothStep","vignette","hit3d","distance","confidence","screenSpaceRayTracing_Linear2D","projMatrix","cameraNearFar","maxDistance","maxIterations","stride","linearDepthTex","useBackfaceDepth","a","b","sceneZ","ShaderHelper","sampleLinearDepthWithBackface","sceneZMax01","max","cameraFar","sampleLinearDepth","sceneZMax","neg","and","greaterThanEqual","zA","lessThanEqual","zB","out","rayLen","$choice","rayOrigin","z","rayDirection","rayEnd","zMin","min","zMax","rayOriginH","rayEndH","k0","k1","Q0","Q1","rayOriginNDC","rayEndNDC","origin","P0","zw","P1","xMin","xMax","yMin","yMax","t","t2","distanceSquared","delta","permute","yx","stepDir","sign","invdx","dQ","dK","dP","pixelStride","jitter","prevZMaxEstimate","pqk","dpqk","invRenderTargetSize","intersected","hitUV","hitZ","numIterations","skippedIterations","$for","getDevice","type","i","$break","clamp","rayIntersectDepth","traceRayLinear2D","not","surfaceZ01","equal","linearDepthToNonLinear","iterationAttenuation","hitPixel","startPixel","hitDistance","length","SSR_Linear2D","screenSpaceRayTracing_HiZ","maxMipLevel","HiZTexture","int","textureDimensions","mipLevel","level","r","projected","projectPosition","d","screenSpacePos","currentMipPosition","currentMipResolution","xyPlane","floor","floorOffset","invCurrentMipResolution","uvOffset","invDirection","currentT","position","direction","inout","skippedTile","bool","boundaryPlanes","forwardT","tMin","aboveSurface","notEqual","floatBitsToUint","$else","reverseT","tExit","exitZ","rayMinZ","rayMaxZ","overlapsDepth","surfaceZMax","$elseif","currentMip","screenSpaceDirection","mostDetailMip","getMipResolution","exp2","screenSize","SSR_initialAdvanceRay","$while","maxT","depthRange","textureLoad","ivec2","rg","SSR_advanceRay","nextMipIsOutOfRange","validHit","normalize","reverseRay","rayLength","originH","originCS","originTS","endTS","directionTS","projectDirection","hit","SSR_RaymarchHiZ","SSR_HiZ"],"mappings":"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"}
1
+ {"version":3,"file":"ssr.js","sources":["../../src/shaders/ssr.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport function SSR_calcJitter(scope: PBInsideFunctionScope, viewPos: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('SSR_calcJitter', [pb.vec3('viewPos'), pb.float('roughness')], function () {\r\n this.$l.h = pb.fract(pb.mul(this.viewPos, 0.8));\r\n this.h = pb.add(this.h, pb.dot(this.h, pb.add(this.h.yxz, pb.vec3(19.19))));\r\n this.h = pb.fract(pb.mul(pb.add(this.h.xxy, this.h.yxx), this.h.zyx));\r\n this.h = pb.sub(this.h, pb.vec3(0.5));\r\n this.$return(pb.mix(pb.vec3(0), this.h, this.roughness));\r\n });\r\n return scope.SSR_calcJitter(viewPos, roughness);\r\n}\r\n\r\n/** @internal */\r\n// source: https://github.com/blender/blender/blob/594f47ecd2d5367ca936cf6fc6ec8168c2b360d0/source/blender/gpu/shaders/material/gpu_shader_material_fresnel.glsl\r\nexport function SSR_fresnel(\r\n scope: PBInsideFunctionScope,\r\n viewVec: PBShaderExp,\r\n normal: PBShaderExp,\r\n eta: PBShaderExp | number = 1.5\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('SSR_fresnel', [pb.vec3('viewVec'), pb.vec3('viewNormal'), pb.float('eta')], function () {\r\n this.$l.cos = pb.dot(this.viewVec, this.viewNormal);\r\n this.$l.c = pb.abs(this.cos);\r\n this.$l.g = pb.add(pb.sub(pb.mul(this.eta, this.eta), 1), pb.mul(this.c, this.c));\r\n this.$l.r = pb.float();\r\n this.$if(pb.greaterThan(this.g, 0), function () {\r\n this.g = pb.sqrt(this.g);\r\n this.$l.A = pb.div(pb.sub(this.g, this.c), pb.add(this.g, this.c));\r\n this.$l.B = pb.div(\r\n pb.sub(pb.mul(this.c, pb.add(this.g, this.c)), 1),\r\n pb.add(pb.mul(this.c, pb.sub(this.g, this.c)), 1)\r\n );\r\n this.r = pb.mul(this.A, this.A, 0.5, pb.add(pb.mul(this.B, this.B), 1));\r\n }).$else(function () {\r\n this.r = 1;\r\n });\r\n this.$return(pb.min(1, pb.mul(this.r, 5)));\r\n });\r\n return scope.SSR_fresnel(viewVec, normal, eta);\r\n}\r\n\r\n/** @internal */\r\nexport function SSR_dither(scope: PBInsideFunctionScope, uv: PBShaderExp) {\r\n const pb = scope.$builder;\r\n if (pb.getDevice().type === 'webgl') {\r\n return pb.float(0);\r\n }\r\n if (!pb.getGlobalScope().Z_dither) {\r\n pb.getGlobalScope().Z_dither = [\r\n pb.float(0),\r\n pb.float(0.5),\r\n pb.float(0.125),\r\n pb.float(0.625),\r\n pb.float(0.75),\r\n pb.float(0.25),\r\n pb.float(0.875),\r\n pb.float(0.375),\r\n pb.float(0.187),\r\n pb.float(0.687),\r\n pb.float(0.0625),\r\n pb.float(0.562),\r\n pb.float(0.937),\r\n pb.float(0.437),\r\n pb.float(0.812),\r\n pb.float(0.312)\r\n ];\r\n pb.func('SSR_dither', [pb.vec2('uv')], function () {\r\n this.$l.ditherUV = pb.mod(this.uv, pb.vec2(4));\r\n this.$return(this.Z_dither.at(pb.uint(pb.add(pb.mul(this.ditherUV.x, 4), this.ditherUV.y))));\r\n });\r\n return scope.SSR_dither(uv);\r\n }\r\n}\r\n/** @internal */\r\nfunction invProjectPosition(scope: PBInsideFunctionScope, pos: PBShaderExp, mat: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('invProjectPosition', [pb.vec3('p'), pb.mat4('mat')], function () {\r\n this.$l.c = pb.vec3(\r\n pb.sub(pb.mul(this.p.xy, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, this.p.z)\r\n );\r\n this.$l.u = pb.mul(this.mat, pb.vec4(this.c, 1));\r\n this.u = pb.div(this.u, this.u.w);\r\n this.$return(this.u.xyz);\r\n });\r\n return scope.invProjectPosition(pos, mat);\r\n}\r\n\r\n/** @internal */\r\nfunction validateHit(\r\n scope: PBInsideFunctionScope,\r\n hit2D: PBShaderExp,\r\n hit3D: Nullable<PBShaderExp>,\r\n surfaceZ: PBShaderExp,\r\n thickness: Nullable<PBShaderExp>,\r\n uv: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n textureSize: PBShaderExp,\r\n normalTexture?: PBShaderExp,\r\n debugValidationOut?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = hit3D ? 'SSR_validateHit_HiZ' : 'SSR_validateHit';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('hit2d'),\r\n ...(hit3D ? [pb.vec3('hit3d')] : []),\r\n ...(hit3D ? [pb.float('thickness')] : []),\r\n pb.float('surfaceZ'),\r\n pb.vec2('uv'),\r\n pb.vec3('viewSpaceRayDirection'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.vec4('textureSize'),\r\n ...(debugValidationOut ? [pb.vec3('debugValidation').out()] : [])\r\n ],\r\n function () {\r\n if (debugValidationOut) {\r\n this.debugValidation = pb.vec3(1, 1, 0);\r\n }\r\n this.$if(\r\n pb.or(pb.any(pb.lessThan(this.hit2d, pb.vec2(0))), pb.any(pb.greaterThan(this.hit2d, pb.vec2(1)))),\r\n function () {\r\n if (debugValidationOut) {\r\n this.debugValidation = pb.vec3(0);\r\n }\r\n this.$return(pb.float(0));\r\n }\r\n );\r\n this.$l.manhattanDist = pb.abs(pb.sub(this.hit2d, this.uv));\r\n this.$if(\r\n pb.all(pb.lessThan(this.manhattanDist, pb.vec2(pb.div(pb.vec2(2), this.textureSize.xy)))),\r\n function () {\r\n if (debugValidationOut) {\r\n this.debugValidation.x = 0;\r\n }\r\n this.$return(pb.float(0));\r\n }\r\n );\r\n if (normalTexture) {\r\n this.$l.hitNormalWS = pb.sub(\r\n pb.mul(pb.textureSampleLevel(normalTexture, this.hit2d, 0).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n this.$l.hitNormalVS = pb.mul(this.viewMatrix, pb.vec4(this.hitNormalWS, 0)).xyz;\r\n this.$if(pb.greaterThan(pb.dot(this.hitNormalVS, this.viewSpaceRayDirection), 0), function () {\r\n if (debugValidationOut) {\r\n this.debugValidation.y = 0;\r\n }\r\n this.$return(pb.float(0));\r\n });\r\n }\r\n this.$l.viewSpaceSurface = invProjectPosition(\r\n this,\r\n pb.vec3(this.hit2d, this.surfaceZ),\r\n this.invProjMatrix\r\n );\r\n this.$l.fov = pb.mul(pb.vec2(pb.div(this.textureSize.y, this.textureSize.x), 1), 0.05);\r\n this.$l.border = pb.mul(\r\n pb.smoothStep(pb.vec2(0), this.fov, this.hit2d),\r\n pb.sub(pb.vec2(1), pb.smoothStep(pb.sub(pb.vec2(1), this.fov), pb.vec2(1), this.hit2d))\r\n );\r\n this.$l.vignette = pb.mul(this.border.x, this.border.y);\r\n if (this.hit3d) {\r\n this.$l.distance = pb.distance(this.viewSpaceSurface, this.hit3d);\r\n this.$l.confidence = pb.sub(1, pb.smoothStep(0, this.thickness, this.distance));\r\n if (debugValidationOut) {\r\n this.debugValidation.z = this.confidence;\r\n }\r\n this.$return(pb.mul(this.vignette, this.confidence, this.confidence));\r\n } else {\r\n this.$return(this.vignette);\r\n }\r\n }\r\n );\r\n return hit3D\r\n ? debugValidationOut\r\n ? scope[funcName](\r\n hit2D,\r\n hit3D,\r\n thickness,\r\n surfaceZ,\r\n uv,\r\n traceRay,\r\n viewMatrix,\r\n invProjMatrix,\r\n textureSize,\r\n debugValidationOut\r\n )\r\n : scope[funcName](\r\n hit2D,\r\n hit3D,\r\n thickness,\r\n surfaceZ,\r\n uv,\r\n traceRay,\r\n viewMatrix,\r\n invProjMatrix,\r\n textureSize\r\n )\r\n : scope[funcName](hit2D, surfaceZ, uv, traceRay, viewMatrix, invProjMatrix, textureSize);\r\n}\r\n\r\n/**\r\n * Optional `giTraceOut` (both tracers): `vec3(occluded, escaped, rawConfidence)`.\r\n *\r\n * Reflections only care whether a hit is usable, so the returned confidence folds\r\n * together \"was the ray blocked\" and \"can its radiance be trusted\". Diffuse GI\r\n * needs those apart: a hit whose colour is unusable still occludes the sky.\r\n * - `occluded`: the march intersected geometry (not a sky texel).\r\n * - `escaped`: the march missed and the ray was provably unoccluded where it\r\n * stopped. Neither flag set means the outcome is indeterminate (ran out of\r\n * screen or iterations behind geometry) and callers should exclude the sample\r\n * rather than treat it as unoccluded.\r\n * - `certainty`: how certain the intersection is *geometrically* — the hit's\r\n * distance from the sampled surface relative to the thickness, so a thin-object\r\n * false positive does not occlude. Deliberately excludes the screen-border,\r\n * near-self and backface vetoes {@link validateHit} applies: those bound\r\n * reflection artifacts, whereas for diffuse GI a border, adjacent or\r\n * back-facing hit is real geometry whose screen colour is still the best\r\n * available estimate of its outgoing radiance. The march-length attenuation is\r\n * excluded too, as it would make occlusion depend on camera distance.\r\n *\r\n * Callers that omit the parameter generate exactly the same shader as before.\r\n */\r\nexport function screenSpaceRayTracing_Linear2D(\r\n scope: PBInsideFunctionScope,\r\n viewPos: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n projMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n cameraNearFar: PBShaderExp,\r\n maxDistance: PBShaderExp | number,\r\n maxIterations: PBShaderExp | number,\r\n thickness: PBShaderExp | number,\r\n stride: PBShaderExp | number,\r\n textureSize: PBShaderExp,\r\n linearDepthTex: PBShaderExp,\r\n normalTexture?: PBShaderExp,\r\n useBackfaceDepth?: boolean,\r\n giTraceOut?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('distanceSquared', [pb.vec2('a'), pb.vec2('b')], function () {\r\n this.$l.x = pb.sub(this.a, this.b);\r\n this.$return(pb.dot(this.x, this.x));\r\n });\r\n pb.func(\r\n 'rayIntersectDepth',\r\n [pb.float('zA'), pb.float('zB'), pb.float('thickness'), pb.vec2('uv'), pb.float('cameraFar')],\r\n function () {\r\n let thickness = this.thickness;\r\n if (useBackfaceDepth) {\r\n this.$l.sceneZ = ShaderHelper.sampleLinearDepthWithBackface(this, linearDepthTex, this.uv, 0);\r\n this.$l.sceneZMax01 = this.sceneZ.x;\r\n thickness = pb.max(this.thickness, pb.mul(pb.sub(this.sceneZ.y, this.sceneZ.x), this.cameraFar));\r\n } else {\r\n this.$l.sceneZMax01 = ShaderHelper.sampleLinearDepth(this, linearDepthTex, this.uv, 0);\r\n }\r\n this.sceneZMax = pb.neg(pb.mul(this.sceneZMax01, this.cameraFar));\r\n this.$return(\r\n pb.and(\r\n pb.lessThan(this.sceneZMax01, 1),\r\n pb.greaterThanEqual(this.zA, pb.sub(this.sceneZMax, thickness)),\r\n pb.lessThanEqual(this.zB, this.sceneZMax)\r\n )\r\n );\r\n }\r\n );\r\n pb.func(\r\n 'traceRayLinear2D',\r\n [\r\n pb.vec3('rayOrigin'),\r\n pb.vec3('rayDirection'),\r\n pb.float('stride'),\r\n pb.float('maxDistance'),\r\n pb.float('maxIterations'),\r\n pb.float('thickness'),\r\n pb.vec2('cameraNearFar'),\r\n pb.mat4('projMatrix'),\r\n pb.vec4('textureSize'),\r\n pb.vec3('hit2D').out(),\r\n pb.vec3('hit3D').out(),\r\n pb.vec2('origin').out(),\r\n pb.float('numIterations').out()\r\n ],\r\n function () {\r\n this.$l.rayLen = this.$choice(\r\n pb.greaterThan(\r\n pb.add(this.rayOrigin.z, pb.mul(this.rayDirection.z, this.maxDistance)),\r\n pb.neg(this.cameraNearFar.x)\r\n ),\r\n pb.div(pb.sub(pb.neg(this.cameraNearFar.x), this.rayOrigin.z), this.rayDirection.z),\r\n this.maxDistance\r\n );\r\n this.$l.rayEnd = pb.add(this.rayOrigin, pb.mul(this.rayDirection, this.rayLen));\r\n this.$l.zMin = pb.min(this.rayOrigin.z, this.rayEnd.z);\r\n this.$l.zMax = pb.max(this.rayOrigin.z, this.rayEnd.z);\r\n this.$l.rayOriginH = pb.mul(this.projMatrix, pb.vec4(this.rayOrigin, 1));\r\n this.$l.rayEndH = pb.mul(this.projMatrix, pb.vec4(this.rayEnd, 1));\r\n this.$l.k0 = pb.div(1, this.rayOriginH.w);\r\n this.$l.k1 = pb.div(1, this.rayEndH.w);\r\n this.$l.Q0 = pb.mul(this.rayOrigin, this.k0);\r\n this.$l.Q1 = pb.mul(this.rayEnd, this.k1);\r\n this.$l.rayOriginNDC = pb.mul(this.rayOriginH, this.k0);\r\n this.$l.rayEndNDC = pb.mul(this.rayEndH, this.k1);\r\n this.origin = pb.add(pb.mul(this.rayOriginNDC.xy, 0.5), pb.vec2(0.5));\r\n this.$l.P0 = pb.mul(this.origin, this.textureSize.zw);\r\n this.$l.P1 = pb.mul(pb.add(pb.mul(this.rayEndNDC.xy, 0.5), pb.vec2(0.5)), this.textureSize.zw);\r\n this.$l.xMin = 0.5;\r\n this.$l.xMax = pb.sub(this.textureSize.z, 0.5);\r\n this.$l.yMin = 0.5;\r\n this.$l.yMax = pb.sub(this.textureSize.w, 0.5);\r\n this.$l.t = pb.float();\r\n this.$if(pb.or(pb.greaterThan(this.P1.y, this.yMax), pb.lessThan(this.P1.y, this.yMin)), function () {\r\n this.t = pb.div(\r\n pb.sub(this.P1.y, this.$choice(pb.greaterThan(this.P1.y, this.yMax), this.yMax, this.yMin)),\r\n pb.sub(this.P1.y, this.P0.y)\r\n );\r\n });\r\n this.$if(pb.or(pb.greaterThan(this.P1.x, this.xMax), pb.lessThan(this.P1.x, this.xMin)), function () {\r\n this.t2 = pb.div(\r\n pb.sub(this.P1.x, this.$choice(pb.greaterThan(this.P1.x, this.xMax), this.xMax, this.xMin)),\r\n pb.sub(this.P1.x, this.P0.x)\r\n );\r\n this.t = pb.max(this.t, this.t2);\r\n });\r\n this.P1 = pb.mix(this.P1, this.P0, this.t);\r\n this.k1 = pb.mix(this.k1, this.k0, this.t);\r\n this.Q1 = pb.mix(this.Q1, this.Q0, this.t);\r\n this.P1 = this.$choice(\r\n pb.lessThan(this.distanceSquared(this.P0, this.P1), 0.0001),\r\n pb.add(this.P1, pb.vec2(0.01)),\r\n this.P1\r\n );\r\n this.$l.delta = pb.sub(this.P1, this.P0);\r\n this.$l.permute = false;\r\n this.$if(pb.lessThan(pb.abs(this.delta.x), pb.abs(this.delta.y)), function () {\r\n this.permute = true;\r\n this.delta = this.delta.yx;\r\n this.P0 = this.P0.yx;\r\n this.P1 = this.P1.yx;\r\n });\r\n this.$l.stepDir = pb.sign(this.delta.x);\r\n this.$l.invdx = pb.div(this.stepDir, this.delta.x);\r\n this.$l.dQ = pb.mul(pb.sub(this.Q1, this.Q0), this.invdx);\r\n this.$l.dK = pb.mul(pb.sub(this.k1, this.k0), this.invdx);\r\n this.$l.dP = pb.vec2(this.stepDir, pb.mul(this.delta.y, this.invdx));\r\n //this.$l.strideScalar = pb.sub(1, pb.min(1, pb.div(pb.neg(this.rayOrigin.z), this.strideZCutoff)));\r\n //this.$l.pixelStride = pb.add(1, pb.mul(this.strideScalar, this.stride));\r\n this.$l.pixelStride = this.stride;\r\n this.dP = pb.mul(this.dP, this.pixelStride);\r\n this.dQ = pb.mul(this.dQ, this.pixelStride);\r\n this.dK = pb.mul(this.dK, this.pixelStride);\r\n this.$l.jitter = pb.float(1); //dither(this, this.P0);\r\n this.P0 = pb.add(this.P0, pb.mul(this.dP, this.jitter));\r\n this.Q0 = pb.add(this.Q0, pb.mul(this.dQ, this.jitter));\r\n this.k0 = pb.add(this.k0, pb.mul(this.dK, this.jitter));\r\n this.$l.prevZMaxEstimate = this.rayOrigin.z;\r\n this.$l.zA = this.prevZMaxEstimate;\r\n this.$l.zB = this.prevZMaxEstimate;\r\n this.$l.pqk = pb.vec4(this.P0, this.Q0.z, this.k0);\r\n this.$l.dpqk = pb.vec4(this.dP, this.dQ.z, this.dK);\r\n this.$l.invRenderTargetSize = pb.div(pb.vec2(1), this.textureSize.zw);\r\n this.$l.intersected = false;\r\n this.$l.hitUV = pb.vec2();\r\n this.$l.hitZ = pb.float();\r\n this.numIterations = 0;\r\n this.skippedIterations = pb.min(this.maxIterations, 1);\r\n this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? 1000 : this.maxIterations, function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.maxIterations), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$if(pb.and(this.intersected, pb.greaterThanEqual(this.i, this.skippedIterations)), function () {\r\n this.$break();\r\n });\r\n this.numIterations = pb.add(this.numIterations, 1);\r\n this.pqk = pb.add(this.pqk, this.dpqk);\r\n this.zA = this.prevZMaxEstimate;\r\n this.zB = pb.div(\r\n pb.add(pb.mul(this.dpqk.z, 0.5), this.pqk.z),\r\n pb.add(pb.mul(this.dpqk.w, 0.5), this.pqk.w)\r\n );\r\n this.zB = pb.clamp(this.zB, this.zMin, this.zMax);\r\n this.prevZMaxEstimate = this.zB;\r\n this.hitZ = this.zB;\r\n this.$if(pb.greaterThan(this.zB, this.zA), function () {\r\n this.$l.t = this.zB;\r\n this.zB = this.zA;\r\n this.zA = this.t;\r\n });\r\n this.hitUV = this.$choice(this.permute, this.pqk.yx, this.pqk.xy);\r\n this.hitUV = pb.mul(this.hitUV, this.invRenderTargetSize);\r\n this.intersected = this.rayIntersectDepth(\r\n this.zA,\r\n this.zB,\r\n this.thickness,\r\n this.hitUV,\r\n this.cameraNearFar.y\r\n );\r\n });\r\n this.hit2D = pb.vec3(this.hitUV, this.hitZ);\r\n this.Q0 = pb.vec3(pb.add(this.Q0.xy, pb.mul(this.dQ.xy, this.numIterations)), this.pqk.z);\r\n this.hit3D = pb.div(this.Q0, this.pqk.w);\r\n this.$return(this.intersected);\r\n }\r\n );\r\n pb.func(\r\n giTraceOut ? 'SSR_Linear2D_GI' : 'SSR_Linear2D',\r\n [\r\n pb.vec3('rayOrigin'),\r\n pb.vec3('rayDirection'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('projMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.float('stride'),\r\n pb.float('maxDistance'),\r\n pb.float('maxIterations'),\r\n pb.float('thickness'),\r\n pb.vec2('cameraNearFar'),\r\n pb.vec4('textureSize'),\r\n ...(giTraceOut ? [pb.vec3('giTrace').out()] : [])\r\n ],\r\n function () {\r\n if (giTraceOut) {\r\n this.giTrace = pb.vec3(0);\r\n }\r\n this.$l.hit2D = pb.vec3();\r\n this.$l.hit3D = pb.vec3();\r\n this.$l.origin = pb.vec2();\r\n this.$l.numIterations = pb.float();\r\n this.$l.intersected = this.traceRayLinear2D(\r\n this.rayOrigin,\r\n this.rayDirection,\r\n this.stride,\r\n this.maxDistance,\r\n this.maxIterations,\r\n this.thickness,\r\n this.cameraNearFar,\r\n this.projMatrix,\r\n this.textureSize,\r\n this.hit2D,\r\n this.hit3D,\r\n this.origin,\r\n this.numIterations\r\n );\r\n if (giTraceOut) {\r\n // Depth where the march stopped. A miss only counts as a free escape\r\n // when the ray was still in front of the depth buffer there; a ray that\r\n // left the screen from behind geometry is indeterminate, not unoccluded.\r\n this.$l.exitSurfaceZ01 = ShaderHelper.sampleLinearDepth(this, linearDepthTex, this.hit2D.xy, 0);\r\n this.$if(pb.not(this.intersected), function () {\r\n this.$l.exitSceneZ = pb.neg(pb.mul(this.exitSurfaceZ01, this.cameraNearFar.y));\r\n this.giTrace = pb.vec3(\r\n 0,\r\n pb.float(\r\n pb.or(\r\n pb.greaterThanEqual(this.exitSurfaceZ01, 1),\r\n pb.greaterThan(this.hit2D.z, this.exitSceneZ)\r\n )\r\n ),\r\n 0\r\n );\r\n this.$return(pb.vec4(0));\r\n });\r\n } else {\r\n this.$if(pb.not(this.intersected), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n }\r\n this.$l.surfaceZ01 = giTraceOut\r\n ? this.exitSurfaceZ01\r\n : ShaderHelper.sampleLinearDepth(this, linearDepthTex, this.hit2D.xy, 0);\r\n this.$if(pb.equal(this.surfaceZ01, 1), function () {\r\n if (giTraceOut) {\r\n // The intersection resolved onto a sky texel, so the ray escaped.\r\n this.giTrace = pb.vec3(0, 1, 0);\r\n }\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.surfaceZ = ShaderHelper.linearDepthToNonLinear(\r\n this,\r\n pb.mul(this.surfaceZ01, this.cameraNearFar.y),\r\n this.cameraNearFar\r\n );\r\n this.$l.confidence = validateHit(\r\n this,\r\n this.hit2D.xy,\r\n null,\r\n this.surfaceZ,\r\n null,\r\n this.origin,\r\n this.rayDirection,\r\n this.viewMatrix,\r\n this.invProjMatrix,\r\n this.textureSize,\r\n normalTexture\r\n );\r\n if (giTraceOut) {\r\n // rayIntersectDepth already enforced the thickness window, so an\r\n // intersection here is geometrically certain regardless of the vetoes\r\n // validateHit applies for reflections.\r\n this.giTrace = pb.vec3(1, 0, 1);\r\n }\r\n this.$l.iterationAttenuation = pb.sub(1, pb.smoothStep(0, this.maxIterations, this.numIterations));\r\n //this.$l.iterationAttenuation = pb.smoothStep(this.maxIterations, 1, this.numIterations);\r\n this.confidence = pb.mul(this.confidence, this.iterationAttenuation);\r\n this.$l.hitPixel = pb.mul(this.hit2D.xy, this.textureSize.zw);\r\n this.$l.startPixel = pb.mul(this.origin.xy, this.textureSize.zw);\r\n this.$l.hitDistance = pb.length(pb.sub(this.hitPixel, this.startPixel));\r\n this.$return(pb.vec4(this.hit2D.xy, this.hitDistance, this.confidence));\r\n }\r\n );\r\n return giTraceOut\r\n ? scope.SSR_Linear2D_GI(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n stride,\r\n maxDistance,\r\n maxIterations,\r\n thickness,\r\n cameraNearFar,\r\n textureSize,\r\n giTraceOut\r\n )\r\n : scope.SSR_Linear2D(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n stride,\r\n maxDistance,\r\n maxIterations,\r\n thickness,\r\n cameraNearFar,\r\n textureSize\r\n );\r\n}\r\n\r\n/**\r\n * UE5 Random.ush InterleavedGradientNoise. Used as the temporal jitter\r\n * (StepOffset) for the fixed-step HZB march below.\r\n */\r\nexport function SSR_interleavedGradientNoise(\r\n scope: PBInsideFunctionScope,\r\n uv: PBShaderExp,\r\n frameId: PBShaderExp | number\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('SSR_IGN', [pb.vec2('uv'), pb.float('frameId')], function () {\r\n this.$l.p = pb.add(this.uv, pb.mul(pb.vec2(47, 17), 0.695, this.frameId));\r\n this.$return(pb.fract(pb.mul(52.9829189, pb.fract(pb.dot(this.p, pb.vec2(0.06711056, 0.00583715))))));\r\n });\r\n return scope.SSR_IGN(uv, frameId);\r\n}\r\n\r\n/**\r\n * Screen space ray intersection against the HZB, ported from UE5's\r\n * SSRTRayCast.ush (InitScreenSpaceRayFromWorldSpace + CastScreenSpaceRay):\r\n * a fixed-step linear march over the ray clipped/extended to the screen\r\n * border, sampling the furthest-depth pyramid at a mip level that grows with\r\n * roughness, with a slope-based CompareTolerance hit window and line-segment\r\n * hit refinement.\r\n *\r\n * Convention differences vs UE5:\r\n * - UE is reversed-Z (larger = closer); we use standard Z, so every depth\r\n * difference is mirrored (`Diff = SampleDepth - SampleZ`).\r\n * - UE view space has +z forward; ours has -z forward.\r\n * - UE's HZB is a half-res pow2 pyramid and starts marching at its mip 1;\r\n * ours is full-res at mip0. Under standard-Z the march starts at\r\n * START_MIP = 0, because the coarse furthest-depth blocks quantize into a\r\n * staircase that grazing rays periodically self-intersect, showing up as\r\n * regular stripes TAA cannot converge. Under reverse-Z depth precision is\r\n * nearly uniform, so the march starts at mip 1 like UE; rough reflections\r\n * still climb the pyramid via the roughness mip ramp in both cases.\r\n *\r\n * `maxIterations` is the number of linear samples along the ray (UE NumSteps,\r\n * typically 8..64), no longer the traversal iteration cap of the previous\r\n * FidelityFX-style implementation.\r\n */\r\nexport function screenSpaceRayTracing_HiZ(\r\n scope: PBInsideFunctionScope,\r\n viewPos: PBShaderExp,\r\n traceRay: PBShaderExp,\r\n viewMatrix: PBShaderExp,\r\n projMatrix: PBShaderExp,\r\n invProjMatrix: PBShaderExp,\r\n cameraNearFar: PBShaderExp,\r\n maxMipLevel: PBShaderExp | number,\r\n maxIterations: PBShaderExp | number,\r\n maxDistance: PBShaderExp | number,\r\n thickness: PBShaderExp | number,\r\n textureSize: PBShaderExp,\r\n HiZTexture: PBShaderExp,\r\n normalTexture?: PBShaderExp,\r\n giTraceOut?: PBShaderExp,\r\n roughness?: PBShaderExp | number,\r\n stepOffset?: PBShaderExp | number\r\n) {\r\n const pb = scope.$builder;\r\n // The r32f pyramid stores the furthest depth (max reduction; mip0 is the\r\n // raw depth). Matches UE5 marching against the FurthestHZBTexture (UE is\r\n // reversed-Z, so its furthest pyramid is the min reduction instead).\r\n pb.func('SSR_loadDepth', [pb.vec2('uv'), pb.float('level')], function () {\r\n this.$return(pb.textureSampleLevel(HiZTexture, this.uv, this.level).r);\r\n });\r\n pb.func('invProjectPosition', [pb.vec3('p'), pb.mat4('mat')], function () {\r\n this.$l.c = pb.vec3(\r\n pb.sub(pb.mul(this.p.xy, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, this.p.z)\r\n );\r\n this.$l.u = pb.mul(this.mat, pb.vec4(this.c, 1));\r\n this.u = pb.div(this.u, this.u.w);\r\n this.$return(this.u.xyz);\r\n });\r\n // Port of UE5 GetStepScreenFactorToClipAtScreenEdge. Returns the multiplier\r\n // for rayStepNDC so the ray ends exactly at the screen border. A factor\r\n // above 1 extends short rays to the border (UE bExtendRayToScreenBorder).\r\n pb.func('SSR_clipRayToScreenEdge', [pb.vec2('rayStartNDC'), pb.vec2('rayStepNDC')], function () {\r\n this.$l.rayStepInvFactor = pb.mul(0.5, pb.length(this.rayStepNDC));\r\n this.$l.absStep = pb.max(pb.abs(this.rayStepNDC), pb.vec2(1e-8));\r\n this.$l.s = pb.sub(\r\n pb.vec2(1),\r\n pb.div(\r\n pb.max(\r\n pb.sub(\r\n pb.abs(pb.add(this.rayStepNDC, pb.mul(this.rayStartNDC, this.rayStepInvFactor))),\r\n pb.vec2(this.rayStepInvFactor)\r\n ),\r\n pb.vec2(0)\r\n ),\r\n this.absStep\r\n )\r\n );\r\n this.$return(pb.div(pb.min(this.s.x, this.s.y), pb.max(this.rayStepInvFactor, 1e-8)));\r\n });\r\n // Port of UE5 InitScreenSpaceRayFromWorldSpace, in view space (-z forward).\r\n // Outputs the ray in \"texture space\": uv in [0,1], z = device depth in\r\n // [0,1], the same mapping the HZB stores.\r\n pb.func(\r\n 'SSR_initScreenSpaceRay',\r\n [\r\n pb.vec3('viewPos'),\r\n pb.vec3('rayDirection'),\r\n pb.float('maxDistance'),\r\n pb.float('slopeCompareToleranceScale'),\r\n pb.mat4('projMatrix'),\r\n pb.vec3('rayStartTS').out(),\r\n pb.vec3('rayStepTS').out(),\r\n pb.float('compareTolerance').out()\r\n ],\r\n function () {\r\n // Rays heading towards the camera stop before reaching 5% of the\r\n // surface view depth (UE: min(-0.95 * SceneDepth / ViewDirZ, TMax)).\r\n this.$l.rayLength = this.$choice(\r\n pb.greaterThan(this.rayDirection.z, 0),\r\n pb.min(this.maxDistance, pb.div(pb.mul(-0.95, this.viewPos.z), pb.max(this.rayDirection.z, 1e-6))),\r\n this.maxDistance\r\n );\r\n this.$l.rayEnd = pb.add(this.viewPos, pb.mul(this.rayDirection, this.rayLength));\r\n this.$l.startH = pb.mul(this.projMatrix, pb.vec4(this.viewPos, 1));\r\n this.$l.endH = pb.mul(this.projMatrix, pb.vec4(this.rayEnd, 1));\r\n this.$l.startNDC = pb.div(this.startH.xyz, this.startH.w);\r\n this.$l.endNDC = pb.div(this.endH.xyz, this.endH.w);\r\n this.$l.stepNDC = pb.sub(this.endNDC, this.startNDC);\r\n // Always extend/clip the ray to the screen border so NumSteps samples\r\n // cover the whole visible segment.\r\n this.stepNDC = pb.mul(this.stepNDC, this.SSR_clipRayToScreenEdge(this.startNDC.xy, this.stepNDC.xy));\r\n if (REVERSE_Z) {\r\n // Reverse ZO canonical clip space: NDC z is already the device depth.\r\n this.rayStartTS = pb.vec3(pb.add(pb.mul(this.startNDC.xy, 0.5), pb.vec2(0.5)), this.startNDC.z);\r\n this.rayStepTS = pb.vec3(pb.mul(this.stepNDC.xy, 0.5), this.stepNDC.z);\r\n } else {\r\n this.rayStartTS = pb.add(pb.mul(this.startNDC, 0.5), pb.vec3(0.5));\r\n this.rayStepTS = pb.mul(this.stepNDC, 0.5);\r\n }\r\n // Depth-only step (UE RayDepthScreen): project the point at rayLength\r\n // straight along the view forward axis for the slope tolerance.\r\n this.$l.depthH = pb.mul(\r\n this.projMatrix,\r\n pb.vec4(this.viewPos.xy, pb.sub(this.viewPos.z, this.rayLength), 1)\r\n );\r\n this.$l.depthTSz = REVERSE_Z\r\n ? pb.div(this.depthH.z, this.depthH.w)\r\n : pb.add(pb.mul(pb.div(this.depthH.z, this.depthH.w), 0.5), 0.5);\r\n // Under standard Z depth grows away from the camera, mirroring UE's\r\n // reversed-Z expression (RayStartScreen.z - RayDepthScreen.z); under\r\n // reverse-Z the UE orientation applies directly.\r\n this.compareTolerance = pb.max(\r\n pb.abs(this.rayStepTS.z),\r\n pb.mul(\r\n REVERSE_Z ? pb.sub(this.rayStartTS.z, this.depthTSz) : pb.sub(this.depthTSz, this.rayStartTS.z),\r\n this.slopeCompareToleranceScale\r\n )\r\n );\r\n }\r\n );\r\n // Port of UE5 CastScreenSpaceRay: NumSteps uniform samples in batches of 4,\r\n // mip level ramped by roughness, tolerance-window hit test, uncertainty\r\n // tracking and line-segment hit refinement.\r\n // Standard-Z keeps 0 instead of UE's StartMipLevel=1: coarse-mip depth\r\n // staircases combined with the poor far-depth resolution near 1.0 cause\r\n // grazing-angle stripe artifacts. Under reverse-Z depth precision is nearly\r\n // uniform along the ray, so the march starts at mip 1 like UE for better\r\n // texture cache behavior.\r\n const START_MIP = REVERSE_Z ? 1 : 0;\r\n pb.func(\r\n 'SSR_castScreenSpaceRay',\r\n [\r\n pb.vec3('rayStartTS'),\r\n pb.vec3('rayStepTS'),\r\n pb.float('compareToleranceIn'),\r\n pb.float('numSteps'),\r\n pb.float('stepOffset'),\r\n pb.float('roughness'),\r\n pb.float('maxMipLevel'),\r\n pb.vec3('hitUVz').out(),\r\n pb.bool('foundHit').out(),\r\n pb.bool('uncertain').out(),\r\n pb.float('numIterations').out()\r\n ],\r\n function () {\r\n this.$l.step = pb.div(1, this.numSteps);\r\n this.$l.compareTolerance = pb.mul(this.compareToleranceIn, this.step);\r\n this.$l.rayStepUVz = pb.mul(this.rayStepTS, this.step);\r\n this.$l.rayUVz = pb.add(this.rayStartTS, pb.mul(this.rayStepUVz, this.stepOffset));\r\n this.$l.level = pb.float(START_MIP);\r\n this.$l.mipInc = pb.mul(pb.div(8, this.numSteps), this.roughness);\r\n this.$l.lastDiff = pb.float(0);\r\n this.foundHit = false;\r\n this.uncertain = false;\r\n this.$l.marchBase = pb.float(0);\r\n // Depth diffs / hit flags of the current 4-sample batch, kept for the\r\n // post-loop hit refinement.\r\n this.$l.diff0 = pb.float(0);\r\n this.$l.diff1 = pb.float(0);\r\n this.$l.diff2 = pb.float(0);\r\n this.$l.diff3 = pb.float(0);\r\n this.$l.hit0 = pb.bool(false);\r\n this.$l.hit1 = pb.bool(false);\r\n this.$l.hit2 = pb.bool(false);\r\n this.$l.hit3 = pb.bool(false);\r\n this.$l.numBatches = pb.ceil(pb.mul(this.numSteps, 0.25));\r\n this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? 64 : this.numBatches, function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numBatches), function () {\r\n this.$break();\r\n });\r\n }\r\n this.marchBase = pb.mul(this.i, 4);\r\n // Two samples per mip step (UE: SamplesMip.xy = Level; Level += inc).\r\n this.$l.mip01 = pb.min(this.level, this.maxMipLevel);\r\n this.$l.mip23 = pb.min(pb.add(this.level, this.mipInc), this.maxMipLevel);\r\n this.level = pb.add(this.level, pb.mul(this.mipInc, 2));\r\n for (let j = 0; j < 4; j++) {\r\n this.$l[`sampleT${j}`] = pb.add(this.marchBase, j + 1);\r\n this.$l[`sampleUV${j}`] = pb.add(this.rayUVz.xy, pb.mul(this.rayStepUVz.xy, this[`sampleT${j}`]));\r\n this.$l[`sampleZ${j}`] = pb.add(this.rayUVz.z, pb.mul(this.rayStepUVz.z, this[`sampleT${j}`]));\r\n // Negative when the ray is behind the surface, hit window (-2T, 0).\r\n // Under reverse-Z this is UE's original `SamplesZ - SampleDepth`;\r\n // under standard Z the difference is mirrored.\r\n this[`diff${j}`] = REVERSE_Z\r\n ? pb.sub(\r\n this[`sampleZ${j}`],\r\n this.SSR_loadDepth(this[`sampleUV${j}`], j < 2 ? this.mip01 : this.mip23)\r\n )\r\n : pb.sub(\r\n this.SSR_loadDepth(this[`sampleUV${j}`], j < 2 ? this.mip01 : this.mip23),\r\n this[`sampleZ${j}`]\r\n );\r\n this[`hit${j}`] = pb.lessThan(\r\n pb.abs(pb.add(this[`diff${j}`], this.compareTolerance)),\r\n this.compareTolerance\r\n );\r\n this.foundHit = pb.or(this.foundHit, this[`hit${j}`]);\r\n // The ray went far behind geometry before any hit: its outcome\r\n // cannot be resolved from the depth buffer (UE bUncertain).\r\n this.uncertain = pb.or(\r\n this.uncertain,\r\n pb.and(\r\n pb.lessThan(pb.add(this[`diff${j}`], this.compareTolerance), pb.neg(this.compareTolerance)),\r\n pb.not(this.foundHit)\r\n )\r\n );\r\n }\r\n this.$if(this.foundHit, function () {\r\n this.$break();\r\n });\r\n this.lastDiff = this.diff3;\r\n });\r\n this.$if(this.foundHit, function () {\r\n // Locate the first hit sample of the batch, then refine with a line\r\n // segment intersection (UE: TimeLerp = saturate(D0 / (D0 - D1))).\r\n this.$l.depthDiff0 = this.diff2;\r\n this.$l.depthDiff1 = this.diff3;\r\n this.$l.time0 = pb.float(3);\r\n this.$if(this.hit2, function () {\r\n this.depthDiff0 = this.diff1;\r\n this.depthDiff1 = this.diff2;\r\n this.time0 = 2;\r\n });\r\n this.$if(this.hit1, function () {\r\n this.depthDiff0 = this.diff0;\r\n this.depthDiff1 = this.diff1;\r\n this.time0 = 1;\r\n });\r\n this.$if(this.hit0, function () {\r\n this.depthDiff0 = this.lastDiff;\r\n this.depthDiff1 = this.diff0;\r\n this.time0 = 0;\r\n });\r\n this.time0 = pb.add(this.time0, this.marchBase);\r\n this.$l.denom = pb.sub(this.depthDiff0, this.depthDiff1);\r\n this.$l.timeLerp = this.$choice(\r\n pb.greaterThan(pb.abs(this.denom), 1e-20),\r\n pb.clamp(pb.div(this.depthDiff0, this.denom), 0, 1),\r\n pb.float(0.5)\r\n );\r\n this.$l.intersectTime = pb.add(this.time0, this.timeLerp);\r\n this.hitUVz = pb.add(this.rayUVz, pb.mul(this.rayStepUVz, this.intersectTime));\r\n this.numIterations = this.intersectTime;\r\n }).$else(function () {\r\n // No certain intersection - the march covered the whole clipped ray.\r\n this.hitUVz = pb.add(this.rayUVz, pb.mul(this.rayStepUVz, this.numSteps));\r\n this.numIterations = this.numSteps;\r\n });\r\n }\r\n );\r\n pb.func(\r\n giTraceOut ? 'SSR_HiZ_GI' : 'SSR_HiZ',\r\n [\r\n pb.vec3('viewPos'),\r\n pb.vec3('traceRay'),\r\n pb.mat4('viewMatrix'),\r\n pb.mat4('projMatrix'),\r\n pb.mat4('invProjMatrix'),\r\n pb.vec2('cameraNearFar'),\r\n pb.float('maxDistance'),\r\n pb.float('thickness'),\r\n pb.vec4('textureSize'),\r\n pb.int('maxMipLevel'),\r\n pb.float('maxIterations'),\r\n pb.float('roughness'),\r\n pb.float('stepOffset'),\r\n ...(giTraceOut ? [pb.vec3('giTrace').out()] : [])\r\n ],\r\n function () {\r\n if (giTraceOut) {\r\n this.giTrace = pb.vec3(0);\r\n }\r\n this.$l.rayDirection = pb.normalize(this.traceRay);\r\n this.$l.rayStartTS = pb.vec3();\r\n this.$l.rayStepTS = pb.vec3();\r\n this.$l.compareTolerance = pb.float();\r\n // UE uses SlopeCompareToleranceScale 4 for SSR and 2 for SSGI.\r\n this.SSR_initScreenSpaceRay(\r\n this.viewPos,\r\n this.rayDirection,\r\n this.maxDistance,\r\n pb.float(giTraceOut ? 2 : 4),\r\n this.projMatrix,\r\n this.rayStartTS,\r\n this.rayStepTS,\r\n this.compareTolerance\r\n );\r\n this.$l.hitUVz = pb.vec3();\r\n this.$l.foundHit = pb.bool();\r\n this.$l.uncertain = pb.bool();\r\n this.$l.numIterations = pb.float();\r\n this.SSR_castScreenSpaceRay(\r\n this.rayStartTS,\r\n this.rayStepTS,\r\n this.compareTolerance,\r\n pb.max(this.maxIterations, 4),\r\n this.stepOffset,\r\n this.roughness,\r\n pb.float(this.maxMipLevel),\r\n this.hitUVz,\r\n this.foundHit,\r\n this.uncertain,\r\n this.numIterations\r\n );\r\n this.$l.confidence = pb.float(0);\r\n const hitBranch = this.$if(this.foundHit, function () {\r\n this.$l.surfaceZ = this.SSR_loadDepth(this.hitUVz.xy, 0);\r\n this.$if(ShaderHelper.isFarthestDepth(this, this.surfaceZ), function () {\r\n if (giTraceOut) {\r\n // The intersection resolved onto a sky texel, so the ray escaped.\r\n this.giTrace = pb.vec3(0, 1, 0);\r\n }\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.hit3D = invProjectPosition(this, this.hitUVz, this.invProjMatrix);\r\n this.confidence = validateHit(\r\n this,\r\n this.hitUVz.xy,\r\n this.hit3D,\r\n this.surfaceZ,\r\n this.thickness,\r\n this.rayStartTS.xy,\r\n this.rayDirection,\r\n this.viewMatrix,\r\n this.invProjMatrix,\r\n this.textureSize,\r\n normalTexture\r\n );\r\n if (giTraceOut) {\r\n // Keep only the thickness term of validateHit: a hit far from the\r\n // sampled surface may be a thin-object false positive, which is a\r\n // genuine geometric doubt. The border, near-self and backface vetoes\r\n // bound reflection artifacts and must not gate diffuse occlusion.\r\n this.$l.giSurfaceVS = invProjectPosition(\r\n this,\r\n pb.vec3(this.hitUVz.xy, this.surfaceZ),\r\n this.invProjMatrix\r\n );\r\n this.$l.giThicknessFade = pb.sub(\r\n 1,\r\n pb.smoothStep(0, this.thickness, pb.distance(this.giSurfaceVS, this.hit3D))\r\n );\r\n this.giTrace = pb.vec3(1, 0, pb.mul(this.giThicknessFade, this.giThicknessFade));\r\n }\r\n });\r\n if (giTraceOut) {\r\n hitBranch.$else(function () {\r\n // The ray is always extended to the screen border, so a march that\r\n // finished without ever going behind geometry is a proven escape.\r\n // An uncertain march (went far behind geometry before any hit) is\r\n // indeterminate, not unoccluded (UE bUncertain semantics).\r\n this.giTrace = pb.vec3(0, pb.float(pb.not(this.uncertain)), 0);\r\n });\r\n }\r\n this.$l.iterationAttenuation = pb.sub(1, pb.smoothStep(0, this.maxIterations, this.numIterations));\r\n this.confidence = pb.mul(this.confidence, this.iterationAttenuation);\r\n this.$l.hitPixel = pb.mul(this.hitUVz.xy, this.textureSize.zw);\r\n this.$l.startPixel = pb.mul(this.rayStartTS.xy, this.textureSize.zw);\r\n this.$l.hitDistance = pb.length(pb.sub(this.hitPixel, this.startPixel));\r\n this.$return(pb.vec4(this.hitUVz.xy, this.hitDistance, this.confidence));\r\n }\r\n );\r\n const roughnessArg = roughness ?? 0;\r\n const stepOffsetArg = stepOffset ?? 0.5;\r\n return (\r\n giTraceOut\r\n ? scope.SSR_HiZ_GI(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n cameraNearFar,\r\n maxDistance,\r\n thickness,\r\n textureSize,\r\n pb.sub(maxMipLevel, 1),\r\n maxIterations,\r\n roughnessArg,\r\n stepOffsetArg,\r\n giTraceOut\r\n )\r\n : scope.SSR_HiZ(\r\n viewPos,\r\n traceRay,\r\n viewMatrix,\r\n projMatrix,\r\n invProjMatrix,\r\n cameraNearFar,\r\n maxDistance,\r\n thickness,\r\n textureSize,\r\n pb.sub(maxMipLevel, 1),\r\n maxIterations,\r\n roughnessArg,\r\n stepOffsetArg\r\n )\r\n ) as PBShaderExp;\r\n}\r\n\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n\treturn floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n\treturn input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n\tfloat2 cell_size = 1.0 / cell_count;\r\n\tfloat2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n\tfloat2 solutions = (planes - pos)/dir.xy;\r\n\tfloat3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n\tintersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n\treturn intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n\treturn (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n\treturn input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n\tfloat level = HIZ_START_LEVEL;\r\n\tfloat3 v_z = v/v.z;\r\n\tfloat2 hi_z_size = cell_count(level);\r\n\tfloat3 ray = p;\r\n\r\n\tfloat2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n\tfloat2 cross_offset = cross_step * 0.00001;\r\n\tcross_step = saturate(cross_step);\r\n\r\n\tfloat2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n\tray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n\titerations = 0;\r\n\twhile(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n\t\t// get the cell number of the current ray\r\n\t\tfloat2 current_cell_count = cell_count(level);\r\n\t\tfloat2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n\t\t// get the minimum depth plane in which the current ray resides\r\n\t\tfloat min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n\t\t// intersect only if ray depth is below the minimum depth plane\r\n\t\tfloat3 tmp_ray = ray;\r\n\t\tif(v.z > 0) {\r\n\t\t\tfloat min_minus_ray = min_z - ray.z;\r\n\t\t\ttmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n\t\t\tfloat2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n\t\t\tif(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n\t\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\t\tlevel = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n\t\t\t}else{\r\n\t\t\t\tif(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n\t\t\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\t\t\tlevel = 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if(ray.z < min_z) {\r\n\t\t\ttmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n\t\t\tlevel = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n\t\t}\r\n\r\n\t\tray.xyz = tmp_ray.xyz;\r\n\t\t--level;\r\n\r\n\t\t++iterations;\r\n\t}\r\n\treturn ray;\r\n}\r\n*/\r\n"],"names":["SSR_calcJitter","scope","viewPos","roughness","pb","$builder","func","vec3","float","$l","h","fract","mul","add","dot","yxz","xxy","yxx","zyx","sub","$return","mix","invProjectPosition","pos","mat","mat4","c","p","xy","vec2","ShaderHelper","deviceDepthToClipZ","z","u","vec4","div","w","xyz","validateHit","hit2D","hit3D","surfaceZ","thickness","uv","traceRay","viewMatrix","invProjMatrix","textureSize","normalTexture","debugValidationOut","funcName","out","debugValidation","$if","or","any","lessThan","hit2d","greaterThan","manhattanDist","abs","all","x","hitNormalWS","textureSampleLevel","rgb","hitNormalVS","viewSpaceRayDirection","y","viewSpaceSurface","fov","border","smoothStep","vignette","hit3d","distance","confidence","screenSpaceRayTracing_Linear2D","projMatrix","cameraNearFar","maxDistance","maxIterations","stride","linearDepthTex","useBackfaceDepth","giTraceOut","a","b","sceneZ","sampleLinearDepthWithBackface","sceneZMax01","max","cameraFar","sampleLinearDepth","sceneZMax","neg","and","greaterThanEqual","zA","lessThanEqual","zB","rayLen","$choice","rayOrigin","rayDirection","rayEnd","zMin","min","zMax","rayOriginH","rayEndH","k0","k1","Q0","Q1","rayOriginNDC","rayEndNDC","origin","P0","zw","P1","xMin","xMax","yMin","yMax","t","t2","distanceSquared","delta","permute","yx","stepDir","sign","invdx","dQ","dK","dP","pixelStride","jitter","prevZMaxEstimate","pqk","dpqk","invRenderTargetSize","intersected","hitUV","hitZ","numIterations","skippedIterations","$for","getDevice","type","i","$break","clamp","rayIntersectDepth","giTrace","traceRayLinear2D","exitSurfaceZ01","not","exitSceneZ","surfaceZ01","equal","linearDepthToNonLinear","iterationAttenuation","hitPixel","startPixel","hitDistance","length","SSR_Linear2D_GI","SSR_Linear2D","SSR_interleavedGradientNoise","frameId","SSR_IGN","screenSpaceRayTracing_HiZ","maxMipLevel","HiZTexture","stepOffset","level","r","rayStepInvFactor","rayStepNDC","absStep","s","rayStartNDC","rayLength","startH","endH","startNDC","endNDC","stepNDC","SSR_clipRayToScreenEdge","REVERSE_Z","rayStartTS","rayStepTS","depthH","depthTSz","compareTolerance","slopeCompareToleranceScale","START_MIP","bool","step","numSteps","compareToleranceIn","rayStepUVz","rayUVz","mipInc","lastDiff","foundHit","uncertain","marchBase","diff0","diff1","diff2","diff3","hit0","hit1","hit2","hit3","numBatches","ceil","mip01","mip23","j","SSR_loadDepth","depthDiff0","depthDiff1","time0","denom","timeLerp","intersectTime","hitUVz","$else","int","normalize","SSR_initScreenSpaceRay","SSR_castScreenSpaceRay","hitBranch","isFarthestDepth","giSurfaceVS","giThicknessFade","roughnessArg","stepOffsetArg","SSR_HiZ_GI","SSR_HiZ"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
+ import { REVERSE_Z, Vector4 } from '@zephyr3d/base';
1
2
  import { ShadowImpl } from './shadow_impl.js';
2
- import { Vector4 } from '@zephyr3d/base';
3
3
  import '../render/primitive.js';
4
4
  import { decodeNormalizedFloatFromRGBA, encodeNormalizedFloatToRGBA } from '../shaders/misc.js';
5
5
  import { getDevice } from '../app/api.js';
6
6
  import { GaussianBlurBlitter } from '../blitter/gaussianblur.js';
7
- import { computeShadowMapDepth, filterShadowESM } from '../shaders/shadow.js';
7
+ import { isDeviceDepthShadow, computeShadowMapDepth, ndcToShadowCoord, shadowCoordDepthInRange, filterShadowESM } from '../shaders/shadow.js';
8
8
  import { LIGHT_TYPE_POINT } from '../values.js';
9
9
  import { ShaderHelper } from '../material/shader/helper.js';
10
10
  import { computeShadowBiasCSM, computeShadowBias } from './shader.js';
@@ -193,7 +193,10 @@ class BlurBlitter extends GaussianBlurBlitter {
193
193
  }
194
194
  getShadowMapClearColor(shadowMapParams) {
195
195
  const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];
196
- return colorAttachment ? colorAttachment.format === 'rgba8unorm' ? new Vector4(0, 0, 0, 1) : new Vector4(1, 0, 0, 1) : null;
196
+ // Empty texels must read as "farthest": under reverse-Z that is 0 for
197
+ // device-encoded directional/rect maps, 1 for linear point/spot maps.
198
+ const farthest = REVERSE_Z && isDeviceDepthShadow(shadowMapParams.lightType) ? 0 : 1;
199
+ return colorAttachment ? colorAttachment.format === 'rgba8unorm' ? new Vector4(0, 0, 0, 1) : new Vector4(farthest, 0, 0, 1) : null;
197
200
  }
198
201
  getShadowMap(shadowMapParams) {
199
202
  const implData = shadowMapParams.implData;
@@ -268,7 +271,9 @@ class BlurBlitter extends GaussianBlurBlitter {
268
271
  getShaderHash() {
269
272
  return `${this._blur ? 1 : 0}${this._logSpace ? 1 : 0}`;
270
273
  }
271
- getParams() {}
274
+ getParams(out) {
275
+ return out ?? Vector4.zero();
276
+ }
272
277
  getShadowMapColorFormat(_shadowMapParams) {
273
278
  const device = getDevice();
274
279
  return device.getDeviceCaps().textureCaps.supportFloatColorBuffer && device.getDeviceCaps().textureCaps.supportLinearFloatTexture ? device.type === 'webgl' ? 'rgba32f' : 'rg32f' : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer && device.getDeviceCaps().textureCaps.supportLinearHalfFloatTexture ? device.type === 'webgl' ? 'rgba16f' : 'rg16f' : 'rgba8unorm';
@@ -291,8 +296,8 @@ class BlurBlitter extends GaussianBlurBlitter {
291
296
  pb.int('split')
292
297
  ], function() {
293
298
  this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
294
- this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);
295
- this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), pb.lessThanEqual(this.shadowCoord.z, 1)));
299
+ this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
300
+ this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), shadowCoordDepthInRange(this, this.shadowCoord.z)));
296
301
  this.$l.shadow = pb.float(1);
297
302
  this.$if(this.inShadow, function() {
298
303
  this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);
@@ -317,8 +322,8 @@ class BlurBlitter extends GaussianBlurBlitter {
317
322
  this.$return(filterShadowESM(this, LIGHT_TYPE_POINT, shadowMapParams.shadowMap.format, logSpace, this.dir, undefined, this.shadowBias));
318
323
  } else {
319
324
  this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
320
- this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);
321
- this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), pb.lessThanEqual(this.shadowCoord.z, 1)));
325
+ this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
326
+ this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), shadowCoordDepthInRange(this, this.shadowCoord.z)));
322
327
  this.$l.shadow = pb.float(1);
323
328
  this.$if(this.inShadow, function() {
324
329
  this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.shadowCoord.z, this.NdotL, false);