@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,113 +1,115 @@
1
- import { u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
- import { ComputeShader } from "../../shader/ComputeShader.js";
5
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
- import { CLIPMAP_METADATA } from "./CLIPMAP_METADATA.js";
7
-
8
- const PUSH_CONSTANTS = WebGPUStruct.from({
9
- cascade_index: u32,
10
- position: vec3f
11
- });
12
-
13
- const resources = new ShaderResourceSetDescriptor();
14
- resources.createGroup()
15
- .addUniform("settings", PUSH_CONSTANTS)
16
- .addStorageBuffer("metadata", CLIPMAP_METADATA, true)
17
- .addStorageTexture("t_cascades", "r32uint", "3d", "write-only")
18
- ;
19
-
20
- /**
21
- * Converts world-aligned voxel coordinate to local wrapped voxel coordinate in the 3d texture representing the cascade
22
- * @type {CodeChunk}
23
- */
24
- const chunk_clip_cascade_world_to_voxel = CodeChunk.from(
25
- //language=WGSL
26
- `
27
- fn cascade_voxel_wrap(
28
- coord_ws: vec3<f32>,
29
- world_offset : vec3<i32>,
30
- voxel_size: f32,
31
- resolution: u32,
32
- ) -> vec3<u32>{
33
- let coord_voxel = world_offset + coord_ws / voxel_size;
34
-
35
- let offset = coord_voxel + f32(resolution) * 0.5;
36
- let offset_i = i32(offset);
37
-
38
- let wrapped_offset = ( ( offset % resolution ) + resolution ) % resolution;
39
-
40
- return vec3<u32>(wrapped_offset);
41
- }
42
- `, []
43
- );
44
-
45
- /**
46
- *
47
- * @type {CodeChunk}
48
- */
49
- const chunk_clip_cascade_voxel_to_world = CodeChunk.from(
50
- //language=WGSL
51
- `
52
- fn clip_cascade_voxel_to_world(
53
- voxel_coord: vec3<u32>,
54
- world_offset: vec3<i32>,
55
- voxel_size: f32,
56
- resolution: u32,
57
- ) -> vec3<f32>{
58
- let x = world_offset + voxel_coord - f32(resolution)*0.5;
59
-
60
- return x * voxel_size;
61
- }
62
- `
63
- );
64
-
65
-
66
- const body = CodeChunk.from(
67
- //language=WGSL
68
- `
69
- @compute @workgroup_size(8,8,4)
70
- fn main(
71
- @builtin(global_invocation_id) global_id : vec3<u32>,
72
- ){
73
- if(any(global_id >= vec3(metadata.cascade_resolution))){
74
- return;
75
- }
76
-
77
- let cascade_info = metadata.cascades[settings.cascade_index];
78
-
79
- // discretize position
80
- let discrete_position = vec3<i32>(settings.position / cascade_info.voxel_size);
81
-
82
- // difference
83
- let position_delta = discrete_position - cascade_info.offset;
84
-
85
- let cascade_voxel_coord = global_id + discrete_position - center;
86
-
87
- let cascade_texture_offset = vec3<u32>( 0, 0, settings.cascade_index * metadata.cascade_resolution );
88
-
89
- // TODO implement
90
- let voxel_cleared = false;
91
- if(voxel_cleared){
92
- textureStore(
93
- t_cascades,
94
- cascade_texture_offset + cascade_voxel_coord,
95
- vec4(0)
96
- );
97
- }
98
-
99
- // set new offset
100
- metadata.cascades[settings.cascade_index].offset = discrete_position;
101
- }
102
- `
103
- )
104
-
105
- /**
106
- * Update cascade offset, and clear out any voxels that scroll out
107
- * @type {ComputeShader}
108
- */
109
- export const shader_update_clipmap_cascade = ComputeShader.from({
110
- label: "Clipmap / update",
111
- resources,
112
- body
1
+ import { u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
+ import { ComputeShader } from "../../shader/ComputeShader.js";
5
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { CLIPMAP_METADATA } from "./CLIPMAP_METADATA.js";
7
+
8
+ const PUSH_CONSTANTS = WebGPUStruct.from({
9
+ cascade_index: u32,
10
+ position: vec3f
11
+ });
12
+
13
+ const resources = new ShaderResourceSetDescriptor();
14
+
15
+ // per-dispatch, 32 bytes, read-only: immediate data rather than a uniform buffer
16
+ resources.setImmediate("settings", PUSH_CONSTANTS);
17
+ resources.createGroup()
18
+ .addStorageBuffer("metadata", CLIPMAP_METADATA, true)
19
+ .addStorageTexture("t_cascades", "r32uint", "3d", "write-only")
20
+ ;
21
+
22
+ /**
23
+ * Converts world-aligned voxel coordinate to local wrapped voxel coordinate in the 3d texture representing the cascade
24
+ * @type {CodeChunk}
25
+ */
26
+ const chunk_clip_cascade_world_to_voxel = CodeChunk.from(
27
+ //language=WGSL
28
+ `
29
+ fn cascade_voxel_wrap(
30
+ coord_ws: vec3<f32>,
31
+ world_offset : vec3<i32>,
32
+ voxel_size: f32,
33
+ resolution: u32,
34
+ ) -> vec3<u32>{
35
+ let coord_voxel = world_offset + coord_ws / voxel_size;
36
+
37
+ let offset = coord_voxel + f32(resolution) * 0.5;
38
+ let offset_i = i32(offset);
39
+
40
+ let wrapped_offset = ( ( offset % resolution ) + resolution ) % resolution;
41
+
42
+ return vec3<u32>(wrapped_offset);
43
+ }
44
+ `, []
45
+ );
46
+
47
+ /**
48
+ *
49
+ * @type {CodeChunk}
50
+ */
51
+ const chunk_clip_cascade_voxel_to_world = CodeChunk.from(
52
+ //language=WGSL
53
+ `
54
+ fn clip_cascade_voxel_to_world(
55
+ voxel_coord: vec3<u32>,
56
+ world_offset: vec3<i32>,
57
+ voxel_size: f32,
58
+ resolution: u32,
59
+ ) -> vec3<f32>{
60
+ let x = world_offset + voxel_coord - f32(resolution)*0.5;
61
+
62
+ return x * voxel_size;
63
+ }
64
+ `
65
+ );
66
+
67
+
68
+ const body = CodeChunk.from(
69
+ //language=WGSL
70
+ `
71
+ @compute @workgroup_size(8,8,4)
72
+ fn main(
73
+ @builtin(global_invocation_id) global_id : vec3<u32>,
74
+ ){
75
+ if(any(global_id >= vec3(metadata.cascade_resolution))){
76
+ return;
77
+ }
78
+
79
+ let cascade_info = metadata.cascades[settings.cascade_index];
80
+
81
+ // discretize position
82
+ let discrete_position = vec3<i32>(settings.position / cascade_info.voxel_size);
83
+
84
+ // difference
85
+ let position_delta = discrete_position - cascade_info.offset;
86
+
87
+ let cascade_voxel_coord = global_id + discrete_position - center;
88
+
89
+ let cascade_texture_offset = vec3<u32>( 0, 0, settings.cascade_index * metadata.cascade_resolution );
90
+
91
+ // TODO implement
92
+ let voxel_cleared = false;
93
+ if(voxel_cleared){
94
+ textureStore(
95
+ t_cascades,
96
+ cascade_texture_offset + cascade_voxel_coord,
97
+ vec4(0)
98
+ );
99
+ }
100
+
101
+ // set new offset
102
+ metadata.cascades[settings.cascade_index].offset = discrete_position;
103
+ }
104
+ `
105
+ )
106
+
107
+ /**
108
+ * Update cascade offset, and clear out any voxels that scroll out
109
+ * @type {ComputeShader}
110
+ */
111
+ export const shader_update_clipmap_cascade = ComputeShader.from({
112
+ label: "Clipmap / update",
113
+ resources,
114
+ body
113
115
  });
@@ -1 +1 @@
1
- {"version":3,"file":"graph_lpv_store_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js"],"names":[],"mappings":"AAmFA;;;;;;;;GAQG;AACH,kIA+BC"}
1
+ {"version":3,"file":"graph_lpv_store_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js"],"names":[],"mappings":"AAsFA;;;;;;;;GAQG;AACH,kIA+BC"}
@@ -19,8 +19,11 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
19
19
  })
