@zephyr3d/scene 0.9.27 → 0.10.0

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 (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. 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\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
+ {"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.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, this.maxIterations, function () {\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 * 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\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 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 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 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 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 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: project the point at rayLength 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 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 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, this.numBatches, function () {\r\n this.marchBase = pb.mul(this.i, 4);\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 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 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 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 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 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 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 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 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"],"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","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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"}
@@ -112,7 +112,6 @@ const FLT_MAX = 32767;
112
112
  pb.func('clipHistoryColor', [
113
113
  pb.vec2('uv'),
114
114
  pb.vec3('historyColor'),
115
- pb.vec2('closestVelocity'),
116
115
  pb.vec2('texSize')
117
116
  ], function() {
118
117
  let n = 1;
@@ -134,11 +133,7 @@ const FLT_MAX = 32767;
134
133
  }
135
134
  this.colorAvg = pb.div(this.colorAvg, n - 1);
136
135
  this.colorAvg2 = pb.div(this.colorAvg2, n - 1);
137
- // Keep a non-zero floor: collapsing the box to the 3x3 mean while moving
138
- // discards all sub-pixel detail and turns the output into a box-filtered
139
- // jittered frame, which shimmers with the jitter phase.
140
- this.$l.boxSize = pb.mix(2.5, 0.75, pb.smoothStep(0, 0.02, pb.length(this.closestVelocity)));
141
- this.$l.dev = pb.mul(pb.sqrt(pb.abs(pb.sub(this.colorAvg2, pb.mul(this.colorAvg, this.colorAvg)))), this.boxSize);
136
+ this.$l.dev = pb.mul(pb.sqrt(pb.abs(pb.sub(this.colorAvg2, pb.mul(this.colorAvg, this.colorAvg)))), 1.25);
142
137
  this.$l.colorMin = pb.sub(this.colorAvg, this.dev);
143
138
  this.$l.colorMax = pb.add(this.colorAvg, this.dev);
144
139
  this.$l.color = this.clipAABB(this.colorMin, this.colorMax, pb.clamp(this.colorAvg, this.colorMin, this.colorMax), this.historyColor);
@@ -175,16 +170,37 @@ const FLT_MAX = 32767;
175
170
  this.texPos3 = pb.div(this.texPos3, this.texSize);
176
171
  this.texPos12 = pb.div(this.texPos12, this.texSize);
177
172
  this.$l.result = pb.vec3(0);
178
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos0, 0).rgb, this.w0.x, this.w0.y));
179
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos0.y), 0).rgb, this.w12.x, this.w0.y));
180
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos0.y), 0).rgb, this.w3.x, this.w0.y));
181
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos12.y), 0).rgb, this.w0.x, this.w12.y));
182
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos12, 0).rgb, this.w12.x, this.w12.y));
183
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos12.y), 0).rgb, this.w3.x, this.w12.y));
184
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos3.y), 0).rgb, this.w0.x, this.w3.y));
185
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos3.y), 0).rgb, this.w12.x, this.w3.y));
186
- this.result = pb.add(this.result, pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos3, 0).rgb, this.w3.x, this.w3.y));
187
- this.$return(pb.max(this.result, pb.vec3(0)));
173
+ this.$l.tapMin = pb.vec3(1e30);
174
+ this.$l.tapMax = pb.vec3(-1e30);
175
+ const rows = [
176
+ [
177
+ 'texPos0',
178
+ 'w0'
179
+ ],
180
+ [
181
+ 'texPos12',
182
+ 'w12'
183
+ ],
184
+ [
185
+ 'texPos3',
186
+ 'w3'
187
+ ]
188
+ ];
189
+ for (const [py, wy] of rows){
190
+ for (const [px, wx] of rows){
191
+ this.$l.tap = pb.textureSampleLevel(historyColorTex, pb.vec2(this[px].x, this[py].y), 0).rgb;
192
+ this.result = pb.add(this.result, pb.mul(this.tap, this[wx].x, this[wy].y));
193
+ this.tapMin = pb.min(this.tapMin, this.tap);
194
+ this.tapMax = pb.max(this.tapMax, this.tap);
195
+ }
196
+ }
197
+ // Anti-ringing: Catmull-Rom's negative lobes scale with the contrast they straddle. Beside a
198
+ // texel at the sky's output clamp (the sun disk, ~32256) a lobe of -0.07 subtracts thousands
199
+ // from a sky pixel near 1; the result is floored to black, the clip box of a pixel whose
200
+ // neighbourhood mixes disk and sky reaches below zero and keeps it, and the low blend weight a
201
+ // large current/history difference gets holds it there -- dark specks around the disk while the
202
+ // camera moves. Bounding the filter by the texels it read keeps it from inventing values.
203
+ this.$return(pb.clamp(this.result, pb.max(this.tapMin, pb.vec3(0)), this.tapMax));
188
204
  });
