@woosh/meep-engine 3.12.0 → 3.13.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 (285) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  3. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  4. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  5. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  6. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  7. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  8. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  9. package/src/shade/RENDERER_CONTRACT.md +2 -1
  10. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  11. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  12. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  13. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  14. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  15. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  16. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  17. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  18. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  19. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  20. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  21. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  22. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  23. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  24. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  25. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  26. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  27. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  28. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  29. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  30. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  31. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  32. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  33. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  34. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  35. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  39. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  40. package/src/shade/renderer/Renderer.d.ts +0 -6
  41. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  42. package/src/shade/renderer/Renderer.js +0 -29
  43. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  44. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  45. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  46. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  47. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  49. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  51. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  58. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  60. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  61. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  62. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  63. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  64. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  65. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  66. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  68. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  70. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  71. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  72. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  73. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  74. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  75. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  76. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  77. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  78. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  79. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  80. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  81. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  82. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  83. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  87. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  88. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  89. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  90. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  91. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  92. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  93. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  94. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  96. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  98. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  104. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  106. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  108. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  109. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  110. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  111. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  113. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  114. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  117. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  118. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  119. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  120. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  121. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  122. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  124. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  126. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  127. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  128. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  129. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  130. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  132. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  133. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  134. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  135. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  136. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  137. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  138. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  139. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  140. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  142. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/graph_particles.js +5 -3
  144. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  145. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  147. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  149. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  151. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  153. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  154. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  155. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  156. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  157. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  158. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  159. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  160. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  161. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  162. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  163. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  164. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  165. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  166. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  168. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  176. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  186. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  188. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  190. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  192. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  194. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  196. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  198. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  199. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  200. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  201. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  202. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  203. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  205. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  207. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  209. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  211. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  213. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  215. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  216. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  217. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  218. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  219. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  220. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  222. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  224. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  225. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  227. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  228. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  229. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  230. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  231. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  232. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  233. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  235. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  237. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  239. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  241. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  242. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  243. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  244. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  245. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  246. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  247. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  248. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  249. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  250. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  252. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  253. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  255. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  256. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  257. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  258. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  260. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  261. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  262. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  263. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  264. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  265. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  266. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  267. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  268. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  269. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  270. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  271. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  272. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  273. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  274. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  275. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  276. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  277. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  278. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  279. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  280. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  281. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  282. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  283. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  284. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  285. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;GAeG;AACH,gMAFa;IAAC,eAAe,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAqMjG"}
1
+ {"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;GAeG;AACH,gMAFa;IAAC,eAAe,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CA8LjG"}
@@ -6,7 +6,6 @@ import { shader_hzb_mesh_filter_2way } from "../cull/hzb/shader_hzb_mesh_filter_
6
6
  import { ShadeDrawMode } from "../../material/ShadeDrawMode.js";
7
7
  import { ShadeDrawSide } from "../../material/ShadeDrawSide.js";
8
8
  import { TransparencyMode } from "../../material/TransparencyMode.js";
9
- import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
10
9
  import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
11
10
  import { graph_import_buffer } from "../../shader/graph/graph_import_buffer.js";
12
11
  import { graph_record_stat } from "../../util/graph_record_stat.js";