20
20
 
21
21
  const resources = new ShaderResourceSetDescriptor();
22
+
23
+ // per-dispatch, 16 bytes, read-only: immediate data rather than a uniform buffer — the struct was
24
+ // already named PUSH_CONSTANTS
25
+ resources.setImmediate("settings", PUSH_CONSTANTS);
22
26
  resources.createGroup()
23
- .addUniform("settings", PUSH_CONSTANTS)
24
27
  .addStorageBuffer("coefficients", WebGPUArray.f32, false)
25
28
  .addStorageBuffer("lpv_probes", WebGPUArray.from(LIGHT_PROBE_STRUCT), true)
26
29
  ;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_lvp_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js"],"names":[],"mappings":"AAkHA;;;;;;;;;GASG;AACH,0IAFa,MAAM,CA8DlB"}
1
+ {"version":3,"file":"graph_lvp_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js"],"names":[],"mappings":"AAqHA;;;;;;;;;GASG;AACH,0IAFa,MAAM,CA8DlB"}
@@ -1,185 +1,188 @@
1
- import { BufferResourceDescriptor } from "../../../../../device/graph/BufferResourceDescriptor.js";
2
- import { u32 } from "../../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
- import { WebGPUArray } from "../../../../shader/type/WebGPUArray.js";
4
- import { WebGPUStruct } from "../../../../shader/type/WebGPUStruct.js";
5
- import {
6
- chunk_octahedral_solid_angle
7
- } from "../../../../shader/chunk/geometry/octahedron/chunk_octahedral_solid_angle.js";
8
- import {
9
- chunk_uv_octahedral_unit_decode
10
- } from "../../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
11
- import { chunk_grid2d_to_index } from "../../../../shader/chunk/grid/chunk_grid2d_to_index.js";
12
- import { PI_DECLARATION } from "../../../../shader/chunk/math/PI_DECLARATION.js";
13
- import { chunk_sh2_basis_at } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_basis_at.js";
14
- import { chunk_sh2_multiply_scalar } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_multiply_scalar.js";
15
- import { chunk_texel_coordinate_to_uv } from "../../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
16
- import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
17
- import { ComputeShader } from "../../../../shader/ComputeShader.js";
18
- import { ShaderResourceSetDescriptor } from "../../../../shader/resource/ShaderResourceSetDescriptor.js";
19
- import { chunk_lpv_atlas_read_patch_texel } from "../sample/chunk_lpv_atlas_read_patch_texel.js";
20
- import { chunk_compute_coefficient_address } from "./chunk_compute_coefficient_address.js";
21
-
22
- const PUSH_CONSTANTS = WebGPUStruct.from({
23
- probe_index_offset: u32,
24
- probe_update_count: u32,
25
- probe_resolution: u32,
26
- probe_count: u32,
27
- probes_per_row: u32, // in g-buffer space
28
- })
29
-
30
- const resources = new ShaderResourceSetDescriptor();
31
- resources.createGroup()
32
- .addUniform("settings", PUSH_CONSTANTS)
33
-
34
- resources.createGroup()
35
- .addStorageBuffer("coefficients", WebGPUArray.f32, true)
36
- .addTexture("tAtlas_radiance", "uint");
37
-
38
- const body = CodeChunk.from(
39
- //language=WGSL
40
- `
41
- @compute @workgroup_size(16,16,1)
42
- fn main(
43
- @builtin(global_invocation_id) global_id : vec3<u32>,
44
- ){
45
-
46
- let g_buffer_texel = global_id.xy;
47
-
48
- let probe_resolution = settings.probe_resolution;
49
-
50
- let probe_texel = g_buffer_texel % probe_resolution;
51
-
52
- let g_buffer_probe_index = grid2d_to_index(g_buffer_texel / probe_resolution, settings.probes_per_row);
53
-
54
- if(g_buffer_probe_index >= settings.probe_update_count){
55
- // out of bounds
56
- return;
57
- }
58
-
59
- let global_probe_index = (g_buffer_probe_index + settings.probe_index_offset) % settings.probe_count;
60
-
61
- let radiance = lpv_atlas_read_patch_texel(global_probe_index, probe_texel + 1, tAtlas_radiance, probe_resolution + 2);
62
-
63
- let probe_texel_uv = texel_coordinate_to_uv(vec2<f32>(probe_texel), vec2(probe_resolution));
64
-
65
- let direction = uv_octahedral_unit_decode(probe_texel_uv);
66
-
67
- let sh3_basis = sh2_basis_at(direction);
68
-
69
- let local_texel_index = grid2d_to_index(probe_texel, probe_resolution);
70
-
71
- let coefficients_address = compute_coefficient_address(g_buffer_probe_index, probe_texel);
72
-
73
- // adjust by solid angle
74
- let solid_angle = octahedral_solid_angle(probe_texel_uv, 1.0 / f32(probe_resolution));
75
-
76
- let sh_coefficients = sh2_multiply_scalar(sh3_basis, solid_angle);
77
-
78
- // NOTE: we do not convolve with cosine kernel here, this is done during sampling.
79
- // what is stored is radiance projected to SH
80
-
81
- // store coefficients for this texel.
82
- // NOTE: no accumulation here, done in a separate pass.
83
- for(var i=0u; i< 4; i++){
84
- let coefficient = sh_coefficients[i];
85
-
86
- let convolved = radiance * coefficient;
87
-
88
- let offset = coefficients_address + i * 3;
89
-
90
- coefficients[ offset ] = convolved.r;
91
- coefficients[ offset + 1 ] = convolved.g;
92
- coefficients[ offset + 2 ] = convolved.b;
93
- }
94
-
95
- }
96
- `, [
97
- chunk_sh2_basis_at,
98
- chunk_grid2d_to_index,
99
- chunk_uv_octahedral_unit_decode,
100
- chunk_texel_coordinate_to_uv,
101
- chunk_lpv_atlas_read_patch_texel,
102
- chunk_compute_coefficient_address,
103
- chunk_octahedral_solid_angle,
104
- chunk_sh2_multiply_scalar,
105
- PI_DECLARATION,
106
- ]
107
- );
108
-
109
- const shader = ComputeShader.from({
110
- label: "Radiance Atlas / convert to SH",
111
- body,
112
- resources,
113
- });
114
-
115
- /**
116
- * Convolve part of the atlas to Spherical Harmonics
117
- * @param {FrameGraph} graph
118
- * @param {GPUProbeAtlas} atlas
119
- * @param {GPUSceneContext} scene
120
- * @param {number} probe_index_offset
121
- * @param {number} probe_update_count
122
- * @param {number[]} g_buffer_resolution In texels
123
- * @returns {number} buffer resource with SH3-encoded texels
124
- */
125
- export function graph_lvp_atlas_to_sh({
126
- graph,
127
- atlas,
128
- scene,
129
- probe_index_offset,
130
- probe_update_count,
131
- g_buffer_resolution,
132
- }) {
133
-
134
- // first convert rasterized probes to SH
135
- const probe_resolution = atlas.probe_resolution;
136
-
137
- /**
138
- *
139
- * @param data
140
- * @param {FramePassResources} resources
141
- * @param {GraphicsExecutionContext} context
142
- */
143
- function execute(data, resources, context) {
144
- /**
145
- *
146
- * @type {GPUBuffer}
147
- */
148
- const output = resources.get(data.output);
149
-
150
- const settings = context.encoder.allocateTransientValueBuffer(PUSH_CONSTANTS, {
151
- probe_index_offset,
152
- probe_update_count,
153
- probe_resolution: probe_resolution,
154
- probe_count: scene.light_probe_volume.source.probe_count,
155
- probes_per_row: Math.round(g_buffer_resolution[0] / probe_resolution)
156
- });
157
-
158
- shader.dispatchThreads({
159
- encoder: context.encoder,
160
- bindings: {
161
- settings,
162
- coefficients: output,
163
- tAtlas_radiance: atlas.texture_radiance.obtainView(),
164
- },
165
- thread_count_x: g_buffer_resolution[0],
166
- thread_count_y: g_buffer_resolution[1],
167
- });
168
- }
169
-
170
- const pass_data = {};
171
-
172
- const pass = graph.add("Atlas to SH", pass_data, execute);
173
-
174
- const probe_texel_count = probe_resolution * probe_resolution;
175
- const total_updated_texel_count = probe_texel_count * probe_update_count;
176
- const buffer_spec = BufferResourceDescriptor.from(
177
- 12 * total_updated_texel_count * Float32Array.BYTES_PER_ELEMENT,
178
- GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
179
- );
180
- const r_sh_buffer = pass.create("sh", buffer_spec);
181
-
182
- pass_data.output = r_sh_buffer;
183
-
184
- return r_sh_buffer;
1
+ import { BufferResourceDescriptor } from "../../../../../device/graph/BufferResourceDescriptor.js";
2
+ import { u32 } from "../../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUArray } from "../../../../shader/type/WebGPUArray.js";
4
+ import { WebGPUStruct } from "../../../../shader/type/WebGPUStruct.js";
5
+ import {
6
+ chunk_octahedral_solid_angle
7
+ } from "../../../../shader/chunk/geometry/octahedron/chunk_octahedral_solid_angle.js";
8
+ import {
9
+ chunk_uv_octahedral_unit_decode
10
+ } from "../../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
11
+ import { chunk_grid2d_to_index } from "../../../../shader/chunk/grid/chunk_grid2d_to_index.js";
12
+ import { PI_DECLARATION } from "../../../../shader/chunk/math/PI_DECLARATION.js";
13
+ import { chunk_sh2_basis_at } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_basis_at.js";
14
+ import { chunk_sh2_multiply_scalar } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_multiply_scalar.js";
15
+ import { chunk_texel_coordinate_to_uv } from "../../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
16
+ import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
17
+ import { ComputeShader } from "../../../../shader/ComputeShader.js";
18
+ import { ShaderResourceSetDescriptor } from "../../../../shader/resource/ShaderResourceSetDescriptor.js";
19
+ import { chunk_lpv_atlas_read_patch_texel } from "../sample/chunk_lpv_atlas_read_patch_texel.js";
20
+ import { chunk_compute_coefficient_address } from "./chunk_compute_coefficient_address.js";
21
+
22
+ const PUSH_CONSTANTS = WebGPUStruct.from({
23
+ probe_index_offset: u32,
24
+ probe_update_count: u32,
25
+ probe_resolution: u32,
26
+ probe_count: u32,
27
+ probes_per_row: u32, // in g-buffer space
28
+ })
29
+
30
+ const resources = new ShaderResourceSetDescriptor();
31
+
32
+ // per-dispatch, 20 bytes, read-only: immediate data rather than a uniform buffer — the struct was
33
+ // already named PUSH_CONSTANTS
34
+ resources.setImmediate("settings", PUSH_CONSTANTS);
35
+ resources.createGroup()
36
+
37
+ resources.createGroup()
38
+ .addStorageBuffer("coefficients", WebGPUArray.f32, true)
39
+ .addTexture("tAtlas_radiance", "uint");
40
+
41
+ const body = CodeChunk.from(
42
+ //language=WGSL
43
+ `
44
+ @compute @workgroup_size(16,16,1)
45
+ fn main(
46
+ @builtin(global_invocation_id) global_id : vec3<u32>,
47
+ ){
48
+
49
+ let g_buffer_texel = global_id.xy;
50
+
51
+ let probe_resolution = settings.probe_resolution;
52
+
53
+ let probe_texel = g_buffer_texel % probe_resolution;
54
+
55
+ let g_buffer_probe_index = grid2d_to_index(g_buffer_texel / probe_resolution, settings.probes_per_row);
56
+
57
+ if(g_buffer_probe_index >= settings.probe_update_count){
58
+ // out of bounds
59
+ return;
60
+ }
61
+
62
+ let global_probe_index = (g_buffer_probe_index + settings.probe_index_offset) % settings.probe_count;
63
+
64
+ let radiance = lpv_atlas_read_patch_texel(global_probe_index, probe_texel + 1, tAtlas_radiance, probe_resolution + 2);
65
+
66
+ let probe_texel_uv = texel_coordinate_to_uv(vec2<f32>(probe_texel), vec2(probe_resolution));
67
+
68
+ let direction = uv_octahedral_unit_decode(probe_texel_uv);
69
+
70
+ let sh3_basis = sh2_basis_at(direction);
71
+
72
+ let local_texel_index = grid2d_to_index(probe_texel, probe_resolution);
73
+
74
+ let coefficients_address = compute_coefficient_address(g_buffer_probe_index, probe_texel);
75
+
76
+ // adjust by solid angle
77
+ let solid_angle = octahedral_solid_angle(probe_texel_uv, 1.0 / f32(probe_resolution));
78
+
79
+ let sh_coefficients = sh2_multiply_scalar(sh3_basis, solid_angle);
80
+
81
+ // NOTE: we do not convolve with cosine kernel here, this is done during sampling.
82
+ // what is stored is radiance projected to SH
83
+
84
+ // store coefficients for this texel.
85
+ // NOTE: no accumulation here, done in a separate pass.
86
+ for(var i=0u; i< 4; i++){
87
+ let coefficient = sh_coefficients[i];
88
+
89
+ let convolved = radiance * coefficient;
90
+
91
+ let offset = coefficients_address + i * 3;
92
+
93
+ coefficients[ offset ] = convolved.r;
94
+ coefficients[ offset + 1 ] = convolved.g;
95
+ coefficients[ offset + 2 ] = convolved.b;
96
+ }
97
+
98
+ }
99
+ `, [
100
+ chunk_sh2_basis_at,
101
+ chunk_grid2d_to_index,
102
+ chunk_uv_octahedral_unit_decode,
103
+ chunk_texel_coordinate_to_uv,
104
+ chunk_lpv_atlas_read_patch_texel,
105
+ chunk_compute_coefficient_address,
106
+ chunk_octahedral_solid_angle,
107
+ chunk_sh2_multiply_scalar,
108
+ PI_DECLARATION,
109
+ ]
110
+ );
111
+
112
+ const shader = ComputeShader.from({
113
+ label: "Radiance Atlas / convert to SH",
114
+ body,
115
+ resources,
116
+ });
117
+
118
+ /**
119
+ * Convolve part of the atlas to Spherical Harmonics
120
+ * @param {FrameGraph} graph
121
+ * @param {GPUProbeAtlas} atlas
122
+ * @param {GPUSceneContext} scene
123
+ * @param {number} probe_index_offset
124
+ * @param {number} probe_update_count
125
+ * @param {number[]} g_buffer_resolution In texels
126
+ * @returns {number} buffer resource with SH3-encoded texels
127
+ */
128
+ export function graph_lvp_atlas_to_sh({
129
+ graph,
130
+ atlas,
131
+ scene,
132
+ probe_index_offset,
133
+ probe_update_count,
134
+ g_buffer_resolution,
135
+ }) {
136
+
137
+ // first convert rasterized probes to SH
138
+ const probe_resolution = atlas.probe_resolution;
139
+
140
+ /**
141
+ *
142
+ * @param data
143
+ * @param {FramePassResources} resources
144
+ * @param {GraphicsExecutionContext} context
145
+ */
146
+ function execute(data, resources, context) {
147
+ /**
148
+ *
149
+ * @type {GPUBuffer}
150
+ */
151
+ const output = resources.get(data.output);
152
+
153
+ const settings = {
154
+ probe_index_offset,
155
+ probe_update_count,
156
+ probe_resolution: probe_resolution,
157
+ probe_count: scene.light_probe_volume.source.probe_count,
158
+ probes_per_row: Math.round(g_buffer_resolution[0] / probe_resolution)
159
+ };
160
+
161
+ shader.dispatchThreads({
162
+ encoder: context.encoder,
163
+ bindings: {
164
+ settings,
165
+ coefficients: output,
166
+ tAtlas_radiance: atlas.texture_radiance.obtainView(),
167
+ },
168
+ thread_count_x: g_buffer_resolution[0],
169
+ thread_count_y: g_buffer_resolution[1],
170
+ });
171
+ }
172
+
173
+ const pass_data = {};
174
+
175
+ const pass = graph.add("Atlas to SH", pass_data, execute);
176
+
177
+ const probe_texel_count = probe_resolution * probe_resolution;
178
+ const total_updated_texel_count = probe_texel_count * probe_update_count;
179
+ const buffer_spec = BufferResourceDescriptor.from(
180
+ 12 * total_updated_texel_count * Float32Array.BYTES_PER_ELEMENT,
181
+ GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
182
+ );
183
+ const r_sh_buffer = pass.create("sh", buffer_spec);
184
+
185
+ pass_data.output = r_sh_buffer;
186
+
187
+ return r_sh_buffer;
185
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_reduce_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js"],"names":[],"mappings":"AA6GA;;;;;;;;;GASG;AACH,mKAsDC;AA5ID,sCAaM;0BArCoB,0CAA0C"}
1
+ {"version":3,"file":"graph_reduce_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js"],"names":[],"mappings":"AAgHA;;;;;;;;;GASG;AACH,mKAsDC;AA5ID,sCAaM;0BAxCoB,0CAA0C"}
@@ -25,8 +25,11 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
25
25
  })
26
26
 
27
27
  const resources = new ShaderResourceSetDescriptor();
28
+
29
+ // per-dispatch, 24 bytes, read-only: immediate data rather than a uniform buffer. The reduce runs
30
+ // one dispatch per mip level, so the buffer was allocated per level to carry six integers.
31
+ resources.setImmediate("settings", PUSH_CONSTANTS);
28
32
  resources.createGroup()
29
- .addUniform("settings", PUSH_CONSTANTS)
30
33
 
31
34
  resources.createGroup({ label: "source" })
32
35
  .addStorageBuffer("coefficients", WebGPUArray.f32, true)