@woosh/meep-engine 3.53.0 → 3.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/package.json +1 -1
  2. package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
  3. package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
  4. package/src/core/math/noise/worley_noise_2d.js +74 -0
  5. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
  6. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
  7. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
  8. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
  9. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
  10. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
  11. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
  12. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
  13. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
  14. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
  15. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
  16. package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
  17. package/src/engine/{graphics3/decal/DecalAtlasFill.d.ts → graphics/texture/atlas/SpriteAtlasFill.d.ts} +4 -4
  18. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
  19. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
  20. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
  21. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  22. package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
  23. package/src/engine/{graphics3/decal/decal_atlas_border.d.ts → graphics/texture/atlas/sprite_atlas_border.d.ts} +12 -12
  24. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
  25. package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
  26. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  27. package/src/engine/graphics3/DecalSystem.js +447 -450
  28. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -22
  29. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  30. package/src/engine/graphics3/GPUParticleEmitterSystem.js +892 -951
  31. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  32. package/src/generation/foliage/FOLIAGE_DESIGN.md +2 -1
  33. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +4 -3
  34. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -1
  35. package/src/generation/foliage/config/BarkMaterialConfig.js +6 -6
  36. package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
  37. package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
  38. package/src/generation/foliage/config/FoliageBarkType.js +16 -0
  39. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +58 -5
  40. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
  41. package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -181
  42. package/src/generation/foliage/index.d.ts +2 -1
  43. package/src/generation/foliage/index.js +44 -43
  44. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -1
  45. package/src/generation/foliage/material/make_bark_material.js +23 -95
  46. package/src/generation/foliage/material/make_foliage_material.d.ts +29 -3
  47. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
  48. package/src/generation/foliage/material/make_foliage_material.js +605 -359
  49. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -1
  50. package/src/generation/foliage/mesh/branch_collar_project.js +205 -203
  51. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +15 -0
  52. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
  53. package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -502
  54. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  55. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -1047
  56. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +2 -1
  57. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
  58. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -415
  59. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  60. package/src/generation/foliage/presets/make_tree_species_preset.js +870 -837
  61. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -121
  62. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +10 -7
  63. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
  64. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -179
  65. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  66. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -1104
  67. package/src/shade/RENDERER_CONTRACT.md +5 -2
  68. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -1
  69. package/src/shade/device/SHADE_DEVICE_FLOOR.js +2 -0
  70. package/src/shade/playground/foliage_wind/foliage_world.d.ts +6 -0
  71. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  72. package/src/shade/playground/foliage_wind/foliage_world.js +602 -593
  73. package/src/shade/playground/foliage_wind/index.html +260 -254
  74. package/src/shade/playground/foliage_wind/main.js +275 -263
  75. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  76. package/src/shade/renderer/Renderer.js +1 -1
  77. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  78. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  79. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  80. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  81. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  82. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
  83. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
  84. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  85. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
  86. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
  87. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
  88. package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
  89. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
  90. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
  91. package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
  92. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
  93. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
  94. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
  95. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
  96. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  97. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
  98. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
  99. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  100. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
  101. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
  102. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
  103. package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
  104. package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
  105. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  106. package/src/shade/renderer/light/GPULightCollection.js +67 -0
  107. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
  108. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
  109. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
  110. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
  111. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
  112. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
  113. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
  114. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
  115. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
  116. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
  117. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
  118. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
  119. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
  120. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
  121. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
  122. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
  123. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
  124. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
  125. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
  126. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
  127. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
  128. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  129. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  130. package/src/shade/renderer/particles/GPUParticleSystem.js +4 -3
  131. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
  132. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  133. package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
  134. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
  135. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
  136. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
  137. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  138. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +21 -38
  139. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.d.ts.map +1 -1
  140. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +154 -147
  141. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +2 -1
  142. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  143. package/src/shade/renderer/postprocess/gtao/GTAO.js +5 -1
  144. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts +8 -0
  145. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -1
  146. package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +10 -1
  147. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  148. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +5 -0
  149. package/src/shade/renderer/postprocess/gtao/chunk_gtao_compute_mip_level.d.ts +22 -0
  150. package/src/shade/renderer/postprocess/gtao/chunk_gtao_compute_mip_level.d.ts.map +1 -0
  151. package/src/shade/renderer/postprocess/gtao/chunk_gtao_compute_mip_level.js +33 -0
  152. package/src/shade/renderer/postprocess/gtao/chunk_gtao_resolve_hzb_depth.d.ts +22 -0
  153. package/src/shade/renderer/postprocess/gtao/chunk_gtao_resolve_hzb_depth.d.ts.map +1 -0
  154. package/src/shade/renderer/postprocess/gtao/chunk_gtao_resolve_hzb_depth.js +56 -0
  155. package/src/shade/renderer/postprocess/gtao/chunk_gtao_sample_depth.d.ts +13 -0
  156. package/src/shade/renderer/postprocess/gtao/chunk_gtao_sample_depth.d.ts.map +1 -0
  157. package/src/shade/renderer/postprocess/gtao/chunk_gtao_sample_depth.js +42 -0
  158. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +2 -1
  159. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  160. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +382 -357
  161. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  162. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +414 -410
  163. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  164. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -7
  165. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
  166. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
  167. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
  168. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
  169. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
  170. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
  171. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
  172. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
  173. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
  174. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
  175. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  176. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
  177. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
  178. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
  179. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  180. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
  181. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
  182. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
  183. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
  184. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
  185. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
  186. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
  187. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
  188. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
  189. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
  190. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
  191. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
  192. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
  193. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
  194. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
  195. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
  196. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
  197. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
  198. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +36 -0
  199. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
  200. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +129 -0
  201. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
  202. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
  203. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +370 -0
  204. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
  205. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
  206. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
  207. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  208. package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
  209. package/src/engine/graphics3/decal/DecalAtlas.d.ts +0 -43
  210. package/src/engine/graphics3/decal/DecalAtlas.d.ts.map +0 -1
  211. package/src/engine/graphics3/decal/DecalAtlasFill.d.ts.map +0 -1
  212. package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
  213. package/src/engine/graphics3/decal/decal_atlas_border.d.ts.map +0 -1
  214. package/src/shade/renderer/postprocess/gtao/graph_build_depth_mipmap.d.ts +0 -26
  215. package/src/shade/renderer/postprocess/gtao/graph_build_depth_mipmap.d.ts.map +0 -1
  216. package/src/shade/renderer/postprocess/gtao/graph_build_depth_mipmap.js +0 -268
  217. package/src/shade/renderer/postprocess/ssr/copy_shader_f32.d.ts +0 -3
  218. package/src/shade/renderer/postprocess/ssr/copy_shader_f32.d.ts.map +0 -1
  219. package/src/shade/renderer/postprocess/ssr/copy_shader_f32.js +0 -32
  220. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts +0 -17
  221. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +0 -1
  222. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +0 -98
  223. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts +0 -23
  224. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts.map +0 -1
  225. package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.js +0 -118
  226. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.d.ts +0 -15
  227. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.d.ts.map +0 -1
  228. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
  229. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +0 -17
  230. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts.map +0 -1
  231. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
  232. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts +0 -35
  233. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +0 -1
  234. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
  235. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +0 -35
  236. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts.map +0 -1
  237. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
  238. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.d.ts +0 -10
  239. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.d.ts.map +0 -1
  240. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
  241. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.d.ts +0 -28
  242. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.d.ts.map +0 -1
  243. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
  244. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +0 -48
  245. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +0 -1
  246. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
  247. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +0 -28
  248. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +0 -1
  249. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