@@ -85,13 +84,6 @@ export function graph_rasterize_partial_opaque({
85
84
 
86
85
  assert.isNonNegativeInteger(bucket_index, 'bucket_index');
87
86
 
88
- const u_bucket_index = encoder.allocateTransientValueBuffer(
89
- U32_CONTAINER_STRUCT,
90
- {
91
- value: bucket_index,
92
- }
93
- );
94
-
95
87
  build_indirect_compute_dispatch_command(
96
88
  COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
97
89
  encoder,
@@ -106,7 +98,7 @@ export function graph_rasterize_partial_opaque({
106
98
  shader_hzb_mesh_filter_2way.dispatchIndirect({
107
99
  encoder,
108
100
  bindings: {
109
- bucket_index: u_bucket_index,
101
+ bucket_index: { value: bucket_index },
110
102
  camera_previous,
111
103
  bucket_data: buckets,
112
104
  scene_database: scene_ctx.scene_database_buffer,
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"AA6FA;;;;;;;;;;;;;;;;;GAiBG;AACH,kOAFa;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAmGlD"}
1
+ {"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"AAwFA;;;;;;;;;;;;;;;;;GAiBG;AACH,kOAFa;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAmGlD"}
@@ -4,7 +4,6 @@ import { STRUCT_DISPATCH_COMPUTE_COMMAND } from "../../gpu_primitive/indirect/ST
4
4
  import { ShadeDrawMode } from "../../material/ShadeDrawMode.js";
5
5
  import { ShadeDrawSide } from "../../material/ShadeDrawSide.js";
6
6
  import { TransparencyMode } from "../../material/TransparencyMode.js";
7
- import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
8
7
  import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
9
8
  import { graph_record_stat } from "../../util/graph_record_stat.js";
10
9
  import { build_indirect_compute_dispatch_command } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
@@ -57,15 +56,11 @@ function graph_extract_meshlets_from_bucket({
57
56
  0
58
57
  );
59
58
 
60
- const u_bucket_index = encoder.allocateTransientValueBuffer(U32_CONTAINER_STRUCT, {
61
- value: bucket_id
62
- });
63
-
64
59
  shader_meshlets_extract_bucket.dispatchIndirect({
65
60
  encoder,
66
61
  command,
67
62
  bindings: {
68
- bucket_index: u_bucket_index,
63
+ bucket_index: { value: bucket_id },
69
64
  bucket_data: buckets,
70
65
  output: output,
71
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_restir_di.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/graph_restir_di.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,+RAFa,MAAM,CAsLlB"}
1
+ {"version":3,"file":"graph_restir_di.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/graph_restir_di.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,+RAFa,MAAM,CAsLlB"}
@@ -1,6 +1,5 @@
1
1
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
2
2
  import { TextureResourceDescriptor } from "../../../device/graph/TextureResourceDescriptor.js";
3
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
4
3
  import { RTXDI_PackedReservoir } from "../reservoir/RTXDI_PackedReservoir.js";
5
4
  import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../../STATIC_GRAPHICS_ENGINE_ASSETS.js";
6
5
  import { graph_import_buffer } from "../../shader/graph/graph_import_buffer.js";
@@ -82,7 +81,7 @@ export function graph_restir_di({
82
81
  tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
83
82
  camera: view.camera.buffer,
84
83
  view: view.uniform_buffer.buffer,
85
- m_initial: context.encoder.allocateTransientValueBuffer(u32, m_initial),
84
+ m_initial: m_initial,
86
85
 
87
86
  light_data: scene_ctx.lights.buffer_data,
88
87
  cluster_parameters: resources.get(data.cluster_parameters),
@@ -167,7 +166,7 @@ export function graph_restir_di({
167
166
  output: out.obtainView(),
168
167
  camera: view.camera.buffer,
169
168
  view: view.uniform_buffer.buffer,
170
- use_screen_space_shadow: context.encoder.allocateTransientValueBuffer(u32, use_screen_space_shadow ? 1 : 0),
169
+ use_screen_space_shadow: use_screen_space_shadow ? 1 : 0,
171
170
 
172
171
  light_data: scene_ctx.lights.buffer_data,
173
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"graph_restir_di_denoise.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/graph_restir_di_denoise.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AACH;IAR8B,KAAK;IACD,IAAI;IACZ,KAAK,EAApB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,MAAM,EAArB,MAAM;IACU,UAAU,GAA1B,MAAM;IACJ,MAAM,CAuDlB"}
1
+ {"version":3,"file":"graph_restir_di_denoise.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/graph_restir_di_denoise.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH;IAR8B,KAAK;IACD,IAAI;IACZ,KAAK,EAApB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,MAAM,EAArB,MAAM;IACU,UAAU,GAA1B,MAAM;IACJ,MAAM,CAuDlB"}
@@ -1,5 +1,4 @@
1
1
  import { TextureResourceDescriptor } from "../../../device/graph/TextureResourceDescriptor.js";
2
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
2
  import { shader_restir_di_denoise } from "./shader_restir_di_denoise.js";
4
3
 
5
4
  /**
@@ -51,7 +50,7 @@ export function graph_restir_di_denoise({
51
50
  gBufferNormal: resources.get(data.normal).obtainView(),
52
51
  output: resources.get(data.output).obtainView(),
53
52
  camera: view.camera.buffer,
54
- step_size: context.encoder.allocateTransientValueBuffer(u32, step_size),
53
+ step_size: step_size,
55
54
  }
56
55
  });
57
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_restir_di_denoise.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/shader_restir_di_denoise.js"],"names":[],"mappings":"AAmIA,qDAIG;8BA/H2B,+BAA+B"}
1
+ {"version":3,"file":"shader_restir_di_denoise.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/shader_restir_di_denoise.js"],"names":[],"mappings":"AAsIA,qDAIG;8BAlI2B,+BAA+B"}
@@ -1,136 +1,139 @@
1
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
3
- import { chunk_normal_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
4
- import { chunk_is_background } from "../../shader/chunk/depth/chunk_is_background.js";
5
- import { chunk_get_view_space_depth } from "../../shader/chunk/depth/chunk_get_view_space_depth.js";
6
- import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
7
- import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
8
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
- import { ComputeShader } from "../../shader/ComputeShader.js";
10
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
-
12
- /**
13
- * ReSTIR DI — spatial denoise pass (edge-aware à-trous).
14
- *
15
- * A tailored, ReSTIR-aware spatial filter for the resolved point/spot radiance.
16
- * One iteration of the à-trous (hole-filled) wavelet: a 3x3 neighbourhood dilated
17
- * by `step_size`, run a few times with step 1, 2, 4 (driven by the graph) to grow
18
- * the effective footprint while keeping the per-pass cost at 8 taps. The
19
- * edge-stopping is SVGF-style — geometry edges from linear depth + normal (always
20
- * safe to stop on), plus a gentle relative-luma term to preserve shadow edges.
21
- *
22
- * Deliberately spatial-only: the engine's TAA and ReSTIR's own reservoir temporal
23
- * reuse already supply the temporal axis, so we do NOT add a second temporal
24
- * reproject (that is the LigmaDenoiser path the user flagged as imperfect).
25
- *
26
- * Operates on the modulated radiance (BRDF already folded in). Albedo-edge
27
- * demodulation is a possible later refinement; depth+normal stopping already holds
28
- * the geometric edges that matter most for direct lighting.
29
- *
30
- * No storage buffers (textures + uniforms only), so it is unaffected by the
31
- * maxStorageBuffersPerShaderStage budget the resolve/resample passes fight for.
32
- *
33
- * @type {ComputeShader}
34
- */
35
-
36
- const resources = new ShaderResourceSetDescriptor();
37
-
38
- resources.createGroup()
39
- .addTexture("tInput")
40
- .addTexture("gBufferDepth")
41
- .addTexture("gBufferNormal", "uint")
42
- .addStorageTexture("output", "rgba16float", "2d", "write-only")
43
- .addUniform("camera", CAMERA_UNIFORM_STRUCT)
44
- .addUniform("step_size", u32);
45
-
46
- const body = CodeChunk.from(
47
- //language=WGSL
48
- `
49
- // Edge-stopping tolerances. Tighter = preserves more detail (less denoising).
50
- const PHI_NORMAL: f32 = 64.0; // normal power; higher stops sooner on curvature
51
- const PHI_DEPTH: f32 = 0.02; // relative linear-depth tolerance (fraction of depth)
52
- const PHI_LUMA: f32 = 0.6; // relative luma tolerance (fraction of centre luma)
53
-
54
- @compute @workgroup_size(8, 8, 1)
55
- fn main(
56
- @builtin(global_invocation_id) global_invocation_id: vec3<u32>,
57
- ) {
58
- let i_coord = vec2<i32>(global_invocation_id.xy);
59
- let screen_size = vec2<i32>(textureDimensions(tInput));
60
-
61
- if (!all(i_coord < screen_size)) {
62
- return;
63
- }
64
-
65
- let center_device_depth = textureLoad(gBufferDepth, i_coord, 0).r;
66
- let center_radiance = textureLoad(tInput, i_coord, 0).rgb;
67
-
68
- // Background carries no ReSTIR radiance — pass it through so the filter neither
69
- // bleeds lit neighbours into it nor pulls it into lit pixels.
70
- if (is_background(center_device_depth)) {
71
- textureStore(output, global_invocation_id.xy, vec4<f32>(center_radiance, 1.0));
72
- return;
73
- }
74
-
75
- let center_depth = get_view_space_depth(center_device_depth, camera);
76
- let center_normal = decode_g_buffer_normal(textureLoad(gBufferNormal, i_coord, 0).xy);
77
- let center_luma = rgb_to_luminance(center_radiance);
78
-
79
- let step = i32(step_size);
80
-
81
- const kernel_weights = array<f32, 2>(1.0, 2.0 / 3.0);
82
- const offsets = array<vec2<i32>, 8>(
83
- vec2<i32>(-1, -1), vec2<i32>(0, -1), vec2<i32>(1, -1),
84
- vec2<i32>(-1, 0), vec2<i32>(1, 0),
85
- vec2<i32>(-1, 1), vec2<i32>(0, 1), vec2<i32>(1, 1),
86
- );
87
-
88
- // centre weight 1, accumulate neighbours
89
- var sum_w = 1.0;
90
- var sum_rgb = center_radiance;
91
-
92
- for (var i = 0; i < 8; i++) {
93
- let offset = offsets[i];
94
- let p = i_coord + offset * step;
95
-
96
- if (!(all(p >= vec2<i32>(0, 0)) && all(p < screen_size))) {
97
- continue;
98
- }
99
-
100
- let sample_device_depth = textureLoad(gBufferDepth, p, 0).r;
101
- if (is_background(sample_device_depth)) {
102
- continue;
103
- }
104
-
105
- let sample_radiance = textureLoad(tInput, p, 0).rgb;
106
- let sample_depth = get_view_space_depth(sample_device_depth, camera);
107
- let sample_normal = decode_g_buffer_normal(textureLoad(gBufferNormal, p, 0).xy);
108
- let sample_luma = rgb_to_luminance(sample_radiance);
109
-
110
- let w_normal = normal_edge_stopping_weight(center_normal, sample_normal, PHI_NORMAL);
111
- let d_depth = abs(center_depth - sample_depth) / (PHI_DEPTH * max(center_depth, 1e-3));
112
- let d_luma = abs(center_luma - sample_luma) / (PHI_LUMA * center_luma + 1e-3);
113
-
114
- let kernel = kernel_weights[abs(offset.x)] * kernel_weights[abs(offset.y)];
115
- let w = exp(-(d_depth + d_luma)) * w_normal * kernel;
116
-
117
- sum_w += w;
118
- sum_rgb += w * sample_radiance;
119
- }
120
-
121
- textureStore(output, global_invocation_id.xy, vec4<f32>(sum_rgb / sum_w, 1.0));
122
- }
123
- `, [
124
- chunk_is_background,
125
- chunk_get_view_space_depth,
126
- chunk_decode_g_buffer_normal,
127
- chunk_rgb_to_luminance,
128
- chunk_normal_edge_stopping_weight,
129
- ]
130
- );
131
-
132
- export const shader_restir_di_denoise = ComputeShader.from({
133
- label: "ReSTIR DI Denoise",
134
- resources,
135
- body,
136
- });
1
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
3
+ import { chunk_normal_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
4
+ import { chunk_is_background } from "../../shader/chunk/depth/chunk_is_background.js";
5
+ import { chunk_get_view_space_depth } from "../../shader/chunk/depth/chunk_get_view_space_depth.js";
6
+ import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
7
+ import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { ComputeShader } from "../../shader/ComputeShader.js";
10
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
+
12
+ /**
13
+ * ReSTIR DI — spatial denoise pass (edge-aware à-trous).
14
+ *
15
+ * A tailored, ReSTIR-aware spatial filter for the resolved point/spot radiance.
16
+ * One iteration of the à-trous (hole-filled) wavelet: a 3x3 neighbourhood dilated
17
+ * by `step_size`, run a few times with step 1, 2, 4 (driven by the graph) to grow
18
+ * the effective footprint while keeping the per-pass cost at 8 taps. The
19
+ * edge-stopping is SVGF-style — geometry edges from linear depth + normal (always
20
+ * safe to stop on), plus a gentle relative-luma term to preserve shadow edges.
21
+ *
22
+ * Deliberately spatial-only: the engine's TAA and ReSTIR's own reservoir temporal
23
+ * reuse already supply the temporal axis, so we do NOT add a second temporal
24
+ * reproject (that is the LigmaDenoiser path the user flagged as imperfect).
25
+ *
26
+ * Operates on the modulated radiance (BRDF already folded in). Albedo-edge
27
+ * demodulation is a possible later refinement; depth+normal stopping already holds
28
+ * the geometric edges that matter most for direct lighting.
29
+ *
30
+ * No storage buffers (textures + uniforms only), so it is unaffected by the
31
+ * maxStorageBuffersPerShaderStage budget the resolve/resample passes fight for.
32
+ *
33
+ * @type {ComputeShader}
34
+ */
35
+
36
+ const resources = new ShaderResourceSetDescriptor();
37
+
38
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer. The a-trous
39
+ // denoise runs one dispatch per step, so the buffer was allocated per iteration.
40
+ resources.setImmediate("step_size", u32);
41
+
42
+ resources.createGroup()
43
+ .addTexture("tInput")
44
+ .addTexture("gBufferDepth")
45
+ .addTexture("gBufferNormal", "uint")
46
+ .addStorageTexture("output", "rgba16float", "2d", "write-only")
47
+ .addUniform("camera", CAMERA_UNIFORM_STRUCT);
48
+
49
+ const body = CodeChunk.from(
50
+ //language=WGSL
51
+ `
52
+ // Edge-stopping tolerances. Tighter = preserves more detail (less denoising).
53
+ const PHI_NORMAL: f32 = 64.0; // normal power; higher stops sooner on curvature
54
+ const PHI_DEPTH: f32 = 0.02; // relative linear-depth tolerance (fraction of depth)
55
+ const PHI_LUMA: f32 = 0.6; // relative luma tolerance (fraction of centre luma)
56
+
57
+ @compute @workgroup_size(8, 8, 1)
58
+ fn main(
59
+ @builtin(global_invocation_id) global_invocation_id: vec3<u32>,
60
+ ) {
61
+ let i_coord = vec2<i32>(global_invocation_id.xy);
62
+ let screen_size = vec2<i32>(textureDimensions(tInput));
63
+
64
+ if (!all(i_coord < screen_size)) {
65
+ return;
66
+ }
67
+
68
+ let center_device_depth = textureLoad(gBufferDepth, i_coord, 0).r;
69
+ let center_radiance = textureLoad(tInput, i_coord, 0).rgb;
70
+
71
+ // Background carries no ReSTIR radiance — pass it through so the filter neither
72
+ // bleeds lit neighbours into it nor pulls it into lit pixels.
73
+ if (is_background(center_device_depth)) {
74
+ textureStore(output, global_invocation_id.xy, vec4<f32>(center_radiance, 1.0));
75
+ return;
76
+ }
77
+
78
+ let center_depth = get_view_space_depth(center_device_depth, camera);
79
+ let center_normal = decode_g_buffer_normal(textureLoad(gBufferNormal, i_coord, 0).xy);
80
+ let center_luma = rgb_to_luminance(center_radiance);
81
+
82
+ let step = i32(step_size);
83
+
84
+ const kernel_weights = array<f32, 2>(1.0, 2.0 / 3.0);
85
+ const offsets = array<vec2<i32>, 8>(
86
+ vec2<i32>(-1, -1), vec2<i32>(0, -1), vec2<i32>(1, -1),
87
+ vec2<i32>(-1, 0), vec2<i32>(1, 0),
88
+ vec2<i32>(-1, 1), vec2<i32>(0, 1), vec2<i32>(1, 1),
89
+ );
90
+
91
+ // centre weight 1, accumulate neighbours
92
+ var sum_w = 1.0;
93
+ var sum_rgb = center_radiance;
94
+
95
+ for (var i = 0; i < 8; i++) {
96
+ let offset = offsets[i];
97
+ let p = i_coord + offset * step;
98
+
99
+ if (!(all(p >= vec2<i32>(0, 0)) && all(p < screen_size))) {
100
+ continue;
101
+ }
102
+
103
+ let sample_device_depth = textureLoad(gBufferDepth, p, 0).r;
104
+ if (is_background(sample_device_depth)) {
105
+ continue;
106
+ }
107
+
108
+ let sample_radiance = textureLoad(tInput, p, 0).rgb;
109
+ let sample_depth = get_view_space_depth(sample_device_depth, camera);
110
+ let sample_normal = decode_g_buffer_normal(textureLoad(gBufferNormal, p, 0).xy);
111
+ let sample_luma = rgb_to_luminance(sample_radiance);
112
+
113
+ let w_normal = normal_edge_stopping_weight(center_normal, sample_normal, PHI_NORMAL);
114
+ let d_depth = abs(center_depth - sample_depth) / (PHI_DEPTH * max(center_depth, 1e-3));
115
+ let d_luma = abs(center_luma - sample_luma) / (PHI_LUMA * center_luma + 1e-3);
116
+
117
+ let kernel = kernel_weights[abs(offset.x)] * kernel_weights[abs(offset.y)];
118
+ let w = exp(-(d_depth + d_luma)) * w_normal * kernel;
119
+
120
+ sum_w += w;
121
+ sum_rgb += w * sample_radiance;
122
+ }
123
+
124
+ textureStore(output, global_invocation_id.xy, vec4<f32>(sum_rgb / sum_w, 1.0));
125
+ }
126
+ `, [
127
+ chunk_is_background,
128
+ chunk_get_view_space_depth,
129
+ chunk_decode_g_buffer_normal,
130
+ chunk_rgb_to_luminance,
131
+ chunk_normal_edge_stopping_weight,
132
+ ]
133
+ );
134
+
135
+ export const shader_restir_di_denoise = ComputeShader.from({
136
+ label: "ReSTIR DI Denoise",
137
+ resources,
138
+ body,
139
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_restir_di_resample.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/shader_restir_di_resample.js"],"names":[],"mappings":"AA4HA,sDAIG;8BArH2B,+BAA+B"}
1
+ {"version":3,"file":"shader_restir_di_resample.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/restir/di/shader_restir_di_resample.js"],"names":[],"mappings":"AA8HA,sDAIG;8BAvH2B,+BAA+B"}