@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ssgi.js","sources":["../../src/posteffect/ssgi.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Matrix4x4, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, FrameBuffer, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\nimport type { RGHandle, RGPassBuilder, RGTextureDesc } from '../render/rendergraph/types';\r\nimport { screenSpaceRayTracing_HiZ, screenSpaceRayTracing_Linear2D } from '../shaders/ssr';\r\nimport { ShaderHelper } from '../material';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\n\r\nconst IRRADIANCE_FORMAT = 'rgba16f' as const;\r\nconst SURFACE_FORMAT = 'rgba16f' as const;\r\nconst MOMENTS_FORMAT = 'rgba16f' as const;\r\n// AO is scalar; r16f is available wherever SSGI runs.\r\nconst AO_FORMAT = 'r16f' as const;\r\nconst HALF_FLOAT_MAX = 65504;\r\n// Keep squared luminance below the rgba16f range.\r\nconst MOMENT_LUMINANCE_MAX = 255;\r\n\r\n/**\r\n * Screen-space diffuse global illumination.\r\n *\r\n * @public\r\n */\r\nexport class SSGI extends AbstractPostEffect {\r\n private static _tracePrograms: Record<string, GPUProgram> = {};\r\n private static _temporalPrograms: Record<string, GPUProgram> = {};\r\n private static _atrousProgram: GPUProgram | null = null;\r\n private static _surfaceProgram: GPUProgram | null = null;\r\n private static _upsampleProgram: GPUProgram | null = null;\r\n private static _compositePrograms: Record<string, GPUProgram> = {};\r\n\r\n private _traceBindGroups: Record<string, BindGroup> = {};\r\n private _temporalBindGroups: Record<string, BindGroup> = {};\r\n private _atrousBindGroups: Record<string, BindGroup> = {};\r\n private _surfaceBindGroups: Record<string, BindGroup> = {};\r\n private _upsampleBindGroups: Record<string, BindGroup> = {};\r\n private _compositeBindGroups: Record<string, BindGroup> = {};\r\n\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.opaque;\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI;\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireMotionVectorTexture} */\r\n requireMotionVectorTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI && ctx.device.type === 'webgpu';\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireHiZTexture} */\r\n requireHiZTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI && ctx.device.type === 'webgpu';\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireSceneNormalTexture} */\r\n requireSceneNormalTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI;\r\n }\r\n\r\n /** Build trace, temporal, denoise, upsample, history and pass-through stages. */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx, history, blackboard } = s;\r\n if (!ctx.SSGI || !history) {\r\n return s.input;\r\n }\r\n const linearDepthHandle = blackboard.get(FrameResources.LinearDepth);\r\n const normalHandle = blackboard.get(FrameResources.SceneNormal);\r\n const motionHandle = blackboard.get(FrameResources.MotionVector);\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n // Traced hits read this as outgoing surface radiance, so it must exclude the\r\n // fog the camera ray accumulated: that fog belongs to a different path than\r\n // the one being integrated, and feeding it back would brighten every bounce.\r\n // Absent when the scene has no fog, in which case SceneColor is already fog\r\n // free. Both the sampled color and the committed history use it, otherwise\r\n // the current and previous frames would disagree and flicker.\r\n const noFogHandle = blackboard.get(FrameResources.SceneColorNoFog);\r\n const sampleColorHandle = noFogHandle ?? s.input;\r\n if (!linearDepthHandle || !normalHandle) {\r\n return s.input;\r\n }\r\n\r\n const settings = ctx.camera.ssgiResolvedSettings;\r\n const traceWidth = settings.halfRes ? Math.max(1, Math.ceil(s.width * 0.5)) : s.width;\r\n const traceHeight = settings.halfRes ? Math.max(1, Math.ceil(s.height * 0.5)) : s.height;\r\n const traceSize = { width: traceWidth, height: traceHeight };\r\n const fullSize = { width: s.width, height: s.height };\r\n const traceDesc: RGTextureDesc = {\r\n format: IRRADIANCE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const fullIrradianceDesc: RGTextureDesc = {\r\n format: IRRADIANCE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const surfaceDesc: RGTextureDesc = {\r\n format: SURFACE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const momentsDesc: RGTextureDesc = {\r\n format: MOMENTS_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const aoTraceDesc: RGTextureDesc = {\r\n format: AO_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const fullAODesc: RGTextureDesc = {\r\n format: AO_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n\r\n const findHistoryRead = (name: string) =>\r\n s.historyReads.find((binding) => binding.name === name)?.handle ?? null;\r\n const previousIrradianceHandle = findHistoryRead(RGHistoryResources.SSGI_IRRADIANCE);\r\n const previousSurfaceHandle = findHistoryRead(RGHistoryResources.SSGI_SURFACE);\r\n const previousMomentsHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_MOMENTS,\r\n momentsDesc,\r\n traceSize\r\n );\r\n // Only this effect's own temporal pass reads the AO history, so it is\r\n // imported directly instead of being routed through the light pass history\r\n // read bindings the way irradiance and surface are.\r\n const previousAOHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_AO,\r\n aoTraceDesc,\r\n traceSize\r\n );\r\n const previousSceneColorHandle =\r\n ctx.device.type === 'webgpu'\r\n ? history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_SCENE_COLOR,\r\n {\r\n format: s.colorFormat,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n },\r\n fullSize\r\n )\r\n : null;\r\n const canSampleSceneHistory = !!(previousSceneColorHandle && previousSurfaceHandle && motionHandle);\r\n\r\n const readFrameInputs = (builder: RGPassBuilder) => {\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n if (motionHandle) {\r\n builder.read(motionHandle);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n };\r\n\r\n // Trace one or two cosine-weighted diffuse rays. A hit prefers the previous\r\n // frame through previousHitUV = hitUV - motion(hitUV) for multi-bounce\r\n // feedback and falls back to the current frame when that reprojection fails.\r\n const traceResult = graph.addPass('SSGI:Trace', (builder) => {\r\n builder.read(sampleColorHandle);\r\n readFrameInputs(builder);\r\n if (canSampleSceneHistory) {\r\n builder.read(previousSceneColorHandle!);\r\n builder.read(previousSurfaceHandle!);\r\n }\r\n const out = builder.createTexture({ ...traceDesc, label: 'SSGI:rawIrradiance' });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: 'SSGI:rawAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:traceFB',\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer<FrameBuffer>(fb));\r\n this.trace(\r\n ctx,\r\n rg.getTexture<Texture2D>(sampleColorHandle),\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(previousSceneColorHandle!) : null,\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(motionHandle!) : null,\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(previousSurfaceHandle!) : null,\r\n hiZHandle ? rg.getTexture<Texture2D>(hiZHandle) : null,\r\n traceWidth,\r\n traceHeight\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n\r\n // Store the current full-resolution surface independently from irradiance;\r\n // no albedo MRT is needed because the next lighting pass applies the BRDF.\r\n const surfaceHandle = graph.addPass('SSGI:Surface', (builder) => {\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...surfaceDesc, label: 'SSGI:surface' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:surfaceFB',\r\n width: s.width,\r\n height: s.height,\r\n colorAttachments: out,\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer<FrameBuffer>(fb));\r\n this.writeSurface(\r\n ctx,\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n const canTemporal = !!(\r\n ctx.device.type === 'webgpu' &&\r\n ctx.camera.ssgiTemporal &&\r\n motionHandle &&\r\n previousIrradianceHandle &&\r\n previousSurfaceHandle &&\r\n previousMomentsHandle &&\r\n previousAOHandle\r\n );\r\n\r\n // Temporal pass always creates moments. On the first frame it simply\r\n // initializes them; with valid history it rejects by depth and normal,\r\n // neighborhood-clamps radiance, and accumulates first/second moments.\r\n const temporalResult = graph.addPass('SSGI:Temporal', (builder) => {\r\n builder.read(traceResult.irradiance);\r\n builder.read(traceResult.ao);\r\n readFrameInputs(builder);\r\n if (canTemporal) {\r\n builder.read(previousIrradianceHandle!);\r\n builder.read(previousSurfaceHandle!);\r\n builder.read(previousMomentsHandle!);\r\n builder.read(previousAOHandle!);\r\n }\r\n const irradiance = builder.createTexture({ ...traceDesc, label: 'SSGI:temporalIrradiance' });\r\n const moments = builder.createTexture({ ...momentsDesc, label: 'SSGI:moments' });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: 'SSGI:temporalAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:temporalFB',\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [irradiance, moments, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer<FrameBuffer>(fb));\r\n this.temporal(\r\n ctx,\r\n rg.getTexture<Texture2D>(traceResult.irradiance),\r\n rg.getTexture<Texture2D>(traceResult.ao),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n canTemporal ? rg.getTexture<Texture2D>(motionHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousIrradianceHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousSurfaceHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousMomentsHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousAOHandle!) : null,\r\n traceWidth,\r\n traceHeight\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance, moments, ao };\r\n });\r\n\r\n // Variance-guided, cross-bilateral a-trous filtering. The increasing\r\n // kernel step removes low-frequency Monte Carlo noise while depth/normal\r\n // weights preserve discontinuities.\r\n let filteredHandle = temporalResult.irradiance;\r\n let filteredAOHandle = temporalResult.ao;\r\n for (let pass = 0; pass < settings.denoisePasses; pass++) {\r\n const source = filteredHandle;\r\n const aoSource = filteredAOHandle;\r\n const filtered = graph.addPass(`SSGI:ATrous:${pass}`, (builder) => {\r\n builder.read(source);\r\n builder.read(aoSource);\r\n builder.read(temporalResult.moments);\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...traceDesc, label: `SSGI:atrous${pass}` });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: `SSGI:atrousAO${pass}` });\r\n const fb = builder.createFramebuffer({\r\n label: `SSGI:atrousFB${pass}`,\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer<FrameBuffer>(fb));\r\n this.atrous(\r\n ctx,\r\n rg.getTexture<Texture2D>(source),\r\n rg.getTexture<Texture2D>(aoSource),\r\n rg.getTexture<Texture2D>(temporalResult.moments),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n traceWidth,\r\n traceHeight,\r\n 1 << pass,\r\n canTemporal\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n filteredHandle = filtered.irradiance;\r\n filteredAOHandle = filtered.ao;\r\n }\r\n\r\n // Half-resolution presets use a joint bilateral upsample before history is\r\n // consumed by full-resolution materials on the next frame.\r\n let finalIrradianceHandle = filteredHandle;\r\n let finalAOHandle = filteredAOHandle;\r\n if (settings.halfRes) {\r\n const source = filteredHandle;\r\n const aoSource = filteredAOHandle;\r\n const upsampled = graph.addPass('SSGI:Upsample', (builder) => {\r\n builder.read(source);\r\n builder.read(aoSource);\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...fullIrradianceDesc, label: 'SSGI:upsampledIrradiance' });\r\n const ao = builder.createTexture({ ...fullAODesc, label: 'SSGI:upsampledAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:upsampleFB',\r\n width: s.width,\r\n height: s.height,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer<FrameBuffer>(fb));\r\n this.upsample(\r\n ctx,\r\n rg.getTexture<Texture2D>(source),\r\n rg.getTexture<Texture2D>(aoSource),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n finalIrradianceHandle = upsampled.irradiance;\r\n finalAOHandle = upsampled.ao;\r\n }\r\n\r\n // Pinned before the commit closure captures it: the a-trous loop above\r\n // reassigns the handle, and the AO history has to be the trace-resolution\r\n // one regardless of whether an upsample ran.\r\n const traceResolutionAOHandle = filteredAOHandle;\r\n\r\n // SSGI history is independent from TAA/SSR history. Commit the opaque HDR\r\n // SceneColor input (before SSR/transparency/tone-map/AA), irradiance,\r\n // surface and moments, then pass SceneColor through unchanged.\r\n return graph.addPass('SSGI:Commit', (builder) => {\r\n builder.read(s.input);\r\n if (noFogHandle) {\r\n builder.read(noFogHandle);\r\n }\r\n builder.read(finalIrradianceHandle);\r\n builder.read(finalAOHandle);\r\n // The trace-resolution AO is what goes back into history, so it has to be\r\n // read here too even when the upsampled one is what gets composited.\r\n builder.read(traceResolutionAOHandle);\r\n builder.read(surfaceHandle);\r\n builder.read(temporalResult.moments);\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(\r\n output.framebuffer ? rg.getFramebuffer<FrameBuffer>(output.framebuffer) : null\r\n );\r\n const sceneColor = rg.getTexture<Texture2D>(s.input);\r\n const irradiance = rg.getTexture<Texture2D>(finalIrradianceHandle);\r\n const ao = rg.getTexture<Texture2D>(finalAOHandle);\r\n const filteredAO = rg.getTexture<Texture2D>(traceResolutionAOHandle);\r\n const surface = rg.getTexture<Texture2D>(surfaceHandle);\r\n const moments = rg.getTexture<Texture2D>(temporalResult.moments);\r\n if (ctx.camera.ssgiAOIntensity > 0) {\r\n this.compositeAO(ctx, sceneColor, ao, output.srgbOutput);\r\n } else {\r\n this.passThrough(ctx, sceneColor, output.srgbOutput);\r\n }\r\n if (ctx.device.type === 'webgpu') {\r\n // Commit the same fog-free color the trace sampled, so next frame's\r\n // reprojected history is on the same footing as this frame's fallback.\r\n this.commitHistory(\r\n history,\r\n RGHistoryResources.SSGI_SCENE_COLOR,\r\n rg.getTexture<Texture2D>(sampleColorHandle)\r\n );\r\n }\r\n this.commitHistory(history, RGHistoryResources.SSGI_IRRADIANCE, irradiance);\r\n this.commitHistory(history, RGHistoryResources.SSGI_SURFACE, surface);\r\n this.commitHistory(history, RGHistoryResources.SSGI_MOMENTS, moments);\r\n // Committed at trace resolution: the temporal pass that consumes it\r\n // runs before the upsample, so a full-resolution AO would fail the\r\n // descriptor compatibility check and silently disable accumulation.\r\n this.commitHistory(history, RGHistoryResources.SSGI_AO, filteredAO);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n\r\n /** @internal */\r\n private commitHistory(\r\n history: NonNullable<PostEffectSetupContext['history']>,\r\n name: string,\r\n texture: Texture2D\r\n ) {\r\n history.queueRetainedCommit(\r\n name,\r\n {\r\n format: texture.format,\r\n sizeMode: 'absolute',\r\n width: texture.width,\r\n height: texture.height\r\n },\r\n { width: texture.width, height: texture.height },\r\n texture\r\n );\r\n }\r\n\r\n /** @internal */\r\n private trace(\r\n ctx: DrawContext,\r\n currentColor: Texture2D,\r\n previousColor: Texture2D | null,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n motion: Texture2D | null,\r\n previousSurface: Texture2D | null,\r\n hiZ: Texture2D | null,\r\n width: number,\r\n height: number\r\n ) {\r\n const sampleHistory = !!(previousColor && motion && previousSurface);\r\n const envHash = ctx.env!.light.getHash();\r\n const historyHash = sampleHistory ? `${previousColor!.uid}:${motion!.uid}:${previousSurface!.uid}` : '';\r\n const hizHash = hiZ ? `${hiZ.uid}` : '';\r\n const programHash = `${sampleHistory ? '1' : '0'}:${hiZ ? '1' : '0'}:${ctx.camera.ssgiResolvedSettings.raysPerPixel}:${envHash}`;\r\n const bindGroupHash = `${currentColor.uid}:${depth.uid}:${normal.uid}:(${historyHash}):(${hizHash}):${ctx.camera.ssgiResolvedSettings.raysPerPixel}:${envHash}`;\r\n let program = SSGI._tracePrograms[programHash];\r\n if (!program) {\r\n program = this.createTraceProgram(ctx, !!hiZ, sampleHistory);\r\n SSGI._tracePrograms[programHash] = program;\r\n }\r\n const colorSampler = fetchSampler(\r\n ctx.device.type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip'\r\n );\r\n let bindGroup = this._traceBindGroups[bindGroupHash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('currentColorTex', currentColor, colorSampler);\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n if (sampleHistory) {\r\n bindGroup.setTexture('previousColorTex', previousColor!, colorSampler);\r\n bindGroup.setTexture('motionTex', motion!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('previousSurfaceTex', previousSurface!, fetchSampler('clamp_nearest_nomip'));\r\n }\r\n if (hiZ) {\r\n bindGroup.setTexture('hizTex', hiZ, fetchSampler('clamp_nearest'));\r\n bindGroup.setValue('depthMipLevels', hiZ.mipLevelCount);\r\n }\r\n this._traceBindGroups[bindGroupHash] = bindGroup;\r\n }\r\n if (sampleHistory) {\r\n bindGroup.setValue(\r\n 'historyRejectParams',\r\n new Vector2(ctx.camera.ssgiDepthReject, ctx.camera.ssgiNormalReject)\r\n );\r\n }\r\n bindGroup.setValue('cameraNearFar', new Vector2(ctx.camera.getNearPlane(), ctx.camera.getFarPlane()));\r\n bindGroup.setValue('viewMatrix', ctx.camera.viewMatrix);\r\n bindGroup.setValue('invViewMatrix', ctx.camera.worldMatrix);\r\n bindGroup.setValue('projMatrix', ctx.camera.getProjectionMatrix());\r\n bindGroup.setValue('invProjMatrix', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));\r\n bindGroup.setValue(\r\n 'traceParams',\r\n new Vector4(\r\n ctx.camera.ssgiMaxDistance,\r\n ctx.camera.ssgiThickness,\r\n ctx.camera.ssgiResolvedSettings.maxSteps,\r\n ctx.camera.ssgiStride\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'targetSize',\r\n new Vector4(width, height, hiZ?.width ?? depth.width, hiZ?.height ?? depth.height)\r\n );\r\n bindGroup.setValue(\r\n 'radianceParams',\r\n new Vector4(\r\n ctx.camera.ssgiIntensity,\r\n ctx.camera.ssgiMaxRayIntensity,\r\n ShaderHelper.getEnvLightLuminance(ctx),\r\n ctx.device.frameInfo.frameCounter\r\n )\r\n );\r\n bindGroup.setValue('skyOcclusion', ctx.camera.ssgiSkyOcclusion);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.env!.light.envLight.updateBindGroup(bindGroup);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private temporal(\r\n ctx: DrawContext,\r\n current: Texture2D,\r\n currentAO: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n motion: Texture2D | null,\r\n previousIrradiance: Texture2D | null,\r\n previousSurface: Texture2D | null,\r\n previousMoments: Texture2D | null,\r\n previousAO: Texture2D | null,\r\n width: number,\r\n height: number\r\n ) {\r\n const hasHistory = !!(motion && previousIrradiance && previousSurface && previousMoments && previousAO);\r\n const hash = hasHistory\r\n ? `history:${current.uid}:${currentAO.uid}:${depth.uid}:${normal.uid}:${motion!.uid}:${previousIrradiance!.uid}:${previousSurface.uid}:${previousMoments.uid}:${previousAO!.uid}`\r\n : `initialize:${current.uid}:${currentAO.uid}:${depth.uid}:${normal.uid}`;\r\n let program = SSGI._temporalPrograms[hash];\r\n if (!program) {\r\n program = this.createTemporalProgram(ctx, hasHistory);\r\n SSGI._temporalPrograms[hash] = program;\r\n }\r\n let bindGroup = this._temporalBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('currentTex', current, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('currentAOTex', currentAO, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n if (hasHistory) {\r\n bindGroup.setTexture('motionTex', motion!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n 'previousIrradianceTex',\r\n previousIrradiance!,\r\n fetchSampler('clamp_linear_nomip')\r\n );\r\n bindGroup.setTexture('previousSurfaceTex', previousSurface!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('previousMomentsTex', previousMoments!, fetchSampler('clamp_linear_nomip'));\r\n // Linear is safe here: this branch only runs on WebGPU, where r16f is\r\n // unconditionally filterable, and the read is at a reprojected UV.\r\n bindGroup.setTexture('previousAOTex', previousAO!, fetchSampler('clamp_linear_nomip'));\r\n }\r\n this._temporalBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('targetSize', new Vector4(width, height, depth.width, depth.height));\r\n bindGroup.setValue(\r\n 'temporalParams',\r\n new Vector4(\r\n ctx.camera.ssgiTemporalWeight,\r\n ctx.camera.ssgiDepthReject,\r\n ctx.camera.ssgiNormalReject,\r\n ctx.camera.getFarPlane()\r\n )\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private atrous(\r\n ctx: DrawContext,\r\n source: Texture2D,\r\n aoSource: Texture2D,\r\n moments: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n width: number,\r\n height: number,\r\n step: number,\r\n hasTemporalHistory: boolean\r\n ) {\r\n let program = SSGI._atrousProgram;\r\n if (!program) {\r\n program = this.createAtrousProgram(ctx);\r\n SSGI._atrousProgram = program;\r\n }\r\n const hash = `atrous:${source.uid}:${aoSource.uid}:${moments.uid}:${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._atrousBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('sourceTex', source, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('aoSourceTex', aoSource, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('momentsTex', moments, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n this._atrousBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('targetSize', new Vector4(width, height, depth.width, depth.height));\r\n bindGroup.setValue(\r\n 'filterParams',\r\n new Vector4(\r\n step,\r\n Math.max(0.001, ctx.camera.ssgiDepthReject),\r\n Math.max(1, ctx.camera.ssgiNormalReject * 32),\r\n 4\r\n )\r\n );\r\n // Number of accumulated frames a pixel needs before its variance estimate is\r\n // trusted. Zero disables the ramp for paths that never build history, where\r\n // the stored length is pinned at 1 and would read as permanently new.\r\n bindGroup.setValue('denoiseParams', new Vector4(hasTemporalHistory ? 8 : 0, 0, 0, 0));\r\n bindGroup.setValue('cameraFar', ctx.camera.getFarPlane());\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private writeSurface(ctx: DrawContext, depth: Texture2D, normal: Texture2D) {\r\n let program = SSGI._surfaceProgram;\r\n if (!program) {\r\n program = this.createSurfaceProgram(ctx);\r\n SSGI._surfaceProgram = program;\r\n }\r\n const hash = `${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._surfaceBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('targetSize', new Vector2(depth.width, depth.height));\r\n this._surfaceBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('cameraFar', ctx.camera.getFarPlane());\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private upsample(\r\n ctx: DrawContext,\r\n source: Texture2D,\r\n aoSource: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D\r\n ) {\r\n let program = SSGI._upsampleProgram;\r\n if (!program) {\r\n program = this.createUpsampleProgram(ctx);\r\n SSGI._upsampleProgram = program;\r\n }\r\n const hash = `${source.uid}:${aoSource.uid}:${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._upsampleBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('sourceTex', source, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('aoSourceTex', aoSource, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('targetSize', new Vector4(source.width, source.height, depth.width, depth.height));\r\n this._upsampleBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue(\r\n 'guideParams',\r\n new Vector4(\r\n Math.max(0.001, ctx.camera.ssgiDepthReject),\r\n Math.max(1, ctx.camera.ssgiNormalReject * 32),\r\n ctx.camera.getFarPlane(),\r\n 0\r\n )\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private createTraceProgram(ctx: DrawContext, useHiZ: boolean, sampleHistory: boolean) {\r\n const raysPerPixel = ctx.camera.ssgiResolvedSettings.raysPerPixel;\r\n const program = ctx.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.currentColorTex = pb.tex2D().uniform(0);\r\n // Linear depth is r32f (or rg32f when thickness is enabled). These\r\n // formats are not filterable without the optional float32-filterable\r\n // feature, and all SSGI depth reads use a nearest sampler.\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n if (sampleHistory) {\r\n this.previousColorTex = pb.tex2D().uniform(0);\r\n this.motionTex = pb.tex2D().uniform(0);\r\n this.previousSurfaceTex = pb.tex2D().uniform(0);\r\n this.historyRejectParams = pb.vec2().uniform(0);\r\n }\r\n if (useHiZ) {\r\n // Hi-Z is stored as r32f. It is only read with a nearest sampler,\r\n // so use the unfilterable sample type for adapters without the\r\n // optional float32-filterable feature (notably some AMD iGPUs).\r\n this.hizTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.depthMipLevels = pb.int().uniform(0);\r\n }\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.viewMatrix = pb.mat4().uniform(0);\r\n this.invViewMatrix = pb.mat4().uniform(0);\r\n this.projMatrix = pb.mat4().uniform(0);\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.traceParams = pb.vec4().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.radianceParams = pb.vec4().uniform(0);\r\n this.skyOcclusion = pb.float().uniform(0);\r\n ctx.env!.light.envLight.initShaderBindings(pb);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_getPosition', [pb.vec2('uv')], function () {\r\n this.$l.linearDepth = ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0);\r\n this.$l.nonLinearDepth = ShaderHelper.linearNormalizedToNonLinearDepth(\r\n this,\r\n this.linearDepth,\r\n this.cameraNearFar\r\n );\r\n this.$l.clipPos = 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.viewPos = pb.mul(this.invProjMatrix, this.clipPos);\r\n this.$return(pb.vec4(pb.div(this.viewPos.xyz, this.viewPos.w), this.linearDepth));\r\n });\r\n pb.func('SSGI_hash22', [pb.vec2('p'), pb.float('seed')], function () {\r\n this.$l.q = pb.vec2(pb.dot(this.p, pb.vec2(127.1, 311.7)), pb.dot(this.p, pb.vec2(269.5, 183.3)));\r\n this.$return(pb.fract(pb.mul(pb.sin(pb.add(this.q, this.seed)), 43758.5453)));\r\n });\r\n pb.func('SSGI_cosineDirection', [pb.vec3('n'), pb.vec2('xi')], function () {\r\n this.$l.up = this.$choice(pb.lessThan(pb.abs(this.n.z), 0.999), pb.vec3(0, 0, 1), pb.vec3(1, 0, 0));\r\n this.$l.tangent = pb.normalize(pb.cross(this.up, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.r = pb.sqrt(this.xi.x);\r\n this.$l.phi = pb.mul(2 * Math.PI, this.xi.y);\r\n this.$l.local = pb.vec3(\r\n pb.mul(this.r, pb.cos(this.phi)),\r\n pb.mul(this.r, pb.sin(this.phi)),\r\n pb.sqrt(pb.max(0, pb.sub(1, this.xi.x)))\r\n );\r\n this.$return(\r\n pb.normalize(\r\n pb.add(\r\n pb.mul(this.tangent, this.local.x),\r\n pb.mul(this.bitangent, this.local.y),\r\n pb.mul(this.n, this.local.z)\r\n )\r\n )\r\n );\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.pos = this.SSGI_getPosition(this.uv);\r\n this.$if(pb.greaterThanEqual(this.pos.w, 1), function () {\r\n this.$outputs.outColor = pb.vec4(0);\r\n // Sky is unoccluded. Its irradiance validity is zero, so this value\r\n // is never read as a weight, but it must not be a dark texel: the\r\n // a-trous and upsample kernels reach across the silhouette.\r\n this.$outputs.outAO = pb.vec4(1);\r\n }).$else(function () {\r\n this.$l.worldNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.viewNormal = pb.normalize(pb.mul(this.viewMatrix, pb.vec4(this.worldNormal, 0)).xyz);\r\n // Use the SH-integrated diffuse IBL as an exact, noise-free\r\n // baseline. Stochastic rays only estimate the screen-space\r\n // replacement relative to the environment in the same direction.\r\n //\r\n // getIrradiance returns the cosine-convolved SH, which already\r\n // carries the 1/PI of the Lambert BRDF: materials consume it as\r\n // k_D * irradiance with no further division, matching punctual\r\n // lights that apply 1/PI explicitly. The published history is mixed\r\n // against that same value in the lighting pass, so this baseline\r\n // must stay in those units and must not be scaled by PI.\r\n this.$l.iblIrradiance = pb.mul(\r\n ctx.env!.light.envLight.getIrradiance(this, this.worldNormal),\r\n this.radianceParams.z\r\n );\r\n this.$l.correctionSum = pb.vec3(0);\r\n // Rays whose outcome the depth buffer cannot resolve (they left the\r\n // screen or ran out of iterations behind geometry) are excluded from\r\n // the average instead of counted as unoccluded sky.\r\n this.$l.determinateSum = pb.float(0);\r\n this.$l.escapedSum = pb.float(0);\r\n // Ambient occlusion reuses the very same visibility measurement the\r\n // sky removal is built on, so the two can never disagree. No extra\r\n // ray march: only this accumulator is new.\r\n this.$l.occludedSum = pb.float(0);\r\n this.$for(pb.float('rayIndex'), 0, raysPerPixel, function () {\r\n this.$l.xi = this.SSGI_hash22(\r\n pb.add(pb.mul(this.uv, this.targetSize.xy), pb.vec2(this.rayIndex, pb.mul(this.rayIndex, 7))),\r\n pb.add(this.radianceParams.w, pb.mul(this.rayIndex, 17))\r\n );\r\n this.$l.worldRay = this.SSGI_cosineDirection(this.worldNormal, this.xi);\r\n this.$l.viewRay = pb.normalize(pb.mul(this.viewMatrix, pb.vec4(this.worldRay, 0)).xyz);\r\n this.$l.rayOrigin = pb.add(this.pos.xyz, pb.mul(this.viewNormal, this.traceParams.y, 0.25));\r\n // vec3(occluded, escaped, rawConfidence) - see screenSpaceRayTracing_Linear2D.\r\n this.$l.giTrace = pb.vec3(0);\r\n if (useHiZ) {\r\n // UE5 SSGI: diffuse rays march with RayRoughness = 1 (fast mip\r\n // ramp) and StepOffset = noise - 0.9. A dedicated hash keeps\r\n // the jitter decorrelated from the direction sample.\r\n this.$l.stepOffset = pb.sub(\r\n this.SSGI_hash22(\r\n pb.add(pb.mul(this.uv, this.targetSize.xy), pb.vec2(pb.mul(this.rayIndex, 23), 11)),\r\n pb.add(this.radianceParams.w, pb.mul(this.rayIndex, 29))\r\n ).x,\r\n 0.9\r\n );\r\n this.$l.hit = screenSpaceRayTracing_HiZ(\r\n this,\r\n this.rayOrigin,\r\n this.viewRay,\r\n this.viewMatrix,\r\n this.projMatrix,\r\n this.invProjMatrix,\r\n this.cameraNearFar,\r\n this.depthMipLevels,\r\n this.traceParams.z,\r\n this.traceParams.x,\r\n this.traceParams.y,\r\n this.targetSize,\r\n this.hizTex,\r\n this.normalTex,\r\n this.giTrace,\r\n 1,\r\n this.stepOffset\r\n );\r\n } else {\r\n this.$l.hit = screenSpaceRayTracing_Linear2D(\r\n this,\r\n this.rayOrigin,\r\n this.viewRay,\r\n this.viewMatrix,\r\n this.projMatrix,\r\n this.invProjMatrix,\r\n this.cameraNearFar,\r\n this.traceParams.x,\r\n this.traceParams.z,\r\n this.traceParams.y,\r\n this.traceParams.w,\r\n this.targetSize,\r\n this.depthTex,\r\n this.normalTex,\r\n false,\r\n this.giTrace\r\n );\r\n }\r\n // Grazing/projectively degenerate rays can return Inf or NaN.\r\n // A zero weight is not sufficient because NaN * 0 remains NaN and\r\n // the spatial passes then spread it into a dark block.\r\n this.$l.hitFinite = pb.all(pb.lessThan(pb.abs(this.hit), pb.vec4(1e30)));\r\n // Visibility and radiance are kept apart: whether the ray was\r\n // blocked is independent of whether the blocker's outgoing\r\n // radiance can be read back from the screen. Geometric certainty\r\n // gates occlusion so a thin-object false positive cannot darken,\r\n // while the hit's screen colour is always a usable radiance\r\n // estimate because the marcher only ever stops on-screen.\r\n this.$l.occluded = pb.mul(\r\n pb.float(this.hitFinite),\r\n pb.clamp(this.giTrace.x, 0, 1),\r\n pb.clamp(this.giTrace.z, 0, 1)\r\n );\r\n this.$l.escaped = pb.mul(pb.float(this.hitFinite), pb.clamp(this.giTrace.y, 0, 1));\r\n this.$l.hitUV = this.$choice(\r\n pb.greaterThan(this.occluded, 0),\r\n pb.clamp(this.hit.xy, pb.vec2(0), pb.vec2(1)),\r\n this.uv\r\n );\r\n this.$l.rawEnvRadiance = pb.mul(\r\n ctx.env!.light.envLight.getRadiance(this, this.worldRay, pb.float(0))!,\r\n this.radianceParams.z\r\n );\r\n this.$l.envRadiance = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.rawEnvRadiance), pb.vec3(1e30))),\r\n this.rawEnvRadiance,\r\n pb.vec3(0)\r\n );\r\n this.$l.currentRadiance = pb.textureSampleLevel(this.currentColorTex, this.hitUV, 0).rgb;\r\n if (sampleHistory) {\r\n this.$l.hitMotion = pb.textureSampleLevel(this.motionTex, this.hitUV, 0).xy;\r\n this.$l.previousHitUV = pb.sub(this.hitUV, this.hitMotion);\r\n this.$l.historyValid = pb.and(\r\n pb.all(pb.greaterThanEqual(this.previousHitUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousHitUV, pb.vec2(1))),\r\n pb.all(pb.lessThan(pb.abs(this.hitMotion), pb.vec2(5e4)))\r\n );\r\n this.$l.historyRadiance = pb.textureSampleLevel(\r\n this.previousColorTex,\r\n pb.clamp(this.previousHitUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n ).rgb;\r\n this.$l.currentHitDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.hitUV, 0),\r\n this.cameraNearFar.y\r\n );\r\n this.$l.currentHitNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.hitUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.previousHitSurface = pb.textureSampleLevel(\r\n this.previousSurfaceTex,\r\n pb.clamp(this.previousHitUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousHitNormal = pb.normalize(\r\n pb.sub(pb.mul(this.previousHitSurface.rgb, 2), pb.vec3(1))\r\n );\r\n this.historyValid = pb.and(\r\n this.historyValid,\r\n pb.lessThanEqual(\r\n pb.abs(pb.sub(this.previousHitSurface.a, this.currentHitDepth)),\r\n this.historyRejectParams.x\r\n ),\r\n pb.greaterThanEqual(\r\n pb.dot(this.currentHitNormal, this.previousHitNormal),\r\n this.historyRejectParams.y\r\n )\r\n );\r\n // Prefer the reprojected previous frame for multi-bounce\r\n // feedback, but fall back to this frame's already-shaded opaque\r\n // colour rather than dropping the sample. Losing one bounce of\r\n // feedback is a far smaller error than reverting to unoccluded\r\n // IBL, which is what made newly disoccluded regions flash.\r\n this.$l.screenRadiance = this.$choice(\r\n this.historyValid,\r\n this.historyRadiance,\r\n this.currentRadiance\r\n );\r\n } else {\r\n this.$l.screenRadiance = this.currentRadiance;\r\n }\r\n this.$l.screenRadianceFinite = pb.all(pb.lessThan(pb.abs(this.screenRadiance), pb.vec3(1e30)));\r\n this.screenRadiance = this.$choice(\r\n this.screenRadianceFinite,\r\n this.screenRadiance,\r\n this.envRadiance\r\n );\r\n this.$l.maxComponent = pb.max(\r\n pb.max(this.screenRadiance.r, this.screenRadiance.g),\r\n this.screenRadiance.b\r\n );\r\n this.$l.fireflyScale = this.$choice(\r\n pb.greaterThan(this.maxComponent, this.radianceParams.y),\r\n pb.div(this.radianceParams.y, pb.max(this.maxComponent, 1e-5)),\r\n pb.float(1)\r\n );\r\n this.$l.clampedScreenRadiance = pb.mul(this.screenRadiance, this.fireflyScale);\r\n // Split the correction into the bounce the blocker adds and the sky\r\n // it takes away. The bounce is always kept: the hit is on-screen, so\r\n // its colour is a real measurement. Only the removal is scaled by\r\n // skyOcclusion, which lets the sky be dimmed less than physically\r\n // implied without also discarding measured bounce light.\r\n this.$l.bounceGain = pb.max(pb.sub(this.clampedScreenRadiance, this.envRadiance), pb.vec3(0));\r\n this.$l.skyLoss = pb.mul(\r\n pb.max(pb.sub(this.envRadiance, this.clampedScreenRadiance), pb.vec3(0)),\r\n this.skyOcclusion\r\n );\r\n // Cosine-weighted sampling makes the estimator of E/PI - the unit\r\n // the baseline and the lighting pass both use - the plain mean of\r\n // the sampled radiance, so no PI appears here either.\r\n this.$l.correction = pb.mul(\r\n pb.sub(this.bounceGain, this.skyLoss),\r\n this.occluded,\r\n this.radianceParams.x\r\n );\r\n this.correctionSum = pb.add(this.correctionSum, this.correction);\r\n this.determinateSum = pb.add(this.determinateSum, pb.max(this.occluded, this.escaped));\r\n this.escapedSum = pb.add(this.escapedSum, this.escaped);\r\n this.occludedSum = pb.add(this.occludedSum, this.occluded);\r\n });\r\n // Average over resolved rays only. Dividing by raysPerPixel would\r\n // implicitly treat every indeterminate ray as an unoccluded sky\r\n // sample, which is the systematic sky leak this pass has to avoid.\r\n this.$l.determinateCount = pb.max(this.determinateSum, 1);\r\n this.$l.irradiance = pb.add(\r\n this.iblIrradiance,\r\n pb.div(this.correctionSum, this.determinateCount)\r\n );\r\n // radianceParams.x blends the traced estimate over the IBL baseline. A finite-ray\r\n // correction can have much higher variance than the integrated physical sky and must\r\n // not remove more than that blend permits (at the default 0.7, at least 30% remains).\r\n // That reserved share is itself scaled by measured visibility, otherwise no amount of\r\n // occlusion could ever darken an enclosed corner.\r\n this.$l.minimumIrradiance = pb.mul(\r\n this.iblIrradiance,\r\n pb.max(0, pb.sub(1, this.radianceParams.x)),\r\n pb.mix(pb.float(1), pb.div(this.escapedSum, this.determinateCount), this.skyOcclusion)\r\n );\r\n // Clamp before the render-target conversion: a finite value that overflows becomes Inf\r\n // in the texture, and every a-trous pass then expands the contaminated region by its\r\n // kernel radius. Pre-exposed lighting makes this unlikely, but a bright emissive hit\r\n // amplified by a low-probability ray can still reach it.\r\n this.$l.boundedIrradiance = pb.clamp(\r\n pb.max(this.irradiance, this.minimumIrradiance),\r\n pb.vec3(0),\r\n pb.vec3(HALF_FLOAT_MAX)\r\n );\r\n this.$outputs.outColor = pb.vec4(this.boundedIrradiance, 1);\r\n // Cosine-weighted sampling makes the mean of `occluded` over the\r\n // resolved rays an unbiased estimate of cosine-weighted visibility.\r\n // Averaging over the determinate set - not raysPerPixel - is what\r\n // keeps an indeterminate ray from reading as unoccluded, the same\r\n // reasoning the irradiance average uses above.\r\n this.$outputs.outAO = pb.vec4(\r\n pb.clamp(pb.sub(1, pb.div(this.occludedSum, this.determinateCount)), 0, 1)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Trace';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createTemporalProgram(ctx: DrawContext, hasHistory: boolean) {\r\n const program = ctx.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.currentTex = pb.tex2D().uniform(0);\r\n this.currentAOTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n if (hasHistory) {\r\n this.motionTex = pb.tex2D().uniform(0);\r\n this.previousIrradianceTex = pb.tex2D().uniform(0);\r\n this.previousSurfaceTex = pb.tex2D().uniform(0);\r\n this.previousMomentsTex = pb.tex2D().uniform(0);\r\n this.previousAOTex = pb.tex2D().uniform(0);\r\n }\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.temporalParams = pb.vec4().uniform(0);\r\n this.$outputs.outIrradiance = pb.vec4();\r\n this.$outputs.outMoments = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_luminance', [pb.vec3('c')], function () {\r\n this.$l.boundedLuminance = pb.clamp(\r\n pb.dot(this.c, pb.vec3(0.2126, 0.7152, 0.0722)),\r\n 0,\r\n MOMENT_LUMINANCE_MAX\r\n );\r\n this.$return(this.boundedLuminance);\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.current = pb.textureSampleLevel(this.currentTex, this.uv, 0);\r\n this.$l.currentAO = pb.textureSampleLevel(this.currentAOTex, this.uv, 0).r;\r\n this.$l.result = this.current.rgb;\r\n this.$l.resultAO = this.currentAO;\r\n this.$l.luminance = this.SSGI_luminance(this.current.rgb);\r\n this.$l.moment = pb.vec4(this.luminance, pb.mul(this.luminance, this.luminance), 1, 0);\r\n if (hasHistory) {\r\n this.$l.motion = pb.textureSampleLevel(this.motionTex, this.uv, 0).xy;\r\n this.$l.previousUV = pb.sub(this.uv, this.motion);\r\n this.$l.validUV = pb.and(\r\n pb.all(pb.greaterThanEqual(this.previousUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousUV, pb.vec2(1))),\r\n pb.all(pb.lessThan(pb.abs(this.motion), pb.vec2(5e4)))\r\n );\r\n this.$l.currentDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.temporalParams.w\r\n );\r\n this.$l.currentNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.previousSurface = pb.textureSampleLevel(\r\n this.previousSurfaceTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousNormal = pb.normalize(pb.sub(pb.mul(this.previousSurface.rgb, 2), pb.vec3(1)));\r\n this.$l.surfaceValid = pb.and(\r\n pb.lessThanEqual(\r\n pb.abs(pb.sub(this.previousSurface.a, this.currentDepth)),\r\n this.temporalParams.y\r\n ),\r\n pb.greaterThanEqual(pb.dot(this.currentNormal, this.previousNormal), this.temporalParams.z)\r\n );\r\n this.$l.neighborhoodMin = this.current.rgb;\r\n this.$l.neighborhoodMax = this.current.rgb;\r\n this.$l.aoNeighborhoodMin = this.currentAO;\r\n this.$l.aoNeighborhoodMax = this.currentAO;\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n if (x === 0 && y === 0) {\r\n continue;\r\n }\r\n this.$l.neighborUV = pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy));\r\n this.$l.neighbor = pb.textureSampleLevel(this.currentTex, this.neighborUV, 0).rgb;\r\n this.neighborhoodMin = pb.min(this.neighborhoodMin, this.neighbor);\r\n this.neighborhoodMax = pb.max(this.neighborhoodMax, this.neighbor);\r\n this.$l.aoNeighbor = pb.textureSampleLevel(this.currentAOTex, this.neighborUV, 0).r;\r\n this.aoNeighborhoodMin = pb.min(this.aoNeighborhoodMin, this.aoNeighbor);\r\n this.aoNeighborhoodMax = pb.max(this.aoNeighborhoodMax, this.aoNeighbor);\r\n }\r\n }\r\n this.$l.previous = pb.textureSampleLevel(\r\n this.previousIrradianceTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousClamped = pb.clamp(this.previous.rgb, this.neighborhoodMin, this.neighborhoodMax);\r\n this.$l.previousMoment = pb.textureSampleLevel(\r\n this.previousMomentsTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.validity = pb.mul(\r\n pb.float(pb.and(this.validUV, this.surfaceValid)),\r\n pb.clamp(this.previous.a, 0, 1)\r\n );\r\n // Start new histories as a running average, then cap their weight\r\n // at the configured value once enough samples have accumulated.\r\n this.$l.runningAverageWeight = pb.div(this.previousMoment.z, pb.add(this.previousMoment.z, 1));\r\n this.$l.historyWeight = pb.min(this.temporalParams.x, this.runningAverageWeight);\r\n this.$l.weight = pb.mul(this.historyWeight, this.validity);\r\n this.result = pb.mix(this.current.rgb, this.previousClamped, this.weight);\r\n // AO accumulates on exactly the same validity and weight as the\r\n // irradiance: it was measured by the same rays against the same\r\n // surface, so any disagreement between the two would be an artifact.\r\n this.$l.previousAO = pb.textureSampleLevel(\r\n this.previousAOTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n ).r;\r\n this.$l.previousAOClamped = pb.clamp(\r\n this.previousAO,\r\n this.aoNeighborhoodMin,\r\n this.aoNeighborhoodMax\r\n );\r\n this.resultAO = pb.mix(this.currentAO, this.previousAOClamped, this.weight);\r\n this.$l.momentXY = pb.mix(this.moment.xy, this.previousMoment.xy, this.weight);\r\n this.$l.historyLength = pb.mix(\r\n pb.float(1),\r\n pb.min(32, pb.add(this.previousMoment.z, 1)),\r\n this.validity\r\n );\r\n this.$l.variance = pb.max(0, pb.sub(this.momentXY.y, pb.mul(this.momentXY.x, this.momentXY.x)));\r\n this.moment = pb.vec4(this.momentXY, this.historyLength, this.variance);\r\n } else {\r\n // The WebGL fallback has no motion-vector temporal resolve. Seed\r\n // a-trous with spatial variance so its luminance weighting can\r\n // still remove Monte Carlo noise instead of treating it as an edge.\r\n this.$l.spatialLum = pb.float(0);\r\n this.$l.spatialLum2 = pb.float(0);\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n this.$l.neighborLum = this.SSGI_luminance(\r\n pb.textureSampleLevel(\r\n this.currentTex,\r\n pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy)),\r\n 0\r\n ).rgb\r\n );\r\n this.spatialLum = pb.add(this.spatialLum, this.neighborLum);\r\n this.spatialLum2 = pb.add(this.spatialLum2, pb.mul(this.neighborLum, this.neighborLum));\r\n }\r\n }\r\n this.spatialLum = pb.div(this.spatialLum, 9);\r\n this.spatialLum2 = pb.div(this.spatialLum2, 9);\r\n this.$l.spatialVariance = pb.max(\r\n 0,\r\n pb.sub(this.spatialLum2, pb.mul(this.spatialLum, this.spatialLum))\r\n );\r\n this.moment = pb.vec4(this.moment.xyz, this.spatialVariance);\r\n }\r\n this.$outputs.outIrradiance = pb.vec4(this.result, this.current.a);\r\n this.$outputs.outMoments = this.moment;\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.resultAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = hasHistory ? '@SSGI_Temporal' : '@SSGI_TemporalInitialize';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createAtrousProgram(ctx: DrawContext) {\r\n const program = ctx.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.sourceTex = pb.tex2D().uniform(0);\r\n this.aoSourceTex = pb.tex2D().uniform(0);\r\n this.momentsTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.filterParams = pb.vec4().uniform(0);\r\n this.denoiseParams = pb.vec4().uniform(0);\r\n this.cameraFar = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_luminance', [pb.vec3('c')], function () {\r\n this.$return(pb.max(0, pb.dot(this.c, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.center = pb.textureSampleLevel(this.sourceTex, this.uv, 0);\r\n this.$l.centerDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.cameraFar\r\n );\r\n this.$l.centerNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.centerLum = this.SSGI_luminance(this.center.rgb);\r\n this.$l.moments = pb.textureSampleLevel(this.momentsTex, this.uv, 0);\r\n // A pixel with little accumulated history has an unreliable variance\r\n // estimate, so the edge-stopping functions would preserve Monte Carlo\r\n // noise as if it were detail. Widen the kernel and relax the luminance\r\n // and normal tests until enough frames have converged, then hand back\r\n // to the sharp weights (standard SVGF history-driven ramp).\r\n //\r\n // A path that never accumulates history (no temporal resolve, so\r\n // moments.z is pinned at 1) is permanently unconverged, not converged:\r\n // it is the noisiest input this filter ever sees. Sending it to the\r\n // relaxed end is the whole point of the ramp - the sharp end would give\r\n // it the narrowest kernel and one eighth the luminance tolerance.\r\n this.$l.historyConfidence = this.$choice(\r\n pb.greaterThan(this.denoiseParams.x, 0),\r\n pb.clamp(pb.div(this.moments.z, this.denoiseParams.x), 0, 1),\r\n pb.float(0)\r\n );\r\n this.$l.stepScale = pb.mix(pb.float(2), pb.float(1), this.historyConfidence);\r\n this.$l.effStep = pb.mul(this.filterParams.x, this.stepScale);\r\n this.$l.normalPower = pb.mix(\r\n pb.max(1, pb.mul(this.filterParams.z, 0.25)),\r\n this.filterParams.z,\r\n this.historyConfidence\r\n );\r\n this.$l.sigmaScale = pb.mix(pb.float(8), pb.float(1), this.historyConfidence);\r\n this.$l.sigma = pb.mul(pb.add(pb.sqrt(pb.max(this.moments.w, 0)), 0.02), this.sigmaScale);\r\n this.$l.centerAO = pb.textureSampleLevel(this.aoSourceTex, this.uv, 0).r;\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$l.aoSum = pb.float(0);\r\n this.$l.aoWeightSum = pb.float(0);\r\n const kernel = [1, 2 / 3, 1 / 6];\r\n for (let y = -2; y <= 2; y++) {\r\n for (let x = -2; x <= 2; x++) {\r\n const kernelWeight = kernel[Math.abs(x)] * kernel[Math.abs(y)];\r\n this.$l.sampleUV = pb.add(\r\n this.uv,\r\n pb.mul(pb.div(pb.vec2(x, y), this.targetSize.xy), this.effStep)\r\n );\r\n this.$l.sampleValue = pb.textureSampleLevel(this.sourceTex, this.sampleUV, 0);\r\n this.$l.sampleDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0),\r\n this.cameraFar\r\n );\r\n this.$l.sampleNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.sampleUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.depthWeight = pb.exp(\r\n pb.neg(\r\n pb.div(\r\n pb.abs(pb.sub(this.sampleDepth, this.centerDepth)),\r\n pb.mul(this.filterParams.y, this.effStep)\r\n )\r\n )\r\n );\r\n this.$l.normalWeight = pb.pow(\r\n pb.max(0, pb.dot(this.centerNormal, this.sampleNormal)),\r\n this.normalPower\r\n );\r\n this.$l.colorWeight = pb.exp(\r\n pb.neg(\r\n pb.div(\r\n pb.abs(pb.sub(this.SSGI_luminance(this.sampleValue.rgb), this.centerLum)),\r\n pb.mul(this.sigma, this.filterParams.w)\r\n )\r\n )\r\n );\r\n this.$l.weight = pb.mul(\r\n kernelWeight,\r\n this.depthWeight,\r\n this.normalWeight,\r\n this.colorWeight,\r\n this.sampleValue.a\r\n );\r\n this.sum = pb.add(this.sum, pb.mul(this.sampleValue.rgb, this.weight));\r\n this.weightSum = pb.add(this.weightSum, this.weight);\r\n // AO deliberately drops colorWeight: that term is driven by the\r\n // moments' luminance variance, which describes the irradiance and\r\n // says nothing about AO. Leaving it out is a stronger smoothing,\r\n // which is what a per-ray binary quantity needs - with 1-2 rays per\r\n // pixel, single-frame AO is close to binary.\r\n this.$l.aoWeight = pb.mul(\r\n kernelWeight,\r\n this.depthWeight,\r\n this.normalWeight,\r\n this.sampleValue.a\r\n );\r\n this.$l.sampleAO = pb.textureSampleLevel(this.aoSourceTex, this.sampleUV, 0).r;\r\n this.aoSum = pb.add(this.aoSum, pb.mul(this.sampleAO, this.aoWeight));\r\n this.aoWeightSum = pb.add(this.aoWeightSum, this.aoWeight);\r\n }\r\n }\r\n this.$l.filtered = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.sum, this.weightSum),\r\n this.center.rgb\r\n );\r\n this.$l.filteredAO = this.$choice(\r\n pb.greaterThan(this.aoWeightSum, 1e-5),\r\n pb.div(this.aoSum, this.aoWeightSum),\r\n this.centerAO\r\n );\r\n this.$outputs.outColor = pb.vec4(this.filtered, this.center.a);\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.filteredAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_ATrous';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createSurfaceProgram(ctx: DrawContext) {\r\n const program = ctx.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.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec2().uniform(0);\r\n this.cameraFar = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize);\r\n this.$l.normal = pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb;\r\n this.$l.depth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.cameraFar\r\n );\r\n this.$outputs.outColor = pb.vec4(this.normal, this.depth);\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Surface';\r\n return program;\r\n }\r\n\r\n /**\r\n * Multiply the traced ambient occlusion into the scene color.\r\n *\r\n * This is the same multiply-into-final-color semantics the standalone SAO post\r\n * effect applies, so enabling both double darkens.\r\n *\r\n * @internal\r\n */\r\n private compositeAO(ctx: DrawContext, sceneColor: Texture2D, ao: Texture2D, srgbOutput: boolean) {\r\n const key = srgbOutput ? 'srgb' : 'linear';\r\n let program = SSGI._compositePrograms[key];\r\n if (!program) {\r\n program = this.createCompositeProgram(ctx, srgbOutput);\r\n SSGI._compositePrograms[key] = program;\r\n }\r\n const hash = `${key}:${sceneColor.uid}:${ao.uid}`;\r\n let bindGroup = this._compositeBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('colorTex', sceneColor, fetchSampler('clamp_nearest_nomip'));\r\n // Nearest, not linear: the AO handed to this pass is already at full\r\n // resolution, so filtering would only add a dependency on the WebGL\r\n // half-float linear filtering cap for no gain.\r\n bindGroup.setTexture('aoTex', ao, fetchSampler('clamp_nearest_nomip'));\r\n this._compositeBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue(\r\n 'aoParams',\r\n new Vector2(ctx.camera.ssgiAOIntensity, Math.max(1e-3, ctx.camera.ssgiAOPower))\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private createCompositeProgram(ctx: DrawContext, srgbOutput: boolean) {\r\n const program = ctx.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.colorTex = pb.tex2D().uniform(0);\r\n this.aoTex = pb.tex2D().uniform(0);\r\n this.aoParams = pb.vec2().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.color = pb.textureSampleLevel(this.colorTex, this.$inputs.uv, 0);\r\n this.$l.ao = pb.clamp(pb.textureSampleLevel(this.aoTex, this.$inputs.uv, 0).r, 0, 1);\r\n // mix() toward 1 rather than a plain multiply: intensity then doubles as\r\n // the fallback for noisy or unresolved texels, which matters most on the\r\n // WebGL path where there is no temporal accumulation to converge them.\r\n this.$l.shapedAO = pb.pow(this.ao, this.aoParams.y);\r\n this.$l.finalAO = pb.mix(pb.float(1), this.shapedAO, this.aoParams.x);\r\n this.$l.occludedColor = pb.mul(this.color.rgb, this.finalAO);\r\n this.$outputs.outColor = pb.vec4(\r\n srgbOutput ? linearToGamma(this, this.occludedColor) : this.occludedColor,\r\n this.color.a\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = srgbOutput ? '@SSGI_CompositeAO_sRGB' : '@SSGI_CompositeAO';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createUpsampleProgram(ctx: DrawContext) {\r\n const program = ctx.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.sourceTex = pb.tex2D().uniform(0);\r\n this.aoSourceTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.guideParams = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.zw);\r\n this.$l.centerDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.guideParams.z\r\n );\r\n this.$l.centerNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$l.aoSum = pb.float(0);\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n this.$l.sampleUV = pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy));\r\n this.$l.sampleValue = pb.textureSampleLevel(this.sourceTex, this.sampleUV, 0);\r\n this.$l.sampleAO = pb.textureSampleLevel(this.aoSourceTex, this.sampleUV, 0).r;\r\n this.$l.sampleDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0),\r\n this.guideParams.z\r\n );\r\n this.$l.sampleNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.sampleUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.depthWeight = pb.exp(\r\n pb.neg(pb.div(pb.abs(pb.sub(this.sampleDepth, this.centerDepth)), this.guideParams.x))\r\n );\r\n this.$l.normalWeight = pb.pow(\r\n pb.max(0, pb.dot(this.centerNormal, this.sampleNormal)),\r\n this.guideParams.y\r\n );\r\n this.$l.weight = pb.mul(this.depthWeight, this.normalWeight, this.sampleValue.a);\r\n this.sum = pb.add(this.sum, pb.mul(this.sampleValue.rgb, this.weight));\r\n this.weightSum = pb.add(this.weightSum, this.weight);\r\n // Same joint bilateral weights as the irradiance, so the upsampled\r\n // AO cannot cross a depth or normal edge the irradiance respects.\r\n this.aoSum = pb.add(this.aoSum, pb.mul(this.sampleAO, this.weight));\r\n }\r\n }\r\n this.$l.result = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.sum, this.weightSum),\r\n pb.textureSampleLevel(this.sourceTex, this.uv, 0).rgb\r\n );\r\n this.$l.resultAO = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.aoSum, this.weightSum),\r\n pb.textureSampleLevel(this.aoSourceTex, this.uv, 0).r\r\n );\r\n this.$outputs.outColor = pb.vec4(this.result, pb.float(pb.greaterThan(this.weightSum, 1e-5)));\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.resultAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Upsample';\r\n return program;\r\n }\r\n}\r\n"],"names":["IRRADIANCE_FORMAT","SURFACE_FORMAT","MOMENTS_FORMAT","AO_FORMAT","HALF_FLOAT_MAX","MOMENT_LUMINANCE_MAX","SSGI","AbstractPostEffect","_tracePrograms","_temporalPrograms","_atrousProgram","_surfaceProgram","_upsampleProgram","_compositePrograms","_traceBindGroups","_temporalBindGroups","_atrousBindGroups","_surfaceBindGroups","_upsampleBindGroups","_compositeBindGroups","_layer","PostEffectLayer","opaque","requireLinearDepthTexture","ctx","requireMotionVectorTexture","device","type","requireHiZTexture","requireSceneNormalTexture","setup","s","graph","history","blackboard","input","linearDepthHandle","get","FrameResources","LinearDepth","normalHandle","SceneNormal","motionHandle","MotionVector","hiZHandle","HiZ","noFogHandle","SceneColorNoFog","sampleColorHandle","settings","camera","ssgiResolvedSettings","traceWidth","halfRes","Math","max","ceil","width","traceHeight","height","traceSize","fullSize","traceDesc","format","sizeMode","fullIrradianceDesc","surfaceDesc","momentsDesc","aoTraceDesc","fullAODesc","findHistoryRead","name","historyReads","find","binding","handle","previousIrradianceHandle","RGHistoryResources","SSGI_IRRADIANCE","previousSurfaceHandle","SSGI_SURFACE","previousMomentsHandle","importPreviousIfCompatible","SSGI_MOMENTS","previousAOHandle","SSGI_AO","previousSceneColorHandle","SSGI_SCENE_COLOR","colorFormat","canSampleSceneHistory","readFrameInputs","builder","read","dep","dependencies","traceResult","addPass","out","createTexture","label","ao","fb","createFramebuffer","colorAttachments","depthAttachment","ignoreDepthStencil","setExecute","rg","pushDeviceStates","setFramebuffer","getFramebuffer","trace","getTexture","popDeviceStates","irradiance","surfaceHandle","writeSurface","canTemporal","ssgiTemporal","temporalResult","moments","temporal","filteredHandle","filteredAOHandle","pass","denoisePasses","source","aoSource","filtered","atrous","finalIrradianceHandle","finalAOHandle","upsampled","upsample","traceResolutionAOHandle","output","createOutput","framebuffer","sceneColor","filteredAO","surface","ssgiAOIntensity","compositeAO","srgbOutput","passThrough","commitHistory","color","texture","queueRetainedCommit","currentColor","previousColor","depth","normal","motion","previousSurface","hiZ","sampleHistory","envHash","env","light","getHash","historyHash","uid","hizHash","programHash","raysPerPixel","bindGroupHash","program","createTraceProgram","colorSampler","fetchSampler","bindGroup","createBindGroup","bindGroupLayouts","setTexture","setValue","mipLevelCount","Vector2","ssgiDepthReject","ssgiNormalReject","getNearPlane","getFarPlane","viewMatrix","worldMatrix","getProjectionMatrix","Matrix4x4","invert","Vector4","ssgiMaxDistance","ssgiThickness","maxSteps","ssgiStride","ssgiIntensity","ssgiMaxRayIntensity","ShaderHelper","getEnvLightLuminance","frameInfo","frameCounter","ssgiSkyOcclusion","needFlip","envLight","updateBindGroup","setProgram","setBindGroup","drawFullscreenQuad","getDefaultRenderState","current","currentAO","previousIrradiance","previousMoments","previousAO","hasHistory","hash","createTemporalProgram","ssgiTemporalWeight","step","hasTemporalHistory","createAtrousProgram","createSurfaceProgram","createUpsampleProgram","useHiZ","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","fragment","currentColorTex","tex2D","depthTex","sampleType","normalTex","previousColorTex","motionTex","previousSurfaceTex","historyRejectParams","hizTex","depthMipLevels","cameraNearFar","mat4","invViewMatrix","projMatrix","invProjMatrix","traceParams","targetSize","radianceParams","skyOcclusion","float","initShaderBindings","outColor","outAO","func","$l","linearDepth","sampleLinearDepth","nonLinearDepth","linearNormalizedToNonLinearDepth","clipPos","sub","deviceDepthToClipZ","clamp","viewPos","$return","div","xyz","w","q","dot","p","fract","sin","seed","vec3","up","$choice","lessThan","abs","n","z","tangent","normalize","cross","bitangent","r","sqrt","xi","x","phi","PI","local","cos","fragCoord","SSGI_getPosition","greaterThanEqual","$else","worldNormal","textureSampleLevel","rgb","viewNormal","iblIrradiance","getIrradiance","correctionSum","determinateSum","escapedSum","occludedSum","$for","SSGI_hash22","rayIndex","worldRay","SSGI_cosineDirection","viewRay","rayOrigin","giTrace","stepOffset","hit","screenSpaceRayTracing_HiZ","screenSpaceRayTracing_Linear2D","hitFinite","all","occluded","escaped","hitUV","greaterThan","rawEnvRadiance","getRadiance","envRadiance","currentRadiance","hitMotion","previousHitUV","historyValid","and","lessThanEqual","historyRadiance","currentHitDepth","currentHitNormal","previousHitSurface","previousHitNormal","a","screenRadiance","screenRadianceFinite","maxComponent","g","b","fireflyScale","clampedScreenRadiance","bounceGain","skyLoss","correction","determinateCount","minimumIrradiance","mix","boundedIrradiance","currentTex","currentAOTex","previousIrradianceTex","previousMomentsTex","previousAOTex","temporalParams","outIrradiance","outMoments","boundedLuminance","c","result","resultAO","luminance","SSGI_luminance","moment","previousUV","validUV","currentDepth","currentNormal","previousNormal","surfaceValid","neighborhoodMin","neighborhoodMax","aoNeighborhoodMin","aoNeighborhoodMax","neighborUV","neighbor","min","aoNeighbor","previous","previousClamped","previousMoment","validity","runningAverageWeight","historyWeight","weight","previousAOClamped","momentXY","historyLength","variance","spatialLum","spatialLum2","neighborLum","spatialVariance","sourceTex","aoSourceTex","momentsTex","filterParams","denoiseParams","cameraFar","center","centerDepth","centerNormal","centerLum","historyConfidence","stepScale","effStep","normalPower","sigmaScale","sigma","centerAO","sum","weightSum","aoSum","aoWeightSum","kernel","kernelWeight","sampleUV","sampleValue","sampleDepth","sampleNormal","depthWeight","exp","normalWeight","pow","colorWeight","aoWeight","sampleAO","key","createCompositeProgram","ssgiAOPower","colorTex","aoTex","aoParams","shapedAO","finalAO","occludedColor","linearToGamma","guideParams","zw"],"mappings":"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"}
1
+ {"version":3,"file":"ssgi.js","sources":["../../src/posteffect/ssgi.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Matrix4x4, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\nimport type { RGHandle, RGPassBuilder, RGTextureDesc } from '../render/rendergraph/types';\r\nimport { screenSpaceRayTracing_HiZ, screenSpaceRayTracing_Linear2D } from '../shaders/ssr';\r\nimport { ShaderHelper } from '../material';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\n\r\nconst IRRADIANCE_FORMAT = 'rgba16f' as const;\r\nconst SURFACE_FORMAT = 'rgba16f' as const;\r\nconst MOMENTS_FORMAT = 'rgba16f' as const;\r\n// AO is scalar; r16f is available wherever SSGI runs.\r\nconst AO_FORMAT = 'r16f' as const;\r\nconst HALF_FLOAT_MAX = 65504;\r\n// Keep squared luminance below the rgba16f range.\r\nconst MOMENT_LUMINANCE_MAX = 255;\r\n\r\n/**\r\n * Screen-space diffuse global illumination.\r\n *\r\n * @public\r\n */\r\nexport class SSGI extends AbstractPostEffect {\r\n private static _tracePrograms: Record<string, GPUProgram> = {};\r\n private static _temporalPrograms: Record<string, GPUProgram> = {};\r\n private static _atrousProgram: GPUProgram | null = null;\r\n private static _surfaceProgram: GPUProgram | null = null;\r\n private static _upsampleProgram: GPUProgram | null = null;\r\n private static _compositePrograms: Record<string, GPUProgram> = {};\r\n\r\n private _traceBindGroups: Record<string, BindGroup> = {};\r\n private _temporalBindGroups: Record<string, BindGroup> = {};\r\n private _atrousBindGroups: Record<string, BindGroup> = {};\r\n private _surfaceBindGroups: Record<string, BindGroup> = {};\r\n private _upsampleBindGroups: Record<string, BindGroup> = {};\r\n private _compositeBindGroups: Record<string, BindGroup> = {};\r\n\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.opaque;\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI;\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireMotionVectorTexture} */\r\n requireMotionVectorTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI && ctx.device.type !== 'webgl';\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireHiZTexture} */\r\n requireHiZTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI && ctx.device.type !== 'webgl';\r\n }\r\n\r\n /** {@inheritDoc AbstractPostEffect.requireSceneNormalTexture} */\r\n requireSceneNormalTexture(ctx: DrawContext) {\r\n return !!ctx.SSGI;\r\n }\r\n\r\n /** Build trace, temporal, denoise, upsample, history and pass-through stages. */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx, history, blackboard } = s;\r\n if (!ctx.SSGI || !history) {\r\n return s.input;\r\n }\r\n const linearDepthHandle = blackboard.get(FrameResources.LinearDepth);\r\n const normalHandle = blackboard.get(FrameResources.SceneNormal);\r\n const motionHandle = blackboard.get(FrameResources.MotionVector);\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n // Traced hits read this as outgoing surface radiance, so it must exclude the\r\n // fog the camera ray accumulated: that fog belongs to a different path than\r\n // the one being integrated, and feeding it back would brighten every bounce.\r\n // Absent when the scene has no fog, in which case SceneColor is already fog\r\n // free. Both the sampled color and the committed history use it, otherwise\r\n // the current and previous frames would disagree and flicker.\r\n const noFogHandle = blackboard.get(FrameResources.SceneColorNoFog);\r\n const sampleColorHandle = noFogHandle ?? s.input;\r\n if (!linearDepthHandle || !normalHandle) {\r\n return s.input;\r\n }\r\n\r\n const settings = ctx.camera.ssgiResolvedSettings;\r\n const traceWidth = settings.halfRes ? Math.max(1, Math.ceil(s.width * 0.5)) : s.width;\r\n const traceHeight = settings.halfRes ? Math.max(1, Math.ceil(s.height * 0.5)) : s.height;\r\n const traceSize = { width: traceWidth, height: traceHeight };\r\n const fullSize = { width: s.width, height: s.height };\r\n const traceDesc: RGTextureDesc = {\r\n format: IRRADIANCE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const fullIrradianceDesc: RGTextureDesc = {\r\n format: IRRADIANCE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const surfaceDesc: RGTextureDesc = {\r\n format: SURFACE_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const momentsDesc: RGTextureDesc = {\r\n format: MOMENTS_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const aoTraceDesc: RGTextureDesc = {\r\n format: AO_FORMAT,\r\n sizeMode: 'absolute',\r\n width: traceWidth,\r\n height: traceHeight\r\n };\r\n const fullAODesc: RGTextureDesc = {\r\n format: AO_FORMAT,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n\r\n const findHistoryRead = (name: string) =>\r\n s.historyReads.find((binding) => binding.name === name)?.handle ?? null;\r\n const previousIrradianceHandle = findHistoryRead(RGHistoryResources.SSGI_IRRADIANCE);\r\n const previousSurfaceHandle = findHistoryRead(RGHistoryResources.SSGI_SURFACE);\r\n const previousMomentsHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_MOMENTS,\r\n momentsDesc,\r\n traceSize\r\n );\r\n // Only this effect's own temporal pass reads the AO history, so it is\r\n // imported directly instead of being routed through the light pass history\r\n // read bindings the way irradiance and surface are.\r\n const previousAOHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_AO,\r\n aoTraceDesc,\r\n traceSize\r\n );\r\n // Reprojecting last frame's colour needs motion vectors, which the WebGL1\r\n // backend does not produce. WebGL2 and WebGPU both do, so both take the\r\n // multi-bounce path.\r\n const previousSceneColorHandle =\r\n ctx.device.type !== 'webgl'\r\n ? history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_SCENE_COLOR,\r\n {\r\n format: s.colorFormat,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n },\r\n fullSize\r\n )\r\n : null;\r\n const canSampleSceneHistory = !!(previousSceneColorHandle && previousSurfaceHandle && motionHandle);\r\n\r\n const readFrameInputs = (builder: RGPassBuilder) => {\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n if (motionHandle) {\r\n builder.read(motionHandle);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n };\r\n\r\n // Trace one or two cosine-weighted diffuse rays. A hit prefers the previous\r\n // frame through previousHitUV = hitUV - motion(hitUV) for multi-bounce\r\n // feedback and falls back to the current frame when that reprojection fails.\r\n const traceResult = graph.addPass('SSGI:Trace', (builder) => {\r\n builder.read(sampleColorHandle);\r\n readFrameInputs(builder);\r\n if (canSampleSceneHistory) {\r\n builder.read(previousSceneColorHandle!);\r\n builder.read(previousSurfaceHandle!);\r\n }\r\n const out = builder.createTexture({ ...traceDesc, label: 'SSGI:rawIrradiance' });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: 'SSGI:rawAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:traceFB',\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer(fb));\r\n this.trace(\r\n ctx,\r\n rg.getTexture<Texture2D>(sampleColorHandle),\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(previousSceneColorHandle!) : null,\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(motionHandle!) : null,\r\n canSampleSceneHistory ? rg.getTexture<Texture2D>(previousSurfaceHandle!) : null,\r\n hiZHandle ? rg.getTexture<Texture2D>(hiZHandle) : null,\r\n traceWidth,\r\n traceHeight\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n\r\n // Store the current full-resolution surface independently from irradiance;\r\n // no albedo MRT is needed because the next lighting pass applies the BRDF.\r\n const surfaceHandle = graph.addPass('SSGI:Surface', (builder) => {\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...surfaceDesc, label: 'SSGI:surface' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:surfaceFB',\r\n width: s.width,\r\n height: s.height,\r\n colorAttachments: out,\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer(fb));\r\n this.writeSurface(\r\n ctx,\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n const canTemporal = !!(\r\n ctx.device.type !== 'webgl' &&\r\n ctx.camera.ssgiTemporal &&\r\n motionHandle &&\r\n previousIrradianceHandle &&\r\n previousSurfaceHandle &&\r\n previousMomentsHandle &&\r\n previousAOHandle\r\n );\r\n\r\n // Temporal pass always creates moments. On the first frame it simply\r\n // initializes them; with valid history it rejects by depth and normal,\r\n // neighborhood-clamps radiance, and accumulates first/second moments.\r\n const temporalResult = graph.addPass('SSGI:Temporal', (builder) => {\r\n builder.read(traceResult.irradiance);\r\n builder.read(traceResult.ao);\r\n readFrameInputs(builder);\r\n if (canTemporal) {\r\n builder.read(previousIrradianceHandle!);\r\n builder.read(previousSurfaceHandle!);\r\n builder.read(previousMomentsHandle!);\r\n builder.read(previousAOHandle!);\r\n }\r\n const irradiance = builder.createTexture({ ...traceDesc, label: 'SSGI:temporalIrradiance' });\r\n const moments = builder.createTexture({ ...momentsDesc, label: 'SSGI:moments' });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: 'SSGI:temporalAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:temporalFB',\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [irradiance, moments, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer(fb));\r\n this.temporal(\r\n ctx,\r\n rg.getTexture<Texture2D>(traceResult.irradiance),\r\n rg.getTexture<Texture2D>(traceResult.ao),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n canTemporal ? rg.getTexture<Texture2D>(motionHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousIrradianceHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousSurfaceHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousMomentsHandle!) : null,\r\n canTemporal ? rg.getTexture<Texture2D>(previousAOHandle!) : null,\r\n traceWidth,\r\n traceHeight\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance, moments, ao };\r\n });\r\n\r\n // Variance-guided, cross-bilateral a-trous filtering. The increasing\r\n // kernel step removes low-frequency Monte Carlo noise while depth/normal\r\n // weights preserve discontinuities.\r\n let filteredHandle = temporalResult.irradiance;\r\n let filteredAOHandle = temporalResult.ao;\r\n for (let pass = 0; pass < settings.denoisePasses; pass++) {\r\n const source = filteredHandle;\r\n const aoSource = filteredAOHandle;\r\n const filtered = graph.addPass(`SSGI:ATrous:${pass}`, (builder) => {\r\n builder.read(source);\r\n builder.read(aoSource);\r\n builder.read(temporalResult.moments);\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...traceDesc, label: `SSGI:atrous${pass}` });\r\n const ao = builder.createTexture({ ...aoTraceDesc, label: `SSGI:atrousAO${pass}` });\r\n const fb = builder.createFramebuffer({\r\n label: `SSGI:atrousFB${pass}`,\r\n width: traceWidth,\r\n height: traceHeight,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer(fb));\r\n this.atrous(\r\n ctx,\r\n rg.getTexture<Texture2D>(source),\r\n rg.getTexture<Texture2D>(aoSource),\r\n rg.getTexture<Texture2D>(temporalResult.moments),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle),\r\n traceWidth,\r\n traceHeight,\r\n 1 << pass,\r\n canTemporal\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n filteredHandle = filtered.irradiance;\r\n filteredAOHandle = filtered.ao;\r\n }\r\n\r\n // Half-resolution presets use a joint bilateral upsample before history is\r\n // consumed by full-resolution materials on the next frame.\r\n let finalIrradianceHandle = filteredHandle;\r\n let finalAOHandle = filteredAOHandle;\r\n if (settings.halfRes) {\r\n const source = filteredHandle;\r\n const aoSource = filteredAOHandle;\r\n const upsampled = graph.addPass('SSGI:Upsample', (builder) => {\r\n builder.read(source);\r\n builder.read(aoSource);\r\n builder.read(linearDepthHandle);\r\n builder.read(normalHandle);\r\n const out = builder.createTexture({ ...fullIrradianceDesc, label: 'SSGI:upsampledIrradiance' });\r\n const ao = builder.createTexture({ ...fullAODesc, label: 'SSGI:upsampledAO' });\r\n const fb = builder.createFramebuffer({\r\n label: 'SSGI:upsampleFB',\r\n width: s.width,\r\n height: s.height,\r\n colorAttachments: [out, ao],\r\n depthAttachment: null,\r\n ignoreDepthStencil: true\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rg.getFramebuffer(fb));\r\n this.upsample(\r\n ctx,\r\n rg.getTexture<Texture2D>(source),\r\n rg.getTexture<Texture2D>(aoSource),\r\n rg.getTexture<Texture2D>(linearDepthHandle),\r\n rg.getTexture<Texture2D>(normalHandle)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return { irradiance: out, ao };\r\n });\r\n finalIrradianceHandle = upsampled.irradiance;\r\n finalAOHandle = upsampled.ao;\r\n }\r\n\r\n // Pinned before the commit closure captures it: the a-trous loop above\r\n // reassigns the handle, and the AO history has to be the trace-resolution\r\n // one regardless of whether an upsample ran.\r\n const traceResolutionAOHandle = filteredAOHandle;\r\n\r\n // SSGI history is independent from TAA/SSR history. Commit the opaque HDR\r\n // SceneColor input (before SSR/transparency/tone-map/AA), irradiance,\r\n // surface and moments, then pass SceneColor through unchanged.\r\n return graph.addPass('SSGI:Commit', (builder) => {\r\n builder.read(s.input);\r\n if (noFogHandle) {\r\n builder.read(noFogHandle);\r\n }\r\n builder.read(finalIrradianceHandle);\r\n builder.read(finalAOHandle);\r\n // The trace-resolution AO is what goes back into history, so it has to be\r\n // read here too even when the upsampled one is what gets composited.\r\n builder.read(traceResolutionAOHandle);\r\n builder.read(surfaceHandle);\r\n builder.read(temporalResult.moments);\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n const sceneColor = rg.getTexture<Texture2D>(s.input);\r\n const irradiance = rg.getTexture<Texture2D>(finalIrradianceHandle);\r\n const ao = rg.getTexture<Texture2D>(finalAOHandle);\r\n const filteredAO = rg.getTexture<Texture2D>(traceResolutionAOHandle);\r\n const surface = rg.getTexture<Texture2D>(surfaceHandle);\r\n const moments = rg.getTexture<Texture2D>(temporalResult.moments);\r\n if (ctx.camera.ssgiAOIntensity > 0) {\r\n this.compositeAO(ctx, sceneColor, ao, output.srgbOutput);\r\n } else {\r\n this.passThrough(ctx, sceneColor, output.srgbOutput);\r\n }\r\n if (ctx.device.type !== 'webgl') {\r\n // Commit the same fog-free color the trace sampled, so next frame's\r\n // reprojected history is on the same footing as this frame's fallback.\r\n this.commitHistory(\r\n history,\r\n RGHistoryResources.SSGI_SCENE_COLOR,\r\n rg.getTexture<Texture2D>(sampleColorHandle)\r\n );\r\n }\r\n this.commitHistory(history, RGHistoryResources.SSGI_IRRADIANCE, irradiance);\r\n this.commitHistory(history, RGHistoryResources.SSGI_SURFACE, surface);\r\n this.commitHistory(history, RGHistoryResources.SSGI_MOMENTS, moments);\r\n // Committed at trace resolution: the temporal pass that consumes it\r\n // runs before the upsample, so a full-resolution AO would fail the\r\n // descriptor compatibility check and silently disable accumulation.\r\n this.commitHistory(history, RGHistoryResources.SSGI_AO, filteredAO);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n\r\n /** @internal */\r\n private commitHistory(\r\n history: NonNullable<PostEffectSetupContext['history']>,\r\n name: string,\r\n texture: Texture2D\r\n ) {\r\n history.queueRetainedCommit(\r\n name,\r\n {\r\n format: texture.format,\r\n sizeMode: 'absolute',\r\n width: texture.width,\r\n height: texture.height\r\n },\r\n { width: texture.width, height: texture.height },\r\n texture\r\n );\r\n }\r\n\r\n /** @internal */\r\n private trace(\r\n ctx: DrawContext,\r\n currentColor: Texture2D,\r\n previousColor: Texture2D | null,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n motion: Texture2D | null,\r\n previousSurface: Texture2D | null,\r\n hiZ: Texture2D | null,\r\n width: number,\r\n height: number\r\n ) {\r\n const sampleHistory = !!(previousColor && motion && previousSurface);\r\n const envHash = ctx.env!.light.getHash();\r\n const historyHash = sampleHistory ? `${previousColor!.uid}:${motion!.uid}:${previousSurface!.uid}` : '';\r\n const hizHash = hiZ ? `${hiZ.uid}` : '';\r\n const programHash = `${sampleHistory ? '1' : '0'}:${hiZ ? '1' : '0'}:${ctx.camera.ssgiResolvedSettings.raysPerPixel}:${envHash}`;\r\n const bindGroupHash = `${currentColor.uid}:${depth.uid}:${normal.uid}:(${historyHash}):(${hizHash}):${ctx.camera.ssgiResolvedSettings.raysPerPixel}:${envHash}`;\r\n let program = SSGI._tracePrograms[programHash];\r\n if (!program) {\r\n program = this.createTraceProgram(ctx, !!hiZ, sampleHistory);\r\n SSGI._tracePrograms[programHash] = program;\r\n }\r\n const colorSampler = fetchSampler(\r\n ctx.device.type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip'\r\n );\r\n let bindGroup = this._traceBindGroups[bindGroupHash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('currentColorTex', currentColor, colorSampler);\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n if (sampleHistory) {\r\n bindGroup.setTexture('previousColorTex', previousColor!, colorSampler);\r\n bindGroup.setTexture('motionTex', motion!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('previousSurfaceTex', previousSurface!, fetchSampler('clamp_nearest_nomip'));\r\n }\r\n if (hiZ) {\r\n bindGroup.setTexture('hizTex', hiZ, fetchSampler('clamp_nearest'));\r\n bindGroup.setValue('depthMipLevels', hiZ.mipLevelCount);\r\n }\r\n this._traceBindGroups[bindGroupHash] = bindGroup;\r\n }\r\n if (sampleHistory) {\r\n bindGroup.setValue(\r\n 'historyRejectParams',\r\n new Vector2(ctx.camera.ssgiDepthReject, ctx.camera.ssgiNormalReject)\r\n );\r\n }\r\n bindGroup.setValue('cameraNearFar', new Vector2(ctx.camera.getNearPlane(), ctx.camera.getFarPlane()));\r\n bindGroup.setValue('viewMatrix', ctx.camera.viewMatrix);\r\n bindGroup.setValue('invViewMatrix', ctx.camera.worldMatrix);\r\n bindGroup.setValue('projMatrix', ctx.camera.getProjectionMatrix());\r\n bindGroup.setValue('invProjMatrix', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));\r\n bindGroup.setValue(\r\n 'traceParams',\r\n new Vector4(\r\n ctx.camera.ssgiMaxDistance,\r\n ctx.camera.ssgiThickness,\r\n ctx.camera.ssgiResolvedSettings.maxSteps,\r\n ctx.camera.ssgiStride\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'targetSize',\r\n new Vector4(width, height, hiZ?.width ?? depth.width, hiZ?.height ?? depth.height)\r\n );\r\n bindGroup.setValue(\r\n 'radianceParams',\r\n new Vector4(\r\n ctx.camera.ssgiIntensity,\r\n ctx.camera.ssgiMaxRayIntensity,\r\n ShaderHelper.getEnvLightLuminance(ctx),\r\n ctx.device.frameInfo.frameCounter\r\n )\r\n );\r\n bindGroup.setValue('skyOcclusion', ctx.camera.ssgiSkyOcclusion);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.env!.light.envLight.updateBindGroup(bindGroup);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private temporal(\r\n ctx: DrawContext,\r\n current: Texture2D,\r\n currentAO: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n motion: Texture2D | null,\r\n previousIrradiance: Texture2D | null,\r\n previousSurface: Texture2D | null,\r\n previousMoments: Texture2D | null,\r\n previousAO: Texture2D | null,\r\n width: number,\r\n height: number\r\n ) {\r\n const hasHistory = !!(motion && previousIrradiance && previousSurface && previousMoments && previousAO);\r\n const hash = hasHistory\r\n ? `history:${current.uid}:${currentAO.uid}:${depth.uid}:${normal.uid}:${motion!.uid}:${previousIrradiance!.uid}:${previousSurface.uid}:${previousMoments.uid}:${previousAO!.uid}`\r\n : `initialize:${current.uid}:${currentAO.uid}:${depth.uid}:${normal.uid}`;\r\n let program = SSGI._temporalPrograms[hash];\r\n if (!program) {\r\n program = this.createTemporalProgram(ctx, hasHistory);\r\n SSGI._temporalPrograms[hash] = program;\r\n }\r\n let bindGroup = this._temporalBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('currentTex', current, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('currentAOTex', currentAO, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n if (hasHistory) {\r\n bindGroup.setTexture('motionTex', motion!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n 'previousIrradianceTex',\r\n previousIrradiance!,\r\n fetchSampler('clamp_linear_nomip')\r\n );\r\n bindGroup.setTexture('previousSurfaceTex', previousSurface!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('previousMomentsTex', previousMoments!, fetchSampler('clamp_linear_nomip'));\r\n // Linear is safe here: this branch never runs on WebGL1, and both\r\n // WebGL2 and WebGPU filter r16f unconditionally. The read is at a\r\n // reprojected UV.\r\n bindGroup.setTexture('previousAOTex', previousAO!, fetchSampler('clamp_linear_nomip'));\r\n }\r\n this._temporalBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('targetSize', new Vector4(width, height, depth.width, depth.height));\r\n bindGroup.setValue(\r\n 'temporalParams',\r\n new Vector4(\r\n ctx.camera.ssgiTemporalWeight,\r\n ctx.camera.ssgiDepthReject,\r\n ctx.camera.ssgiNormalReject,\r\n ctx.camera.getFarPlane()\r\n )\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private atrous(\r\n ctx: DrawContext,\r\n source: Texture2D,\r\n aoSource: Texture2D,\r\n moments: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D,\r\n width: number,\r\n height: number,\r\n step: number,\r\n hasTemporalHistory: boolean\r\n ) {\r\n let program = SSGI._atrousProgram;\r\n if (!program) {\r\n program = this.createAtrousProgram(ctx);\r\n SSGI._atrousProgram = program;\r\n }\r\n const hash = `atrous:${source.uid}:${aoSource.uid}:${moments.uid}:${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._atrousBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('sourceTex', source, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('aoSourceTex', aoSource, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('momentsTex', moments, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n this._atrousBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('targetSize', new Vector4(width, height, depth.width, depth.height));\r\n bindGroup.setValue(\r\n 'filterParams',\r\n new Vector4(\r\n step,\r\n Math.max(0.001, ctx.camera.ssgiDepthReject),\r\n Math.max(1, ctx.camera.ssgiNormalReject * 32),\r\n 4\r\n )\r\n );\r\n // Number of accumulated frames a pixel needs before its variance estimate is\r\n // trusted. Zero disables the ramp for paths that never build history, where\r\n // the stored length is pinned at 1 and would read as permanently new.\r\n bindGroup.setValue('denoiseParams', new Vector4(hasTemporalHistory ? 8 : 0, 0, 0, 0));\r\n bindGroup.setValue('cameraFar', ctx.camera.getFarPlane());\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private writeSurface(ctx: DrawContext, depth: Texture2D, normal: Texture2D) {\r\n let program = SSGI._surfaceProgram;\r\n if (!program) {\r\n program = this.createSurfaceProgram(ctx);\r\n SSGI._surfaceProgram = program;\r\n }\r\n const hash = `${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._surfaceBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('targetSize', new Vector2(depth.width, depth.height));\r\n this._surfaceBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue('cameraFar', ctx.camera.getFarPlane());\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private upsample(\r\n ctx: DrawContext,\r\n source: Texture2D,\r\n aoSource: Texture2D,\r\n depth: Texture2D,\r\n normal: Texture2D\r\n ) {\r\n let program = SSGI._upsampleProgram;\r\n if (!program) {\r\n program = this.createUpsampleProgram(ctx);\r\n SSGI._upsampleProgram = program;\r\n }\r\n const hash = `${source.uid}:${aoSource.uid}:${depth.uid}:${normal.uid}`;\r\n let bindGroup = this._upsampleBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('sourceTex', source, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('aoSourceTex', aoSource, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('depthTex', depth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('normalTex', normal, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('targetSize', new Vector4(source.width, source.height, depth.width, depth.height));\r\n this._upsampleBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue(\r\n 'guideParams',\r\n new Vector4(\r\n Math.max(0.001, ctx.camera.ssgiDepthReject),\r\n Math.max(1, ctx.camera.ssgiNormalReject * 32),\r\n ctx.camera.getFarPlane(),\r\n 0\r\n )\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private createTraceProgram(ctx: DrawContext, useHiZ: boolean, sampleHistory: boolean) {\r\n const raysPerPixel = ctx.camera.ssgiResolvedSettings.raysPerPixel;\r\n const program = ctx.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.currentColorTex = pb.tex2D().uniform(0);\r\n // Linear depth is r32f (or rg32f when thickness is enabled). These\r\n // formats are not filterable without the optional float32-filterable\r\n // feature, and all SSGI depth reads use a nearest sampler.\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n if (sampleHistory) {\r\n this.previousColorTex = pb.tex2D().uniform(0);\r\n this.motionTex = pb.tex2D().uniform(0);\r\n this.previousSurfaceTex = pb.tex2D().uniform(0);\r\n this.historyRejectParams = pb.vec2().uniform(0);\r\n }\r\n if (useHiZ) {\r\n // Hi-Z is stored as r32f. It is only read with a nearest sampler,\r\n // so use the unfilterable sample type for adapters without the\r\n // optional float32-filterable feature (notably some AMD iGPUs).\r\n this.hizTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.depthMipLevels = pb.int().uniform(0);\r\n }\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.viewMatrix = pb.mat4().uniform(0);\r\n this.invViewMatrix = pb.mat4().uniform(0);\r\n this.projMatrix = pb.mat4().uniform(0);\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.traceParams = pb.vec4().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.radianceParams = pb.vec4().uniform(0);\r\n this.skyOcclusion = pb.float().uniform(0);\r\n ctx.env!.light.envLight.initShaderBindings(pb);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_getPosition', [pb.vec2('uv')], function () {\r\n this.$l.linearDepth = ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0);\r\n this.$l.nonLinearDepth = ShaderHelper.linearNormalizedToNonLinearDepth(\r\n this,\r\n this.linearDepth,\r\n this.cameraNearFar\r\n );\r\n this.$l.clipPos = 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.viewPos = pb.mul(this.invProjMatrix, this.clipPos);\r\n this.$return(pb.vec4(pb.div(this.viewPos.xyz, this.viewPos.w), this.linearDepth));\r\n });\r\n pb.func('SSGI_hash22', [pb.vec2('p'), pb.float('seed')], function () {\r\n this.$l.q = pb.vec2(pb.dot(this.p, pb.vec2(127.1, 311.7)), pb.dot(this.p, pb.vec2(269.5, 183.3)));\r\n this.$return(pb.fract(pb.mul(pb.sin(pb.add(this.q, this.seed)), 43758.5453)));\r\n });\r\n pb.func('SSGI_cosineDirection', [pb.vec3('n'), pb.vec2('xi')], function () {\r\n this.$l.up = this.$choice(pb.lessThan(pb.abs(this.n.z), 0.999), pb.vec3(0, 0, 1), pb.vec3(1, 0, 0));\r\n this.$l.tangent = pb.normalize(pb.cross(this.up, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.r = pb.sqrt(this.xi.x);\r\n this.$l.phi = pb.mul(2 * Math.PI, this.xi.y);\r\n this.$l.local = pb.vec3(\r\n pb.mul(this.r, pb.cos(this.phi)),\r\n pb.mul(this.r, pb.sin(this.phi)),\r\n pb.sqrt(pb.max(0, pb.sub(1, this.xi.x)))\r\n );\r\n this.$return(\r\n pb.normalize(\r\n pb.add(\r\n pb.mul(this.tangent, this.local.x),\r\n pb.mul(this.bitangent, this.local.y),\r\n pb.mul(this.n, this.local.z)\r\n )\r\n )\r\n );\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.pos = this.SSGI_getPosition(this.uv);\r\n this.$if(pb.greaterThanEqual(this.pos.w, 1), function () {\r\n this.$outputs.outColor = pb.vec4(0);\r\n // Sky is unoccluded. Its irradiance validity is zero, so this value\r\n // is never read as a weight, but it must not be a dark texel: the\r\n // a-trous and upsample kernels reach across the silhouette.\r\n this.$outputs.outAO = pb.vec4(1);\r\n }).$else(function () {\r\n this.$l.worldNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.viewNormal = pb.normalize(pb.mul(this.viewMatrix, pb.vec4(this.worldNormal, 0)).xyz);\r\n // Use the SH-integrated diffuse IBL as an exact, noise-free\r\n // baseline. Stochastic rays only estimate the screen-space\r\n // replacement relative to the environment in the same direction.\r\n //\r\n // getIrradiance returns the cosine-convolved SH, which already\r\n // carries the 1/PI of the Lambert BRDF: materials consume it as\r\n // k_D * irradiance with no further division, matching punctual\r\n // lights that apply 1/PI explicitly. The published history is mixed\r\n // against that same value in the lighting pass, so this baseline\r\n // must stay in those units and must not be scaled by PI.\r\n this.$l.iblIrradiance = pb.mul(\r\n ctx.env!.light.envLight.getIrradiance(this, this.worldNormal),\r\n this.radianceParams.z\r\n );\r\n this.$l.correctionSum = pb.vec3(0);\r\n // Rays whose outcome the depth buffer cannot resolve (they left the\r\n // screen or ran out of iterations behind geometry) are excluded from\r\n // the average instead of counted as unoccluded sky.\r\n this.$l.determinateSum = pb.float(0);\r\n this.$l.escapedSum = pb.float(0);\r\n // Ambient occlusion reuses the very same visibility measurement the\r\n // sky removal is built on, so the two can never disagree. No extra\r\n // ray march: only this accumulator is new.\r\n this.$l.occludedSum = pb.float(0);\r\n this.$for(pb.float('rayIndex'), 0, raysPerPixel, function () {\r\n this.$l.xi = this.SSGI_hash22(\r\n pb.add(pb.mul(this.uv, this.targetSize.xy), pb.vec2(this.rayIndex, pb.mul(this.rayIndex, 7))),\r\n pb.add(this.radianceParams.w, pb.mul(this.rayIndex, 17))\r\n );\r\n this.$l.worldRay = this.SSGI_cosineDirection(this.worldNormal, this.xi);\r\n this.$l.viewRay = pb.normalize(pb.mul(this.viewMatrix, pb.vec4(this.worldRay, 0)).xyz);\r\n this.$l.rayOrigin = pb.add(this.pos.xyz, pb.mul(this.viewNormal, this.traceParams.y, 0.25));\r\n // vec3(occluded, escaped, rawConfidence) - see screenSpaceRayTracing_Linear2D.\r\n this.$l.giTrace = pb.vec3(0);\r\n if (useHiZ) {\r\n // UE5 SSGI: diffuse rays march with RayRoughness = 1 (fast mip\r\n // ramp) and StepOffset = noise - 0.9. A dedicated hash keeps\r\n // the jitter decorrelated from the direction sample.\r\n this.$l.stepOffset = pb.sub(\r\n this.SSGI_hash22(\r\n pb.add(pb.mul(this.uv, this.targetSize.xy), pb.vec2(pb.mul(this.rayIndex, 23), 11)),\r\n pb.add(this.radianceParams.w, pb.mul(this.rayIndex, 29))\r\n ).x,\r\n 0.9\r\n );\r\n this.$l.hit = screenSpaceRayTracing_HiZ(\r\n this,\r\n this.rayOrigin,\r\n this.viewRay,\r\n this.viewMatrix,\r\n this.projMatrix,\r\n this.invProjMatrix,\r\n this.cameraNearFar,\r\n this.depthMipLevels,\r\n this.traceParams.z,\r\n this.traceParams.x,\r\n this.traceParams.y,\r\n this.targetSize,\r\n this.hizTex,\r\n this.normalTex,\r\n this.giTrace,\r\n 1,\r\n this.stepOffset\r\n );\r\n } else {\r\n this.$l.hit = screenSpaceRayTracing_Linear2D(\r\n this,\r\n this.rayOrigin,\r\n this.viewRay,\r\n this.viewMatrix,\r\n this.projMatrix,\r\n this.invProjMatrix,\r\n this.cameraNearFar,\r\n this.traceParams.x,\r\n this.traceParams.z,\r\n this.traceParams.y,\r\n this.traceParams.w,\r\n this.targetSize,\r\n this.depthTex,\r\n this.normalTex,\r\n false,\r\n this.giTrace\r\n );\r\n }\r\n // Grazing/projectively degenerate rays can return Inf or NaN.\r\n // A zero weight is not sufficient because NaN * 0 remains NaN and\r\n // the spatial passes then spread it into a dark block.\r\n this.$l.hitFinite = pb.all(pb.lessThan(pb.abs(this.hit), pb.vec4(1e30)));\r\n // Visibility and radiance are kept apart: whether the ray was\r\n // blocked is independent of whether the blocker's outgoing\r\n // radiance can be read back from the screen. Geometric certainty\r\n // gates occlusion so a thin-object false positive cannot darken,\r\n // while the hit's screen colour is always a usable radiance\r\n // estimate because the marcher only ever stops on-screen.\r\n this.$l.occluded = pb.mul(\r\n pb.float(this.hitFinite),\r\n pb.clamp(this.giTrace.x, 0, 1),\r\n pb.clamp(this.giTrace.z, 0, 1)\r\n );\r\n this.$l.escaped = pb.mul(pb.float(this.hitFinite), pb.clamp(this.giTrace.y, 0, 1));\r\n this.$l.hitUV = this.$choice(\r\n pb.greaterThan(this.occluded, 0),\r\n pb.clamp(this.hit.xy, pb.vec2(0), pb.vec2(1)),\r\n this.uv\r\n );\r\n this.$l.rawEnvRadiance = pb.mul(\r\n ctx.env!.light.envLight.getRadiance(this, this.worldRay, pb.float(0))!,\r\n this.radianceParams.z\r\n );\r\n this.$l.envRadiance = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.rawEnvRadiance), pb.vec3(1e30))),\r\n this.rawEnvRadiance,\r\n pb.vec3(0)\r\n );\r\n this.$l.currentRadiance = pb.textureSampleLevel(this.currentColorTex, this.hitUV, 0).rgb;\r\n if (sampleHistory) {\r\n this.$l.hitMotion = pb.textureSampleLevel(this.motionTex, this.hitUV, 0).xy;\r\n this.$l.previousHitUV = pb.sub(this.hitUV, this.hitMotion);\r\n this.$l.historyValid = pb.and(\r\n pb.all(pb.greaterThanEqual(this.previousHitUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousHitUV, pb.vec2(1))),\r\n pb.all(pb.lessThan(pb.abs(this.hitMotion), pb.vec2(5e4)))\r\n );\r\n this.$l.historyRadiance = pb.textureSampleLevel(\r\n this.previousColorTex,\r\n pb.clamp(this.previousHitUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n ).rgb;\r\n this.$l.currentHitDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.hitUV, 0),\r\n this.cameraNearFar.y\r\n );\r\n this.$l.currentHitNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.hitUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.previousHitSurface = pb.textureSampleLevel(\r\n this.previousSurfaceTex,\r\n pb.clamp(this.previousHitUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousHitNormal = pb.normalize(\r\n pb.sub(pb.mul(this.previousHitSurface.rgb, 2), pb.vec3(1))\r\n );\r\n this.historyValid = pb.and(\r\n this.historyValid,\r\n pb.lessThanEqual(\r\n pb.abs(pb.sub(this.previousHitSurface.a, this.currentHitDepth)),\r\n this.historyRejectParams.x\r\n ),\r\n pb.greaterThanEqual(\r\n pb.dot(this.currentHitNormal, this.previousHitNormal),\r\n this.historyRejectParams.y\r\n )\r\n );\r\n // Prefer the reprojected previous frame for multi-bounce\r\n // feedback, but fall back to this frame's already-shaded opaque\r\n // colour rather than dropping the sample. Losing one bounce of\r\n // feedback is a far smaller error than reverting to unoccluded\r\n // IBL, which is what made newly disoccluded regions flash.\r\n this.$l.screenRadiance = this.$choice(\r\n this.historyValid,\r\n this.historyRadiance,\r\n this.currentRadiance\r\n );\r\n } else {\r\n this.$l.screenRadiance = this.currentRadiance;\r\n }\r\n this.$l.screenRadianceFinite = pb.all(pb.lessThan(pb.abs(this.screenRadiance), pb.vec3(1e30)));\r\n this.screenRadiance = this.$choice(\r\n this.screenRadianceFinite,\r\n this.screenRadiance,\r\n this.envRadiance\r\n );\r\n this.$l.maxComponent = pb.max(\r\n pb.max(this.screenRadiance.r, this.screenRadiance.g),\r\n this.screenRadiance.b\r\n );\r\n this.$l.fireflyScale = this.$choice(\r\n pb.greaterThan(this.maxComponent, this.radianceParams.y),\r\n pb.div(this.radianceParams.y, pb.max(this.maxComponent, 1e-5)),\r\n pb.float(1)\r\n );\r\n this.$l.clampedScreenRadiance = pb.mul(this.screenRadiance, this.fireflyScale);\r\n // Split the correction into the bounce the blocker adds and the sky\r\n // it takes away. The bounce is always kept: the hit is on-screen, so\r\n // its colour is a real measurement. Only the removal is scaled by\r\n // skyOcclusion, which lets the sky be dimmed less than physically\r\n // implied without also discarding measured bounce light.\r\n this.$l.bounceGain = pb.max(pb.sub(this.clampedScreenRadiance, this.envRadiance), pb.vec3(0));\r\n this.$l.skyLoss = pb.mul(\r\n pb.max(pb.sub(this.envRadiance, this.clampedScreenRadiance), pb.vec3(0)),\r\n this.skyOcclusion\r\n );\r\n // Cosine-weighted sampling makes the estimator of E/PI - the unit\r\n // the baseline and the lighting pass both use - the plain mean of\r\n // the sampled radiance, so no PI appears here either.\r\n this.$l.correction = pb.mul(\r\n pb.sub(this.bounceGain, this.skyLoss),\r\n this.occluded,\r\n this.radianceParams.x\r\n );\r\n this.correctionSum = pb.add(this.correctionSum, this.correction);\r\n this.determinateSum = pb.add(this.determinateSum, pb.max(this.occluded, this.escaped));\r\n this.escapedSum = pb.add(this.escapedSum, this.escaped);\r\n this.occludedSum = pb.add(this.occludedSum, this.occluded);\r\n });\r\n // Average over resolved rays only. Dividing by raysPerPixel would\r\n // implicitly treat every indeterminate ray as an unoccluded sky\r\n // sample, which is the systematic sky leak this pass has to avoid.\r\n this.$l.determinateCount = pb.max(this.determinateSum, 1);\r\n this.$l.irradiance = pb.add(\r\n this.iblIrradiance,\r\n pb.div(this.correctionSum, this.determinateCount)\r\n );\r\n // radianceParams.x blends the traced estimate over the IBL baseline. A finite-ray\r\n // correction can have much higher variance than the integrated physical sky and must\r\n // not remove more than that blend permits (at the default 0.7, at least 30% remains).\r\n // That reserved share is itself scaled by measured visibility, otherwise no amount of\r\n // occlusion could ever darken an enclosed corner.\r\n this.$l.minimumIrradiance = pb.mul(\r\n this.iblIrradiance,\r\n pb.max(0, pb.sub(1, this.radianceParams.x)),\r\n pb.mix(pb.float(1), pb.div(this.escapedSum, this.determinateCount), this.skyOcclusion)\r\n );\r\n // Clamp before the render-target conversion: a finite value that overflows becomes Inf\r\n // in the texture, and every a-trous pass then expands the contaminated region by its\r\n // kernel radius. Pre-exposed lighting makes this unlikely, but a bright emissive hit\r\n // amplified by a low-probability ray can still reach it.\r\n this.$l.boundedIrradiance = pb.clamp(\r\n pb.max(this.irradiance, this.minimumIrradiance),\r\n pb.vec3(0),\r\n pb.vec3(HALF_FLOAT_MAX)\r\n );\r\n this.$outputs.outColor = pb.vec4(this.boundedIrradiance, 1);\r\n // Cosine-weighted sampling makes the mean of `occluded` over the\r\n // resolved rays an unbiased estimate of cosine-weighted visibility.\r\n // Averaging over the determinate set - not raysPerPixel - is what\r\n // keeps an indeterminate ray from reading as unoccluded, the same\r\n // reasoning the irradiance average uses above.\r\n this.$outputs.outAO = pb.vec4(\r\n pb.clamp(pb.sub(1, pb.div(this.occludedSum, this.determinateCount)), 0, 1)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Trace';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createTemporalProgram(ctx: DrawContext, hasHistory: boolean) {\r\n const program = ctx.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.currentTex = pb.tex2D().uniform(0);\r\n this.currentAOTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n if (hasHistory) {\r\n this.motionTex = pb.tex2D().uniform(0);\r\n this.previousIrradianceTex = pb.tex2D().uniform(0);\r\n this.previousSurfaceTex = pb.tex2D().uniform(0);\r\n this.previousMomentsTex = pb.tex2D().uniform(0);\r\n this.previousAOTex = pb.tex2D().uniform(0);\r\n }\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.temporalParams = pb.vec4().uniform(0);\r\n this.$outputs.outIrradiance = pb.vec4();\r\n this.$outputs.outMoments = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_luminance', [pb.vec3('c')], function () {\r\n this.$l.boundedLuminance = pb.clamp(\r\n pb.dot(this.c, pb.vec3(0.2126, 0.7152, 0.0722)),\r\n 0,\r\n MOMENT_LUMINANCE_MAX\r\n );\r\n this.$return(this.boundedLuminance);\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.current = pb.textureSampleLevel(this.currentTex, this.uv, 0);\r\n this.$l.currentAO = pb.textureSampleLevel(this.currentAOTex, this.uv, 0).r;\r\n this.$l.result = this.current.rgb;\r\n this.$l.resultAO = this.currentAO;\r\n this.$l.luminance = this.SSGI_luminance(this.current.rgb);\r\n this.$l.moment = pb.vec4(this.luminance, pb.mul(this.luminance, this.luminance), 1, 0);\r\n if (hasHistory) {\r\n this.$l.motion = pb.textureSampleLevel(this.motionTex, this.uv, 0).xy;\r\n this.$l.previousUV = pb.sub(this.uv, this.motion);\r\n this.$l.validUV = pb.and(\r\n pb.all(pb.greaterThanEqual(this.previousUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousUV, pb.vec2(1))),\r\n pb.all(pb.lessThan(pb.abs(this.motion), pb.vec2(5e4)))\r\n );\r\n this.$l.currentDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.temporalParams.w\r\n );\r\n this.$l.currentNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.previousSurface = pb.textureSampleLevel(\r\n this.previousSurfaceTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousNormal = pb.normalize(pb.sub(pb.mul(this.previousSurface.rgb, 2), pb.vec3(1)));\r\n this.$l.surfaceValid = pb.and(\r\n pb.lessThanEqual(\r\n pb.abs(pb.sub(this.previousSurface.a, this.currentDepth)),\r\n this.temporalParams.y\r\n ),\r\n pb.greaterThanEqual(pb.dot(this.currentNormal, this.previousNormal), this.temporalParams.z)\r\n );\r\n this.$l.neighborhoodMin = this.current.rgb;\r\n this.$l.neighborhoodMax = this.current.rgb;\r\n this.$l.aoNeighborhoodMin = this.currentAO;\r\n this.$l.aoNeighborhoodMax = this.currentAO;\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n if (x === 0 && y === 0) {\r\n continue;\r\n }\r\n this.$l.neighborUV = pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy));\r\n this.$l.neighbor = pb.textureSampleLevel(this.currentTex, this.neighborUV, 0).rgb;\r\n this.neighborhoodMin = pb.min(this.neighborhoodMin, this.neighbor);\r\n this.neighborhoodMax = pb.max(this.neighborhoodMax, this.neighbor);\r\n this.$l.aoNeighbor = pb.textureSampleLevel(this.currentAOTex, this.neighborUV, 0).r;\r\n this.aoNeighborhoodMin = pb.min(this.aoNeighborhoodMin, this.aoNeighbor);\r\n this.aoNeighborhoodMax = pb.max(this.aoNeighborhoodMax, this.aoNeighbor);\r\n }\r\n }\r\n this.$l.previous = pb.textureSampleLevel(\r\n this.previousIrradianceTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.previousClamped = pb.clamp(this.previous.rgb, this.neighborhoodMin, this.neighborhoodMax);\r\n this.$l.previousMoment = pb.textureSampleLevel(\r\n this.previousMomentsTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n );\r\n this.$l.validity = pb.mul(\r\n pb.float(pb.and(this.validUV, this.surfaceValid)),\r\n pb.clamp(this.previous.a, 0, 1)\r\n );\r\n // Start new histories as a running average, then cap their weight\r\n // at the configured value once enough samples have accumulated.\r\n this.$l.runningAverageWeight = pb.div(this.previousMoment.z, pb.add(this.previousMoment.z, 1));\r\n this.$l.historyWeight = pb.min(this.temporalParams.x, this.runningAverageWeight);\r\n this.$l.weight = pb.mul(this.historyWeight, this.validity);\r\n this.result = pb.mix(this.current.rgb, this.previousClamped, this.weight);\r\n // AO accumulates on exactly the same validity and weight as the\r\n // irradiance: it was measured by the same rays against the same\r\n // surface, so any disagreement between the two would be an artifact.\r\n this.$l.previousAO = pb.textureSampleLevel(\r\n this.previousAOTex,\r\n pb.clamp(this.previousUV, pb.vec2(0), pb.vec2(1)),\r\n 0\r\n ).r;\r\n this.$l.previousAOClamped = pb.clamp(\r\n this.previousAO,\r\n this.aoNeighborhoodMin,\r\n this.aoNeighborhoodMax\r\n );\r\n this.resultAO = pb.mix(this.currentAO, this.previousAOClamped, this.weight);\r\n this.$l.momentXY = pb.mix(this.moment.xy, this.previousMoment.xy, this.weight);\r\n this.$l.historyLength = pb.mix(\r\n pb.float(1),\r\n pb.min(32, pb.add(this.previousMoment.z, 1)),\r\n this.validity\r\n );\r\n this.$l.variance = pb.max(0, pb.sub(this.momentXY.y, pb.mul(this.momentXY.x, this.momentXY.x)));\r\n this.moment = pb.vec4(this.momentXY, this.historyLength, this.variance);\r\n } else {\r\n // The WebGL1 fallback has no motion-vector temporal resolve. Seed\r\n // a-trous with spatial variance so its luminance weighting can\r\n // still remove Monte Carlo noise instead of treating it as an edge.\r\n this.$l.spatialLum = pb.float(0);\r\n this.$l.spatialLum2 = pb.float(0);\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n this.$l.neighborLum = this.SSGI_luminance(\r\n pb.textureSampleLevel(\r\n this.currentTex,\r\n pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy)),\r\n 0\r\n ).rgb\r\n );\r\n this.spatialLum = pb.add(this.spatialLum, this.neighborLum);\r\n this.spatialLum2 = pb.add(this.spatialLum2, pb.mul(this.neighborLum, this.neighborLum));\r\n }\r\n }\r\n this.spatialLum = pb.div(this.spatialLum, 9);\r\n this.spatialLum2 = pb.div(this.spatialLum2, 9);\r\n this.$l.spatialVariance = pb.max(\r\n 0,\r\n pb.sub(this.spatialLum2, pb.mul(this.spatialLum, this.spatialLum))\r\n );\r\n this.moment = pb.vec4(this.moment.xyz, this.spatialVariance);\r\n }\r\n this.$outputs.outIrradiance = pb.vec4(this.result, this.current.a);\r\n this.$outputs.outMoments = this.moment;\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.resultAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = hasHistory ? '@SSGI_Temporal' : '@SSGI_TemporalInitialize';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createAtrousProgram(ctx: DrawContext) {\r\n const program = ctx.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.sourceTex = pb.tex2D().uniform(0);\r\n this.aoSourceTex = pb.tex2D().uniform(0);\r\n this.momentsTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.filterParams = pb.vec4().uniform(0);\r\n this.denoiseParams = pb.vec4().uniform(0);\r\n this.cameraFar = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.func('SSGI_luminance', [pb.vec3('c')], function () {\r\n this.$return(pb.max(0, pb.dot(this.c, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n });\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.xy);\r\n this.$l.center = pb.textureSampleLevel(this.sourceTex, this.uv, 0);\r\n this.$l.centerDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.cameraFar\r\n );\r\n this.$l.centerNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.centerLum = this.SSGI_luminance(this.center.rgb);\r\n this.$l.moments = pb.textureSampleLevel(this.momentsTex, this.uv, 0);\r\n // A pixel with little accumulated history has an unreliable variance\r\n // estimate, so the edge-stopping functions would preserve Monte Carlo\r\n // noise as if it were detail. Widen the kernel and relax the luminance\r\n // and normal tests until enough frames have converged, then hand back\r\n // to the sharp weights (standard SVGF history-driven ramp).\r\n //\r\n // A path that never accumulates history (no temporal resolve, so\r\n // moments.z is pinned at 1) is permanently unconverged, not converged:\r\n // it is the noisiest input this filter ever sees. Sending it to the\r\n // relaxed end is the whole point of the ramp - the sharp end would give\r\n // it the narrowest kernel and one eighth the luminance tolerance.\r\n this.$l.historyConfidence = this.$choice(\r\n pb.greaterThan(this.denoiseParams.x, 0),\r\n pb.clamp(pb.div(this.moments.z, this.denoiseParams.x), 0, 1),\r\n pb.float(0)\r\n );\r\n this.$l.stepScale = pb.mix(pb.float(2), pb.float(1), this.historyConfidence);\r\n this.$l.effStep = pb.mul(this.filterParams.x, this.stepScale);\r\n this.$l.normalPower = pb.mix(\r\n pb.max(1, pb.mul(this.filterParams.z, 0.25)),\r\n this.filterParams.z,\r\n this.historyConfidence\r\n );\r\n this.$l.sigmaScale = pb.mix(pb.float(8), pb.float(1), this.historyConfidence);\r\n this.$l.sigma = pb.mul(pb.add(pb.sqrt(pb.max(this.moments.w, 0)), 0.02), this.sigmaScale);\r\n this.$l.centerAO = pb.textureSampleLevel(this.aoSourceTex, this.uv, 0).r;\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$l.aoSum = pb.float(0);\r\n this.$l.aoWeightSum = pb.float(0);\r\n const kernel = [1, 2 / 3, 1 / 6];\r\n for (let y = -2; y <= 2; y++) {\r\n for (let x = -2; x <= 2; x++) {\r\n const kernelWeight = kernel[Math.abs(x)] * kernel[Math.abs(y)];\r\n this.$l.sampleUV = pb.add(\r\n this.uv,\r\n pb.mul(pb.div(pb.vec2(x, y), this.targetSize.xy), this.effStep)\r\n );\r\n this.$l.sampleValue = pb.textureSampleLevel(this.sourceTex, this.sampleUV, 0);\r\n this.$l.sampleDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0),\r\n this.cameraFar\r\n );\r\n this.$l.sampleNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.sampleUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.depthWeight = pb.exp(\r\n pb.neg(\r\n pb.div(\r\n pb.abs(pb.sub(this.sampleDepth, this.centerDepth)),\r\n pb.mul(this.filterParams.y, this.effStep)\r\n )\r\n )\r\n );\r\n this.$l.normalWeight = pb.pow(\r\n pb.max(0, pb.dot(this.centerNormal, this.sampleNormal)),\r\n this.normalPower\r\n );\r\n this.$l.colorWeight = pb.exp(\r\n pb.neg(\r\n pb.div(\r\n pb.abs(pb.sub(this.SSGI_luminance(this.sampleValue.rgb), this.centerLum)),\r\n pb.mul(this.sigma, this.filterParams.w)\r\n )\r\n )\r\n );\r\n this.$l.weight = pb.mul(\r\n kernelWeight,\r\n this.depthWeight,\r\n this.normalWeight,\r\n this.colorWeight,\r\n this.sampleValue.a\r\n );\r\n this.sum = pb.add(this.sum, pb.mul(this.sampleValue.rgb, this.weight));\r\n this.weightSum = pb.add(this.weightSum, this.weight);\r\n // AO deliberately drops colorWeight: that term is driven by the\r\n // moments' luminance variance, which describes the irradiance and\r\n // says nothing about AO. Leaving it out is a stronger smoothing,\r\n // which is what a per-ray binary quantity needs - with 1-2 rays per\r\n // pixel, single-frame AO is close to binary.\r\n this.$l.aoWeight = pb.mul(\r\n kernelWeight,\r\n this.depthWeight,\r\n this.normalWeight,\r\n this.sampleValue.a\r\n );\r\n this.$l.sampleAO = pb.textureSampleLevel(this.aoSourceTex, this.sampleUV, 0).r;\r\n this.aoSum = pb.add(this.aoSum, pb.mul(this.sampleAO, this.aoWeight));\r\n this.aoWeightSum = pb.add(this.aoWeightSum, this.aoWeight);\r\n }\r\n }\r\n this.$l.filtered = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.sum, this.weightSum),\r\n this.center.rgb\r\n );\r\n this.$l.filteredAO = this.$choice(\r\n pb.greaterThan(this.aoWeightSum, 1e-5),\r\n pb.div(this.aoSum, this.aoWeightSum),\r\n this.centerAO\r\n );\r\n this.$outputs.outColor = pb.vec4(this.filtered, this.center.a);\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.filteredAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_ATrous';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createSurfaceProgram(ctx: DrawContext) {\r\n const program = ctx.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.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec2().uniform(0);\r\n this.cameraFar = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize);\r\n this.$l.normal = pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb;\r\n this.$l.depth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.cameraFar\r\n );\r\n this.$outputs.outColor = pb.vec4(this.normal, this.depth);\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Surface';\r\n return program;\r\n }\r\n\r\n /**\r\n * Multiply the traced ambient occlusion into the scene color.\r\n *\r\n * This is the same multiply-into-final-color semantics the standalone SAO post\r\n * effect applies, so enabling both double darkens.\r\n *\r\n * @internal\r\n */\r\n private compositeAO(ctx: DrawContext, sceneColor: Texture2D, ao: Texture2D, srgbOutput: boolean) {\r\n const key = srgbOutput ? 'srgb' : 'linear';\r\n let program = SSGI._compositePrograms[key];\r\n if (!program) {\r\n program = this.createCompositeProgram(ctx, srgbOutput);\r\n SSGI._compositePrograms[key] = program;\r\n }\r\n const hash = `${key}:${sceneColor.uid}:${ao.uid}`;\r\n let bindGroup = this._compositeBindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setTexture('colorTex', sceneColor, fetchSampler('clamp_nearest_nomip'));\r\n // Nearest, not linear: the AO handed to this pass is already at full\r\n // resolution, so filtering would only add a dependency on the WebGL\r\n // half-float linear filtering cap for no gain.\r\n bindGroup.setTexture('aoTex', ao, fetchSampler('clamp_nearest_nomip'));\r\n this._compositeBindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setValue(\r\n 'aoParams',\r\n new Vector2(ctx.camera.ssgiAOIntensity, Math.max(1e-3, ctx.camera.ssgiAOPower))\r\n );\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad(AbstractPostEffect.getDefaultRenderState(ctx, 'always'));\r\n }\r\n\r\n /** @internal */\r\n private createCompositeProgram(ctx: DrawContext, srgbOutput: boolean) {\r\n const program = ctx.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.colorTex = pb.tex2D().uniform(0);\r\n this.aoTex = pb.tex2D().uniform(0);\r\n this.aoParams = pb.vec2().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.color = pb.textureSampleLevel(this.colorTex, this.$inputs.uv, 0);\r\n this.$l.ao = pb.clamp(pb.textureSampleLevel(this.aoTex, this.$inputs.uv, 0).r, 0, 1);\r\n // mix() toward 1 rather than a plain multiply: intensity then doubles as\r\n // the fallback for noisy or unresolved texels, which matters most on the\r\n // WebGL1 path where there is no temporal accumulation to converge them.\r\n this.$l.shapedAO = pb.pow(this.ao, this.aoParams.y);\r\n this.$l.finalAO = pb.mix(pb.float(1), this.shapedAO, this.aoParams.x);\r\n this.$l.occludedColor = pb.mul(this.color.rgb, this.finalAO);\r\n this.$outputs.outColor = pb.vec4(\r\n srgbOutput ? linearToGamma(this, this.occludedColor) : this.occludedColor,\r\n this.color.a\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = srgbOutput ? '@SSGI_CompositeAO_sRGB' : '@SSGI_CompositeAO';\r\n return program;\r\n }\r\n\r\n /** @internal */\r\n private createUpsampleProgram(ctx: DrawContext) {\r\n const program = ctx.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.sourceTex = pb.tex2D().uniform(0);\r\n this.aoSourceTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.normalTex = pb.tex2D().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.guideParams = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n this.$outputs.outAO = pb.vec4();\r\n pb.main(function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.targetSize.zw);\r\n this.$l.centerDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0),\r\n this.guideParams.z\r\n );\r\n this.$l.centerNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.uv, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$l.aoSum = pb.float(0);\r\n for (let y = -1; y <= 1; y++) {\r\n for (let x = -1; x <= 1; x++) {\r\n this.$l.sampleUV = pb.add(this.uv, pb.div(pb.vec2(x, y), this.targetSize.xy));\r\n this.$l.sampleValue = pb.textureSampleLevel(this.sourceTex, this.sampleUV, 0);\r\n this.$l.sampleAO = pb.textureSampleLevel(this.aoSourceTex, this.sampleUV, 0).r;\r\n this.$l.sampleDepth = pb.mul(\r\n ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0),\r\n this.guideParams.z\r\n );\r\n this.$l.sampleNormal = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSampleLevel(this.normalTex, this.sampleUV, 0).rgb, 2), pb.vec3(1))\r\n );\r\n this.$l.depthWeight = pb.exp(\r\n pb.neg(pb.div(pb.abs(pb.sub(this.sampleDepth, this.centerDepth)), this.guideParams.x))\r\n );\r\n this.$l.normalWeight = pb.pow(\r\n pb.max(0, pb.dot(this.centerNormal, this.sampleNormal)),\r\n this.guideParams.y\r\n );\r\n this.$l.weight = pb.mul(this.depthWeight, this.normalWeight, this.sampleValue.a);\r\n this.sum = pb.add(this.sum, pb.mul(this.sampleValue.rgb, this.weight));\r\n this.weightSum = pb.add(this.weightSum, this.weight);\r\n // Same joint bilateral weights as the irradiance, so the upsampled\r\n // AO cannot cross a depth or normal edge the irradiance respects.\r\n this.aoSum = pb.add(this.aoSum, pb.mul(this.sampleAO, this.weight));\r\n }\r\n }\r\n this.$l.result = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.sum, this.weightSum),\r\n pb.textureSampleLevel(this.sourceTex, this.uv, 0).rgb\r\n );\r\n this.$l.resultAO = this.$choice(\r\n pb.greaterThan(this.weightSum, 1e-5),\r\n pb.div(this.aoSum, this.weightSum),\r\n pb.textureSampleLevel(this.aoSourceTex, this.uv, 0).r\r\n );\r\n this.$outputs.outColor = pb.vec4(this.result, pb.float(pb.greaterThan(this.weightSum, 1e-5)));\r\n this.$outputs.outAO = pb.vec4(pb.clamp(this.resultAO, 0, 1));\r\n });\r\n }\r\n })!;\r\n program.name = '@SSGI_Upsample';\r\n return program;\r\n }\r\n}\r\n"],"names":["IRRADIANCE_FORMAT","SURFACE_FORMAT","MOMENTS_FORMAT","AO_FORMAT","HALF_FLOAT_MAX","MOMENT_LUMINANCE_MAX","SSGI","AbstractPostEffect","_tracePrograms","_temporalPrograms","_atrousProgram","_surfaceProgram","_upsampleProgram","_compositePrograms","_traceBindGroups","_temporalBindGroups","_atrousBindGroups","_surfaceBindGroups","_upsampleBindGroups","_compositeBindGroups","_layer","PostEffectLayer","opaque","requireLinearDepthTexture","ctx","requireMotionVectorTexture","device","type","requireHiZTexture","requireSceneNormalTexture","setup","s","graph","history","blackboard","input","linearDepthHandle","get","FrameResources","LinearDepth","normalHandle","SceneNormal","motionHandle","MotionVector","hiZHandle","HiZ","noFogHandle","SceneColorNoFog","sampleColorHandle","settings","camera","ssgiResolvedSettings","traceWidth","halfRes","Math","max","ceil","width","traceHeight","height","traceSize","fullSize","traceDesc","format","sizeMode","fullIrradianceDesc","surfaceDesc","momentsDesc","aoTraceDesc","fullAODesc","findHistoryRead","name","historyReads","find","binding","handle","previousIrradianceHandle","RGHistoryResources","SSGI_IRRADIANCE","previousSurfaceHandle","SSGI_SURFACE","previousMomentsHandle","importPreviousIfCompatible","SSGI_MOMENTS","previousAOHandle","SSGI_AO","previousSceneColorHandle","SSGI_SCENE_COLOR","colorFormat","canSampleSceneHistory","readFrameInputs","builder","read","dep","dependencies","traceResult","addPass","out","createTexture","label","ao","fb","createFramebuffer","colorAttachments","depthAttachment","ignoreDepthStencil","setExecute","rg","pushDeviceStates","setFramebuffer","getFramebuffer","trace","getTexture","popDeviceStates","irradiance","surfaceHandle","writeSurface","canTemporal","ssgiTemporal","temporalResult","moments","temporal","filteredHandle","filteredAOHandle","pass","denoisePasses","source","aoSource","filtered","atrous","finalIrradianceHandle","finalAOHandle","upsampled","upsample","traceResolutionAOHandle","output","createOutput","framebuffer","sceneColor","filteredAO","surface","ssgiAOIntensity","compositeAO","srgbOutput","passThrough","commitHistory","color","texture","queueRetainedCommit","currentColor","previousColor","depth","normal","motion","previousSurface","hiZ","sampleHistory","envHash","env","light","getHash","historyHash","uid","hizHash","programHash","raysPerPixel","bindGroupHash","program","createTraceProgram","colorSampler","fetchSampler","bindGroup","createBindGroup","bindGroupLayouts","setTexture","setValue","mipLevelCount","Vector2","ssgiDepthReject","ssgiNormalReject","getNearPlane","getFarPlane","viewMatrix","worldMatrix","getProjectionMatrix","Matrix4x4","invert","Vector4","ssgiMaxDistance","ssgiThickness","maxSteps","ssgiStride","ssgiIntensity","ssgiMaxRayIntensity","ShaderHelper","getEnvLightLuminance","frameInfo","frameCounter","ssgiSkyOcclusion","needFlip","envLight","updateBindGroup","setProgram","setBindGroup","drawFullscreenQuad","getDefaultRenderState","current","currentAO","previousIrradiance","previousMoments","previousAO","hasHistory","hash","createTemporalProgram","ssgiTemporalWeight","step","hasTemporalHistory","createAtrousProgram","createSurfaceProgram","createUpsampleProgram","useHiZ","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","fragment","currentColorTex","tex2D","depthTex","sampleType","normalTex","previousColorTex","motionTex","previousSurfaceTex","historyRejectParams","hizTex","depthMipLevels","cameraNearFar","mat4","invViewMatrix","projMatrix","invProjMatrix","traceParams","targetSize","radianceParams","skyOcclusion","float","initShaderBindings","outColor","outAO","func","$l","linearDepth","sampleLinearDepth","nonLinearDepth","linearNormalizedToNonLinearDepth","clipPos","sub","deviceDepthToClipZ","clamp","viewPos","$return","div","xyz","w","q","dot","p","fract","sin","seed","vec3","up","$choice","lessThan","abs","n","z","tangent","normalize","cross","bitangent","r","sqrt","xi","x","phi","PI","local","cos","fragCoord","SSGI_getPosition","greaterThanEqual","$else","worldNormal","textureSampleLevel","rgb","viewNormal","iblIrradiance","getIrradiance","correctionSum","determinateSum","escapedSum","occludedSum","$for","SSGI_hash22","rayIndex","worldRay","SSGI_cosineDirection","viewRay","rayOrigin","giTrace","stepOffset","hit","screenSpaceRayTracing_HiZ","screenSpaceRayTracing_Linear2D","hitFinite","all","occluded","escaped","hitUV","greaterThan","rawEnvRadiance","getRadiance","envRadiance","currentRadiance","hitMotion","previousHitUV","historyValid","and","lessThanEqual","historyRadiance","currentHitDepth","currentHitNormal","previousHitSurface","previousHitNormal","a","screenRadiance","screenRadianceFinite","maxComponent","g","b","fireflyScale","clampedScreenRadiance","bounceGain","skyLoss","correction","determinateCount","minimumIrradiance","mix","boundedIrradiance","currentTex","currentAOTex","previousIrradianceTex","previousMomentsTex","previousAOTex","temporalParams","outIrradiance","outMoments","boundedLuminance","c","result","resultAO","luminance","SSGI_luminance","moment","previousUV","validUV","currentDepth","currentNormal","previousNormal","surfaceValid","neighborhoodMin","neighborhoodMax","aoNeighborhoodMin","aoNeighborhoodMax","neighborUV","neighbor","min","aoNeighbor","previous","previousClamped","previousMoment","validity","runningAverageWeight","historyWeight","weight","previousAOClamped","momentXY","historyLength","variance","spatialLum","spatialLum2","neighborLum","spatialVariance","sourceTex","aoSourceTex","momentsTex","filterParams","denoiseParams","cameraFar","center","centerDepth","centerNormal","centerLum","historyConfidence","stepScale","effStep","normalPower","sigmaScale","sigma","centerAO","sum","weightSum","aoSum","aoWeightSum","kernel","kernelWeight","sampleUV","sampleValue","sampleDepth","sampleNormal","depthWeight","exp","normalWeight","pow","colorWeight","aoWeight","sampleAO","key","createCompositeProgram","ssgiAOPower","colorTex","aoTex","aoParams","shapedAO","finalAO","occludedColor","linearToGamma","guideParams","zw"],"mappings":"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"}