@zephyr3d/scene 0.9.26 → 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 (506) 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 +146 -30
  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 +300 -56
  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 +177 -3
  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 +178 -200
  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 +30475 -19865
  109. package/dist/index.js +67 -12
  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/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postsss.js","sources":["../../src/posteffect/postsss.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { ShaderHelper } from '../material';\r\nimport { SSSProfile } from '../material/sssprofile';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { hash21 } from '../shaders/noise';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\n\r\n/**\r\n * Intermediate quantity to visualize instead of the shaded result.\r\n *\r\n * @remarks\r\n * `'none'` renders normally. The rest replace the output with one term of the\r\n * diffusion, which is how an input problem is told apart from a kernel problem.\r\n *\r\n * @public\r\n */\r\nexport type SSSDebugOutput =\r\n | 'none'\r\n /** Scatterable energy recovered from SceneColor and its diffuse-luminance alpha. */\r\n | 'diffusible'\r\n /** Fraction of the pixel treated as diffuse, from `SceneColor.a / luma`. */\r\n | 'diffuseAmount'\r\n /** Per-pixel profile id, as written by the material. */\r\n | 'profileId'\r\n /** World normal carried in the skin mask buffer. */\r\n | 'normal'\r\n /** Per-channel diffusion distance `d`, scaled for display. */\r\n | 'diffusionDistance'\r\n /** Median sample radius, in pixels. */\r\n | 'sampleRadius'\r\n /** Accumulated kernel weight, before normalization. */\r\n | 'weight'\r\n /** Fraction of taps that landed on skin. */\r\n | 'acceptance'\r\n /** CDF mass attributed to the centre pixel. */\r\n | 'centerWeight'\r\n /** The diffused result on its own, before recombination. */\r\n | 'diffused'\r\n /** Light-space thickness from the transmission pass, for the lights in layer 0. */\r\n | 'thickness';\r\n\r\nconst SKIN_SSS_DEBUG_OUTPUTS: SSSDebugOutput[] = [\r\n 'none',\r\n 'diffusible',\r\n 'diffuseAmount',\r\n 'profileId',\r\n 'normal',\r\n 'diffusionDistance',\r\n 'sampleRadius',\r\n 'weight',\r\n 'acceptance',\r\n 'centerWeight',\r\n 'diffused',\r\n 'thickness'\r\n];\r\n\r\n/** Radial-disc sample count. */\r\nconst DEFAULT_SAMPLE_COUNT = 64;\r\n\r\n/**\r\n * Screen-space skin scattering.\r\n *\r\n * WebGPU only.\r\n *\r\n * @public\r\n */\r\nexport class PostSSS extends AbstractPostEffect {\r\n private static _burleyProgram: GPUProgram | null = null;\r\n private static _bvarProgram: GPUProgram | null = null;\r\n private static _recombineProgram: GPUProgram | null = null;\r\n private _burleyBindGroup: BindGroup | null;\r\n private _bvarBindGroup: BindGroup | null;\r\n private _recombineBindGroup: BindGroup | null;\r\n private _profile: SSSProfile | null;\r\n private _debugOutput: SSSDebugOutput;\r\n private _debugExposure: number;\r\n private _sampleCount: number;\r\n private readonly _projScale: Vector2;\r\n private readonly _profileParams: Vector4;\r\n private readonly _targetSize: Vector4;\r\n private readonly _cameraNearFar: Vector2;\r\n\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.opaque;\r\n this._burleyBindGroup = null;\r\n this._bvarBindGroup = null;\r\n this._recombineBindGroup = null;\r\n this._profile = null;\r\n this._debugOutput = 'none';\r\n this._debugExposure = 1;\r\n this._sampleCount = DEFAULT_SAMPLE_COUNT;\r\n this._projScale = new Vector2();\r\n this._profileParams = new Vector4();\r\n this._targetSize = new Vector4();\r\n this._cameraNearFar = new Vector2();\r\n }\r\n\r\n /**\r\n * Fallback profile for pixels whose id is not in the table.\r\n *\r\n * @remarks\r\n * Scattering parameters normally come from the per-pixel profile id the skin\r\n * material writes, so this only applies when that lookup misses.\r\n *\r\n * @public\r\n */\r\n get profile(): SSSProfile | null {\r\n return this._profile;\r\n }\r\n set profile(val: SSSProfile | null) {\r\n this._profile = val ?? null;\r\n }\r\n get sampleCount() {\r\n return this._sampleCount;\r\n }\r\n set sampleCount(val) {\r\n this._sampleCount = Math.max(8, Math.min(64, Math.round(val ?? DEFAULT_SAMPLE_COUNT)));\r\n }\r\n\r\n /**\r\n * Multiplier applied to whatever {@link PostSSS.debugOutput} renders.\r\n *\r\n * @remarks\r\n * Defaults to 1. Several intermediates sit in a narrow band that reads as a\r\n * flat tone at unit exposure, so raising this is how \"no variation\" is told\r\n * apart from \"variation too small to see\". No effect unless a debug output is\r\n * selected.\r\n *\r\n * @public\r\n */\r\n get debugExposure() {\r\n return this._debugExposure;\r\n }\r\n set debugExposure(val: number) {\r\n this._debugExposure = Math.max(0, val ?? 1);\r\n }\r\n\r\n /**\r\n * Intermediate quantity to render instead of the shaded result.\r\n *\r\n * @remarks\r\n * Defaults to `'none'`. See {@link SSSDebugOutput}.\r\n *\r\n * @public\r\n */\r\n get debugOutput(): SSSDebugOutput {\r\n return this._debugOutput;\r\n }\r\n set debugOutput(val: SSSDebugOutput) {\r\n this._debugOutput = SKIN_SSS_DEBUG_OUTPUTS.includes(val) ? val : 'none';\r\n }\r\n\r\n requireLinearDepthTexture() {\r\n return true;\r\n }\r\n\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n if (ctx.SSSMaskTexture && ctx.SSSProfileIdTexture && ctx.device.type !== 'webgpu') {\r\n warnUnsupported(\r\n 'Screen-space subsurface diffusion (SSSMaterial)',\r\n 'WebGPU',\r\n 'skin is lit without diffusion, transmission still applies'\r\n );\r\n }\r\n if (!ctx.SSSMaskTexture || !ctx.SSSProfileIdTexture || ctx.device.type !== 'webgpu') {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n return;\r\n }\r\n const device = ctx.device;\r\n const outputFramebuffer = device.getFramebuffer();\r\n const maskTex = ctx.SSSMaskTexture;\r\n const profileIdTex = ctx.SSSProfileIdTexture;\r\n const width = inputColorTexture.width;\r\n const height = inputColorTexture.height;\r\n\r\n const scatterFormat = ctx.colorFormat;\r\n const profileTable = SSSProfile.getTable(device);\r\n if (!profileTable) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n return;\r\n }\r\n const fallback = this._profile ?? SSSProfile.getDefault();\r\n const projMatrix = ctx.camera.getProjectionMatrix();\r\n this._projScale.setXY(\r\n // x: world length at unit depth, in horizontal UV\r\n 0.5 * projMatrix.m00,\r\n // y: world length at unit depth, in vertical UV\r\n 0.5 * projMatrix.m11\r\n );\r\n // Row of the fallback profile, used when a pixel's id is missing.\r\n this._profileParams.setXYZW(\r\n fallback.encodedId,\r\n 1 / SSSProfile.tableColumns,\r\n 1 / SSSProfile.tableRows,\r\n SSSProfile.tableRows\r\n );\r\n this._targetSize.setXYZW(width, height, 1 / width, 1 / height);\r\n this._cameraNearFar.setXY(ctx.camera.getNearPlane(), ctx.camera.getFarPlane());\r\n\r\n if (!PostSSS._burleyProgram) {\r\n PostSSS._burleyProgram = this.createBurleyProgram(ctx);\r\n }\r\n if (!PostSSS._bvarProgram) {\r\n PostSSS._bvarProgram = this.createBVarProgram(ctx);\r\n }\r\n if (!PostSSS._recombineProgram) {\r\n PostSSS._recombineProgram = this.createRecombineProgram(ctx);\r\n }\r\n\r\n const diffusedFB = device.pool.fetchTemporalFramebuffer(false, width, height, scatterFormat, null, false);\r\n const bvarFB = device.pool.fetchTemporalFramebuffer(false, width, height, scatterFormat, null, false);\r\n\r\n // --- Pass 1: Burley diffusion ---\r\n device.pushDeviceStates();\r\n try {\r\n if (!this._burleyBindGroup) {\r\n this._burleyBindGroup = device.createBindGroup(PostSSS._burleyProgram.bindGroupLayouts[0]);\r\n }\r\n const bg = this._burleyBindGroup;\r\n bg.setTexture('sceneTex', inputColorTexture, fetchSampler('clamp_linear'));\r\n bg.setTexture('maskTex', maskTex, fetchSampler('clamp_linear'));\r\n // Nearest only: the id is a table row, and an interpolated one addresses a\r\n // profile neither neighbour has.\r\n bg.setTexture('profileIdTex', profileIdTex, fetchSampler('clamp_nearest_nomip'));\r\n bg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bg.setValue('cameraNearFar', this._cameraNearFar);\r\n bg.setValue('targetSize', this._targetSize);\r\n bg.setValue('projScale', this._projScale);\r\n bg.setValue('perspective', ctx.camera.isPerspective() ? 1 : 0);\r\n bg.setValue('profileParams', this._profileParams);\r\n bg.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));\r\n bg.setTexture(\r\n 'thicknessTex',\r\n ctx.transmissionThicknessTexture ?? ShaderHelper.getDummyTransmissionThickness(device),\r\n fetchSampler('clamp_nearest')\r\n );\r\n bg.setValue('sampleCount', this._sampleCount);\r\n bg.setValue('debugMode', SKIN_SSS_DEBUG_OUTPUTS.indexOf(this._debugOutput));\r\n bg.setValue('debugExposure', this._debugExposure);\r\n // Intermediate passes always render into a texture, so on WebGPU they flip\r\n // unconditionally. `needFlip` cannot be used: it reports whatever target is\r\n // bound at the time, and these values are set before the pass binds its own.\r\n bg.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n device.setProgram(PostSSS._burleyProgram);\r\n device.setBindGroup(0, bg);\r\n device.setFramebuffer(diffusedFB);\r\n this.drawFullscreenQuad();\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n\r\n // --- Pass 2: BVar transmission ---\r\n device.pushDeviceStates();\r\n try {\r\n if (!this._bvarBindGroup) {\r\n this._bvarBindGroup = device.createBindGroup(PostSSS._bvarProgram.bindGroupLayouts[0]);\r\n }\r\n const bg = this._bvarBindGroup;\r\n bg.setTexture(\r\n 'diffusedTex',\r\n diffusedFB.getColorAttachments()[0] as Texture2D,\r\n fetchSampler('clamp_linear')\r\n );\r\n bg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bg.setValue('targetSize', this._targetSize);\r\n bg.setValue('cameraNearFar', this._cameraNearFar);\r\n bg.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n device.setProgram(PostSSS._bvarProgram);\r\n device.setBindGroup(0, bg);\r\n device.setFramebuffer(bvarFB);\r\n this.drawFullscreenQuad();\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n\r\n // --- Pass 3: Recombine ---\r\n device.setFramebuffer(outputFramebuffer);\r\n if (!this._recombineBindGroup) {\r\n this._recombineBindGroup = device.createBindGroup(PostSSS._recombineProgram.bindGroupLayouts[0]);\r\n }\r\n const rbg = this._recombineBindGroup;\r\n rbg.setTexture('colorTex', inputColorTexture, fetchSampler('clamp_linear'));\r\n rbg.setTexture('maskTex', maskTex, fetchSampler('clamp_linear'));\r\n rbg.setTexture('bvarTex', bvarFB.getColorAttachments()[0] as Texture2D, fetchSampler('clamp_linear'));\r\n rbg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n rbg.setValue('cameraNearFar', this._cameraNearFar);\r\n rbg.setValue('targetSize', this._targetSize);\r\n rbg.setValue('debugMode', SKIN_SSS_DEBUG_OUTPUTS.indexOf(this._debugOutput));\r\n rbg.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n rbg.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n device.setProgram(PostSSS._recombineProgram);\r\n device.setBindGroup(0, rbg);\r\n this.drawFullscreenQuad();\r\n device.pool.releaseFrameBuffer(diffusedFB);\r\n device.pool.releaseFrameBuffer(bvarFB);\r\n }\r\n\r\n private static fullscreenVertex(pb: any) {\r\n pb.getGlobalScope().flip = pb.int().uniform(0);\r\n pb.getGlobalScope().$inputs.pos = pb.vec2().attrib('position');\r\n pb.getGlobalScope().$outputs.uv = pb.vec2();\r\n pb.main(function (this: any) {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function (this: any) {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n }\r\n\r\n private createBurleyProgram(ctx: DrawContext) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n PostSSS.fullscreenVertex(pb);\r\n },\r\n fragment(pb) {\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.sceneTex = pb.tex2D().uniform(0);\r\n this.maskTex = pb.tex2D().uniform(0);\r\n this.profileIdTex = pb.tex2D().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.projScale = pb.vec2().uniform(0);\r\n this.perspective = pb.int().uniform(0);\r\n this.profileParams = pb.vec4().uniform(0);\r\n this.profileTex = pb.tex2D().uniform(0);\r\n // Always declared so the cached program has one layout; a 1x1 dummy is\r\n // bound on frames without a transmission pass. Only the debug view reads\r\n // it — shading takes its thickness through the material, per light.\r\n this.thicknessTex = pb.tex2DArray().uniform(0);\r\n this.sampleCount = pb.int().uniform(0);\r\n this.debugMode = pb.int().uniform(0);\r\n this.debugExposure = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('readDepth01', [pb.vec2('uv')], function () {\r\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\r\n });\r\n pb.func('readDiffusible', [pb.vec2('uv')], function () {\r\n this.$l.scene = pb.textureSampleLevel(this.sceneTex, this.uv, 0);\r\n this.$l.opacity = pb.clamp(pb.textureSampleLevel(this.maskTex, this.uv, 0).a, 0, 1);\r\n this.$l.lum = pb.dot(this.scene.rgb, pb.vec3(0.2126, 0.7152, 0.0722));\r\n this.$l.diffAmt = pb.select(\r\n pb.float(1),\r\n pb.clamp(pb.div(this.scene.a, pb.max(this.lum, 1e-4)), 0, 1),\r\n pb.greaterThan(this.lum, 1e-4)\r\n );\r\n this.$return(pb.vec4(pb.mul(this.scene.rgb, this.diffAmt), this.opacity));\r\n });\r\n pb.func('readProfileId', [pb.vec2('uv')], function () {\r\n this.$return(pb.textureSampleLevel(this.profileIdTex, this.uv, 0).r);\r\n });\r\n pb.func('scalingFactor', [pb.float('a')], function () {\r\n this.$l.v = pb.sub(this.a, 0.33);\r\n this.$l.v2 = pb.mul(this.v, this.v);\r\n this.$return(pb.add(3.5, pb.mul(100, this.v2, this.v2)));\r\n });\r\n pb.func('scalingFactor3D', [pb.vec3('a')], function () {\r\n this.$l.v = pb.sub(this.a, pb.vec3(0.33));\r\n this.$l.v2 = pb.mul(this.v, this.v);\r\n this.$return(pb.add(pb.vec3(3.5), pb.mul(pb.vec3(100), this.v2, this.v2)));\r\n });\r\n // RadiusRootFindByApproximation: d ((2 - 2.6) xi - 2) ln(1 - xi).\r\n pb.func('radiusRootApprox', [pb.float('d'), pb.float('xi')], function () {\r\n this.$l.x = pb.min(this.xi, 0.9999);\r\n this.$return(\r\n pb.mul(this.d, pb.sub(pb.mul(pb.sub(2, 2.6), this.x), 2), pb.log(pb.max(pb.sub(1, this.x), 1e-6)))\r\n );\r\n });\r\n // GetCDFDeriv1: 0.25/d (e^{-r/d} + e^{-r/3d}), clamped as CLAMP_PDF does.\r\n pb.func('burleyPdf', [pb.float('r'), pb.float('l'), pb.float('s')], function () {\r\n this.$l.d = pb.max(pb.div(this.l, this.s), 1e-6);\r\n this.$l.e1 = pb.exp(pb.neg(pb.min(pb.div(this.r, this.d), 40)));\r\n this.$l.e2 = pb.exp(pb.neg(pb.min(pb.div(this.r, pb.mul(this.d, 3)), 40)));\r\n this.$return(pb.max(pb.mul(pb.div(0.25, this.d), pb.add(this.e1, this.e2)), 1e-5));\r\n });\r\n // GetDiffuseReflectProfileWithDiffuseMeanFreePath: r R(r), per channel.\r\n // D = 1/s3d, R = radius/L, (e^{-R/D} + e^{-R/3D}) / (D L) / 8pi\r\n pb.func('diffusionProfile', [pb.vec3('l'), pb.vec3('s3d'), pb.float('radius')], function () {\r\n this.$l.D = pb.div(pb.vec3(1), pb.max(this.s3d, pb.vec3(1e-6)));\r\n this.$l.L = pb.max(this.l, pb.vec3(1e-6));\r\n this.$l.R = pb.div(pb.vec3(this.radius), this.L);\r\n this.$l.negRD = pb.div(pb.neg(this.R), this.D);\r\n this.$l.e1 = pb.exp(pb.max(this.negRD, pb.vec3(-40)));\r\n this.$l.e2 = pb.exp(pb.max(pb.div(this.negRD, 3), pb.vec3(-40)));\r\n this.$return(\r\n pb.max(pb.div(pb.add(this.e1, this.e2), pb.mul(this.D, this.L, 8 * Math.PI)), pb.vec3(1e-12))\r\n );\r\n });\r\n // GetCDF with XI = 0, used to weight the centre sample.\r\n pb.func('burleyCdf', [pb.float('d'), pb.float('x')], function () {\r\n this.$l.sd = pb.max(this.d, 1e-6);\r\n this.$return(\r\n pb.clamp(\r\n pb.sub(\r\n pb.sub(1, pb.mul(0.25, pb.exp(pb.neg(pb.min(pb.div(this.x, this.sd), 40))))),\r\n pb.mul(0.75, pb.exp(pb.neg(pb.min(pb.div(this.x, pb.mul(this.sd, 3)), 40))))\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n });\r\n pb.func('r2Sequence', [pb.int('i')], function () {\r\n this.$return(pb.fract(pb.mul(pb.vec2(0.7548776662466927, 0.5698402909980532), pb.float(this.i))));\r\n });\r\n pb.func('readProfile', [pb.float('id'), pb.float('column')], function () {\r\n this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileParams.y);\r\n this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileParams.z);\r\n this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));\r\n });\r\n pb.func('readNormal', [pb.vec2('uv')], function () {\r\n this.$return(\r\n pb.normalize(pb.sub(pb.mul(pb.textureSampleLevel(this.maskTex, this.uv, 0).rgb, 2), pb.vec3(1)))\r\n );\r\n });\r\n pb.main(function () {\r\n this.$l.uv = this.$inputs.uv;\r\n this.$l.center = this.readDiffusible(this.uv);\r\n this.$l.centerId = this.readProfileId(this.uv);\r\n this.$l.centerDepth01 = this.readDepth01(this.uv);\r\n this.$outputs.outColor = this.center;\r\n // Two distinct tests: a pixel can carry a profile with zero opacity, or\r\n // an opacity with no profile where the prepass and the light pass\r\n // disagree about coverage. Neither scatters.\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(this.centerDepth01, 1),\r\n pb.and(pb.greaterThan(this.center.a, 1e-4), pb.greaterThan(this.centerId, 0.5 / 255))\r\n ),\r\n function () {\r\n this.$l.centerDepth = pb.max(pb.mul(this.centerDepth01, this.cameraNearFar.y), 1e-4);\r\n this.$l.centerNormal = this.readNormal(this.uv);\r\n this.$l.scaling = this.readProfile(this.centerId, 0);\r\n this.$l.albedo = this.readProfile(this.centerId, 1);\r\n this.$l.mfp = this.readProfile(this.centerId, 2);\r\n this.$l.boundaryBleed = this.readProfile(this.centerId, 3).rgb;\r\n this.$l.worldUnitScale = pb.max(this.scaling.x, 1e-3);\r\n\r\n this.$l.aForSampling = this.albedo.w;\r\n this.$l.lForSampling = pb.max(this.mfp.w, 1e-6);\r\n this.$l.S = this.scalingFactor(this.aForSampling);\r\n this.$l.S3D = this.scalingFactor3D(this.albedo.rgb);\r\n this.$l.dForSampling = pb.div(this.lForSampling, pb.max(this.S, 1e-6));\r\n\r\n this.$l.viewScale = pb.max(\r\n pb.select(this.centerDepth, pb.float(1), pb.equal(this.perspective, 0)),\r\n 1e-4\r\n );\r\n this.$l.burleyScale = pb.div(pb.mul(this.projScale, this.worldUnitScale), this.viewScale);\r\n\r\n this.$l.centerRadiusMM = pb.mul(\r\n 0.5,\r\n pb.add(\r\n pb.div(this.targetSize.z, pb.max(this.burleyScale.x, 1e-9)),\r\n pb.div(this.targetSize.w, pb.max(this.burleyScale.y, 1e-9))\r\n )\r\n );\r\n this.$l.centerCdf = this.burleyCdf(this.dForSampling, this.centerRadiusMM);\r\n this.$l.dPerChannel = pb.div(this.mfp.rgb, pb.max(this.S3D, pb.vec3(1e-6)));\r\n this.$l.centerWeight = pb.vec3(\r\n this.burleyCdf(this.dPerChannel.x, this.centerRadiusMM),\r\n this.burleyCdf(this.dPerChannel.y, this.centerRadiusMM),\r\n this.burleyCdf(this.dPerChannel.z, this.centerRadiusMM)\r\n );\r\n\r\n this.$l.seedStart = pb.int(pb.mul(hash21(this, pb.mul(this.uv, this.targetSize.xy)), 65536));\r\n this.$l.radianceAccum = pb.vec3(0);\r\n this.$l.weightAccum = pb.vec3(0);\r\n this.$l.bleedAccum = pb.vec3(0);\r\n this.$l.acceptedCount = pb.float(0);\r\n this.$l.radiusSum = pb.float(0);\r\n this.$for(pb.int('i'), 0, DEFAULT_SAMPLE_COUNT, function () {\r\n this.$l.rand = this.r2Sequence(pb.add(this.seedStart, this.i));\r\n this.$l.xi = pb.add(this.centerCdf, pb.mul(this.rand.x, pb.sub(1, this.centerCdf)));\r\n this.$l.radiusMM = pb.max(this.radiusRootApprox(this.dForSampling, this.xi), 1e-5);\r\n this.$l.pdf = this.burleyPdf(this.radiusMM, this.lForSampling, this.S);\r\n this.$l.theta = pb.mul(this.rand.y, 2 * Math.PI);\r\n this.$l.uvOffset = pb.mul(\r\n pb.vec2(pb.cos(this.theta), pb.sin(this.theta)),\r\n pb.mul(this.radiusMM, this.burleyScale)\r\n );\r\n this.$l.sampleUV = pb.clamp(pb.add(this.uv, this.uvOffset), pb.vec2(0), pb.vec2(1));\r\n this.$l.tapSample = this.readDiffusible(this.sampleUV);\r\n this.$l.sampleDepth01 = this.readDepth01(this.sampleUV);\r\n this.$l.sampleDepth = pb.max(pb.mul(this.sampleDepth01, this.cameraNearFar.y), 1e-4);\r\n this.$l.tapNormal = this.readNormal(this.sampleUV);\r\n this.$l.normalWeight = pb.sqrt(\r\n pb.clamp(pb.add(pb.mul(pb.dot(this.tapNormal, this.centerNormal), 0.5), 0.5), 0, 1)\r\n );\r\n this.$l.deltaDepth = pb.div(pb.sub(this.sampleDepth, this.centerDepth), this.worldUnitScale);\r\n this.$l.radiusSampledMM = pb.sqrt(\r\n pb.add(pb.mul(this.radiusMM, this.radiusMM), pb.mul(this.deltaDepth, this.deltaDepth))\r\n );\r\n this.$l.profile = this.diffusionProfile(this.mfp.rgb, this.S3D, this.radiusSampledMM);\r\n this.$l.tapId = this.readProfileId(this.sampleUV);\r\n this.$l.tapOpacity = pb.select(\r\n pb.float(0),\r\n this.tapSample.a,\r\n pb.greaterThan(this.tapId, 0.5 / 255)\r\n );\r\n this.$l.tapColor = pb.mix(this.center.rgb, this.tapSample.rgb, this.tapOpacity);\r\n this.$l.sampleWeight = pb.mul(pb.div(this.profile, this.pdf), this.normalWeight);\r\n this.$l.sameProfile = pb.float(\r\n pb.or(\r\n pb.lessThan(pb.abs(pb.sub(this.tapId, this.centerId)), 0.002),\r\n pb.lessThan(this.tapOpacity, 1e-4)\r\n )\r\n );\r\n this.bleedAccum = pb.add(\r\n this.bleedAccum,\r\n pb.mul(pb.mix(this.boundaryBleed, pb.vec3(1), this.sameProfile), this.tapOpacity)\r\n );\r\n this.acceptedCount = pb.add(this.acceptedCount, this.tapOpacity);\r\n this.radianceAccum = pb.add(this.radianceAccum, pb.mul(this.sampleWeight, this.tapColor));\r\n this.weightAccum = pb.add(this.weightAccum, this.sampleWeight);\r\n this.radiusSum = pb.add(this.radiusSum, this.radiusMM);\r\n });\r\n this.$l.diffused = pb.mul(\r\n pb.div(this.radianceAccum, pb.max(this.weightAccum, pb.vec3(1e-9))),\r\n 1 / 0.99995\r\n );\r\n this.$l.bleedTint = pb.vec3(1);\r\n this.$if(pb.greaterThan(this.acceptedCount, 1e-4), function () {\r\n this.bleedTint = pb.div(this.bleedAccum, this.acceptedCount);\r\n });\r\n this.diffused = pb.mul(this.diffused, this.bleedTint);\r\n this.diffused = pb.mix(this.diffused, this.center.rgb, this.centerWeight);\r\n this.$l.weightValid = pb.vec3(\r\n pb.float(pb.greaterThan(this.weightAccum.x, 0)),\r\n pb.float(pb.greaterThan(this.weightAccum.y, 0)),\r\n pb.float(pb.greaterThan(this.weightAccum.z, 0))\r\n );\r\n this.diffused = pb.mix(this.center.rgb, this.diffused, this.weightValid);\r\n this.diffused = pb.mix(this.center.rgb, this.diffused, this.center.a);\r\n this.$outputs.outColor = pb.vec4(pb.max(this.diffused, pb.vec3(0)), this.center.a);\r\n this.$if(pb.notEqual(this.debugMode, 0), function () {\r\n this.$l.dbg = pb.vec3(0);\r\n this.$if(pb.equal(this.debugMode, 1), function () {\r\n this.dbg = this.center.rgb;\r\n });\r\n this.$if(pb.equal(this.debugMode, 2), function () {\r\n this.$l.lum = pb.dot(\r\n pb.textureSampleLevel(this.sceneTex, this.uv, 0).rgb,\r\n pb.vec3(0.2126, 0.7152, 0.0722)\r\n );\r\n this.dbg = pb.vec3(\r\n pb.clamp(\r\n pb.div(pb.textureSampleLevel(this.sceneTex, this.uv, 0).a, pb.max(this.lum, 1e-4)),\r\n 0,\r\n 1\r\n )\r\n );\r\n });\r\n this.$if(pb.equal(this.debugMode, 3), function () {\r\n this.dbg = pb.vec3(pb.mul(this.centerId, 255 / 8));\r\n });\r\n this.$if(pb.equal(this.debugMode, 4), function () {\r\n this.dbg = pb.add(pb.mul(this.centerNormal, 0.5), pb.vec3(0.5));\r\n });\r\n this.$if(pb.equal(this.debugMode, 5), function () {\r\n // d in millimetres of world space, so skin reads around 1.\r\n this.dbg = pb.mul(this.dPerChannel, 1000);\r\n });\r\n this.$if(pb.equal(this.debugMode, 6), function () {\r\n // Mean vertical sample radius in pixels, 32 px mapped to white.\r\n this.dbg = pb.vec3(\r\n pb.div(\r\n pb.mul(\r\n pb.div(this.radiusSum, DEFAULT_SAMPLE_COUNT),\r\n this.burleyScale.y,\r\n this.targetSize.y\r\n ),\r\n 32\r\n )\r\n );\r\n });\r\n this.$if(pb.equal(this.debugMode, 7), function () {\r\n this.dbg = this.weightAccum;\r\n });\r\n this.$if(pb.equal(this.debugMode, 8), function () {\r\n this.dbg = pb.vec3(pb.div(this.acceptedCount, DEFAULT_SAMPLE_COUNT));\r\n });\r\n this.$if(pb.equal(this.debugMode, 9), function () {\r\n this.dbg = this.centerWeight;\r\n });\r\n this.$if(pb.equal(this.debugMode, 10), function () {\r\n this.dbg = this.diffused;\r\n });\r\n this.$if(pb.equal(this.debugMode, 11), function () {\r\n this.$l.th = pb.textureArraySampleLevel(this.thicknessTex, this.uv, 0, 0);\r\n this.$l.enc = pb.min(pb.min(this.th.r, this.th.g), pb.min(this.th.b, this.th.a));\r\n this.$if(pb.greaterThan(this.enc, 0.999), function () {\r\n this.dbg = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.dbg = pb.vec3(pb.sub(1, this.enc));\r\n });\r\n });\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.dbg, this.debugExposure), this.center.a);\r\n });\r\n }\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@PostSSSBurley';\r\n return program;\r\n }\r\n\r\n private createBVarProgram(ctx: DrawContext) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n PostSSS.fullscreenVertex(pb);\r\n },\r\n fragment(pb) {\r\n this.diffusedTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.diffused = pb.textureSampleLevel(this.diffusedTex, this.$inputs.uv, 0);\r\n this.$outputs.outColor = pb.vec4(this.diffused.rgb, this.diffused.a);\r\n });\r\n }\r\n })!;\r\n program.name = '@PostSSSBVar';\r\n return program;\r\n }\r\n\r\n private createRecombineProgram(ctx: DrawContext) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n PostSSS.fullscreenVertex(pb);\r\n },\r\n fragment(pb) {\r\n this.colorTex = pb.tex2D().uniform(0);\r\n this.maskTex = pb.tex2D().uniform(0);\r\n this.bvarTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.debugMode = pb.int().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('readDepth01', [pb.vec2('uv')], function () {\r\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\r\n });\r\n pb.main(function () {\r\n this.$l.uv = this.$inputs.uv;\r\n this.$l.baseColor = pb.textureSampleLevel(this.colorTex, this.uv, 0);\r\n this.$l.result = this.baseColor.rgb;\r\n this.$l.centerDepth01 = this.readDepth01(this.uv);\r\n this.$l.centerMask = pb.textureSampleLevel(this.maskTex, this.uv, 0).a;\r\n this.$if(\r\n pb.and(\r\n pb.equal(this.debugMode, 0),\r\n pb.and(pb.lessThan(this.centerDepth01, 1), pb.greaterThan(this.centerMask, 1e-4))\r\n ),\r\n function () {\r\n this.$l.lum = pb.dot(this.baseColor.rgb, pb.vec3(0.2126, 0.7152, 0.0722));\r\n this.$l.diffAmt = pb.select(\r\n pb.float(1),\r\n pb.clamp(pb.div(this.baseColor.a, pb.max(this.lum, 1e-4)), 0, 1),\r\n pb.greaterThan(this.lum, 1e-4)\r\n );\r\n this.$l.specKeep = pb.mul(this.baseColor.rgb, pb.sub(1, this.diffAmt));\r\n this.$l.diffused = pb.textureSampleLevel(this.bvarTex, this.uv, 0).rgb;\r\n this.result = pb.max(pb.add(this.diffused, this.specKeep), pb.vec3(0));\r\n }\r\n );\r\n this.$if(pb.notEqual(this.debugMode, 0), function () {\r\n this.result = pb.textureSampleLevel(this.bvarTex, this.uv, 0).rgb;\r\n });\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.result, this.baseColor.a);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.result), this.baseColor.a);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@PostSSSRecombine';\r\n return program;\r\n }\r\n}\r\n"],"names":["SKIN_SSS_DEBUG_OUTPUTS","DEFAULT_SAMPLE_COUNT","PostSSS","AbstractPostEffect","_burleyProgram","_bvarProgram","_recombineProgram","_burleyBindGroup","_bvarBindGroup","_recombineBindGroup","_profile","_debugOutput","_debugExposure","_sampleCount","_projScale","_profileParams","_targetSize","_cameraNearFar","_layer","PostEffectLayer","opaque","Vector2","Vector4","profile","val","sampleCount","Math","max","min","round","debugExposure","debugOutput","includes","requireLinearDepthTexture","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","SSSMaskTexture","SSSProfileIdTexture","device","type","warnUnsupported","passThrough","outputFramebuffer","getFramebuffer","maskTex","profileIdTex","width","height","scatterFormat","colorFormat","profileTable","SSSProfile","getTable","fallback","getDefault","projMatrix","camera","getProjectionMatrix","setXY","m00","m11","setXYZW","encodedId","tableColumns","tableRows","getNearPlane","getFarPlane","createBurleyProgram","createBVarProgram","createRecombineProgram","diffusedFB","pool","fetchTemporalFramebuffer","bvarFB","pushDeviceStates","createBindGroup","bindGroupLayouts","bg","setTexture","fetchSampler","setValue","isPerspective","transmissionThicknessTexture","ShaderHelper","getDummyTransmissionThickness","indexOf","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","popDeviceStates","getColorAttachments","rbg","needFlip","releaseFrameBuffer","fullscreenVertex","pb","getGlobalScope","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","program","buildRenderProgram","vertex","fragment","depthTex","tex2D","sampleType","sceneTex","cameraNearFar","targetSize","projScale","perspective","profileParams","profileTex","thicknessTex","tex2DArray","debugMode","float","outColor","func","$return","sampleLinearDepth","$l","scene","textureSampleLevel","opacity","clamp","a","lum","dot","rgb","vec3","diffAmt","select","div","greaterThan","r","v","sub","v2","x","xi","d","log","l","s","e1","exp","e2","D","s3d","L","R","radius","negRD","PI","sd","fract","i","u","column","id","z","normalize","center","readDiffusible","centerId","readProfileId","centerDepth01","readDepth01","and","lessThan","centerDepth","centerNormal","readNormal","scaling","readProfile","albedo","mfp","boundaryBleed","worldUnitScale","aForSampling","w","lForSampling","S","scalingFactor","S3D","scalingFactor3D","dForSampling","viewScale","equal","burleyScale","centerRadiusMM","centerCdf","burleyCdf","dPerChannel","centerWeight","seedStart","hash21","radianceAccum","weightAccum","bleedAccum","acceptedCount","radiusSum","$for","rand","r2Sequence","radiusMM","radiusRootApprox","pdf","burleyPdf","theta","uvOffset","cos","sin","sampleUV","tapSample","sampleDepth01","sampleDepth","tapNormal","normalWeight","sqrt","deltaDepth","radiusSampledMM","diffusionProfile","tapId","tapOpacity","tapColor","mix","sampleWeight","sameProfile","or","abs","diffused","bleedTint","weightValid","dbg","th","textureArraySampleLevel","enc","g","b","$else","name","diffusedTex","colorTex","bvarTex","srgbOut","baseColor","result","centerMask","specKeep","linearToGamma"],"mappings":"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"}
@@ -8,6 +8,21 @@ import { fetchSampler } from '../utility/misc.js';
8
8
 
9
9
  const NUM_SAMPLES = 7;
10
10
  const NUM_RINGS = 4;
11
+ /**
12
+ * Hard cap on the tap pattern's screen-space radius, in pixels.
13
+ *
14
+ * @remarks
15
+ * Purely a performance guard, not a look control: the world-space radius is
16
+ * projected per pixel, and without a cap a surface close to the near plane
17
+ * would spread the taps across the whole screen, which destroys depth-texture
18
+ * cache locality for no visual gain. At 1080p this is about a quarter of the
19
+ * screen height, far wider than any sane occlusion radius projects to at a
20
+ * normal working distance.
21
+ */ const MAX_TAP_RADIUS_PIXELS = 256;
22
+ /**
23
+ * Mean of the falloff term over the fixed tap pattern, used to normalize the
24
+ * occlusion sum so {@link SAO.intensity} does not depend on the radius.
25
+ */ const MEAN_TAP_FALLOFF = 0.748834;
11
26
  class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
12
27
  _packed;
13
28
  constructor(finalPhase){
@@ -51,11 +66,9 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
51
66
  static _renderStateBlend = null;
52
67
  static _bindgroup = null;
53
68
  static _bindgroupPacked = null;
54
- _saoScale;
55
69
  _saoBias;
56
70
  _saoIntensity;
57
- _saoRadius;
58
- _saoMinResolution;
71
+ _saoOcclusionRadius;
59
72
  _saoRandomSeed;
60
73
  _saoBlurDepthCutoff;
61
74
  _blitterH;
@@ -67,11 +80,9 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
67
80
  super();
68
81
  this._supported = true;
69
82
  this._layer = PostEffectLayer.opaque;
70
- this._saoScale = 10;
71
- this._saoBias = 1;
72
- this._saoIntensity = 0.025;
73
- this._saoRadius = 100;
74
- this._saoMinResolution = 0;
83
+ this._saoBias = 0.05;
84
+ this._saoIntensity = 1;
85
+ this._saoOcclusionRadius = 0.5;
75
86
  this._saoRandomSeed = 0;
76
87
  this._saoBlurDepthCutoff = 2;
77
88
  this._blitterH = new DepthLimitAOBlurBlitter(false);
@@ -81,35 +92,29 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
81
92
  this._blitterV.kernelRadius = 8;
82
93
  this._blitterV.stdDev = 10;
83
94
  }
84
- /** Scale value */ get scale() {
85
- return this._saoScale;
95
+ /**
96
+ * Strength of the occlusion term added by each tap.
97
+ */ get intensity() {
98
+ return this._saoIntensity;
86
99
  }
87
- set scale(val) {
88
- this._saoScale = val;
100
+ set intensity(val) {
101
+ this._saoIntensity = val;
89
102
  }
90
- /** Bias value */ get bias() {
103
+ /**
104
+ * Threshold below which a sample does not occlude, in the range 0..1.
105
+ */ get bias() {
91
106
  return this._saoBias;
92
107
  }
93
108
  set bias(val) {
94
109
  this._saoBias = val;
95
110
  }
96
- /** Radius value */ get radius() {
97
- return this._saoRadius;
98
- }
99
- set radius(val) {
100
- this._saoRadius = val;
101
- }
102
- /** SAO intensity */ get intensity() {
103
- return this._saoIntensity;
104
- }
105
- set intensity(val) {
106
- this._saoIntensity = val;
107
- }
108
- /** Minimum resolution */ get minResolution() {
109
- return this._saoMinResolution;
111
+ /**
112
+ * World-space occlusion radius in metres.
113
+ */ get occlusionRadius() {
114
+ return this._saoOcclusionRadius;
110
115
  }
111
- set minResolution(val) {
112
- this._saoMinResolution = val;
116
+ set occlusionRadius(val) {
117
+ this._saoOcclusionRadius = val;
113
118
  }
114
119
  /** Blur kernel size */ get blurKernelSize() {
115
120
  return this._blitterH.kernelRadius;
@@ -160,13 +165,11 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
160
165
  const bindgroup = packed ? SAO._bindgroupPacked : SAO._bindgroup;
161
166
  bindgroup.setValue('flip', this.needFlip(device) ? 1 : 0);
162
167
  bindgroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));
163
- bindgroup.setValue('scale', this._saoScale);
164
168
  bindgroup.setValue('invProj', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));
165
169
  bindgroup.setValue('bias', this._saoBias);
166
170
  bindgroup.setValue('cameraNearFar', cameraNearFar);
167
171
  bindgroup.setValue('intensity', this._saoIntensity);
168
- bindgroup.setValue('kernelRadius', this._saoRadius);
169
- bindgroup.setValue('minResolution', this._saoMinResolution);
172
+ bindgroup.setValue('occlusionRadius', this._saoOcclusionRadius);
170
173
  bindgroup.setValue('size', new Vector2(viewport.width, viewport.height));
171
174
  bindgroup.setValue('randomSeed', this._saoRandomSeed);
172
175
  device.setRenderStates(SAO._renderState);
@@ -196,7 +199,7 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
196
199
  }
197
200
  _getIntermediateTextureFormat(device) {
198
201
  const texCaps = device.getDeviceCaps().textureCaps;
199
- return device.type === 'webgl' || !texCaps.supportHalfFloatColorBuffer && !texCaps.supportFloatColorBuffer ? 'rgba8unorm' : texCaps.supportHalfFloatColorBuffer ? 'r16f' : 'r32f';
202
+ return !texCaps.supportHalfFloatColorBuffer && !texCaps.supportFloatColorBuffer ? 'rgba8unorm' : texCaps.supportHalfFloatColorBuffer ? 'r16f' : 'r32f';
200
203
  }
201
204
  /** @internal */ _prepare(device, _srcTexture) {
202
205
  const fb = device.getFramebuffer();
@@ -228,17 +231,14 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
228
231
  },
229
232
  fragment (pb) {
230
233
  this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
231
- this.scale = pb.float().uniform(0);
232
234
  this.invProj = pb.mat4().uniform(0);
233
235
  this.cameraNearFar = pb.vec2().uniform(0);
234
236
  this.intensity = pb.float().uniform(0);
235
237
  this.bias = pb.float().uniform(0);
236
- this.kernelRadius = pb.float().uniform(0);
237
- this.minResolution = pb.float().uniform(0);
238
+ this.occlusionRadius = pb.float().uniform(0);
238
239
  this.size = pb.vec2().uniform(0);
239
240
  this.randomSeed = pb.float().uniform(0);
240
- this.$l.scaleDividedByCameraFar = pb.float();
241
- this.$l.minResolutionMultipliedByCameraFar = pb.float();
241
+ this.$l.occlusionRadiusSq = pb.float();
242
242
  pb.func('rand', [
243
243
  pb.vec2('uv')
244
244
  ], function() {
@@ -253,11 +253,7 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
253
253
  pb.vec2('uv')
254
254
  ], function() {
255
255
  this.$l.depthValue = pb.textureSample(this.depthTex, this.uv);
256
- if (device.type === 'webgl') {
257
- this.$l.linearDepth = decodeNormalizedFloatFromRGBA(this, this.depthValue);
258
- } else {
259
- this.$l.linearDepth = this.depthValue.r;
260
- }
256
+ this.$l.linearDepth = this.depthValue.r;
261
257
  this.$l.nonLinearDepth = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.linearDepth, this.cameraNearFar);
262
258
  this.$l.clipSpacePos = pb.vec4(pb.sub(pb.mul(this.uv, 2), pb.vec2(1)), ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinearDepth, 0, 1)), 1);
263
259
  // this.$l.clipSpacePos = pb.vec4(this.uv, this.nonLinearDepth, 1);
@@ -271,18 +267,20 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
271
267
  pb.vec3('samplePos')
272
268
  ], function() {
273
269
  this.$l.viewDelta = pb.sub(this.samplePos, this.centerPos);
274
- this.$l.viewDistance = pb.length(this.viewDelta);
275
- this.$l.scaledScreenDistance = pb.mul(this.scaleDividedByCameraFar, this.viewDistance);
276
- this.$return(pb.div(pb.max(0, pb.sub(pb.div(pb.sub(pb.dot(this.centerNormal, this.viewDelta), this.minResolutionMultipliedByCameraFar), this.scaledScreenDistance), this.bias)), pb.add(pb.mul(this.scaledScreenDistance, this.scaledScreenDistance), 1)));
270
+ this.$l.viewDistance = pb.max(pb.length(this.viewDelta), 1e-6);
271
+ this.$return(pb.div(pb.max(0, pb.sub(pb.div(pb.dot(this.centerNormal, this.viewDelta), this.viewDistance), this.bias)), pb.add(1, pb.div(pb.mul(this.viewDistance, this.viewDistance), this.occlusionRadiusSq))));
277
272
  });
278
273
  pb.func('getAO', [
279
274
  pb.vec3('vPos')
280
275
  ], function() {
281
- this.scaleDividedByCameraFar = pb.div(this.scale, this.cameraNearFar.y);
282
- this.minResolutionMultipliedByCameraFar = pb.mul(this.minResolution, this.cameraNearFar.y);
283
276
  this.$l.centerViewNormal = pb.normalize(pb.cross(pb.dpdx(this.vPos), pb.dpdy(this.vPos)));
284
277
  this.$l.angle = pb.mul(this.rand(pb.add(this.$inputs.uv, pb.vec2(this.randomSeed))), Math.PI * 2);
285
- this.$l.radius = pb.div(pb.vec2(pb.mul(this.kernelRadius, 1 / NUM_SAMPLES)), this.size);
278
+ this.$l.projScale = pb.div(pb.mul(this.size.y, 0.5), pb.max(this.invProj[1].y, 1e-6));
279
+ this.$l.viewDepth = pb.max(pb.neg(this.vPos.z), 1e-4);
280
+ this.$l.radiusPx = pb.clamp(pb.div(pb.mul(this.occlusionRadius, this.projScale), this.viewDepth), 2, MAX_TAP_RADIUS_PIXELS);
281
+ this.$l.effectiveRadius = pb.div(pb.mul(this.radiusPx, this.viewDepth), this.projScale);
282
+ this.occlusionRadiusSq = pb.max(pb.mul(this.effectiveRadius, this.effectiveRadius), 1e-12);
283
+ this.$l.radius = pb.div(pb.vec2(pb.mul(this.radiusPx, 1 / NUM_SAMPLES)), this.size);
286
284
  this.$l.radiusStep = this.radius;
287
285
  this.$l.occlusionSum = pb.float(0);
288
286
  this.$l.weightSum = pb.float(0);
@@ -297,7 +295,7 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
297
295
  this.$if(pb.equal(this.weightSum, 0), function() {
298
296
  pb.discard();
299
297
  });
300
- this.$return(pb.div(pb.mul(this.occlusionSum, this.intensity), this.weightSum));
298
+ this.$return(pb.div(pb.mul(this.occlusionSum, this.intensity), pb.mul(this.weightSum, MEAN_TAP_FALLOFF)));
301
299
  });
302
300
  pb.main(function() {
303
301
  this.$l.vPos = this.getPositionVS(this.$inputs.uv);
@@ -1 +1 @@
1
- {"version":3,"file":"sao.js","sources":["../../src/posteffect/sao.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { isFloatTextureFormat } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { decodeNormalizedFloatFromRGBA, encodeNormalizedFloatToRGBA } from '../shaders/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_COMPARE_FARTHER, DEPTH_FARTHEST, Matrix4x4, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport { BilateralBlurBlitter } from '../blitter/bilateralblur';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { BlitType } from '../blitter';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst NUM_SAMPLES = 7;\r\nconst NUM_RINGS = 4;\r\n\r\nclass DepthLimitAOBlurBlitter extends BilateralBlurBlitter {\r\n private _packed: boolean;\r\n constructor(finalPhase: boolean) {\r\n super(finalPhase);\r\n this._packed = false;\r\n }\r\n get packed() {\r\n return this._packed;\r\n }\r\n set packed(val) {\r\n if (this._packed !== !!val) {\r\n this._packed = !!val;\r\n this.invalidateHash();\r\n }\r\n }\r\n protected calcHash() {\r\n return `${this._packed}:${super.calcHash()}`;\r\n }\r\n readTexel(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint' | 'depth'\r\n ) {\r\n const pb = scope.$builder;\r\n const texel = super.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (this._packed) {\r\n return pb.vec4(pb.vec3(decodeNormalizedFloatFromRGBA(scope, texel)), 1);\r\n } else {\r\n return pb.vec4(texel.rrr, 1);\r\n }\r\n }\r\n writeTexel(scope: PBInsideFunctionScope, type: BlitType, uv: PBShaderExp, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const outTexel = super.writeTexel(scope, type, uv, pb.vec4(texel.rrr, 1));\r\n return this._finalPhase || !this._packed\r\n ? pb.vec4(outTexel.rrr, 1)\r\n : encodeNormalizedFloatToRGBA(scope, outTexel.r);\r\n }\r\n}\r\n/**\r\n * The Scalable Ambient Obscurance (SAO) post effect\r\n * @public\r\n */\r\nexport class SAO extends AbstractPostEffect {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static _programPacked: Nullable<GPUProgram> = null;\r\n private static _renderState: Nullable<RenderStateSet> = null;\r\n private static _renderStateBlend: Nullable<RenderStateSet> = null;\r\n private static _bindgroup: Nullable<BindGroup> = null;\r\n private static _bindgroupPacked: Nullable<BindGroup> = null;\r\n private _saoScale: number;\r\n private _saoBias: number;\r\n private _saoIntensity: number;\r\n private _saoRadius: number;\r\n private _saoMinResolution: number;\r\n private readonly _saoRandomSeed: number;\r\n private _saoBlurDepthCutoff: number;\r\n private readonly _blitterH: DepthLimitAOBlurBlitter;\r\n private readonly _blitterV: DepthLimitAOBlurBlitter;\r\n private _supported: boolean;\r\n /**\r\n * Creates an instance of SAO post effect\r\n */\r\n constructor() {\r\n super();\r\n this._supported = true;\r\n this._layer = PostEffectLayer.opaque;\r\n this._saoScale = 10;\r\n this._saoBias = 1;\r\n this._saoIntensity = 0.025;\r\n this._saoRadius = 100;\r\n this._saoMinResolution = 0;\r\n this._saoRandomSeed = 0;\r\n this._saoBlurDepthCutoff = 2;\r\n this._blitterH = new DepthLimitAOBlurBlitter(false);\r\n this._blitterH.kernelRadius = 8;\r\n this._blitterH.stdDev = 10;\r\n this._blitterV = new DepthLimitAOBlurBlitter(true);\r\n this._blitterV.kernelRadius = 8;\r\n this._blitterV.stdDev = 10;\r\n }\r\n /** Scale value */\r\n get scale() {\r\n return this._saoScale;\r\n }\r\n set scale(val) {\r\n this._saoScale = val;\r\n }\r\n /** Bias value */\r\n get bias() {\r\n return this._saoBias;\r\n }\r\n set bias(val) {\r\n this._saoBias = val;\r\n }\r\n /** Radius value */\r\n get radius() {\r\n return this._saoRadius;\r\n }\r\n set radius(val) {\r\n this._saoRadius = val;\r\n }\r\n /** SAO intensity */\r\n get intensity() {\r\n return this._saoIntensity;\r\n }\r\n set intensity(val) {\r\n this._saoIntensity = val;\r\n }\r\n /** Minimum resolution */\r\n get minResolution() {\r\n return this._saoMinResolution;\r\n }\r\n set minResolution(val) {\r\n this._saoMinResolution = val;\r\n }\r\n /** Blur kernel size */\r\n get blurKernelSize() {\r\n return this._blitterH.kernelRadius;\r\n }\r\n set blurKernelSize(val) {\r\n val = Math.min(64, Math.max(0, val >> 0));\r\n this._blitterH.kernelRadius = val;\r\n this._blitterV.kernelRadius = val;\r\n }\r\n /** Gaussian blur stddev value */\r\n get blurStdDev() {\r\n return this._blitterH.stdDev;\r\n }\r\n set blurStdDev(val) {\r\n this._blitterH.stdDev = val;\r\n this._blitterV.stdDev = val;\r\n }\r\n /** Cutoff of depth limited blur */\r\n get blurDepthCutoff() {\r\n return this._saoBlurDepthCutoff;\r\n }\r\n set blurDepthCutoff(val) {\r\n this._saoBlurDepthCutoff = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return true;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return true;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const viewport = device.getViewport();\r\n this._prepare(device, inputColorTexture);\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n if (!this._supported) {\r\n return;\r\n }\r\n const fmt = this._getIntermediateTextureFormat(device);\r\n const depth = device.getFramebuffer()!.getDepthAttachment() as Texture2D;\r\n\r\n const fbao = device.pool.fetchTemporalTexture2D(false, fmt, depth.width, depth.height, false);\r\n const fbblur = device.pool.fetchTemporalTexture2D(false, fmt, depth.width, depth.height, false);\r\n const packed = fbao.format === 'rgba8unorm';\r\n const cameraNearFar = new Vector2(ctx.camera.getNearPlane(), ctx.camera.getFarPlane());\r\n device.pushDeviceStates();\r\n device.setFramebuffer([fbao], depth);\r\n device.clearFrameBuffer(packed ? new Vector4(0, 0, 0, 1) : new Vector4(1, 0, 0, 1), null, null);\r\n const bindgroup = packed ? SAO._bindgroupPacked! : SAO._bindgroup!;\r\n bindgroup.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n bindgroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindgroup.setValue('scale', this._saoScale);\r\n bindgroup.setValue('invProj', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));\r\n bindgroup.setValue('bias', this._saoBias);\r\n bindgroup.setValue('cameraNearFar', cameraNearFar);\r\n bindgroup.setValue('intensity', this._saoIntensity);\r\n bindgroup.setValue('kernelRadius', this._saoRadius);\r\n bindgroup.setValue('minResolution', this._saoMinResolution);\r\n bindgroup.setValue('size', new Vector2(viewport.width, viewport.height));\r\n bindgroup.setValue('randomSeed', this._saoRandomSeed);\r\n device.setRenderStates(SAO._renderState);\r\n device.setProgram(packed ? SAO._programPacked : SAO._program);\r\n device.setBindGroup(0, bindgroup);\r\n this.drawFullscreenQuad(SAO._renderState!);\r\n this._blitterH.size = new Vector2(inputColorTexture.width, inputColorTexture.height);\r\n this._blitterH.depthTex = sceneDepthTexture;\r\n this._blitterH.depthCutoff = this._saoBlurDepthCutoff;\r\n this._blitterH.sampler = fetchSampler('clamp_nearest_nomip');\r\n this._blitterH.cameraNearFar = cameraNearFar;\r\n this._blitterH.packed = packed;\r\n this._blitterH.renderStates = SAO._renderState;\r\n this._blitterV.size = new Vector2(inputColorTexture.width, inputColorTexture.height);\r\n this._blitterV.depthTex = sceneDepthTexture;\r\n this._blitterV.depthCutoff = this._saoBlurDepthCutoff;\r\n this._blitterV.sampler = fetchSampler('clamp_nearest_nomip');\r\n this._blitterV.cameraNearFar = cameraNearFar;\r\n this._blitterV.packed = packed;\r\n this._blitterV.srgbOut = srgbOutput;\r\n this._blitterV.renderStates = SAO._renderStateBlend;\r\n this._blitterH.blit(fbao, fbblur);\r\n device.popDeviceStates();\r\n this._blitterV.blit(fbblur, device.getFramebuffer()!);\r\n device.pool.releaseTexture(fbao);\r\n device.pool.releaseTexture(fbblur);\r\n }\r\n private _getIntermediateTextureFormat(device: AbstractDevice) {\r\n const texCaps = device.getDeviceCaps().textureCaps;\r\n return device.type === 'webgl' ||\r\n (!texCaps.supportHalfFloatColorBuffer && !texCaps.supportFloatColorBuffer)\r\n ? 'rgba8unorm'\r\n : texCaps.supportHalfFloatColorBuffer\r\n ? 'r16f'\r\n : 'r32f';\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n const fb = device.getFramebuffer();\r\n const isFloatFramebuffer = fb && isFloatTextureFormat(fb.getColorAttachments()[0].format);\r\n this._supported = !isFloatFramebuffer || device.getDeviceCaps().framebufferCaps.supportFloatBlending;\r\n if (this._supported) {\r\n if (!SAO._renderState) {\r\n SAO._renderState = device.createRenderStateSet();\r\n SAO._renderState\r\n .useDepthState()\r\n .enableTest(true)\r\n .enableWrite(false)\r\n .setCompareFunc(DEPTH_COMPARE_FARTHER);\r\n SAO._renderState.useRasterizerState().setCullMode('none');\r\n SAO._renderStateBlend = device.createRenderStateSet();\r\n SAO._renderStateBlend\r\n .useDepthState()\r\n .enableTest(true)\r\n .enableWrite(false)\r\n .setCompareFunc(DEPTH_COMPARE_FARTHER);\r\n SAO._renderStateBlend.useRasterizerState().setCullMode('none');\r\n SAO._renderStateBlend\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('zero', 'src-color')\r\n .setBlendFuncAlpha('zero', 'one');\r\n }\r\n function createProgram(packed: boolean) {\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.scale = pb.float().uniform(0);\r\n this.invProj = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.bias = pb.float().uniform(0);\r\n this.kernelRadius = pb.float().uniform(0);\r\n this.minResolution = pb.float().uniform(0);\r\n this.size = pb.vec2().uniform(0);\r\n this.randomSeed = pb.float().uniform(0);\r\n this.$l.scaleDividedByCameraFar = pb.float();\r\n this.$l.minResolutionMultipliedByCameraFar = pb.float();\r\n pb.func('rand', [pb.vec2('uv')], function () {\r\n this.$l.a = 12.9898;\r\n this.$l.b = 78.233;\r\n this.$l.c = 43758.5453;\r\n this.$l.dt = pb.dot(this.uv, pb.vec2(this.a, this.b));\r\n this.$l.sn = pb.mod(this.dt, Math.PI);\r\n this.$return(pb.fract(pb.mul(pb.sin(this.sn), this.c)));\r\n });\r\n pb.func('getPositionVS', [pb.vec2('uv')], function () {\r\n this.$l.depthValue = pb.textureSample(this.depthTex, this.uv);\r\n if (device.type === 'webgl') {\r\n this.$l.linearDepth = decodeNormalizedFloatFromRGBA(this, this.depthValue);\r\n } else {\r\n this.$l.linearDepth = this.depthValue.r;\r\n }\r\n this.$l.nonLinearDepth = ShaderHelper.linearNormalizedToNonLinearDepth(\r\n this,\r\n this.linearDepth,\r\n this.cameraNearFar\r\n );\r\n this.$l.clipSpacePos = pb.vec4(\r\n pb.sub(pb.mul(this.uv, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinearDepth, 0, 1)),\r\n 1\r\n );\r\n // this.$l.clipSpacePos = pb.vec4(this.uv, this.nonLinearDepth, 1);\r\n this.$l.vPos = pb.mul(this.invProj, this.clipSpacePos);\r\n this.vPos = pb.div(this.vPos, this.vPos.w);\r\n this.$return(this.vPos.xyz);\r\n });\r\n pb.func(\r\n 'getOcclusion',\r\n [pb.vec3('centerPos'), pb.vec3('centerNormal'), pb.vec3('samplePos')],\r\n function () {\r\n this.$l.viewDelta = pb.sub(this.samplePos, this.centerPos);\r\n this.$l.viewDistance = pb.length(this.viewDelta);\r\n this.$l.scaledScreenDistance = pb.mul(this.scaleDividedByCameraFar, this.viewDistance);\r\n this.$return(\r\n pb.div(\r\n pb.max(\r\n 0,\r\n pb.sub(\r\n pb.div(\r\n pb.sub(\r\n pb.dot(this.centerNormal, this.viewDelta),\r\n this.minResolutionMultipliedByCameraFar\r\n ),\r\n this.scaledScreenDistance\r\n ),\r\n this.bias\r\n )\r\n ),\r\n pb.add(pb.mul(this.scaledScreenDistance, this.scaledScreenDistance), 1)\r\n )\r\n );\r\n }\r\n );\r\n pb.func('getAO', [pb.vec3('vPos')], function () {\r\n this.scaleDividedByCameraFar = pb.div(this.scale, this.cameraNearFar.y);\r\n this.minResolutionMultipliedByCameraFar = pb.mul(this.minResolution, this.cameraNearFar.y);\r\n this.$l.centerViewNormal = pb.normalize(pb.cross(pb.dpdx(this.vPos), pb.dpdy(this.vPos)));\r\n this.$l.angle = pb.mul(\r\n this.rand(pb.add(this.$inputs.uv, pb.vec2(this.randomSeed))),\r\n Math.PI * 2\r\n );\r\n this.$l.radius = pb.div(pb.vec2(pb.mul(this.kernelRadius, 1 / NUM_SAMPLES)), this.size);\r\n this.$l.radiusStep = this.radius;\r\n this.$l.occlusionSum = pb.float(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$for(pb.int('i'), 0, NUM_SAMPLES, function () {\r\n this.$l.sampleUV = pb.add(\r\n this.$inputs.uv,\r\n pb.mul(pb.vec2(pb.cos(this.angle), pb.sin(this.angle)), this.radius)\r\n );\r\n this.radius = pb.add(this.radius, this.radiusStep);\r\n this.angle = pb.add(this.angle, (Math.PI * NUM_RINGS) / NUM_SAMPLES);\r\n this.samplePos = this.getPositionVS(this.sampleUV);\r\n this.occlusionSum = pb.add(\r\n this.occlusionSum,\r\n this.getOcclusion(this.vPos, this.centerViewNormal, this.samplePos)\r\n );\r\n this.weightSum = pb.add(this.weightSum, 1);\r\n });\r\n this.$if(pb.equal(this.weightSum, 0), function () {\r\n pb.discard();\r\n });\r\n this.$return(pb.div(pb.mul(this.occlusionSum, this.intensity), this.weightSum));\r\n });\r\n pb.main(function () {\r\n this.$l.vPos = this.getPositionVS(this.$inputs.uv);\r\n this.$l.ao = pb.clamp(pb.sub(1, this.getAO(this.vPos)), 0, packed ? 0.999 : 1);\r\n if (packed) {\r\n this.$outputs.outColor = encodeNormalizedFloatToRGBA(this, this.ao);\r\n } else {\r\n this.$outputs.outColor = pb.vec4(this.ao, this.ao, this.ao, 1);\r\n }\r\n });\r\n }\r\n })!;\r\n program.name = packed ? '@SAO_Packed' : '@SAO';\r\n return program;\r\n }\r\n if (!SAO._program) {\r\n SAO._program = createProgram(false);\r\n SAO._programPacked = createProgram(true);\r\n SAO._bindgroup = device.createBindGroup(SAO._program.bindGroupLayouts[0]);\r\n SAO._bindgroupPacked = device.createBindGroup(SAO._programPacked.bindGroupLayouts[0]);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["NUM_SAMPLES","NUM_RINGS","DepthLimitAOBlurBlitter","BilateralBlurBlitter","_packed","finalPhase","packed","val","invalidateHash","calcHash","readTexel","scope","type","srcTex","srcUV","srcLayer","sampleType","pb","$builder","texel","vec4","vec3","decodeNormalizedFloatFromRGBA","rrr","writeTexel","uv","outTexel","_finalPhase","encodeNormalizedFloatToRGBA","r","SAO","AbstractPostEffect","_program","_programPacked","_renderState","_renderStateBlend","_bindgroup","_bindgroupPacked","_saoScale","_saoBias","_saoIntensity","_saoRadius","_saoMinResolution","_saoRandomSeed","_saoBlurDepthCutoff","_blitterH","_blitterV","_supported","_layer","PostEffectLayer","opaque","kernelRadius","stdDev","scale","bias","radius","intensity","minResolution","blurKernelSize","Math","min","max","blurStdDev","blurDepthCutoff","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","viewport","getViewport","_prepare","passThrough","fmt","_getIntermediateTextureFormat","depth","getFramebuffer","getDepthAttachment","fbao","pool","fetchTemporalTexture2D","width","height","fbblur","format","cameraNearFar","Vector2","camera","getNearPlane","getFarPlane","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","bindgroup","setValue","needFlip","setTexture","fetchSampler","Matrix4x4","invert","getProjectionMatrix","setRenderStates","setProgram","setBindGroup","drawFullscreenQuad","size","depthTex","depthCutoff","sampler","renderStates","srgbOut","blit","popDeviceStates","releaseTexture","texCaps","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","supportFloatColorBuffer","_srcTexture","fb","isFloatFramebuffer","isFloatTextureFormat","getColorAttachments","framebufferCaps","supportFloatBlending","createRenderStateSet","useDepthState","enableTest","enableWrite","setCompareFunc","DEPTH_COMPARE_FARTHER","useRasterizerState","setCullMode","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha","createProgram","program","buildRenderProgram","vertex","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","fragment","tex2D","float","invProj","mat4","randomSeed","$l","scaleDividedByCameraFar","minResolutionMultipliedByCameraFar","func","a","b","c","dt","dot","sn","mod","PI","$return","fract","sin","depthValue","textureSample","linearDepth","nonLinearDepth","ShaderHelper","linearNormalizedToNonLinearDepth","clipSpacePos","sub","deviceDepthToClipZ","clamp","vPos","div","w","xyz","viewDelta","samplePos","centerPos","viewDistance","length","scaledScreenDistance","centerNormal","centerViewNormal","normalize","cross","dpdx","dpdy","angle","rand","radiusStep","occlusionSum","weightSum","$for","sampleUV","cos","getPositionVS","getOcclusion","equal","discard","ao","getAO","outColor","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
1
+ {"version":3,"file":"sao.js","sources":["../../src/posteffect/sao.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { isFloatTextureFormat } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { decodeNormalizedFloatFromRGBA, encodeNormalizedFloatToRGBA } from '../shaders/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_COMPARE_FARTHER, DEPTH_FARTHEST, Matrix4x4, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport { BilateralBlurBlitter } from '../blitter/bilateralblur';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { BlitType } from '../blitter';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst NUM_SAMPLES = 7;\r\nconst NUM_RINGS = 4;\r\n/**\r\n * Hard cap on the tap pattern's screen-space radius, in pixels.\r\n *\r\n * @remarks\r\n * Purely a performance guard, not a look control: the world-space radius is\r\n * projected per pixel, and without a cap a surface close to the near plane\r\n * would spread the taps across the whole screen, which destroys depth-texture\r\n * cache locality for no visual gain. At 1080p this is about a quarter of the\r\n * screen height, far wider than any sane occlusion radius projects to at a\r\n * normal working distance.\r\n */\r\nconst MAX_TAP_RADIUS_PIXELS = 256;\r\n/**\r\n * Mean of the falloff term over the fixed tap pattern, used to normalize the\r\n * occlusion sum so {@link SAO.intensity} does not depend on the radius.\r\n */\r\nconst MEAN_TAP_FALLOFF = 0.748834;\r\n\r\nclass DepthLimitAOBlurBlitter extends BilateralBlurBlitter {\r\n private _packed: boolean;\r\n constructor(finalPhase: boolean) {\r\n super(finalPhase);\r\n this._packed = false;\r\n }\r\n get packed() {\r\n return this._packed;\r\n }\r\n set packed(val) {\r\n if (this._packed !== !!val) {\r\n this._packed = !!val;\r\n this.invalidateHash();\r\n }\r\n }\r\n protected calcHash() {\r\n return `${this._packed}:${super.calcHash()}`;\r\n }\r\n readTexel(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint' | 'depth'\r\n ) {\r\n const pb = scope.$builder;\r\n const texel = super.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (this._packed) {\r\n return pb.vec4(pb.vec3(decodeNormalizedFloatFromRGBA(scope, texel)), 1);\r\n } else {\r\n return pb.vec4(texel.rrr, 1);\r\n }\r\n }\r\n writeTexel(scope: PBInsideFunctionScope, type: BlitType, uv: PBShaderExp, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const outTexel = super.writeTexel(scope, type, uv, pb.vec4(texel.rrr, 1));\r\n return this._finalPhase || !this._packed\r\n ? pb.vec4(outTexel.rrr, 1)\r\n : encodeNormalizedFloatToRGBA(scope, outTexel.r);\r\n }\r\n}\r\n/**\r\n * The Scalable Ambient Obscurance (SAO) post effect\r\n * @public\r\n */\r\nexport class SAO extends AbstractPostEffect {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static _programPacked: Nullable<GPUProgram> = null;\r\n private static _renderState: Nullable<RenderStateSet> = null;\r\n private static _renderStateBlend: Nullable<RenderStateSet> = null;\r\n private static _bindgroup: Nullable<BindGroup> = null;\r\n private static _bindgroupPacked: Nullable<BindGroup> = null;\r\n private _saoBias: number;\r\n private _saoIntensity: number;\r\n private _saoOcclusionRadius: number;\r\n private readonly _saoRandomSeed: number;\r\n private _saoBlurDepthCutoff: number;\r\n private readonly _blitterH: DepthLimitAOBlurBlitter;\r\n private readonly _blitterV: DepthLimitAOBlurBlitter;\r\n private _supported: boolean;\r\n /**\r\n * Creates an instance of SAO post effect\r\n */\r\n constructor() {\r\n super();\r\n this._supported = true;\r\n this._layer = PostEffectLayer.opaque;\r\n this._saoBias = 0.05;\r\n this._saoIntensity = 1;\r\n this._saoOcclusionRadius = 0.5;\r\n this._saoRandomSeed = 0;\r\n this._saoBlurDepthCutoff = 2;\r\n this._blitterH = new DepthLimitAOBlurBlitter(false);\r\n this._blitterH.kernelRadius = 8;\r\n this._blitterH.stdDev = 10;\r\n this._blitterV = new DepthLimitAOBlurBlitter(true);\r\n this._blitterV.kernelRadius = 8;\r\n this._blitterV.stdDev = 10;\r\n }\r\n /**\r\n * Strength of the occlusion term added by each tap.\r\n */\r\n get intensity() {\r\n return this._saoIntensity;\r\n }\r\n set intensity(val) {\r\n this._saoIntensity = val;\r\n }\r\n /**\r\n * Threshold below which a sample does not occlude, in the range 0..1.\r\n */\r\n get bias() {\r\n return this._saoBias;\r\n }\r\n set bias(val) {\r\n this._saoBias = val;\r\n }\r\n /**\r\n * World-space occlusion radius in metres.\r\n */\r\n get occlusionRadius() {\r\n return this._saoOcclusionRadius;\r\n }\r\n set occlusionRadius(val) {\r\n this._saoOcclusionRadius = val;\r\n }\r\n /** Blur kernel size */\r\n get blurKernelSize() {\r\n return this._blitterH.kernelRadius;\r\n }\r\n set blurKernelSize(val) {\r\n val = Math.min(64, Math.max(0, val >> 0));\r\n this._blitterH.kernelRadius = val;\r\n this._blitterV.kernelRadius = val;\r\n }\r\n /** Gaussian blur stddev value */\r\n get blurStdDev() {\r\n return this._blitterH.stdDev;\r\n }\r\n set blurStdDev(val) {\r\n this._blitterH.stdDev = val;\r\n this._blitterV.stdDev = val;\r\n }\r\n /** Cutoff of depth limited blur */\r\n get blurDepthCutoff() {\r\n return this._saoBlurDepthCutoff;\r\n }\r\n set blurDepthCutoff(val) {\r\n this._saoBlurDepthCutoff = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return true;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return true;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const viewport = device.getViewport();\r\n this._prepare(device, inputColorTexture);\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n if (!this._supported) {\r\n return;\r\n }\r\n const fmt = this._getIntermediateTextureFormat(device);\r\n const depth = device.getFramebuffer()!.getDepthAttachment() as Texture2D;\r\n\r\n const fbao = device.pool.fetchTemporalTexture2D(false, fmt, depth.width, depth.height, false);\r\n const fbblur = device.pool.fetchTemporalTexture2D(false, fmt, depth.width, depth.height, false);\r\n const packed = fbao.format === 'rgba8unorm';\r\n const cameraNearFar = new Vector2(ctx.camera.getNearPlane(), ctx.camera.getFarPlane());\r\n device.pushDeviceStates();\r\n device.setFramebuffer([fbao], depth);\r\n device.clearFrameBuffer(packed ? new Vector4(0, 0, 0, 1) : new Vector4(1, 0, 0, 1), null, null);\r\n const bindgroup = packed ? SAO._bindgroupPacked! : SAO._bindgroup!;\r\n bindgroup.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n bindgroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindgroup.setValue('invProj', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));\r\n bindgroup.setValue('bias', this._saoBias);\r\n bindgroup.setValue('cameraNearFar', cameraNearFar);\r\n bindgroup.setValue('intensity', this._saoIntensity);\r\n bindgroup.setValue('occlusionRadius', this._saoOcclusionRadius);\r\n bindgroup.setValue('size', new Vector2(viewport.width, viewport.height));\r\n bindgroup.setValue('randomSeed', this._saoRandomSeed);\r\n device.setRenderStates(SAO._renderState);\r\n device.setProgram(packed ? SAO._programPacked : SAO._program);\r\n device.setBindGroup(0, bindgroup);\r\n this.drawFullscreenQuad(SAO._renderState!);\r\n this._blitterH.size = new Vector2(inputColorTexture.width, inputColorTexture.height);\r\n this._blitterH.depthTex = sceneDepthTexture;\r\n this._blitterH.depthCutoff = this._saoBlurDepthCutoff;\r\n this._blitterH.sampler = fetchSampler('clamp_nearest_nomip');\r\n this._blitterH.cameraNearFar = cameraNearFar;\r\n this._blitterH.packed = packed;\r\n this._blitterH.renderStates = SAO._renderState;\r\n this._blitterV.size = new Vector2(inputColorTexture.width, inputColorTexture.height);\r\n this._blitterV.depthTex = sceneDepthTexture;\r\n this._blitterV.depthCutoff = this._saoBlurDepthCutoff;\r\n this._blitterV.sampler = fetchSampler('clamp_nearest_nomip');\r\n this._blitterV.cameraNearFar = cameraNearFar;\r\n this._blitterV.packed = packed;\r\n this._blitterV.srgbOut = srgbOutput;\r\n this._blitterV.renderStates = SAO._renderStateBlend;\r\n this._blitterH.blit(fbao, fbblur);\r\n device.popDeviceStates();\r\n this._blitterV.blit(fbblur, device.getFramebuffer()!);\r\n device.pool.releaseTexture(fbao);\r\n device.pool.releaseTexture(fbblur);\r\n }\r\n private _getIntermediateTextureFormat(device: AbstractDevice) {\r\n const texCaps = device.getDeviceCaps().textureCaps;\r\n return !texCaps.supportHalfFloatColorBuffer && !texCaps.supportFloatColorBuffer\r\n ? 'rgba8unorm'\r\n : texCaps.supportHalfFloatColorBuffer\r\n ? 'r16f'\r\n : 'r32f';\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n const fb = device.getFramebuffer();\r\n const isFloatFramebuffer = fb && isFloatTextureFormat(fb.getColorAttachments()[0].format);\r\n this._supported = !isFloatFramebuffer || device.getDeviceCaps().framebufferCaps.supportFloatBlending;\r\n if (this._supported) {\r\n if (!SAO._renderState) {\r\n SAO._renderState = device.createRenderStateSet();\r\n SAO._renderState\r\n .useDepthState()\r\n .enableTest(true)\r\n .enableWrite(false)\r\n .setCompareFunc(DEPTH_COMPARE_FARTHER);\r\n SAO._renderState.useRasterizerState().setCullMode('none');\r\n SAO._renderStateBlend = device.createRenderStateSet();\r\n SAO._renderStateBlend\r\n .useDepthState()\r\n .enableTest(true)\r\n .enableWrite(false)\r\n .setCompareFunc(DEPTH_COMPARE_FARTHER);\r\n SAO._renderStateBlend.useRasterizerState().setCullMode('none');\r\n SAO._renderStateBlend\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('zero', 'src-color')\r\n .setBlendFuncAlpha('zero', 'one');\r\n }\r\n function createProgram(packed: boolean) {\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invProj = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.bias = pb.float().uniform(0);\r\n this.occlusionRadius = pb.float().uniform(0);\r\n this.size = pb.vec2().uniform(0);\r\n this.randomSeed = pb.float().uniform(0);\r\n this.$l.occlusionRadiusSq = pb.float();\r\n pb.func('rand', [pb.vec2('uv')], function () {\r\n this.$l.a = 12.9898;\r\n this.$l.b = 78.233;\r\n this.$l.c = 43758.5453;\r\n this.$l.dt = pb.dot(this.uv, pb.vec2(this.a, this.b));\r\n this.$l.sn = pb.mod(this.dt, Math.PI);\r\n this.$return(pb.fract(pb.mul(pb.sin(this.sn), this.c)));\r\n });\r\n pb.func('getPositionVS', [pb.vec2('uv')], function () {\r\n this.$l.depthValue = pb.textureSample(this.depthTex, this.uv);\r\n this.$l.linearDepth = this.depthValue.r;\r\n this.$l.nonLinearDepth = ShaderHelper.linearNormalizedToNonLinearDepth(\r\n this,\r\n this.linearDepth,\r\n this.cameraNearFar\r\n );\r\n this.$l.clipSpacePos = pb.vec4(\r\n pb.sub(pb.mul(this.uv, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinearDepth, 0, 1)),\r\n 1\r\n );\r\n // this.$l.clipSpacePos = pb.vec4(this.uv, this.nonLinearDepth, 1);\r\n this.$l.vPos = pb.mul(this.invProj, this.clipSpacePos);\r\n this.vPos = pb.div(this.vPos, this.vPos.w);\r\n this.$return(this.vPos.xyz);\r\n });\r\n pb.func(\r\n 'getOcclusion',\r\n [pb.vec3('centerPos'), pb.vec3('centerNormal'), pb.vec3('samplePos')],\r\n function () {\r\n this.$l.viewDelta = pb.sub(this.samplePos, this.centerPos);\r\n this.$l.viewDistance = pb.max(pb.length(this.viewDelta), 1e-6);\r\n this.$return(\r\n pb.div(\r\n pb.max(\r\n 0,\r\n pb.sub(pb.div(pb.dot(this.centerNormal, this.viewDelta), this.viewDistance), this.bias)\r\n ),\r\n pb.add(1, pb.div(pb.mul(this.viewDistance, this.viewDistance), this.occlusionRadiusSq))\r\n )\r\n );\r\n }\r\n );\r\n pb.func('getAO', [pb.vec3('vPos')], function () {\r\n this.$l.centerViewNormal = pb.normalize(pb.cross(pb.dpdx(this.vPos), pb.dpdy(this.vPos)));\r\n this.$l.angle = pb.mul(\r\n this.rand(pb.add(this.$inputs.uv, pb.vec2(this.randomSeed))),\r\n Math.PI * 2\r\n );\r\n this.$l.projScale = pb.div(pb.mul(this.size.y, 0.5), pb.max(this.invProj[1].y, 1e-6));\r\n this.$l.viewDepth = pb.max(pb.neg(this.vPos.z), 1e-4);\r\n this.$l.radiusPx = pb.clamp(\r\n pb.div(pb.mul(this.occlusionRadius, this.projScale), this.viewDepth),\r\n 2,\r\n MAX_TAP_RADIUS_PIXELS\r\n );\r\n this.$l.effectiveRadius = pb.div(pb.mul(this.radiusPx, this.viewDepth), this.projScale);\r\n this.occlusionRadiusSq = pb.max(pb.mul(this.effectiveRadius, this.effectiveRadius), 1e-12);\r\n this.$l.radius = pb.div(pb.vec2(pb.mul(this.radiusPx, 1 / NUM_SAMPLES)), this.size);\r\n this.$l.radiusStep = this.radius;\r\n this.$l.occlusionSum = pb.float(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$for(pb.int('i'), 0, NUM_SAMPLES, function () {\r\n this.$l.sampleUV = pb.add(\r\n this.$inputs.uv,\r\n pb.mul(pb.vec2(pb.cos(this.angle), pb.sin(this.angle)), this.radius)\r\n );\r\n this.radius = pb.add(this.radius, this.radiusStep);\r\n this.angle = pb.add(this.angle, (Math.PI * NUM_RINGS) / NUM_SAMPLES);\r\n this.samplePos = this.getPositionVS(this.sampleUV);\r\n this.occlusionSum = pb.add(\r\n this.occlusionSum,\r\n this.getOcclusion(this.vPos, this.centerViewNormal, this.samplePos)\r\n );\r\n this.weightSum = pb.add(this.weightSum, 1);\r\n });\r\n this.$if(pb.equal(this.weightSum, 0), function () {\r\n pb.discard();\r\n });\r\n this.$return(\r\n pb.div(pb.mul(this.occlusionSum, this.intensity), pb.mul(this.weightSum, MEAN_TAP_FALLOFF))\r\n );\r\n });\r\n pb.main(function () {\r\n this.$l.vPos = this.getPositionVS(this.$inputs.uv);\r\n this.$l.ao = pb.clamp(pb.sub(1, this.getAO(this.vPos)), 0, packed ? 0.999 : 1);\r\n if (packed) {\r\n this.$outputs.outColor = encodeNormalizedFloatToRGBA(this, this.ao);\r\n } else {\r\n this.$outputs.outColor = pb.vec4(this.ao, this.ao, this.ao, 1);\r\n }\r\n });\r\n }\r\n })!;\r\n program.name = packed ? '@SAO_Packed' : '@SAO';\r\n return program;\r\n }\r\n if (!SAO._program) {\r\n SAO._program = createProgram(false);\r\n SAO._programPacked = createProgram(true);\r\n SAO._bindgroup = device.createBindGroup(SAO._program.bindGroupLayouts[0]);\r\n SAO._bindgroupPacked = device.createBindGroup(SAO._programPacked.bindGroupLayouts[0]);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["NUM_SAMPLES","NUM_RINGS","MAX_TAP_RADIUS_PIXELS","MEAN_TAP_FALLOFF","DepthLimitAOBlurBlitter","BilateralBlurBlitter","_packed","finalPhase","packed","val","invalidateHash","calcHash","readTexel","scope","type","srcTex","srcUV","srcLayer","sampleType","pb","$builder","texel","vec4","vec3","decodeNormalizedFloatFromRGBA","rrr","writeTexel","uv","outTexel","_finalPhase","encodeNormalizedFloatToRGBA","r","SAO","AbstractPostEffect","_program","_programPacked","_renderState","_renderStateBlend","_bindgroup","_bindgroupPacked","_saoBias","_saoIntensity","_saoOcclusionRadius","_saoRandomSeed","_saoBlurDepthCutoff","_blitterH","_blitterV","_supported","_layer","PostEffectLayer","opaque","kernelRadius","stdDev","intensity","bias","occlusionRadius","blurKernelSize","Math","min","max","blurStdDev","blurDepthCutoff","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","viewport","getViewport","_prepare","passThrough","fmt","_getIntermediateTextureFormat","depth","getFramebuffer","getDepthAttachment","fbao","pool","fetchTemporalTexture2D","width","height","fbblur","format","cameraNearFar","Vector2","camera","getNearPlane","getFarPlane","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","bindgroup","setValue","needFlip","setTexture","fetchSampler","Matrix4x4","invert","getProjectionMatrix","setRenderStates","setProgram","setBindGroup","drawFullscreenQuad","size","depthTex","depthCutoff","sampler","renderStates","srgbOut","blit","popDeviceStates","releaseTexture","texCaps","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","supportFloatColorBuffer","_srcTexture","fb","isFloatFramebuffer","isFloatTextureFormat","getColorAttachments","framebufferCaps","supportFloatBlending","createRenderStateSet","useDepthState","enableTest","enableWrite","setCompareFunc","DEPTH_COMPARE_FARTHER","useRasterizerState","setCullMode","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha","createProgram","program","buildRenderProgram","vertex","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","fragment","tex2D","invProj","mat4","float","randomSeed","$l","occlusionRadiusSq","func","a","b","c","dt","dot","sn","mod","PI","$return","fract","sin","depthValue","textureSample","linearDepth","nonLinearDepth","ShaderHelper","linearNormalizedToNonLinearDepth","clipSpacePos","sub","deviceDepthToClipZ","clamp","vPos","div","w","xyz","viewDelta","samplePos","centerPos","viewDistance","length","centerNormal","centerViewNormal","normalize","cross","dpdx","dpdy","angle","rand","projScale","viewDepth","z","radiusPx","effectiveRadius","radius","radiusStep","occlusionSum","weightSum","$for","sampleUV","cos","getPositionVS","getOcclusion","equal","discard","ao","getAO","outColor","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}