@woosh/meep-engine 3.12.0 → 3.13.1

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 (301) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  3. package/src/core/geom/3d/shape/ConvexHullShape3D.js +41 -25
  4. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  5. package/src/core/geom/3d/shape/PosedShape3D.js +7 -2
  6. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  7. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  8. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  9. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  10. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  11. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  12. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  13. package/src/shade/RENDERER_CONTRACT.md +2 -1
  14. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  15. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  16. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  17. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +755 -0
  18. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  19. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  20. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  21. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  22. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  23. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  24. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  25. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  26. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  27. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  28. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  29. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  30. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  31. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  32. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  33. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  34. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  35. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  39. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  40. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  41. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  42. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  43. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  44. package/src/shade/renderer/Renderer.d.ts +0 -6
  45. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  46. package/src/shade/renderer/Renderer.js +0 -29
  47. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  49. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  51. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  58. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  60. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  61. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  62. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  64. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  65. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  66. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  68. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  70. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  72. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  74. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  75. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  76. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  77. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  78. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  79. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  80. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  81. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  82. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  83. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  85. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  87. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  88. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  89. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  90. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  91. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  92. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  93. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  94. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  96. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  98. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  104. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  106. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  108. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  110. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  111. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  113. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  114. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  117. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  118. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  119. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  120. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  121. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  122. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  124. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  126. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  127. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  128. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  129. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  130. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  136. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  137. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  138. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  139. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  140. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  142. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  143. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  144. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  145. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  146. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph_particles.js +5 -3
  148. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  149. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  151. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  153. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  155. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  157. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  158. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  159. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  160. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  161. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  162. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  163. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  164. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  165. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  166. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  168. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  176. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  186. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  188. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  190. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  192. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  194. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  196. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  198. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  200. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  201. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  202. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  203. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  205. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  207. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  209. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  211. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  213. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  215. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  216. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  217. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  219. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  220. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  222. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  224. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  225. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  226. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  227. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  228. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  229. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  230. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  231. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  232. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  233. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  235. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  237. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  239. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  240. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  241. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  242. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  243. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  245. package/src/shade/renderer/scene/Mesh.d.ts.map +1 -1
  246. package/src/shade/renderer/scene/Mesh.js +4 -6
  247. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  248. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  249. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  250. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  251. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  252. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  253. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  254. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  255. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  256. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  257. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +16 -7
  258. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1342 -1326
  260. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +13 -0
  261. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  262. package/src/shade/renderer/shadow/map/Shadowmap.js +14 -0
  263. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +79 -0
  264. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -0
  265. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +196 -0
  266. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts +91 -0
  267. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts.map +1 -0
  268. package/src/shade/renderer/shadow/map/ShadowmapRegistry.js +156 -0
  269. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  270. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  271. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  272. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  273. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  274. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  275. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  276. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  277. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  278. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  279. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  280. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  281. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  282. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  283. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  284. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  285. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  286. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  287. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  288. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  289. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  290. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  291. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  292. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  294. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  295. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  296. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  297. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  298. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  299. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  300. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  301. 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"}