189
205
  pb.func('temporalResolve', [
190
206
  pb.vec2('screenUV'),
@@ -207,23 +223,18 @@ const FLT_MAX = 32767;
207
223
  // Tonemap, then clip -- not the other way round. The neighbourhood box is
208
224
  // built in Reinhard space, so the history has to be in it as well; the
209
225
  // resolve stays there until the final reinhardInv below.
210
- this.prevColor = this.clipHistoryColor(this.screenUV, this.reinhard(this.historyColor), this.velocityClosest.xy, this.texSize);
226
+ this.prevColor = this.clipHistoryColor(this.screenUV, this.reinhard(this.historyColor), this.texSize);
211
227
  this.$l.screenFactor = this.$choice(pb.or(pb.any(pb.lessThan(this.reprojectedUV, pb.vec2(0))), pb.any(pb.greaterThan(this.reprojectedUV, pb.vec2(1)))), pb.float(1), pb.float(0));
212
228
  this.$l.disocclusionFactor = this.getDisocclusionFactor(this.reprojectedUV, this.velocityClosest.xy, this.texSize);
213
- this.$l.alpha = pb.clamp(pb.add(this.blendFactor, this.screenFactor, this.disocclusionFactor), 0, 1);
214
- //this.alpha = 0.1;
215
229
  // prevColor is already tonemapped (and clipped in that space) above.
216
230
  this.currentColor = this.reinhard(this.sampleColor);
217
231
  this.$l.currentLum = this.luminance(this.currentColor);
218
232
  this.$l.prevLum = this.luminance(this.prevColor);
219
- // Luminance is in Reinhard space (always < 1), so a 1.001 floor makes the
220
- // denominator constant and the ratio degenerates to an absolute difference,
221
- // leaving dark-area flicker almost undamped. Use a smaller floor so the
222
- // difference stays relative.
223
- this.$l.diff = pb.div(pb.abs(pb.sub(this.currentLum, this.prevLum)), pb.max(this.currentLum, pb.max(this.prevLum, 0.2)));
224
- this.diff = pb.sub(1, this.diff);
225
- this.diff = pb.mul(this.diff, this.diff);
226
- this.alpha = pb.clamp(pb.mix(0, this.alpha, this.diff), 0.05, 1);
233
+ this.$l.velocityPixels = pb.length(pb.mul(this.velocityClosest.xy, this.texSize));
234
+ this.$l.alpha = pb.max(this.blendFactor, pb.mix(this.blendFactor, 0.2, pb.clamp(pb.div(this.velocityPixels, 20), 0, 1)));
235
+ this.alpha = pb.max(this.alpha, pb.clamp(pb.div(pb.mul(this.prevLum, 0.01), pb.max(pb.abs(pb.sub(this.currentLum, this.prevLum)), 1e-6)), 0, 1));
236
+ // Pixels whose motion vectors carry no strength (the sky) keep a 5% floor
237
+ this.alpha = pb.clamp(pb.add(pb.max(this.alpha, 0.05), this.screenFactor, this.disocclusionFactor), 0, 1);
227
238
  this.$l.resolvedColor = pb.vec3();
228
239
  if (debug === TAA_DEBUG_CURRENT_COLOR) {
229
240
  this.resolvedColor = this.currentColor.rgb;