@zephyr3d/scene 0.9.27 → 0.10.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.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +54 -0
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +279 -55
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +171 -1
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +104 -178
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +25436 -15990
- package/dist/index.js +65 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +191 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +333 -191
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +1261 -1438
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +4 -13
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +25 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +5 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +58 -158
- package/dist/render/underwater.js.map +1 -1
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +633 -268
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +40 -2
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +87 -254
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', this._karisAverage ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D, srgbOutput: boolean) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","textures","dstTexture","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","karis","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","weights","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static readonly PHYSICAL_LEVEL_WEIGHTS = [0.3465 + 0.138, 0.1176, 0.066, 0.066, 0.061].map(\r\n (w) => w * 0.675\r\n );\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n *\r\n * Only applies under legacy lighting. With physical lighting, bloom downsample is a\r\n * plain linear average and leaves fireflies to TAA (bloom reads the TAA-resolved frame).\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n private static _levelWeights(ctx: DrawContext, count: number) {\r\n const physical = ctx.scene?.lightingMode === 'physical';\r\n const weights: number[] = [];\r\n for (let i = 0; i < count; i++) {\r\n weights.push(physical ? (Bloom.PHYSICAL_LEVEL_WEIGHTS[i] ?? 0) : 1);\r\n }\r\n return weights;\r\n }\r\n /** Whether the prefilter uses the Karis average, see {@link Bloom.karisAverage}. */\r\n private _useKarisAverage(ctx: DrawContext) {\r\n return this._karisAverage && ctx.scene?.lightingMode !== 'physical';\r\n }\r\n /**\r\n * Upsample source scale for level `i + 1` into level `i`.\r\n *\r\n * @remarks\r\n * The chain accumulates acc[i] = L[i] + (w[i+1] / w[i]) * up(acc[i+1]), which equals\r\n * sum(w[k] * L[k]) / w[i]; the final compose multiplies by w[0]. This weights every level with a\r\n * single scalar per pass.\r\n */\r\n private static _upsampleScale(weights: number[], i: number) {\r\n return weights[i] > 0 ? weights[i + 1] / weights[i] : 0;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n const weights = Bloom._levelWeights(ctx, levels.length);\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out), this._useKarisAverage(ctx));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(\r\n device,\r\n rg.getTexture<Texture2D>(src),\r\n rg.getTexture<Texture2D>(out),\r\n Bloom._upsampleScale(weights, i)\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput,\r\n weights[0]\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex, this._useKarisAverage(ctx));\r\n this.downsample(device, colorTex, downsampleTextures);\r\n const weights = Bloom._levelWeights(ctx, downsampleTextures.length);\r\n this.upsample(device, downsampleTextures, weights);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput, weights[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D, karis = this._karisAverage) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', karis ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(\r\n device: AbstractDevice,\r\n srcTexture: Texture2D,\r\n bloomTexture: Texture2D,\r\n srgbOutput: boolean,\r\n levelWeight = 1\r\n ) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity * levelWeight);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[], weights?: number[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i], weights ? Bloom._upsampleScale(weights, i) : 1);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D, scale = 1) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('scale', scale);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.scale = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.sum, this.scale), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","PHYSICAL_LEVEL_WEIGHTS","map","w","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","_levelWeights","ctx","count","physical","scene","lightingMode","weights","i","push","_useKarisAverage","_upsampleScale","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","h","maxLevels","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","karis","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","levelWeight","textures","dstTexture","scale","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
|
|
@@ -5,61 +5,61 @@ import { Vector2 } from '@zephyr3d/base';
|
|
|
5
5
|
import { FrameResources } from '../render/rendergraph/blackboard.js';
|
|
6
6
|
|
|
7
7
|
/** Default for {@link MotionBlur.maxBlurLength}. @internal */ const DEFAULT_MAX_BLUR_LENGTH = 40;
|
|
8
|
-
/**
|
|
9
|
-
* Sample spacing along a streak, in pixels. The taps are not dithered, so this
|
|
10
|
-
* is all that stands between a long streak and ghosting.
|
|
11
|
-
* @internal
|
|
8
|
+
/**
|
|
9
|
+
* Sample spacing along a streak, in pixels. The taps are not dithered, so this
|
|
10
|
+
* is all that stands between a long streak and ghosting.
|
|
11
|
+
* @internal
|
|
12
12
|
*/ const TARGET_STEP_PX = 3.3;
|
|
13
|
-
/**
|
|
14
|
-
* Cost ceiling, and the one place the spacing above is allowed to slip. Past
|
|
15
|
-
* `MAX_WALK_STEPS * TARGET_STEP_PX` per direction the taps thin out and long
|
|
16
|
-
* streaks ghost, which caps the usable {@link MotionBlur.maxBlurLength} at
|
|
17
|
-
* roughly 210 px on a fully biased shutter, twice that on a centred one.
|
|
18
|
-
* @internal
|
|
13
|
+
/**
|
|
14
|
+
* Cost ceiling, and the one place the spacing above is allowed to slip. Past
|
|
15
|
+
* `MAX_WALK_STEPS * TARGET_STEP_PX` per direction the taps thin out and long
|
|
16
|
+
* streaks ghost, which caps the usable {@link MotionBlur.maxBlurLength} at
|
|
17
|
+
* roughly 210 px on a fully biased shutter, twice that on a centred one.
|
|
18
|
+
* @internal
|
|
19
19
|
*/ const MIN_WALK_STEPS = 4;
|
|
20
20
|
const MAX_WALK_STEPS = 64;
|
|
21
|
-
/**
|
|
22
|
-
* Velocity tile size, which is also the furthest a point may throw its streak:
|
|
23
|
-
* NeighborMax dilates across one tile, so anything that can reach a pixel has
|
|
24
|
-
* to live within a tile of it. A centred shutter spends that reach both ways
|
|
25
|
-
* and affords twice the tile size; a fully biased one spends it all one way.
|
|
26
|
-
* @internal
|
|
21
|
+
/**
|
|
22
|
+
* Velocity tile size, which is also the furthest a point may throw its streak:
|
|
23
|
+
* NeighborMax dilates across one tile, so anything that can reach a pixel has
|
|
24
|
+
* to live within a tile of it. A centred shutter spends that reach both ways
|
|
25
|
+
* and affords twice the tile size; a fully biased one spends it all one way.
|
|
26
|
+
* @internal
|
|
27
27
|
*/ function tileSizeFor(maxBlurLength, shutterBias) {
|
|
28
28
|
return Math.max(2, Math.ceil(maxBlurLength * Math.max(shutterBias, 1 - shutterBias)));
|
|
29
29
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Steps for a walk spanning `spanPx` pixels, at {@link TARGET_STEP_PX} stride.
|
|
32
|
-
* Per direction rather than per pair: the bias splits the streak unevenly, and
|
|
33
|
-
* a direction with no share must take no steps (see the walk).
|
|
34
|
-
* @internal
|
|
30
|
+
/**
|
|
31
|
+
* Steps for a walk spanning `spanPx` pixels, at {@link TARGET_STEP_PX} stride.
|
|
32
|
+
* Per direction rather than per pair: the bias splits the streak unevenly, and
|
|
33
|
+
* a direction with no share must take no steps (see the walk).
|
|
34
|
+
* @internal
|
|
35
35
|
*/ function walkStepsFor(spanPx) {
|
|
36
36
|
if (spanPx <= 0) {
|
|
37
37
|
return 0;
|
|
38
38
|
}
|
|
39
39
|
return Math.min(MAX_WALK_STEPS, Math.max(MIN_WALK_STEPS, Math.ceil(spanPx / TARGET_STEP_PX)));
|
|
40
40
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Sentinel velocity emitted by materials opting out of temporal reuse
|
|
43
|
-
* ({@link MeshMaterial.disableTAA} writes `(6e4, 6e4)`). Read literally it
|
|
44
|
-
* would smear those pixels across the screen. Same threshold
|
|
45
|
-
* `temporalResolve()` tests against.
|
|
46
|
-
* @internal
|
|
41
|
+
/**
|
|
42
|
+
* Sentinel velocity emitted by materials opting out of temporal reuse
|
|
43
|
+
* ({@link MeshMaterial.disableTAA} writes `(6e4, 6e4)`). Read literally it
|
|
44
|
+
* would smear those pixels across the screen. Same threshold
|
|
45
|
+
* `temporalResolve()` tests against.
|
|
46
|
+
* @internal
|
|
47
47
|
*/ const MV_SENTINEL = 5e4;
|
|
48
|
-
/**
|
|
49
|
-
* View-space depth gap past which two samples count as separate surfaces.
|
|
50
|
-
* Small on purpose: the test is meant to be near-binary, with the ramp only
|
|
51
|
-
* softening near-coplanar cases.
|
|
52
|
-
* @internal
|
|
48
|
+
/**
|
|
49
|
+
* View-space depth gap past which two samples count as separate surfaces.
|
|
50
|
+
* Small on purpose: the test is meant to be near-binary, with the ramp only
|
|
51
|
+
* softening near-coplanar cases.
|
|
52
|
+
* @internal
|
|
53
53
|
*/ const SOFT_Z_EXTENT = 0.01;
|
|
54
54
|
/** Half the separation between the two walks per direction. @internal */ const RIBBON_WIDTH = 3;
|
|
55
55
|
/** Velocity tiles keep the sign of the motion, so a signed float format. @internal */ const TILE_FORMAT = 'rgba16f';
|
|
56
56
|
const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
57
|
-
/**
|
|
58
|
-
* Raw motion vector to the velocity the filter works with: sentinel rejected,
|
|
59
|
-
* scaled by strength, clamped to the longest reconstructible streak. Every
|
|
60
|
-
* pass must apply exactly this, or the dilated and per-pixel velocities
|
|
61
|
-
* disagree and the weights break.
|
|
62
|
-
* @internal
|
|
57
|
+
/**
|
|
58
|
+
* Raw motion vector to the velocity the filter works with: sentinel rejected,
|
|
59
|
+
* scaled by strength, clamped to the longest reconstructible streak. Every
|
|
60
|
+
* pass must apply exactly this, or the dilated and per-pixel velocities
|
|
61
|
+
* disagree and the weights break.
|
|
62
|
+
* @internal
|
|
63
63
|
*/ function processVelocity(scope, raw, texSize, strength, maxLength) {
|
|
64
64
|
const pb = scope.$builder;
|
|
65
65
|
pb.func(FUNC_PROCESS_VELOCITY, [
|
|
@@ -76,21 +76,21 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
|
76
76
|
});
|
|
77
77
|
return scope[FUNC_PROCESS_VELOCITY](raw, texSize, strength, maxLength);
|
|
78
78
|
}
|
|
79
|
-
/**
|
|
80
|
-
* The motion blur post effect
|
|
81
|
-
*
|
|
82
|
-
* @remarks
|
|
83
|
-
* The reconstruction filter of McGuire et al., "A Reconstruction Filter for
|
|
84
|
-
* Plausible Motion Blur" (2012), with the tap path walking the velocity field
|
|
85
|
-
* rather than a straight line so that rotating geometry does not tear.
|
|
86
|
-
*
|
|
87
|
-
* Velocity is dilated over tiles first (TileMax, then NeighborMax) so a static
|
|
88
|
-
* pixel still blurs when fast geometry passes near it. That dilation is what
|
|
89
|
-
* makes moving *objects* streak over the background: reading only the velocity
|
|
90
|
-
* under the current pixel reproduces camera motion, where the field is smooth
|
|
91
|
-
* screen-wide, but leaves moving objects with hard edges.
|
|
92
|
-
*
|
|
93
|
-
* @public
|
|
79
|
+
/**
|
|
80
|
+
* The motion blur post effect
|
|
81
|
+
*
|
|
82
|
+
* @remarks
|
|
83
|
+
* The reconstruction filter of McGuire et al., "A Reconstruction Filter for
|
|
84
|
+
* Plausible Motion Blur" (2012), with the tap path walking the velocity field
|
|
85
|
+
* rather than a straight line so that rotating geometry does not tear.
|
|
86
|
+
*
|
|
87
|
+
* Velocity is dilated over tiles first (TileMax, then NeighborMax) so a static
|
|
88
|
+
* pixel still blurs when fast geometry passes near it. That dilation is what
|
|
89
|
+
* makes moving *objects* streak over the background: reading only the velocity
|
|
90
|
+
* under the current pixel reproduces camera motion, where the field is smooth
|
|
91
|
+
* screen-wide, but leaves moving objects with hard edges.
|
|
92
|
+
*
|
|
93
|
+
* @public
|
|
94
94
|
*/ class MotionBlur extends AbstractPostEffect {
|
|
95
95
|
static _programTileMaxH = null;
|
|
96
96
|
static _bindgroupTileMaxH = null;
|
|
@@ -104,8 +104,8 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
|
104
104
|
/** @internal */ _shutterBias;
|
|
105
105
|
/** @internal */ _maxBlurLength;
|
|
106
106
|
/** @internal */ _texSize;
|
|
107
|
-
/**
|
|
108
|
-
* Creates an instance of tonemap post effect
|
|
107
|
+
/**
|
|
108
|
+
* Creates an instance of tonemap post effect
|
|
109
109
|
*/ constructor(){
|
|
110
110
|
super();
|
|
111
111
|
this._intensity = 1;
|
|
@@ -117,57 +117,57 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
|
117
117
|
// handle is final before either post chain is built.
|
|
118
118
|
this._layer = PostEffectLayer.end;
|
|
119
119
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Motion blur strength, the fraction of the frame interval the shutter is
|
|
122
|
-
* open. 1 blurs over a whole frame of movement (a 360 degree shutter), 0.5
|
|
123
|
-
* over half of it (the cinematic 180 degree shutter), 0 disables the effect.
|
|
124
|
-
*
|
|
125
|
-
* @remarks
|
|
126
|
-
* Motion vectors already carry one frame of displacement, so this is a plain
|
|
127
|
-
* dimensionless factor and must not be scaled by frame time again. The
|
|
128
|
-
* result is capped by {@link MotionBlur.maxBlurLength} whatever the strength.
|
|
120
|
+
/**
|
|
121
|
+
* Motion blur strength, the fraction of the frame interval the shutter is
|
|
122
|
+
* open. 1 blurs over a whole frame of movement (a 360 degree shutter), 0.5
|
|
123
|
+
* over half of it (the cinematic 180 degree shutter), 0 disables the effect.
|
|
124
|
+
*
|
|
125
|
+
* @remarks
|
|
126
|
+
* Motion vectors already carry one frame of displacement, so this is a plain
|
|
127
|
+
* dimensionless factor and must not be scaled by frame time again. The
|
|
128
|
+
* result is capped by {@link MotionBlur.maxBlurLength} whatever the strength.
|
|
129
129
|
*/ get strength() {
|
|
130
130
|
return this._intensity;
|
|
131
131
|
}
|
|
132
132
|
set strength(val) {
|
|
133
133
|
this._intensity = val;
|
|
134
134
|
}
|
|
135
|
-
/**
|
|
136
|
-
* How much of the streak lies ahead of where the object is now, as a fraction
|
|
137
|
-
* of its length. Clamped to [0, 1].
|
|
138
|
-
*
|
|
139
|
-
* - `0` trails the streak entirely behind, which is what a shutter closing
|
|
140
|
-
* on the current frame produces and reads as the object dragging a tail.
|
|
141
|
-
* - `0.5` (the default) centres it, as McGuire et al. describe: nothing lags,
|
|
142
|
-
* at the cost of blurring into where the object has not been yet.
|
|
143
|
-
* - `1` puts it entirely ahead. Offered for symmetry, rarely wanted.
|
|
144
|
-
*
|
|
145
|
-
* @remarks
|
|
146
|
-
* This slides the streak without lengthening it;
|
|
147
|
-
* {@link MotionBlur.maxBlurLength} is honoured at any bias, paid for with a
|
|
148
|
-
* coarser tile grid towards the extremes.
|
|
135
|
+
/**
|
|
136
|
+
* How much of the streak lies ahead of where the object is now, as a fraction
|
|
137
|
+
* of its length. Clamped to [0, 1].
|
|
138
|
+
*
|
|
139
|
+
* - `0` trails the streak entirely behind, which is what a shutter closing
|
|
140
|
+
* on the current frame produces and reads as the object dragging a tail.
|
|
141
|
+
* - `0.5` (the default) centres it, as McGuire et al. describe: nothing lags,
|
|
142
|
+
* at the cost of blurring into where the object has not been yet.
|
|
143
|
+
* - `1` puts it entirely ahead. Offered for symmetry, rarely wanted.
|
|
144
|
+
*
|
|
145
|
+
* @remarks
|
|
146
|
+
* This slides the streak without lengthening it;
|
|
147
|
+
* {@link MotionBlur.maxBlurLength} is honoured at any bias, paid for with a
|
|
148
|
+
* coarser tile grid towards the extremes.
|
|
149
149
|
*/ get shutterBias() {
|
|
150
150
|
return this._shutterBias;
|
|
151
151
|
}
|
|
152
152
|
set shutterBias(val) {
|
|
153
153
|
this._shutterBias = Math.min(1, Math.max(0, val));
|
|
154
154
|
}
|
|
155
|
-
/**
|
|
156
|
-
* Longest streak the filter will reconstruct, in pixels at render
|
|
157
|
-
* resolution. Velocity beyond this is clamped: the direction survives, the
|
|
158
|
-
* length does not.
|
|
159
|
-
*
|
|
160
|
-
* @remarks
|
|
161
|
-
* This is the ceiling {@link MotionBlur.strength} runs into: an object
|
|
162
|
-
* crossing `V` pixels per frame stops responding once `V * strength` reaches
|
|
163
|
-
* it. The clamp is per pixel, so fast objects saturate first and pushing
|
|
164
|
-
* strength further only flattens the fast/slow difference. Raise this instead.
|
|
165
|
-
*
|
|
166
|
-
* Cost is linear in it - 28 samples per pixel at the default 40, 100 at 160,
|
|
167
|
-
* since step counts are derived from the length to keep the sampling dense.
|
|
168
|
-
* The quality limit comes sooner though: a tile is as wide as the reach, so
|
|
169
|
-
* raising this spreads the dilated velocity further and a fast object starts
|
|
170
|
-
* dragging nearby slow geometry into its blur.
|
|
155
|
+
/**
|
|
156
|
+
* Longest streak the filter will reconstruct, in pixels at render
|
|
157
|
+
* resolution. Velocity beyond this is clamped: the direction survives, the
|
|
158
|
+
* length does not.
|
|
159
|
+
*
|
|
160
|
+
* @remarks
|
|
161
|
+
* This is the ceiling {@link MotionBlur.strength} runs into: an object
|
|
162
|
+
* crossing `V` pixels per frame stops responding once `V * strength` reaches
|
|
163
|
+
* it. The clamp is per pixel, so fast objects saturate first and pushing
|
|
164
|
+
* strength further only flattens the fast/slow difference. Raise this instead.
|
|
165
|
+
*
|
|
166
|
+
* Cost is linear in it - 28 samples per pixel at the default 40, 100 at 160,
|
|
167
|
+
* since step counts are derived from the length to keep the sampling dense.
|
|
168
|
+
* The quality limit comes sooner though: a tile is as wide as the reach, so
|
|
169
|
+
* raising this spreads the dilated velocity further and a fast object starts
|
|
170
|
+
* dragging nearby slow geometry into its blur.
|
|
171
171
|
*/ get maxBlurLength() {
|
|
172
172
|
return this._maxBlurLength;
|
|
173
173
|
}
|
|
@@ -297,13 +297,13 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
|
297
297
|
return output.color;
|
|
298
298
|
});
|
|
299
299
|
}
|
|
300
|
-
/**
|
|
301
|
-
* {@inheritDoc AbstractPostEffect.apply}
|
|
302
|
-
*
|
|
303
|
-
* @remarks
|
|
304
|
-
* Reconstruction needs the dilated tiles that {@link MotionBlur.setup} builds
|
|
305
|
-
* and this single-pass entry cannot. Only reached without motion vectors,
|
|
306
|
-
* where no blur is the right answer anyway.
|
|
300
|
+
/**
|
|
301
|
+
* {@inheritDoc AbstractPostEffect.apply}
|
|
302
|
+
*
|
|
303
|
+
* @remarks
|
|
304
|
+
* Reconstruction needs the dilated tiles that {@link MotionBlur.setup} builds
|
|
305
|
+
* and this single-pass entry cannot. Only reached without motion vectors,
|
|
306
|
+
* where no blur is the right answer anyway.
|
|
307
307
|
*/ apply(ctx, inputColorTexture, _sceneDepthTexture, srgbOutput) {
|
|
308
308
|
this.passThrough(ctx, inputColorTexture, srgbOutput);
|
|
309
309
|
}
|
|
@@ -694,11 +694,11 @@ const FUNC_PROCESS_VELOCITY = 'Z_mbProcessVelocity';
|
|
|
694
694
|
MotionBlur._bindgroupMotionBlur = device.createBindGroup(MotionBlur._programMotionBlur.bindGroupLayouts[0]);
|
|
695
695
|
}
|
|
696
696
|
}
|
|
697
|
-
/**
|
|
698
|
-
* Shared fullscreen quad vertex stage. `uv` is derived from the attribute and
|
|
699
|
-
* so is unaffected by the flip, which keeps every pass in this effect writing
|
|
700
|
-
* and sampling the same orientation on both backends.
|
|
701
|
-
* @internal
|
|
697
|
+
/**
|
|
698
|
+
* Shared fullscreen quad vertex stage. `uv` is derived from the attribute and
|
|
699
|
+
* so is unaffected by the flip, which keeps every pass in this effect writing
|
|
700
|
+
* and sampling the same orientation on both backends.
|
|
701
|
+
* @internal
|
|
702
702
|
*/ function fullscreenVertex(pb) {
|
|
703
703
|
this.flip = pb.int().uniform(0);
|
|
704
704
|
this.$inputs.pos = pb.vec2().attrib('position');
|