@@ -1,27 +1,30 @@
1
- import { RenderPipelineDescriptor } from "../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
2
1
  import { DepthStencilState } from "../../../descriptor/pipeline/render/DepthStencilState.js";
3
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
2
+ import { RenderPipelineDescriptor } from "../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
4
3
  import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
5
4
  import { chunk_sample_volumetrics } from "../../deferred/chunk_sample_volumetrics.js";
6
5
  import { AVBOIT_EXTINCT_TRANSMITTANCE } from "../../rasterize/native/avboit/AVBOIT_CONSTANTS.js";
7
- import { AVBOIT_WARP_STRUCT } from "../../rasterize/native/avboit/AVBOIT_WARP_STRUCT.js";
8
6
  import { AVBOIT_DRAW_TARGETS } from "../../rasterize/native/avboit/avboit_draw_fragment_body.js";
9
- import { chunk_avboit_view_depth_to_virtual } from "../../rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js";
7
+ import { AVBOIT_WARP_STRUCT } from "../../rasterize/native/avboit/AVBOIT_WARP_STRUCT.js";
10
8
  import { chunk_avboit_footprint_bias } from "../../rasterize/native/avboit/chunk_avboit_footprint_bias.js";
11
9
  import { chunk_avboit_sample_transmittance } from "../../rasterize/native/avboit/chunk_avboit_sample_transmittance.js";
12
- import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
10
+ import { chunk_avboit_view_depth_to_virtual } from "../../rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js";
13
11
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
14
12
  import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
13
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
14
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
15
15
  import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
16
- import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
17
16
  import { chunk_view_mip_bias } from "../../view/chunk_view_mip_bias.js";
17
+ import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
18
+ import {
19
+ irradiance_clipmap_add_resources
20
+ } from "../../volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js";
18
21
  import { VOLUMETRICS_METADATA_STRUCT } from "../../volumetrics/VOLUMETRICS_METADATA_STRUCT.js";
19
22
  import { EMITTER_FLAG } from "../data/PARTICLE_EMITTER_STRUCT.js";
20
23
  import { PARTICLE_SOFT_FADE_RANGE } from "../ParticleConstants.js";
21
24
  import { chunk_particle_avboit_contribution } from "./chunk_particle_avboit_contribution.js";
22
- import { chunk_particle_scene_view_depth } from "./chunk_particle_scene_view_depth.js";
23
25
  import { chunk_particle_billboard_vertex } from "./chunk_particle_billboard_vertex.js";
24
26
  import { chunk_particle_lighting } from "./chunk_particle_lighting.js";
27
+ import { chunk_particle_scene_view_depth } from "./chunk_particle_scene_view_depth.js";
25
28
 
