@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,723 +1,723 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { SamplerDescriptor } from "../../../../descriptor/texture/SamplerDescriptor.js";
3
- import { TextureResourceDescriptor } from "../../../../device/graph/TextureResourceDescriptor.js";
4
- import { rp_rewrite_for_primitive_state } from "../../../../device/pipeline/rp_rewrite_for_primitive_state.js";
5
- import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
6
- import { BindGroupDescriptor } from "../../../binding/BindGroupDescriptor.js";
7
- import { SHADING_LIGHT_RESOURCE_GROUP } from "../../../deferred/SHADING_LIGHT_RESOURCE_GROUP.js";
8
- import { ShadeDrawMode } from "../../../material/ShadeDrawMode.js";
9
- import { ShadeDrawSide } from "../../../material/ShadeDrawSide.js";
10
- import { SHADING_MATERIAL_RESOURCE_GROUP } from "../../../material/standard/SHADING_MATERIAL_RESOURCE_GROUP.js";
11
- import { TransparencyMode } from "../../../material/TransparencyMode.js";
12
- import { ShadeIndirectLightingMode } from "../../../ShadeIndirectLightingMode.js";
13
- import { graph_image_pass } from "../../../shader/graph/graph_image_pass.js";
14
- import { graph_import_buffer } from "../../../shader/graph/graph_import_buffer.js";
15
- import { graph_import_texture } from "../../../shader/graph/graph_import_texture.js";
16
- import {
17
- SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR
18
- } from "../../../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
19
- import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../../../STATIC_GRAPHICS_ENGINE_ASSETS.js";
20
- import { rasterization_material_bucket } from "../../expand/bucket/chunk_rasterization_material_bucket.js";
21
- import { construct_primitive_state } from "../../bucket/construct_primitive_state.js";
22
- import { filter_materials_by_bucket } from "../../bucket/filter_materials_by_bucket.js";
23
- import {
24
- graph_prepare_meshlet_draw_commands_by_material
25
- } from "../../bucket/prepare_meshlet_draw_commands_by_material.js";
26
- import {
27
- RASTERIZATION_SHADER_BIND_GROUP_SCENE,
28
- RASTERIZATION_SHADER_BIND_GROUP_VIEW
29
- } from "../alpha_tested_pass_resources.js";
30
- import { shader_oit_blend } from "./shader_oit_blend.js";
31
- import { shader_oit_generate_moments } from "./shader_oit_generate_moments.js";
32
- import { shader_oit_resolve_moments } from "./shader_oit_resolve_moments.js";
33
- import { shader_oit_resolve_moments_ibl } from "./shader_oit_resolve_moments_ibl.js";
34
- import { SHADING_SCENE_RESOURCE_GROUP } from "./SHADING_SCENE_RESOURCE_GROUP.js";
35
-
36
- const DRAW_COMMAND_BYTE_SIZE = STRUCT_UNINDEXED_DRAW_COMMAND.aligned_size;
37
-
38
- const BIND_GROUP_LAYOUT_SCENE = SHADING_SCENE_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
39
- const BIND_GROUP_LAYOUT_MATERIAL = SHADING_MATERIAL_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
40
- const BIND_GROUP_LAYOUT_LIGHT = SHADING_LIGHT_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
41
-
42
-
43
- /**
44
- *
45
- * @param {GPUMaterialManager} material_manager
46
- * @param {number} material_count
47
- * @param {ShadeMaterial[]} materials
48
- * @param {RenderPassDescriptor} render_pass_descriptor
49
- * @param {BindGroupManager} bind_manager
50
- * @param {GPURenderPassEncoder} pass_encoder
51
- * @param {GPUBuffer} command_buffer_draw
52
- */
53
- function material_draw(
54
- material_manager,
55
- material_count,
56
- materials,
57
- render_pass_descriptor,
58
- bind_manager,
59
- pass_encoder,
60
- command_buffer_draw
61
- ) {
62
-
63
- assert.defined(material_manager, 'material_manager');
64
- assert.isNonNegativeInteger(material_count, 'material_count');
65
- assert.isArray(materials, 'materials');
66
-
67
- for (let i = 0; i < material_count; i++) {
68
-
69
- const material = materials[i];
70
- const gpu_material = material_manager.obtain(material);
71
-
72
- if (!gpu_material.is_built) {
73
- // skip, not ready for rendering
74
- continue;
75
- }
76
-
77
- const material_resource_group = render_pass_descriptor.resources.groups[0];
78
- const binding_entries = material_resource_group.generateBindings(gpu_material.binding_data);
79
- const material_bindings = bind_manager.obtain(BindGroupDescriptor.from(
80
- BIND_GROUP_LAYOUT_MATERIAL,
81
- binding_entries
82
- ));
83
-
84
- // set material-specific bind group at 0
85
- pass_encoder.setBindGroup(0, material_bindings)
86
-
87
- pass_encoder.drawIndirect(
88
- command_buffer_draw,
89
- i * DRAW_COMMAND_BYTE_SIZE,
90
- );
91
-
92
- }
93
- }
94
-
95
- /**
96
- *
97
- * @param {FrameGraph} graph
98
- * @param {GPUViewContext} view_ctx
99
- * @param {number} material_count
100
- * @param {ShadeMaterial[]} materials
101
- * @param {boolean} [clear_targets]
102
- * @param {number} texture_moments
103
- * @param {number} texture_optical_depth
104
- * @param {number} draw_commands
105
- * @param {number} meshlets
106
- * @param {number} depth_texture
107
- * @param {number} light_cluster_parameters
108
- * @param {number} light_cluster_lookup
109
- * @param {number} light_cluster_data
110
- * @param {number} shadowmap_atlas
111
- * @param {number} output
112
- * @param {PrimitiveState} primitive
113
- * @param {ShadeIndirectLightingMode} indirect_lighting_mode
114
- * @return {number}
115
- */
116
- function graph_oit_resolve_moments({
117
- graph,
118
- view_ctx,
119
- material_count,
120
- materials,
121
- clear_targets = true,
122
- texture_moments,
123
- texture_optical_depth,
124
- draw_commands,
125
- meshlets,
126
- depth_texture ,
127
- primitive,
128
- light_cluster_parameters ,
129
- light_cluster_lookup ,
130
- light_cluster_data ,
131
-
132
- shadowmap_atlas ,
133
-
134
- volumetrics_lut,
135
- volumetrics_metadata,
136
-
137
- output = -1,
138
- indirect_lighting_mode = ShadeIndirectLightingMode.IBL,
139
- }) {
140
-
141
- assert.isNonNegativeInteger(material_count, 'material_count');
142
- assert.isNonNegativeInteger(draw_commands, 'draw_commands');
143
- assert.isNonNegativeInteger(meshlets, 'meshlets');
144
-
145
- const scene_ctx = view_ctx.scene;
146
-
147
- /**
148
- *
149
- * @param data
150
- * @param {FramePassResources} resources
151
- * @param {GraphicsExecutionContext} context
152
- */
153
- function execute(data, resources, context) {
154
-
155
- assert.ok(context.graphics.device.features.has("indirect-first-instance"), '"indirect-first-instance" feature needs to be enabled for non-zero firstInstance values to be used.')
156
-
157
- const command_buffer_draw = resources.get(data.draw_commands);
158
- const meshlet_buffer = resources.get(data.meshlets);
159
-
160
- const t_moments = resources.get(data.moments);
161
- const t_optical_depth = resources.get(data.optical_depth);
162
- const t_resolved = resources.get(data.resolved);
163
- const t_depth = resources.get(data.depth);
164
-
165
- const light_cluster_parameters = resources.get(data.light_cluster_parameters);
166
- const light_cluster_lookup = resources.get(data.light_cluster_lookup);
167
- const light_cluster_data = resources.get(data.light_cluster_data);
168
-
169
- const shadowmap_atlas = resources.get(data.shadowmap_atlas);
170
-
171
- const t_volumetrics_lut = resources.get(data.volumetrics_lut);
172
- const volumetrics_metadata = resources.get(data.volumetrics_metadata);
173
-
174
- const encoder = context.encoder;
175
-
176
- const graphics = context.graphics;
177
-
178
- const bind_manager = graphics.bind_groups;
179
-
180
- const scene_bindings = bind_manager.obtain(BindGroupDescriptor.from(
181
- BIND_GROUP_LAYOUT_SCENE,
182
- [
183
- { buffer: meshlet_buffer },
184
- { buffer: scene_ctx.geometries.meshlets.buffer_metadata },
185
- { buffer: scene_ctx.geometries.meshlets.buffer_data },
186
- { buffer: scene_ctx.scene_database_buffer },
187
- { buffer: scene_ctx.geometries.buffer_metadata },
188
- ]
189
- ));
190
-
191
- const sampler_shadowmap = context.graphics.samplers.obtain(SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR);
192
-
193
- const light_bindings = bind_manager.obtain(BindGroupDescriptor.from(
194
- BIND_GROUP_LAYOUT_LIGHT,
195
- [
196
- { buffer: view_ctx.scene.lights.buffer_data },
197
- view_ctx.scene.lights.environment.obtainView(),
198
- //
199
- { buffer: light_cluster_parameters },
200
- { buffer: light_cluster_lookup },
201
- { buffer: light_cluster_data },
202
- //
203
- shadowmap_atlas.obtainView(),
204
- sampler_shadowmap,
205
- ]
206
- ));
207
-
208
- // Select render pass descriptor based on indirect lighting mode
209
- const use_brick4 = data.indirect_lighting_mode === ShadeIndirectLightingMode.Brick4;
210
- const render_pass_descriptor = use_brick4
211
- ? shader_oit_resolve_moments
212
- : shader_oit_resolve_moments_ibl;
213
-
214
- const pass_encoder = encoder.beginRenderPass(render_pass_descriptor.toGPU({
215
- colorTargets: [t_resolved],
216
- depthTarget: t_depth,
217
- colorLoadOp: clear_targets ? "clear" : "load",
218
- depthLoadOp: "load",
219
- storeOp: "store",
220
- }));
221
-
222
- const pipeline_descriptor = rp_rewrite_for_primitive_state(render_pass_descriptor.pipeline, primitive);
223
-
224
- const pipeline = graphics.render_pipelines.obtain(pipeline_descriptor)
225
- pass_encoder.setPipeline(pipeline);
226
-
227
- pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_SCENE, scene_bindings);
228
- pass_encoder.setBindGroup(3, light_bindings);
229
-
230
- const sampler_linear = graphics.samplers.obtain(SamplerDescriptor.from({
231
- magFilter: "linear",
232
- }));
233
-
234
- const t_split_sum_lut = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.split_sum);
235
-
236
- const stbn_vec3 = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
237
-
238
- // Brick4 variant requires brick4 buffer in the view bind group;
239
- // IBL variant does not. Volumetrics bindings are appended last (after sLinear), matching
240
- // the order declared in shader_oit_resolve_moments[_ibl].
241
- const view_bind_entries = use_brick4
242
- ? [
243
- { buffer: view_ctx.camera.buffer.buffer },
244
- { buffer: view_ctx.uniform_buffer.buffer },
245
- t_moments.obtainView(),
246
- t_optical_depth.obtainView(),
247
- { buffer: view_ctx.scene.volumetric_light_map.buffer },
248
- t_split_sum_lut.obtainView(),
249
- sampler_linear,
250
- // volumetrics
251
- { buffer: volumetrics_metadata },
252
- t_volumetrics_lut.obtainView(),
253
- stbn_vec3.obtainView(),
254
- ]
255
- : [
256
- { buffer: view_ctx.camera.buffer.buffer },
257
- { buffer: view_ctx.uniform_buffer.buffer },
258
- t_moments.obtainView(),
259
- t_optical_depth.obtainView(),
260
- t_split_sum_lut.obtainView(),
261
- sampler_linear,
262
- // volumetrics
263
- { buffer: volumetrics_metadata },
264
- t_volumetrics_lut.obtainView(),
265
- stbn_vec3.obtainView(),
266
- ];
267
-
268
- const view_bindings = bind_manager.obtain(BindGroupDescriptor.from(
269
- render_pass_descriptor.pipeline.layout.bindGroupLayouts[RASTERIZATION_SHADER_BIND_GROUP_VIEW],
270
- view_bind_entries
271
- ));
272
-
273
- pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_VIEW, view_bindings);
274
-
275
- material_draw(
276
- scene_ctx.materials,
277
- material_count,
278
- materials,
279
- render_pass_descriptor,
280
- bind_manager,
281
- pass_encoder,
282
- command_buffer_draw
283
- );
284
-
285
- pass_encoder.end();
286
-
287
- }
288
-
289
- const pass_data = {
290
- indirect_lighting_mode,
291
- };
292
- const pass = graph.add("MBOIT/resolve moments", pass_data, execute);
293
-
294
- pass_data.draw_commands = pass.read(draw_commands);
295
- pass_data.meshlets = pass.read(meshlets)
296
-
297
- pass_data.depth = pass.read(depth_texture);
298
-
299
- pass_data.optical_depth = pass.read(texture_optical_depth);
300
- pass_data.moments = pass.read(texture_moments);
301
-
302
- if (output !== -1) {
303
- pass.read(output);
304
- pass_data.resolved = pass.write(output);
305
- } else {
306
- pass_data.resolved = pass.create("OIT resolved", TextureResourceDescriptor.from({
307
- resolution: view_ctx.resolution,
308
- format: 'rgba16float',
309
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
310
- }));
311
- }
312
-
313
- pass_data.light_cluster_parameters = pass.read(light_cluster_parameters);
314
- pass_data.light_cluster_lookup = pass.read(light_cluster_lookup);
315
- pass_data.light_cluster_data = pass.read(light_cluster_data);
316
-
317
- pass_data.shadowmap_atlas = pass.read(shadowmap_atlas);
318
-
319
- pass_data.volumetrics_lut = pass.read(volumetrics_lut);
320
- pass_data.volumetrics_metadata = pass.read(volumetrics_metadata);
321
-
322
- return pass_data.resolved;
323
- }
324
-
325
- /**
326
- *
327
- * @param {FrameGraph} graph
328
- * @param {GPUViewContext} view_ctx
329
- * @param {number} material_count
330
- * @param {ShadeMaterial[]} materials
331
- * @param {number} draw_commands resource ID
332
- * @param {number} meshlets resource ID
333
- * @param {number} depth_texture resource ID
334
- * @param {number} [output_optical_depth]
335
- * @param {number} [output_moments]
336
- * @param {PrimitiveState} primitive
337
- * @param {boolean} [clear_targets]
338
- * @return {{optical_depth:number, moments:number}}
339
- */
340
- function graph_oit_generate_moments({
341
- graph,
342
- view_ctx,
343
- material_count,
344
- materials,
345
- draw_commands,
346
- meshlets,
347
- depth_texture ,
348
- output_optical_depth = -1,
349
- output_moments = -1,
350
- primitive,
351
- clear_targets = true,
352
- }) {
353
-
354
- assert.isNonNegativeInteger(material_count, 'material_count');
355
- assert.isNonNegativeInteger(draw_commands, 'draw_commands');
356
- assert.isNonNegativeInteger(meshlets, 'meshlets');
357
- assert.equal(view_ctx.isGPUViewContext, true, 'view_ctx.isGPUViewContext !== true');
358
-
359
-
360
- const scene_ctx = view_ctx.scene;
361
-
362
- /**
363
- *
364
- * @param data
365
- * @param {FramePassResources} resources
366
- * @param {GraphicsExecutionContext} context
367
- */
368
- function execute(data, resources, context) {
369
-
370
- assert.ok(context.graphics.device.features.has("indirect-first-instance"), '"indirect-first-instance" feature needs to be enabled for non-zero firstInstance values to be used.')
371
-
372
-
373
- const command_buffer_draw = resources.get(data.draw_commands);
374
- const meshlet_buffer = resources.get(data.meshlets);
375
-
376
- const t_moments = resources.get(data.moments);
377
- const t_optical_depth = resources.get(data.optical_depth);
378
- const t_depth = resources.get(data.depth);
379
-
380
- const encoder = context.encoder;
381
-
382
- const graphics = context.graphics;
383
-
384
- const bind_manager = graphics.bind_groups;
385
-
386
- const scene_bindings = bind_manager.obtain(BindGroupDescriptor.from(
387
- BIND_GROUP_LAYOUT_SCENE,
388
- [
389
- { buffer: meshlet_buffer },
390
- { buffer: scene_ctx.geometries.meshlets.buffer_metadata },
391
- { buffer: scene_ctx.geometries.meshlets.buffer_data },
392
- { buffer: scene_ctx.scene_database_buffer },
393
- { buffer: scene_ctx.geometries.buffer_metadata },
394
- ]
395
- ));
396
-
397
- const render_pass_descriptor = shader_oit_generate_moments;
398
- const pass_encoder = encoder.beginRenderPass(render_pass_descriptor.toGPU({
399
- colorTargets: [
400
- t_optical_depth,
401
- t_moments,
402
- ],
403
- depthTarget: t_depth,
404
- colorLoadOp: clear_targets ? "clear" : "load",
405
- // we don't modify depth, only use it for depth test
406
- depthLoadOp: "load",
407
- storeOp: "store",
408
- }));
409
-
410
- const pipeline_descriptor = rp_rewrite_for_primitive_state(render_pass_descriptor.pipeline, primitive);
411
-
412
- const pipeline = graphics.render_pipelines.obtain(pipeline_descriptor)
413
- pass_encoder.setPipeline(pipeline);
414
-
415
- pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_SCENE, scene_bindings);
416
-
417
- const view_bindings = bind_manager.obtain(BindGroupDescriptor.from(
418
- render_pass_descriptor.pipeline.layout.bindGroupLayouts[RASTERIZATION_SHADER_BIND_GROUP_VIEW],
419
- [
420
- { buffer: view_ctx.camera.buffer.buffer },
421
- { buffer: view_ctx.uniform_buffer.buffer },
422
- ]
423
- ));
424
-
425
- pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_VIEW, view_bindings);
426
-
427
- material_draw(
428
- scene_ctx.materials,
429
- material_count,
430
- materials,
431
- render_pass_descriptor,
432
- bind_manager,
433
- pass_encoder,
434
- command_buffer_draw
435
- );
436
-
437
- pass_encoder.end();
438
-
439
- }
440
-
441
- const pass_data = {};
442
- const pass = graph.add("MBOIT/generate moments", pass_data, execute);
443
-
444
- pass_data.draw_commands = pass.read(draw_commands);
445
- pass_data.meshlets = pass.read(meshlets)
446
-
447
- pass_data.depth = pass.read(depth_texture);
448
-
449
- if (output_optical_depth !== -1) {
450
- pass.read(output_optical_depth);
451
- pass_data.optical_depth = pass.write(output_optical_depth);
452
- } else {
453
- pass_data.optical_depth = pass.create("OIT depth", TextureResourceDescriptor.from({
454
- resolution: view_ctx.resolution,
455
- format: 'r32float',
456
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
457
- }));
458
- }
459
-
460
- if (output_moments !== -1) {
461
- pass.read(output_moments);
462
- pass_data.moments = pass.write(output_moments);
463
- } else {
464
-
465
- pass_data.moments = pass.create('OIT moments', TextureResourceDescriptor.from({
466
- resolution: view_ctx.resolution,
467
- format: 'rgba32float',
468
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
469
- }));
470
- }
471
-
472
- return {
473
- optical_depth: pass_data.optical_depth,
474
- moments: pass_data.moments
475
- }
476
- }
477
-
478
- /**
479
- * Order-independent transparency. Does not write depth.
480
- *
481
- * @param {FrameGraph} graph
482
- * @param {number} buckets
483
- * @param {GPUViewContext} view_ctx
484
- * @param {number[]} viewport
485
- * @param {number} color_texture resource ID
486
- * @param {number} [depth_texture] resource ID
487
- * @param {GPUCollectionLimits} limits
488
- * @param {number} light_cluster_parameters
489
- * @param {number} light_cluster_lookup
490
- * @param {number} light_cluster_data
491
- * @param {number} shadowmap_atlas
492
- * @param {ShadeIndirectLightingMode} indirect_lighting_mode
493
- * @returns {number} resource ID of modified color texture
494
- */
495
- export function graph_rasterize_meshes_transparent_oit({
496
- graph,
497
- buckets,
498
- view_ctx,
499
- viewport,
500
- depth_texture ,
501
- color_texture,
502
- limits,
503
- light_cluster_parameters ,
504
- light_cluster_lookup ,
505
- light_cluster_data ,
506
-
507
- shadowmap_atlas ,
508
-
509
- volumetrics_lut,
510
- volumetrics_metadata,
511
-
512
- indirect_lighting_mode = ShadeIndirectLightingMode.IBL,
513
- }) {
514
-
515
-
516
- assert.isNonNegativeInteger(buckets, 'buckets');
517
-
518
- assert.isNonNegativeInteger(light_cluster_parameters, 'light_cluster_parameters');
519
- assert.isNonNegativeInteger(light_cluster_lookup, 'light_cluster_lookup');
520
- assert.isNonNegativeInteger(light_cluster_data, 'light_cluster_data');
521
-
522
- assert.isNonNegativeInteger(shadowmap_atlas, 'shadowmap_atlas');
523
-
524
-
525
- assert.equal(view_ctx.isGPUViewContext, true, 'view_ctx.isGPUViewContext !== true');
526
-
527
- const scene_ctx = view_ctx.scene;
528
-
529
- /**
530
- *
531
- * @type {ShadeMaterial[]}
532
- */
533
- const materials_front = [];
534
- /**
535
- *
536
- * @type {ShadeMaterial[]}
537
- */
538
- const materials_double = [];
539
-
540
- const scene_materials = scene_ctx.scene.instances.materials;
541
-
542
- // we need to draw with different pipeline states, so the code is a little convoluted
543
- // Essentially, we draw Double-side and Front-sided materials
544
-
545
- const material_count_front = filter_materials_by_bucket(
546
- materials_front, 0,
547
- TransparencyMode.Transparent,
548
- ShadeDrawMode.Triangles,
549
- ShadeDrawSide.Front,
550
- scene_materials,
551
- scene_materials.length
552
- );
553
-
554
- const material_count_double = filter_materials_by_bucket(
555
- materials_double, 0,
556
- TransparencyMode.Transparent,
557
- ShadeDrawMode.Triangles,
558
- ShadeDrawSide.Double,
559
- scene_materials,
560
- scene_materials.length
561
- );
562
-
563
- if ((material_count_front + material_count_double) === 0) {
564
- // nothing to do
565
- return color_texture;
566
- }
567
-
568
- // TODO prepare depth bounds (min-max) for better moments, using meshlet metadata that has survived the cull
569
- // tight bounds will help improve reconstruction accuracy according to the original paper
570
-
571
- const bucket_index_front = rasterization_material_bucket(
572
- TransparencyMode.Transparent, ShadeDrawMode.Triangles, ShadeDrawSide.Front
573
- );
574
-
575
- const bucket_index_double = rasterization_material_bucket(
576
- TransparencyMode.Transparent, ShadeDrawMode.Triangles, ShadeDrawSide.Double
577
- );
578
-
579
- const primitive_front = construct_primitive_state(
580
- ShadeDrawMode.Triangles, ShadeDrawSide.Front,
581
- );
582
- const primitive_double = construct_primitive_state(
583
- ShadeDrawMode.Triangles, ShadeDrawSide.Double,
584
- );
585
-
586
- const gr_hzb = graph_import_texture(graph, view_ctx.hierarchical_z_buffer.texture);
587
- const gr_camera = graph_import_buffer(graph, view_ctx.camera.buffer.buffer);
588
-
589
- // Prepare draw artifacts
590
- // ======
591
-
592
- const {
593
- meshlets: meshlets_front,
594
- draw_commands: draw_commands_front
595
- } = graph_prepare_meshlet_draw_commands_by_material({
596
- graph,
597
- materials: materials_front,
598
- bucket_id: bucket_index_front,
599
- limits,
600
- buckets,
601
- scene: scene_ctx,
602
- camera: gr_camera,
603
- hzb: gr_hzb,
604
- resolution: [viewport[2], viewport[3]],
605
- label: `${view_ctx.label}/OIT-front`,
606
- });
607
-
608
- const {
609
- meshlets: meshlets_double,
610
- draw_commands: draw_commands_double
611
- } = graph_prepare_meshlet_draw_commands_by_material({
612
- graph,
613
- materials: materials_double,
614
- bucket_id: bucket_index_double,
615
- limits,
616
- buckets,
617
- scene: scene_ctx,
618
- camera: gr_camera,
619
- hzb: gr_hzb,
620
- resolution: [viewport[2], viewport[3]],
621
- label: `${view_ctx.label}/OIT-double`,
622
- });
623
-
624
- // Generate moments
625
- // ==========
626
-
627
- const { moments: moments_front, optical_depth: optical_depth_front } = graph_oit_generate_moments({
628
- graph,
629
- view_ctx,
630
- material_count: material_count_front,
631
- meshlets: meshlets_front,
632
- clear_targets: true,
633
- materials: materials_front,
634
- draw_commands: draw_commands_front,
635
- depth_texture,
636
- primitive: primitive_front,
637
- });
638
-
639
- const { moments, optical_depth } = graph_oit_generate_moments({
640
- graph,
641
- view_ctx,
642
- material_count: material_count_double,
643
- meshlets: meshlets_double,
644
- clear_targets: false,
645
- materials: materials_double,
646
- draw_commands: draw_commands_double,
647
- output_optical_depth: optical_depth_front,
648
- output_moments: moments_front,
649
- depth_texture,
650
- primitive: primitive_double,
651
- });
652
-
653
- // Resolve moments
654
- // ===========
655
-
656
- let resolved = graph_oit_resolve_moments({
657
- graph,
658
- view_ctx,
659
- primitive: primitive_front,
660
- material_count: material_count_front,
661
- materials: materials_front,
662
- clear_targets: true,
663
- draw_commands: draw_commands_front,
664
- meshlets: meshlets_front,
665
- depth_texture,
666
- texture_moments: moments,
667
- texture_optical_depth: optical_depth,
668
-
669
- //
670
- light_cluster_parameters,
671
- light_cluster_lookup,
672
- light_cluster_data,
673
-
674
- shadowmap_atlas,
675
-
676
- volumetrics_lut,
677
- volumetrics_metadata,
678
-
679
- indirect_lighting_mode,
680
- });
681
-
682
- resolved = graph_oit_resolve_moments({
683
- graph,
684
- view_ctx,
685
- primitive: primitive_double,
686
- output: resolved,
687
- material_count: material_count_double,
688
- materials: materials_double,
689
- clear_targets: false,
690
- draw_commands: draw_commands_double,
691
- meshlets: meshlets_double,
692
- depth_texture,
693
- texture_moments: moments,
694
- texture_optical_depth: optical_depth,
695
-
696
- //
697
- light_cluster_parameters,
698
- light_cluster_lookup,
699
- light_cluster_data,
700
-
701
- shadowmap_atlas,
702
-
703
- volumetrics_lut,
704
- volumetrics_metadata,
705
-
706
- indirect_lighting_mode,
707
- });
708
-
709
- const [blended] = graph_image_pass({
710
- graph,
711
- shader: shader_oit_blend,
712
- output: [color_texture],
713
- load_op: "load",
714
- store_op: "store",
715
- inputs: {
716
- transparent: resolved,
717
- moment_zero: optical_depth,
718
- }
719
- });
720
-
721
-
722
- return blended;
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { SamplerDescriptor } from "../../../../descriptor/texture/SamplerDescriptor.js";
3
+ import { TextureResourceDescriptor } from "../../../../device/graph/TextureResourceDescriptor.js";
4
+ import { rp_rewrite_for_primitive_state } from "../../../../device/pipeline/rp_rewrite_for_primitive_state.js";
5
+ import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
6
+ import { BindGroupDescriptor } from "../../../binding/BindGroupDescriptor.js";
7
+ import { SHADING_LIGHT_RESOURCE_GROUP } from "../../../deferred/SHADING_LIGHT_RESOURCE_GROUP.js";
8
+ import { ShadeDrawMode } from "../../../material/ShadeDrawMode.js";
9
+ import { ShadeDrawSide } from "../../../material/ShadeDrawSide.js";
10
+ import { SHADING_MATERIAL_RESOURCE_GROUP } from "../../../material/standard/SHADING_MATERIAL_RESOURCE_GROUP.js";
11
+ import { TransparencyMode } from "../../../material/TransparencyMode.js";
12
+ import { ShadeIndirectLightingMode } from "../../../ShadeIndirectLightingMode.js";
13
+ import { graph_image_pass } from "../../../shader/graph/graph_image_pass.js";
14
+ import { graph_import_buffer } from "../../../shader/graph/graph_import_buffer.js";
15
+ import { graph_import_texture } from "../../../shader/graph/graph_import_texture.js";
16
+ import {
17
+ SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR
18
+ } from "../../../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
19
+ import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../../../STATIC_GRAPHICS_ENGINE_ASSETS.js";
20
+ import { rasterization_material_bucket } from "../../expand/bucket/chunk_rasterization_material_bucket.js";
21
+ import { construct_primitive_state } from "../../bucket/construct_primitive_state.js";
22
+ import { filter_materials_by_bucket } from "../../bucket/filter_materials_by_bucket.js";
23
+ import {
24
+ graph_prepare_meshlet_draw_commands_by_material
25
+ } from "../../bucket/prepare_meshlet_draw_commands_by_material.js";
26
+ import {
27
+ RASTERIZATION_SHADER_BIND_GROUP_SCENE,
28
+ RASTERIZATION_SHADER_BIND_GROUP_VIEW
29
+ } from "../alpha_tested_pass_resources.js";
30
+ import { shader_oit_blend } from "./shader_oit_blend.js";
31
+ import { shader_oit_generate_moments } from "./shader_oit_generate_moments.js";
32
+ import { shader_oit_resolve_moments } from "./shader_oit_resolve_moments.js";
33
+ import { shader_oit_resolve_moments_ibl } from "./shader_oit_resolve_moments_ibl.js";
34
+ import { SHADING_SCENE_RESOURCE_GROUP } from "./SHADING_SCENE_RESOURCE_GROUP.js";
35
+
36
+ const DRAW_COMMAND_BYTE_SIZE = STRUCT_UNINDEXED_DRAW_COMMAND.aligned_size;
37
+
38
+ const BIND_GROUP_LAYOUT_SCENE = SHADING_SCENE_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
39
+ const BIND_GROUP_LAYOUT_MATERIAL = SHADING_MATERIAL_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
40
+ const BIND_GROUP_LAYOUT_LIGHT = SHADING_LIGHT_RESOURCE_GROUP.generateBindGroupLayoutDescriptor(GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX);
41
+
42
+
43
+ /**
44
+ *
45
+ * @param {GPUMaterialManager} material_manager
46
+ * @param {number} material_count
47
+ * @param {ShadeMaterial[]} materials
48
+ * @param {RenderPassDescriptor} render_pass_descriptor
49
+ * @param {BindGroupManager} bind_manager
50
+ * @param {ShadeGPURenderPassEncoder} pass_encoder
51
+ * @param {GPUBuffer} command_buffer_draw
52
+ */
53
+ function material_draw(
54
+ material_manager,
55
+ material_count,
56
+ materials,
57
+ render_pass_descriptor,
58
+ bind_manager,
59
+ pass_encoder,
60
+ command_buffer_draw
61
+ ) {
62
+
63
+ assert.defined(material_manager, 'material_manager');
64
+ assert.isNonNegativeInteger(material_count, 'material_count');
65
+ assert.isArray(materials, 'materials');
66
+
67
+ for (let i = 0; i < material_count; i++) {
68
+
69
+ const material = materials[i];
70
+ const gpu_material = material_manager.obtain(material);
71
+
72
+ if (!gpu_material.is_built) {
73
+ // skip, not ready for rendering
74
+ continue;
75
+ }
76
+
77
+ const material_resource_group = render_pass_descriptor.resources.groups[0];
78
+ const binding_entries = material_resource_group.generateBindings(gpu_material.binding_data);
79
+ const material_bindings = bind_manager.obtain(BindGroupDescriptor.from(
80
+ BIND_GROUP_LAYOUT_MATERIAL,
81
+ binding_entries
82
+ ));
83
+
84
+ // set material-specific bind group at 0
85
+ pass_encoder.setBindGroup(0, material_bindings)
86
+
87
+ pass_encoder.drawIndirect(
88
+ command_buffer_draw,
89
+ i * DRAW_COMMAND_BYTE_SIZE,
90
+ );
91
+
92
+ }
93
+ }
94
+
95
+ /**
96
+ *
97
+ * @param {FrameGraph} graph
98
+ * @param {GPUViewContext} view_ctx
99
+ * @param {number} material_count
100
+ * @param {ShadeMaterial[]} materials
101
+ * @param {boolean} [clear_targets]
102
+ * @param {number} texture_moments
103
+ * @param {number} texture_optical_depth
104
+ * @param {number} draw_commands
105
+ * @param {number} meshlets
106
+ * @param {number} depth_texture
107
+ * @param {number} light_cluster_parameters
108
+ * @param {number} light_cluster_lookup
109
+ * @param {number} light_cluster_data
110
+ * @param {number} shadowmap_atlas
111
+ * @param {number} output
112
+ * @param {PrimitiveState} primitive
113
+ * @param {ShadeIndirectLightingMode} indirect_lighting_mode
114
+ * @return {number}
115
+ */
116
+ function graph_oit_resolve_moments({
117
+ graph,
118
+ view_ctx,
119
+ material_count,
120
+ materials,
121
+ clear_targets = true,
122
+ texture_moments,
123
+ texture_optical_depth,
124
+ draw_commands,
125
+ meshlets,
126
+ depth_texture ,
127
+ primitive,
128
+ light_cluster_parameters ,
129
+ light_cluster_lookup ,
130
+ light_cluster_data ,
131
+
132
+ shadowmap_atlas ,
133
+
134
+ volumetrics_lut,
135
+ volumetrics_metadata,
136
+
137
+ output = -1,
138
+ indirect_lighting_mode = ShadeIndirectLightingMode.IBL,
139
+ }) {
140
+
141
+ assert.isNonNegativeInteger(material_count, 'material_count');
142
+ assert.isNonNegativeInteger(draw_commands, 'draw_commands');
143
+ assert.isNonNegativeInteger(meshlets, 'meshlets');
144
+
145
+ const scene_ctx = view_ctx.scene;
146
+
147
+ /**
148
+ *
149
+ * @param data
150
+ * @param {FramePassResources} resources
151
+ * @param {GraphicsExecutionContext} context
152
+ */
153
+ function execute(data, resources, context) {
154
+
155
+ assert.ok(context.graphics.device.features.has("indirect-first-instance"), '"indirect-first-instance" feature needs to be enabled for non-zero firstInstance values to be used.')
156
+
157
+ const command_buffer_draw = resources.get(data.draw_commands);
158
+ const meshlet_buffer = resources.get(data.meshlets);
159
+
160
+ const t_moments = resources.get(data.moments);
161
+ const t_optical_depth = resources.get(data.optical_depth);
162
+ const t_resolved = resources.get(data.resolved);
163
+ const t_depth = resources.get(data.depth);
164
+
165
+ const light_cluster_parameters = resources.get(data.light_cluster_parameters);
166
+ const light_cluster_lookup = resources.get(data.light_cluster_lookup);
167
+ const light_cluster_data = resources.get(data.light_cluster_data);
168
+
169
+ const shadowmap_atlas = resources.get(data.shadowmap_atlas);
170
+
171
+ const t_volumetrics_lut = resources.get(data.volumetrics_lut);
172
+ const volumetrics_metadata = resources.get(data.volumetrics_metadata);
173
+
174
+ const encoder = context.encoder;
175
+
176
+ const graphics = context.graphics;
177
+
178
+ const bind_manager = graphics.bind_groups;
179
+
180
+ const scene_bindings = bind_manager.obtain(BindGroupDescriptor.from(
181
+ BIND_GROUP_LAYOUT_SCENE,
182
+ [
183
+ { buffer: meshlet_buffer },
184
+ { buffer: scene_ctx.geometries.meshlets.buffer_metadata },
185
+ { buffer: scene_ctx.geometries.meshlets.buffer_data },
186
+ { buffer: scene_ctx.scene_database_buffer },
187
+ { buffer: scene_ctx.geometries.buffer_metadata },
188
+ ]
189
+ ));
190
+
191
+ const sampler_shadowmap = context.graphics.samplers.obtain(SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR);
192
+
193
+ const light_bindings = bind_manager.obtain(BindGroupDescriptor.from(
194
+ BIND_GROUP_LAYOUT_LIGHT,
195
+ [
196
+ { buffer: view_ctx.scene.lights.buffer_data },
197
+ view_ctx.scene.lights.environment.obtainView(),
198
+ //
199
+ { buffer: light_cluster_parameters },
200
+ { buffer: light_cluster_lookup },
201
+ { buffer: light_cluster_data },
202
+ //
203
+ shadowmap_atlas.obtainView(),
204
+ sampler_shadowmap,
205
+ ]
206
+ ));
207
+
208
+ // Select render pass descriptor based on indirect lighting mode
209
+ const use_brick4 = data.indirect_lighting_mode === ShadeIndirectLightingMode.Brick4;
210
+ const render_pass_descriptor = use_brick4
211
+ ? shader_oit_resolve_moments
212
+ : shader_oit_resolve_moments_ibl;
213
+
214
+ const pass_encoder = encoder.beginRenderPass(render_pass_descriptor.toGPU({
215
+ colorTargets: [t_resolved],
216
+ depthTarget: t_depth,
217
+ colorLoadOp: clear_targets ? "clear" : "load",
218
+ depthLoadOp: "load",
219
+ storeOp: "store",
220
+ }));
221
+
222
+ const pipeline_descriptor = rp_rewrite_for_primitive_state(render_pass_descriptor.pipeline, primitive);
223
+
224
+ const pipeline = graphics.render_pipelines.obtain(pipeline_descriptor)
225
+ pass_encoder.setPipeline(pipeline);
226
+
227
+ pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_SCENE, scene_bindings);
228
+ pass_encoder.setBindGroup(3, light_bindings);
229
+
230
+ const sampler_linear = graphics.samplers.obtain(SamplerDescriptor.from({
231
+ magFilter: "linear",
232
+ }));
233
+
234
+ const t_split_sum_lut = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.split_sum);
235
+
236
+ const stbn_vec3 = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
237
+
238
+ // Brick4 variant requires brick4 buffer in the view bind group;
239
+ // IBL variant does not. Volumetrics bindings are appended last (after sLinear), matching
240
+ // the order declared in shader_oit_resolve_moments[_ibl].
241
+ const view_bind_entries = use_brick4
242
+ ? [
243
+ { buffer: view_ctx.camera.buffer.buffer },
244
+ { buffer: view_ctx.uniform_buffer.buffer },
245
+ t_moments.obtainView(),
246
+ t_optical_depth.obtainView(),
247
+ { buffer: view_ctx.scene.volumetric_light_map.buffer },
248
+ t_split_sum_lut.obtainView(),
249
+ sampler_linear,
250
+ // volumetrics
251
+ { buffer: volumetrics_metadata },
252
+ t_volumetrics_lut.obtainView(),
253
+ stbn_vec3.obtainView(),
254
+ ]
255
+ : [
256
+ { buffer: view_ctx.camera.buffer.buffer },
257
+ { buffer: view_ctx.uniform_buffer.buffer },
258
+ t_moments.obtainView(),
259
+ t_optical_depth.obtainView(),
260
+ t_split_sum_lut.obtainView(),
261
+ sampler_linear,
262
+ // volumetrics
263
+ { buffer: volumetrics_metadata },
264
+ t_volumetrics_lut.obtainView(),
265
+ stbn_vec3.obtainView(),
266
+ ];
267
+
268
+ const view_bindings = bind_manager.obtain(BindGroupDescriptor.from(
269
+ render_pass_descriptor.pipeline.layout.bindGroupLayouts[RASTERIZATION_SHADER_BIND_GROUP_VIEW],
270
+ view_bind_entries
271
+ ));
272
+
273
+ pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_VIEW, view_bindings);
274
+
275
+ material_draw(
276
+ scene_ctx.materials,
277
+ material_count,
278
+ materials,
279
+ render_pass_descriptor,
280
+ bind_manager,
281
+ pass_encoder,
282
+ command_buffer_draw
283
+ );
284
+
285
+ pass_encoder.end();
286
+
287
+ }
288
+
289
+ const pass_data = {
290
+ indirect_lighting_mode,
291
+ };
292
+ const pass = graph.add("MBOIT/resolve moments", pass_data, execute);
293
+
294
+ pass_data.draw_commands = pass.read(draw_commands);
295
+ pass_data.meshlets = pass.read(meshlets)
296
+
297
+ pass_data.depth = pass.read(depth_texture);
298
+
299
+ pass_data.optical_depth = pass.read(texture_optical_depth);
300
+ pass_data.moments = pass.read(texture_moments);
301
+
302
+ if (output !== -1) {
303
+ pass.read(output);
304
+ pass_data.resolved = pass.write(output);
305
+ } else {
306
+ pass_data.resolved = pass.create("OIT resolved", TextureResourceDescriptor.from({
307
+ resolution: view_ctx.resolution,
308
+ format: 'rgba16float',
309
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
310
+ }));
311
+ }
312
+
313
+ pass_data.light_cluster_parameters = pass.read(light_cluster_parameters);
314
+ pass_data.light_cluster_lookup = pass.read(light_cluster_lookup);
315
+ pass_data.light_cluster_data = pass.read(light_cluster_data);
316
+
317
+ pass_data.shadowmap_atlas = pass.read(shadowmap_atlas);
318
+
319
+ pass_data.volumetrics_lut = pass.read(volumetrics_lut);
320
+ pass_data.volumetrics_metadata = pass.read(volumetrics_metadata);
321
+
322
+ return pass_data.resolved;
323
+ }
324
+
325
+ /**
326
+ *
327
+ * @param {FrameGraph} graph
328
+ * @param {GPUViewContext} view_ctx
329
+ * @param {number} material_count
330
+ * @param {ShadeMaterial[]} materials
331
+ * @param {number} draw_commands resource ID
332
+ * @param {number} meshlets resource ID
333
+ * @param {number} depth_texture resource ID
334
+ * @param {number} [output_optical_depth]
335
+ * @param {number} [output_moments]
336
+ * @param {PrimitiveState} primitive
337
+ * @param {boolean} [clear_targets]
338
+ * @return {{optical_depth:number, moments:number}}
339
+ */
340
+ function graph_oit_generate_moments({
341
+ graph,
342
+ view_ctx,
343
+ material_count,
344
+ materials,
345
+ draw_commands,
346
+ meshlets,
347
+ depth_texture ,
348
+ output_optical_depth = -1,
349
+ output_moments = -1,
350
+ primitive,
351
+ clear_targets = true,
352
+ }) {
353
+
354
+ assert.isNonNegativeInteger(material_count, 'material_count');
355
+ assert.isNonNegativeInteger(draw_commands, 'draw_commands');
356
+ assert.isNonNegativeInteger(meshlets, 'meshlets');
357
+ assert.equal(view_ctx.isGPUViewContext, true, 'view_ctx.isGPUViewContext !== true');
358
+
359
+
360
+ const scene_ctx = view_ctx.scene;
361
+
362
+ /**
363
+ *
364
+ * @param data
365
+ * @param {FramePassResources} resources
366
+ * @param {GraphicsExecutionContext} context
367
+ */
368
+ function execute(data, resources, context) {
369
+
370
+ assert.ok(context.graphics.device.features.has("indirect-first-instance"), '"indirect-first-instance" feature needs to be enabled for non-zero firstInstance values to be used.')
371
+
372
+
373
+ const command_buffer_draw = resources.get(data.draw_commands);
374
+ const meshlet_buffer = resources.get(data.meshlets);
375
+
376
+ const t_moments = resources.get(data.moments);
377
+ const t_optical_depth = resources.get(data.optical_depth);
378
+ const t_depth = resources.get(data.depth);
379
+
380
+ const encoder = context.encoder;
381
+
382
+ const graphics = context.graphics;
383
+
384
+ const bind_manager = graphics.bind_groups;
385
+
386
+ const scene_bindings = bind_manager.obtain(BindGroupDescriptor.from(
387
+ BIND_GROUP_LAYOUT_SCENE,
388
+ [
389
+ { buffer: meshlet_buffer },
390
+ { buffer: scene_ctx.geometries.meshlets.buffer_metadata },
391
+ { buffer: scene_ctx.geometries.meshlets.buffer_data },
392
+ { buffer: scene_ctx.scene_database_buffer },
393
+ { buffer: scene_ctx.geometries.buffer_metadata },
394
+ ]
395
+ ));
396
+
397
+ const render_pass_descriptor = shader_oit_generate_moments;
398
+ const pass_encoder = encoder.beginRenderPass(render_pass_descriptor.toGPU({
399
+ colorTargets: [
400
+ t_optical_depth,
401
+ t_moments,
402
+ ],
403
+ depthTarget: t_depth,
404
+ colorLoadOp: clear_targets ? "clear" : "load",
405
+ // we don't modify depth, only use it for depth test
406
+ depthLoadOp: "load",
407
+ storeOp: "store",
408
+ }));
409
+
410
+ const pipeline_descriptor = rp_rewrite_for_primitive_state(render_pass_descriptor.pipeline, primitive);
411
+
412
+ const pipeline = graphics.render_pipelines.obtain(pipeline_descriptor)
413
+ pass_encoder.setPipeline(pipeline);
414
+
415
+ pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_SCENE, scene_bindings);
416
+
417
+ const view_bindings = bind_manager.obtain(BindGroupDescriptor.from(
418
+ render_pass_descriptor.pipeline.layout.bindGroupLayouts[RASTERIZATION_SHADER_BIND_GROUP_VIEW],
419
+ [
420
+ { buffer: view_ctx.camera.buffer.buffer },
421
+ { buffer: view_ctx.uniform_buffer.buffer },
422
+ ]
423
+ ));
424
+
425
+ pass_encoder.setBindGroup(RASTERIZATION_SHADER_BIND_GROUP_VIEW, view_bindings);
426
+
427
+ material_draw(
428
+ scene_ctx.materials,
429
+ material_count,
430
+ materials,
431
+ render_pass_descriptor,
432
+ bind_manager,
433
+ pass_encoder,
434
+ command_buffer_draw
435
+ );
436
+
437
+ pass_encoder.end();
438
+
439
+ }
440
+
441
+ const pass_data = {};
442
+ const pass = graph.add("MBOIT/generate moments", pass_data, execute);
443
+
444
+ pass_data.draw_commands = pass.read(draw_commands);
445
+ pass_data.meshlets = pass.read(meshlets)
446
+
447
+ pass_data.depth = pass.read(depth_texture);
448
+
449
+ if (output_optical_depth !== -1) {
450
+ pass.read(output_optical_depth);
451
+ pass_data.optical_depth = pass.write(output_optical_depth);
452
+ } else {
453
+ pass_data.optical_depth = pass.create("OIT depth", TextureResourceDescriptor.from({
454
+ resolution: view_ctx.resolution,
455
+ format: 'r32float',
456
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
457
+ }));
458
+ }
459
+
460
+ if (output_moments !== -1) {
461
+ pass.read(output_moments);
462
+ pass_data.moments = pass.write(output_moments);
463
+ } else {
464
+
465
+ pass_data.moments = pass.create('OIT moments', TextureResourceDescriptor.from({
466
+ resolution: view_ctx.resolution,
467
+ format: 'rgba32float',
468
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
469
+ }));
470
+ }
471
+
472
+ return {
473
+ optical_depth: pass_data.optical_depth,
474
+ moments: pass_data.moments
475
+ }
476
+ }
477
+
478
+ /**
479
+ * Order-independent transparency. Does not write depth.
480
+ *
481
+ * @param {FrameGraph} graph
482
+ * @param {number} buckets
483
+ * @param {GPUViewContext} view_ctx
484
+ * @param {number[]} viewport
485
+ * @param {number} color_texture resource ID
486
+ * @param {number} [depth_texture] resource ID
487
+ * @param {GPUCollectionLimits} limits
488
+ * @param {number} light_cluster_parameters
489
+ * @param {number} light_cluster_lookup
490
+ * @param {number} light_cluster_data
491
+ * @param {number} shadowmap_atlas
492
+ * @param {ShadeIndirectLightingMode} indirect_lighting_mode
493
+ * @returns {number} resource ID of modified color texture
494
+ */
495
+ export function graph_rasterize_meshes_transparent_oit({
496
+ graph,
497
+ buckets,
498
+ view_ctx,
499
+ viewport,
500
+ depth_texture ,
501
+ color_texture,
502
+ limits,
503
+ light_cluster_parameters ,
504
+ light_cluster_lookup ,
505
+ light_cluster_data ,
506
+
507
+ shadowmap_atlas ,
508
+
509
+ volumetrics_lut,
510
+ volumetrics_metadata,
511
+
512
+ indirect_lighting_mode = ShadeIndirectLightingMode.IBL,
513
+ }) {
514
+
515
+
516
+ assert.isNonNegativeInteger(buckets, 'buckets');
517
+
518
+ assert.isNonNegativeInteger(light_cluster_parameters, 'light_cluster_parameters');
519
+ assert.isNonNegativeInteger(light_cluster_lookup, 'light_cluster_lookup');
520
+ assert.isNonNegativeInteger(light_cluster_data, 'light_cluster_data');
521
+
522
+ assert.isNonNegativeInteger(shadowmap_atlas, 'shadowmap_atlas');
523
+
524
+
525
+ assert.equal(view_ctx.isGPUViewContext, true, 'view_ctx.isGPUViewContext !== true');
526
+
527
+ const scene_ctx = view_ctx.scene;
528
+
529
+ /**
530
+ *
531
+ * @type {ShadeMaterial[]}
532
+ */
533
+ const materials_front = [];
534
+ /**
535
+ *
536
+ * @type {ShadeMaterial[]}
537
+ */
538
+ const materials_double = [];
539
+
540
+ const scene_materials = scene_ctx.scene.instances.materials;
541
+
542
+ // we need to draw with different pipeline states, so the code is a little convoluted
543
+ // Essentially, we draw Double-side and Front-sided materials
544
+
545
+ const material_count_front = filter_materials_by_bucket(
546
+ materials_front, 0,
547
+ TransparencyMode.Transparent,
548
+ ShadeDrawMode.Triangles,
549
+ ShadeDrawSide.Front,
550
+ scene_materials,
551
+ scene_materials.length
552
+ );
553
+
554
+ const material_count_double = filter_materials_by_bucket(
555
+ materials_double, 0,
556
+ TransparencyMode.Transparent,
557
+ ShadeDrawMode.Triangles,
558
+ ShadeDrawSide.Double,
559
+ scene_materials,
560
+ scene_materials.length
561
+ );
562
+
563
+ if ((material_count_front + material_count_double) === 0) {
564
+ // nothing to do
565
+ return color_texture;
566
+ }
567
+
568
+ // TODO prepare depth bounds (min-max) for better moments, using meshlet metadata that has survived the cull
569
+ // tight bounds will help improve reconstruction accuracy according to the original paper
570
+
571
+ const bucket_index_front = rasterization_material_bucket(
572
+ TransparencyMode.Transparent, ShadeDrawMode.Triangles, ShadeDrawSide.Front
573
+ );
574
+
575
+ const bucket_index_double = rasterization_material_bucket(
576
+ TransparencyMode.Transparent, ShadeDrawMode.Triangles, ShadeDrawSide.Double
577
+ );
578
+
579
+ const primitive_front = construct_primitive_state(
580
+ ShadeDrawMode.Triangles, ShadeDrawSide.Front,
581
+ );
582
+ const primitive_double = construct_primitive_state(
583
+ ShadeDrawMode.Triangles, ShadeDrawSide.Double,
584
+ );
585
+
586
+ const gr_hzb = graph_import_texture(graph, view_ctx.hierarchical_z_buffer.texture);
587
+ const gr_camera = graph_import_buffer(graph, view_ctx.camera.buffer.buffer);
588
+
589
+ // Prepare draw artifacts
590
+ // ======
591
+
592
+ const {
593
+ meshlets: meshlets_front,
594
+ draw_commands: draw_commands_front
595
+ } = graph_prepare_meshlet_draw_commands_by_material({
596
+ graph,
597
+ materials: materials_front,
598
+ bucket_id: bucket_index_front,
599
+ limits,
600
+ buckets,
601
+ scene: scene_ctx,
602
+ camera: gr_camera,
603
+ hzb: gr_hzb,
604
+ resolution: [viewport[2], viewport[3]],
605
+ label: `${view_ctx.label}/OIT-front`,
606
+ });
607
+
608
+ const {
609
+ meshlets: meshlets_double,
610
+ draw_commands: draw_commands_double
611
+ } = graph_prepare_meshlet_draw_commands_by_material({
612
+ graph,
613
+ materials: materials_double,
614
+ bucket_id: bucket_index_double,
615
+ limits,
616
+ buckets,
617
+ scene: scene_ctx,
618
+ camera: gr_camera,
619
+ hzb: gr_hzb,
620
+ resolution: [viewport[2], viewport[3]],
621
+ label: `${view_ctx.label}/OIT-double`,
622
+ });
623
+
624
+ // Generate moments
625
+ // ==========
626
+
627
+ const { moments: moments_front, optical_depth: optical_depth_front } = graph_oit_generate_moments({
628
+ graph,
629
+ view_ctx,
630
+ material_count: material_count_front,
631
+ meshlets: meshlets_front,
632
+ clear_targets: true,
633
+ materials: materials_front,
634
+ draw_commands: draw_commands_front,
635
+ depth_texture,
636
+ primitive: primitive_front,
637
+ });
638
+
639
+ const { moments, optical_depth } = graph_oit_generate_moments({
640
+ graph,
641
+ view_ctx,
642
+ material_count: material_count_double,
643
+ meshlets: meshlets_double,
644
+ clear_targets: false,
645
+ materials: materials_double,
646
+ draw_commands: draw_commands_double,
647
+ output_optical_depth: optical_depth_front,
648
+ output_moments: moments_front,
649
+ depth_texture,
650
+ primitive: primitive_double,
651
+ });
652
+
653
+ // Resolve moments
654
+ // ===========
655
+
656
+ let resolved = graph_oit_resolve_moments({
657
+ graph,
658
+ view_ctx,
659
+ primitive: primitive_front,
660
+ material_count: material_count_front,
661
+ materials: materials_front,
662
+ clear_targets: true,
663
+ draw_commands: draw_commands_front,
664
+ meshlets: meshlets_front,
665
+ depth_texture,
666
+ texture_moments: moments,
667
+ texture_optical_depth: optical_depth,
668
+
669
+ //
670
+ light_cluster_parameters,
671
+ light_cluster_lookup,
672
+ light_cluster_data,
673
+
674
+ shadowmap_atlas,
675
+
676
+ volumetrics_lut,
677
+ volumetrics_metadata,
678
+
679
+ indirect_lighting_mode,
680
+ });
681
+
682
+ resolved = graph_oit_resolve_moments({
683
+ graph,
684
+ view_ctx,
685
+ primitive: primitive_double,
686
+ output: resolved,
687
+ material_count: material_count_double,
688
+ materials: materials_double,
689
+ clear_targets: false,
690
+ draw_commands: draw_commands_double,
691
+ meshlets: meshlets_double,
692
+ depth_texture,
693
+ texture_moments: moments,
694
+ texture_optical_depth: optical_depth,
695
+
696
+ //
697
+ light_cluster_parameters,
698
+ light_cluster_lookup,
699
+ light_cluster_data,
700
+
701
+ shadowmap_atlas,
702
+
703
+ volumetrics_lut,
704
+ volumetrics_metadata,
705
+
706
+ indirect_lighting_mode,
707
+ });
708
+
709
+ const [blended] = graph_image_pass({
710
+ graph,
711
+ shader: shader_oit_blend,
712
+ output: [color_texture],
713
+ load_op: "load",
714
+ store_op: "store",
715
+ inputs: {
716
+ transparent: resolved,
717
+ moment_zero: optical_depth,
718
+ }
719
+ });
720
+
721
+
722
+ return blended;
723
723
  }