26
29
  /**
27
30
  * The particles' AVBOIT draw: the billboard quads at internal resolution, depth-tested against the
@@ -30,28 +33,13 @@ import { chunk_particle_lighting } from "./chunk_particle_lighting.js";
30
33
  *
31
34
  * Per fragment: the atlas sample times the particle colour, the soft-depth fade against the scene
32
35
  * depth, lighting for an emitter flagged `EMITTER_FLAG.LIGHTING` (`chunk_particle_lighting`: the
33
- * froxel irradiance volume: the lights and the indirect lighting), the volumetric fog composite exactly as the
34
- * mesh draw applies it, then the transmittance of everything in front from the integral texture —
35
- * and a fragment the volume already calls extinct is discarded unshaded. An emitter without the
36
- * flag is its own colour, which is what an additive one wants.
37
- *
38
- * What is written depends on how the particle blends:
39
- *
40
- * - **alpha / premultiplied** — a surface: `color += premultiplied × T`, `norm += coverage × T`,
41
- * `extinction += -log(1 - coverage)`, the same three the meshes write, with an untinted
42
- * `T_self = 1 - coverage`; the splat recorded exactly that.
43
- * - **additive** — light: `emission += premultiplied × T`, nothing else. It joins the resolve
44
- * attenuated by what is in front of it and outside the coverage normalization, which is what an
45
- * additive fragment means.
46
- *
47
- * The scene depth is bound twice: as the read-only depth attachment the pipeline tests against, and
48
- * as the texture the soft fade reads. Both are reads, which WebGPU allows within one pass; the pass
49
- * is recorded with the attachment read-only for that reason.
36
+ * world-space irradiance clipmap and cached far-field SH), the volumetric fog composite, then the
37
+ * transmittance of everything in front from the integral texture.
50
38
  */
51
39
 
52
40
  const resources = new ShaderResourceSetDescriptor();
53
41
 
54
- resources.createGroup()
42
+ const group = resources.createGroup()
55
43
  .addUniform("camera", CAMERA_UNIFORM_STRUCT)
56
44
  .addUniform("view", VIEW_UNIFORM_STRUCT)
57
45
  .addStorageBuffer("warp", AVBOIT_WARP_STRUCT)
@@ -67,10 +55,10 @@ resources.createGroup()
67
55
  // volumetrics (composited inline)
68
56
  .addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
69
57
  .addTexture("tVolumetrics", "float", "3d")
70
- .addTexture("tSTBN_vec3", "float", "3d")
71
- // lighting (chunk_particle_lighting): the froxel irradiance volume, trilinear through sLinear
72
- .addTexture("tIrradianceY", "float", "3d")
73
- .addTexture("tIrradianceCoCg", "float", "3d");
58
+ .addTexture("tSTBN_vec3", "float", "3d");
59
+
60
+ // lighting (chunk_particle_lighting): world-space irradiance clipmap + cached far-field SH fallback
61
+ irradiance_clipmap_add_resources(group, { include_far_field: true });
74
62
 
75
63
  const body = CodeChunk.from(
76
64
  /* language=wgsl */ `
@@ -111,16 +99,11 @@ fn vs_general(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32
111
99
 
112
100
  @fragment
113
101
  fn fs_main(in : ParticleVertexOut) -> ParticleAVBOITDrawOutput {
114
- let screen_uv = in.clip.xy / vec2<f32>(f32(view.width), f32(view.height));
115
- let uv_bias = view_uv_derivative_bias(view.upscale_ratio);
116
- let uv_ddx = dpdx(in.uv) * uv_bias.x;
102
+ let screen_uv = in.clip.xy / vec2<f32>(f32(view.width), f32(view.height));
103
+ let uv_bias = view_uv_derivative_bias(view.upscale_ratio);
104
+ let uv_ddx = dpdx(in.uv) * uv_bias.x;
117
105
  let uv_ddy = dpdy(in.uv) * uv_bias.y;
118
106
 
119
- // a billboard, stretched or not, is built from the camera's right and up and lies in the view plane,
120
- // so its footprint is zero; a horizontal, vertical or world-facing quad seen at an angle runs
121
- // through depth across a voxel (avboit_footprint_bias). An additive particle writes nothing into
122
- // the volume, so nothing of its own is there to occlude it, and takes none. The derivative is
123
- // taken here, in uniform control flow, whatever the blend
124
107
  let footprint = select(
125
108
  avboit_footprint_bias(&warp, fwidth(avboit_view_depth_to_virtual(&warp, in.view_depth))),
126
109
  0.0,
@@ -170,7 +153,7 @@ fn fs_main(in : ParticleVertexOut) -> ParticleAVBOITDrawOutput {
170
153
  chunk_sample_volumetrics,
171
154
  chunk_avboit_view_depth_to_virtual,
172
155
  chunk_avboit_footprint_bias,
173
- chunk_avboit_sample_transmittance,
156
+ chunk_avboit_sample_transmittance,
174
157
  chunk_view_mip_bias,
175
158
  ]);
176
159
 
@@ -1 +1 @@
1
- {"version":3,"file":"fragment_shader_denoise_ao.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js"],"names":[],"mappings":"AAYA,kDAEG;AAsHH;;;GAGG;AACH,yCAFU,gBAAgB,CAMvB;AAEH,2DAKE;6BAlJ2B,mCAAmC;iCAQ/B,kCAAkC;4BAFvC,6BAA6B"}
1
+ {"version":3,"file":"fragment_shader_denoise_ao.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js"],"names":[],"mappings":"AAaA,kDAEG;AAsHH;;;GAGG;AACH,yCAFU,gBAAgB,CAMvB;AAEH,2DAWE;6BAxJ2B,mCAAmC;iCAQ/B,kCAAkC;4BAFvC,6BAA6B"}
@@ -1,148 +1,155 @@
1
- import { i32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
- import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
4
- import {
5
- chunk_texture_channel_compute_variance_center
6
- } from "../../shader/chunk/texture/chunk_texture_channel_compute_variance_center.js";
7
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
- import { ImageShader } from "../../shader/ImageShader.js";
9
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
11
- import { chunk_compute_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
12
-
13
- export const ATORUS_UNIFORMS_STRUCT = WebGPUStruct.from({
14
- step_size: i32
15
- });
16
-
17
- const resources = new ShaderResourceSetDescriptor();
18
-
19
- // per-pass, four bytes, read-only: immediate data rather than a uniform buffer
20
- resources.setImmediate("settings", ATORUS_UNIFORMS_STRUCT);
21
-
22
- resources.createGroup()
23
- .addTexture("tInput")
24
- .addTexture("tDepth")
25
- .addTexture("tNormal", "uint");
26
-
27
- const body = CodeChunk.from(
28
- //language=WGSL
29
- `
30
- const phi_visibility = 4.0;
31
- const phi_normal = 128.0;
32
- const sigma_depth = 1.0;
33
-
34
- @fragment
35
- fn main(
36
- @builtin(position) coord: vec4<f32>,
37
- ) -> @location(0) vec2<f32>{
38
- let ipos = vec2<i32>(coord.xy);
39
- let screen_size = vec2<i32>(textureDimensions(tInput));
40
-
41
- const eps_variance = 1e-10;
42
- const kernel_weights = array<f32,3>( 1.0, 2.0 / 3.0, 1.0 / 6.0 );
43
-
44
- // constant samplers to prevent the compiler from generating code which
45
- // fetches the sampler descriptor from memory for each texture access
46
- let center_visibility = textureLoad(tInput, ipos, 0).rg;
47
-
48
- // variance estimate from per-pixel moments, filtered using 3x3 gaussian blur
49
- let variance = texture_channel_compute_variance_center( ipos, tInput);
50
-
51
- let std_dev = sqrt(max(0.0, eps_variance + variance));
52
-
53
- let phi_visibility = phi_visibility * std_dev;
54
-
55
- // explicitly store/accumulate center pixel with weight 1 to prevent issues
56
- // with the edge-stopping functions
57
- var sum_w_visibility = 1.0;
58
- var sum_visibility = center_visibility;
59
-
60
-
61
- let current_normal = decode_g_buffer_normal(textureLoad(tNormal, ipos, 0).xy);
62
- let center_depth = textureLoad(tDepth, ipos, 0).r;
63
-
64
- const offsets = array< vec2<i32>,8>(
65
- vec2( -1, -1 ),
66
- vec2( 0, -1 ) ,
67
- vec2( 1, -1 ),
68
- vec2( -1, 0 ),
69
- vec2( 1, 0 ),
70
- vec2( -1, 1 ),
71
- vec2( 0, 1 ),
72
- vec2( 1, 1 ),
73
- );
74
-
75
- const num_samples = 8;
76
-
77
- for(var i=0; i< num_samples; i++){
78
- let offset = offsets[i];
79
-
80
- let xx = offset.x;
81
- let yy = offset.y;
82
-
83
- let p = ipos + offset * settings.step_size;
84
- let inside = all(p >= vec2(0, 0)) && all(p < screen_size);
85
-
86
- if(!inside){
87
- continue;
88
- }
89
-
90
- let kernel = kernel_weights[ abs(xx) ] * kernel_weights[ abs(yy) ];
91
-
92
- let sample_visibility = textureLoad(tInput, p, 0).rg;
93
-
94
- let sample_normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
95
- let sample_depth = textureLoad(tDepth, p, 0).r;
96
-
97
- // compute the edge-stopping functions
98
- let w = compute_edge_stopping_weight(
99
- center_depth,
100
- sample_depth,
101
- sigma_depth,
102
-
103
- current_normal,
104
- sample_normal,
105
- phi_normal,
106
-
107
- center_visibility.r,
108
- sample_visibility.r,
109
- phi_visibility
110
- );
111
-
112
- let w_visibility = w * kernel;
113
-
114
- // both channels carry moments (E[X], E[X²]) - average linearly so the
115
- // pair remains a valid moment estimate that downstream get_std_dev can interpret.
116
- sum_w_visibility += w_visibility;
117
- sum_visibility += w_visibility * sample_visibility;
118
- }
119
-
120
- // output first two moments
121
- let out_visibility = sum_visibility / sum_w_visibility;
122
-
123
- return out_visibility;
124
- }
125
- `,
126
- [
127
- ATORUS_UNIFORMS_STRUCT.declaration_chunk,
128
- chunk_texture_channel_compute_variance_center,
129
- chunk_decode_g_buffer_normal,
130
- chunk_compute_edge_stopping_weight,
131
- ]);
132
-
133
- /**
134
- * Based on REBLUR paper, a type of Gaussian blur with edge-stopping
135
- * @type {ShaderDescriptor}
136
- */
137
- export const fragment_shader_denoise_ao = ShaderDescriptor.from({
138
- label: "A-torus Denoise",
139
- resources,
140
- body
141
- });
142
-
143
- export const shader_denoise_luminance_spatial = ImageShader.from({
144
- descriptor: fragment_shader_denoise_ao,
145
- targets: [
146
- { format: "rg16float" }
147
- ]
1
+ import { DEPTH_STENCIL_FOREGROUND_ONLY } from "../../depth/DEPTH_STENCIL_FOREGROUND_ONLY.js";
2
+ import { i32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
+ import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
5
+ import {
6
+ chunk_texture_channel_compute_variance_center
7
+ } from "../../shader/chunk/texture/chunk_texture_channel_compute_variance_center.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
12
+ import { chunk_compute_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
13
+
14
+ export const ATORUS_UNIFORMS_STRUCT = WebGPUStruct.from({
15
+ step_size: i32
16
+ });
17
+
18
+ const resources = new ShaderResourceSetDescriptor();
19
+
20
+ // per-pass, four bytes, read-only: immediate data rather than a uniform buffer
21
+ resources.setImmediate("settings", ATORUS_UNIFORMS_STRUCT);
22
+
23
+ resources.createGroup()
24
+ .addTexture("tInput")
25
+ .addTexture("tDepth")
26
+ .addTexture("tNormal", "uint");
27
+
28
+ const body = CodeChunk.from(
29
+ //language=WGSL
30
+ `
31
+ const phi_visibility = 4.0;
32
+ const phi_normal = 128.0;
33
+ const sigma_depth = 1.0;
34
+
35
+ @fragment
36
+ fn main(
37
+ @builtin(position) coord: vec4<f32>,
38
+ ) -> @location(0) vec2<f32>{
39
+ let ipos = vec2<i32>(coord.xy);
40
+ let screen_size = vec2<i32>(textureDimensions(tInput));
41
+
42
+ const eps_variance = 1e-10;
43
+ const kernel_weights = array<f32,3>( 1.0, 2.0 / 3.0, 1.0 / 6.0 );
44
+
45
+ // constant samplers to prevent the compiler from generating code which
46
+ // fetches the sampler descriptor from memory for each texture access
47
+ let center_visibility = textureLoad(tInput, ipos, 0).rg;
48
+
49
+ // variance estimate from per-pixel moments, filtered using 3x3 gaussian blur
50
+ let variance = texture_channel_compute_variance_center( ipos, tInput);
51
+
52
+ let std_dev = sqrt(max(0.0, eps_variance + variance));
53
+
54
+ let phi_visibility = phi_visibility * std_dev;
55
+
56
+ // explicitly store/accumulate center pixel with weight 1 to prevent issues
57
+ // with the edge-stopping functions
58
+ var sum_w_visibility = 1.0;
59
+ var sum_visibility = center_visibility;
60
+
61
+
62
+ let current_normal = decode_g_buffer_normal(textureLoad(tNormal, ipos, 0).xy);
63
+ let center_depth = textureLoad(tDepth, ipos, 0).r;
64
+
65
+ const offsets = array< vec2<i32>,8>(
66
+ vec2( -1, -1 ),
67
+ vec2( 0, -1 ) ,
68
+ vec2( 1, -1 ),
69
+ vec2( -1, 0 ),
70
+ vec2( 1, 0 ),
71
+ vec2( -1, 1 ),
72
+ vec2( 0, 1 ),
73
+ vec2( 1, 1 ),
74
+ );
75
+
76
+ const num_samples = 8;
77
+
78
+ for(var i=0; i< num_samples; i++){
79
+ let offset = offsets[i];
80
+
81
+ let xx = offset.x;
82
+ let yy = offset.y;
83
+
84
+ let p = ipos + offset * settings.step_size;
85
+ let inside = all(p >= vec2(0, 0)) && all(p < screen_size);
86
+
87
+ if(!inside){
88
+ continue;
89
+ }
90
+
91
+ let kernel = kernel_weights[ abs(xx) ] * kernel_weights[ abs(yy) ];
92
+
93
+ let sample_visibility = textureLoad(tInput, p, 0).rg;
94
+
95
+ let sample_normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
96
+ let sample_depth = textureLoad(tDepth, p, 0).r;
97
+
98
+ // compute the edge-stopping functions
99
+ let w = compute_edge_stopping_weight(
100
+ center_depth,
101
+ sample_depth,
102
+ sigma_depth,
103
+
104
+ current_normal,
105
+ sample_normal,
106
+ phi_normal,
107
+
108
+ center_visibility.r,
109
+ sample_visibility.r,
110
+ phi_visibility
111
+ );
112
+
113
+ let w_visibility = w * kernel;
114
+
115
+ // both channels carry moments (E[X], E[X²]) - average linearly so the
116
+ // pair remains a valid moment estimate that downstream get_std_dev can interpret.
117
+ sum_w_visibility += w_visibility;
118
+ sum_visibility += w_visibility * sample_visibility;
119
+ }
120
+
121
+ // output first two moments
122
+ let out_visibility = sum_visibility / sum_w_visibility;
123
+
124
+ return out_visibility;
125
+ }
126
+ `,
127
+ [
128
+ ATORUS_UNIFORMS_STRUCT.declaration_chunk,
129
+ chunk_texture_channel_compute_variance_center,
130
+ chunk_decode_g_buffer_normal,
131
+ chunk_compute_edge_stopping_weight,
132
+ ]);
133
+
134
+ /**
135
+ * Based on REBLUR paper, a type of Gaussian blur with edge-stopping
136
+ * @type {ShaderDescriptor}
137
+ */
138
+ export const fragment_shader_denoise_ao = ShaderDescriptor.from({
139
+ label: "A-torus Denoise",
140
+ resources,
141
+ body
142
+ });
143
+
144
+ export const shader_denoise_luminance_spatial = ImageShader.from({
145
+ descriptor: fragment_shader_denoise_ao,
146
+ depthStencil: DEPTH_STENCIL_FOREGROUND_ONLY,
147
+ targets: [
148
+ {
149
+ format: "rg16float",
150
+ // Background is skipped, so it keeps the clear: moments of visibility 1 (not occluded), zero variance.
151
+ // Downstream neighbourhoods read across silhouettes and must see background as unoccluded.
152
+ clearValue: [1, 1],
153
+ }
154
+ ]
148
155
  })
@@ -24,6 +24,7 @@ export class GTAO {
24
24
  * @param {FrameGraph} graph
25
25
  * @param {number} camera
26
26
  * @param {number} input_depth
27
+ * @param {number} input_hzb
27
28
  * @param {number} input_color
28
29
  * @param {number} input_depth_previous
29
30
  * @param {number} input_normal
@@ -34,7 +35,7 @@ export class GTAO {
34
35
  * @param {number[]} resolution
35
36
  * @returns {{occlusion:number, bent_normals:number, diffuse_indirect:number}}
36
37
  */
37
- graph_pass({ graph, camera, input_depth, input_depth_previous, input_normal, input_velocity, input_occlusion, frame_index, output, resolution }: FrameGraph): {
38
+ graph_pass({ graph, camera, input_depth, input_hzb, input_depth_previous, input_normal, input_velocity, input_occlusion, frame_index, output, resolution }: FrameGraph): {
38
39
  occlusion: number;
39
40
  bent_normals: number;
40
41
  diffuse_indirect: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;IAQI;;;OAGG;IACH,uCAUC;IAED;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;;OAIG;IACH,0BAFW,eAAe,QAOzB;IAED;;;;;;;;;;;;;;OAcG;IACH,8JAFa;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAC;QAAC,gBAAgB,EAAC,MAAM,CAAA;KAAC,CA6F5E;;CACJ;8BA5JY,OAAO,6CAA6C,EAAE,eAAe"}
1
+ {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;IAQI;;;OAGG;IACH,uCAUC;IAED;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;;OAIG;IACH,0BAFW,eAAe,QAOzB;IAED;;;;;;;;;;;;;;;OAeG;IACH,yKAFa;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAC;QAAC,gBAAgB,EAAC,MAAM,CAAA;KAAC,CAiG5E;;CACJ;8BAjKY,OAAO,6CAA6C,EAAE,eAAe"}
@@ -61,6 +61,7 @@ export class GTAO {
61
61
  * @param {FrameGraph} graph
62
62
  * @param {number} camera
63
63
  * @param {number} input_depth
64
+ * @param {number} input_hzb
64
65
  * @param {number} input_color
65
66
  * @param {number} input_depth_previous
66
67
  * @param {number} input_normal
@@ -75,6 +76,7 @@ export class GTAO {
75
76
  graph,
76
77
  camera,
77
78
  input_depth,
79
+ input_hzb,
78
80
  input_depth_previous,
79
81
  input_normal,
80
82
  input_velocity,
@@ -102,6 +104,7 @@ export class GTAO {
102
104
  input_depth,
103
105
  inputs: {
104
106
  tDepth: input_depth,
107
+ tHZB: input_hzb,
105
108
  tNormal: input_normal,
106
109
  camera,
107
110
  settings: {
@@ -119,6 +122,7 @@ export class GTAO {
119
122
  graph,
120
123
  shader: shader_denoise_luminance_spatial,
121
124
  output_resolution: resolution,
125
+ input_depth,
122
126
  inputs: {
123
127
  tInput: moments,
124
128
  tDepth: input_depth,
@@ -134,6 +138,7 @@ export class GTAO {
134
138
  graph,
135
139
  shader: ao_reproject_shader,
136
140
  output: [moments_output],
141
+ input_depth,
137
142
  inputs: {
138
143
  tInput: moments,
139
144
  tHistory: moments_history,
@@ -164,4 +169,3 @@ export class GTAO {
164
169
  };
165
170
  }
166
171
  }
167
-
@@ -15,6 +15,14 @@ export const GTAO_QUALITY_PROFILES: any;
15
15
  * @type {number}
16
16
  */
17
17
  export const GTAO_DEPTH_MIP_LEVELS: number;
18
+ /**
19
+ * Log2 offset applied to the screen-space step distance (in pixels) when selecting a depth pyramid mip level.
20
+ * Higher values stay on finer mips further out; lower values drop to coarser mips sooner.
21
+ *
22
+ * @see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.h#L71
23
+ * @type {number}
24
+ */
25
+ export const GTAO_DEPTH_MIP_SAMPLING_OFFSET: number;
18
26
  /**
19
27
  * distant samples contribute less
20
28
  * must be in [0, 1] range
@@ -1 +1 @@
1
- {"version":3,"file":"GTAO_CONSTANTS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js"],"names":[],"mappings":"gCAmBU,MAAM;;;;;;;AAShB;;;GAGG;AACH,wCAiBE;AAEF;;;GAGG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,8CAA+C;AAE/C;;;;GAIG;AACH,iCAFU,MAAM,CAEoB"}
1
+ {"version":3,"file":"GTAO_CONSTANTS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js"],"names":[],"mappings":"gCAmBU,MAAM;;;;;;;AAShB;;;GAGG;AACH,wCAiBE;AAEF;;;GAGG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;;;;GAMG;AACH,6CAFU,MAAM,CAEmC;AAEnD;;;GAGG;AACH,8CAA+C;AAE/C;;;;GAIG;AACH,iCAFU,MAAM,CAEoB"}
@@ -53,7 +53,16 @@ export const GTAO_QUALITY_PROFILES = {
53
53
  * see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.h#L55
54
54
  * @type {number}
55
55
  */
56
- export const GTAO_DEPTH_MIP_LEVELS = 0;
56
+ export const GTAO_DEPTH_MIP_LEVELS = 5;
57
+
58
+ /**
59
+ * Log2 offset applied to the screen-space step distance (in pixels) when selecting a depth pyramid mip level.
60
+ * Higher values stay on finer mips further out; lower values drop to coarser mips sooner.
61
+ *
62
+ * @see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.h#L71
63
+ * @type {number}
64
+ */
65
+ export const GTAO_DEPTH_MIP_SAMPLING_OFFSET = 3.30;
57
66
 
58
67
  /**
59
68
  * distant samples contribute less
@@ -1 +1 @@
1
- {"version":3,"file":"ao_reproject_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/ao_reproject_shader.js"],"names":[],"mappings":"AA+JA,8CASE;4BAnK0B,6BAA6B"}
1
+ {"version":3,"file":"ao_reproject_shader.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/ao_reproject_shader.js"],"names":[],"mappings":"AAgKA,8CAaE;4BAvK0B,6BAA6B"}
@@ -1,3 +1,4 @@
1
+ import { DEPTH_STENCIL_FOREGROUND_ONLY } from "../../depth/DEPTH_STENCIL_FOREGROUND_ONLY.js";
1
2
  import { chunk_get_std_dev } from "../../shader/chunk/math/statistics/chunk_get_std_dev.js";
2
3
  import {
3
4
  chunk_texture_sample_catmullrom_hardware_5tap_uv
@@ -163,7 +164,11 @@ export const ao_reproject_shader = new ImageShader({
163
164
  body,
164
165
  resources,
165
166
  }),
167
+ depthStencil: DEPTH_STENCIL_FOREGROUND_ONLY,
166
168
  targets: [{
167
169
  format: "rg16float",
170
+ // Background is skipped, so it keeps the clear: moments of visibility 1 (not occluded), zero variance.
171
+ // This is also next frame's history, whose filtered fetch reaches across silhouettes.
172
+ clearValue: [1, 1],
168
173
  }]
169
174
  })
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Selects the depth pyramid mip level for a GTAO horizon step at `sample_offset_length` screen pixels
3
+ * from the center pixel.
4
+ *
5
+ * Follows Intel XeGTAO's `clamp(log2(sampleOffsetLength) - DepthMIPSamplingOffset, 0, GTAO_DEPTH_MIP_LEVELS - 1)`
6
+ * paired with a `MIP_POINT` sampler (`round` to nearest integer mip). Because Mip 0 lives in `tDepth`
7
+ * while Mips 1..4 live in `tHZB`, rounding here keeps the Mip 0 -> Mip 1 handoff at `lod = 0.5`
8
+ * (`~13.9 px`) rather than `lod > 0.0` (`~9.8 px`). With `GTAO_DEPTH_MIP_SAMPLING_OFFSET = 3.30`:
9
+ * - Mip 0 (`< ~13.9 px`): full-resolution `tDepth`
10
+ * - Mip 1 (`~13.9 .. 27.9 px`): HZB mip 0 (half-res)
11
+ * - Mip 2 (`~27.9 .. 55.7 px`): HZB mip 1 (quarter-res)
12
+ * - Mip 3 (`~55.7 .. 111.4 px`): HZB mip 2 (1/8-res)
13
+ * - Mip 4 (`>= ~111.4 px`): HZB mip 3 (1/16-res)
14
+ *
15
+ * Every mip transition occurs when the tap is at least ~7 texels away at the target mip resolution.
16
+ *
17
+ * @see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.hlsli#L244
18
+ * @type {CodeChunk}
19
+ */
20
+ export const chunk_gtao_compute_mip_level: CodeChunk;
21
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
22
+ //# sourceMappingURL=chunk_gtao_compute_mip_level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_gtao_compute_mip_level.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/chunk_gtao_compute_mip_level.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,2CAFU,SAAS,CAUjB;0BAhCwB,oCAAoC"}
@@ -0,0 +1,33 @@
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { GTAO_DEPTH_MIP_LEVELS, GTAO_DEPTH_MIP_SAMPLING_OFFSET } from "./GTAO_CONSTANTS.js";
3
+
4
+ const MAX_MIP_LEVEL = Math.max(0, GTAO_DEPTH_MIP_LEVELS - 1);
5
+
6
+ /**
7
+ * Selects the depth pyramid mip level for a GTAO horizon step at `sample_offset_length` screen pixels
8
+ * from the center pixel.
9
+ *
10
+ * Follows Intel XeGTAO's `clamp(log2(sampleOffsetLength) - DepthMIPSamplingOffset, 0, GTAO_DEPTH_MIP_LEVELS - 1)`
11
+ * paired with a `MIP_POINT` sampler (`round` to nearest integer mip). Because Mip 0 lives in `tDepth`
12
+ * while Mips 1..4 live in `tHZB`, rounding here keeps the Mip 0 -> Mip 1 handoff at `lod = 0.5`
13
+ * (`~13.9 px`) rather than `lod > 0.0` (`~9.8 px`). With `GTAO_DEPTH_MIP_SAMPLING_OFFSET = 3.30`:
14
+ * - Mip 0 (`< ~13.9 px`): full-resolution `tDepth`
15
+ * - Mip 1 (`~13.9 .. 27.9 px`): HZB mip 0 (half-res)
16
+ * - Mip 2 (`~27.9 .. 55.7 px`): HZB mip 1 (quarter-res)
17
+ * - Mip 3 (`~55.7 .. 111.4 px`): HZB mip 2 (1/8-res)
18
+ * - Mip 4 (`>= ~111.4 px`): HZB mip 3 (1/16-res)
19
+ *
20
+ * Every mip transition occurs when the tap is at least ~7 texels away at the target mip resolution.
21
+ *
22
+ * @see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.hlsli#L244
23
+ * @type {CodeChunk}
24
+ */
25
+ export const chunk_gtao_compute_mip_level = CodeChunk.from(
26
+ //language=WGSL
27
+ `
28
+ fn gtao_compute_mip_level(sample_offset_length: f32) -> f32 {
29
+ let mip_f = round(log2(max(1.0, sample_offset_length)) - ${GTAO_DEPTH_MIP_SAMPLING_OFFSET});
30
+ return clamp(mip_f, 0.0, f32(${MAX_MIP_LEVEL}));
31
+ }
32
+ `
33
+ );
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resolves a single reverse-Z device depth from an HZB `(d_min, d_max)` pair (`hzb.x` = farthest,
3
+ * `hzb.y` = closest in the $2^m \times 2^m$ footprint) using a discontinuity-aware slope filter.
4
+ *
5
+ * Why neither pure `hzb.y` (closest) nor pure `0.5 * (hzb.x + hzb.y)` (average) suffices alone
6
+ * (cf. Intel XeGTAO `DepthMIPFilter` and Tomasz Stachowiak / h3r2tic's Tiny Glade linear + point
7
+ * depth-sampling analysis):
8
+ * - On a continuous sloped surface, reverse-Z device depth $1 / (-z_{\text{view}})$ is affine in
9
+ * screen space. Taking only `hzb.y` treats each coarse $2^m \times 2^m$ texel as a flat "Duplo
10
+ * brick" protruding toward the camera, causing false self-occlusion on slopes; averaging
11
+ * `0.5 * (hzb.x + hzb.y)` reconstructs the smooth plane across the footprint.
12
+ * - Across a silhouette edge (depth discontinuity), averaging `hzb.x` and `hzb.y` creates a
13
+ * mid-air "shrink-wrap" phantom surface between foreground and background (or erodes silhouettes
14
+ * against the sky). Weighting `hzb.x` down to zero when `depth_far - depth_near` exceeds the
15
+ * effect falloff collapses the filter to `hzb.y` (the foreground surface).
16
+ *
17
+ * @see https://github.com/GameTechDev/XeGTAO/blob/a5b1686c7ea37788eeb3576b5be47f7c03db532c/Source/Rendering/Shaders/XeGTAO.hlsli#L622
18
+ * @type {CodeChunk}
19
+ */
20
+ export const chunk_gtao_resolve_hzb_depth: CodeChunk;
21
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
22
+ //# sourceMappingURL=chunk_gtao_resolve_hzb_depth.d.ts.map