@woosh/meep-engine 3.47.0 → 3.49.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/build/bundle-worker-terrain.js +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +1 -2
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +2 -4
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
- package/package.json +1 -1
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +27 -11
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +11 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +2 -2
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +7 -7
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +8 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +11 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +26 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +91 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +2 -2
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +8 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts +84 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMedia.js +139 -5
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +6 -2
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +29 -4
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts +10 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.js +38 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem.js +46 -3
- package/src/engine/network/NetworkSession.d.ts +16 -5
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +104 -7
- package/src/engine/network/README.md +27 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +40 -18
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +180 -190
- package/src/engine/network/replication/Replicator.d.ts +15 -4
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +50 -16
- package/src/engine/network/state/RecordArrivalRing.d.ts +57 -0
- package/src/engine/network/state/RecordArrivalRing.d.ts.map +1 -0
- package/src/engine/network/state/RecordArrivalRing.js +144 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +354 -0
- package/src/engine/physics/cloth/PLAN.md +85 -5
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +0 -12
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +0 -13
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +7 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +4 -15
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +6 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +20 -10
- package/src/engine/physics/cloth/playground/collide.html +5 -3
- package/src/engine/physics/cloth/playground/collide_main.js +14 -13
- package/src/engine/physics/cloth/solver/ClothState.d.ts +30 -2
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +62 -4
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +11 -3
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +52 -11
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts +42 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.js +64 -0
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +99 -24
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +102 -25
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +5 -1
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +13 -3
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +0 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -14
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +23 -4
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +36 -8
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +4 -2
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +15 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +21 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts +20 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/ComputePipelineManager.js +80 -6
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts +52 -0
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts.map +1 -0
- package/src/shade/device/pipeline/PipelineEnquiry.js +63 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts +21 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/RenderPipelineManager.js +84 -4
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts +137 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.js +654 -0
- package/src/shade/playground/contact_shadows/README.md +126 -0
- package/src/shade/playground/contact_shadows/index.html +191 -0
- package/src/shade/playground/contact_shadows/main.d.ts +2 -0
- package/src/shade/playground/contact_shadows/main.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/main.js +888 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts +48 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/scenes.js +620 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts +36 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.js +245 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts +15 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.js +120 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts +55 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.js +216 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts +20 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.js +114 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts +11 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.js +90 -0
- package/src/shade/playground/contact_shadows/textures.d.ts +16 -0
- package/src/shade/playground/contact_shadows/textures.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/textures.js +123 -0
- package/src/shade/playground/particle_ecs/README.md +1 -1
- package/src/shade/playground/particle_ecs/effects/flame.json +1932 -1881
- package/src/shade/playground/particle_ecs/effects/smoke.json +99 -1
- package/src/shade/playground/particle_ecs/effects/soot.json +152 -145
- package/src/shade/playground/tonemap_sdr/README.md +90 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts +105 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.js +380 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts +32 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.js +104 -0
- package/src/shade/playground/tonemap_sdr/index.html +90 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts +2 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/main.js +306 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts +26 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/scenes.js +404 -0
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +85 -4
- package/src/shade/playground/water_refraction/README.md +26 -18
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts +35 -3
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +208 -12
- package/src/shade/renderer/ShadeToneMappingMode.d.ts +14 -0
- package/src/shade/renderer/ShadeToneMappingMode.d.ts.map +1 -0
- package/src/shade/renderer/ShadeToneMappingMode.js +30 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +9 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +14 -0
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -3
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +7 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +12 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts +8 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +12 -0
- package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
- package/src/shade/renderer/camera/GPUCameraContext.js +19 -8
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +4 -0
- package/src/shade/renderer/deferred/shader_deferred_main.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_deferred_main.js +3 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.js +13 -3
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.js +63 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.js +87 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR.js +23 -5
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.js +68 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.js +73 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +58 -9
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +35 -25
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +97 -196
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +121 -129
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +3 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.js +4 -0
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.js +4 -0
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.js +4 -0
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +131 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.js +45 -38
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.js +81 -79
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.js +5 -3
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts +21 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.js +42 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.js +44 -0
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +23 -5
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +139 -23
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +179 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +7 -16
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts +3 -4
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +6 -23
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +11 -0
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +14 -3
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.js +13 -3
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +14 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts +26 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.js +52 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts +32 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +20 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +10 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +294 -281
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +18 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts +8 -0
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +234 -218
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +13 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.js +16 -2
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +10 -0
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +13 -0
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +3 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +16 -4
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +38 -8
- package/src/shade/renderer/particles/DESIGN.md +49 -7
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +453 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +5 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +13 -5
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -2
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +12 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +60 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +156 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +2 -2
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +6 -4
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +7 -6
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +91 -58
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +10 -0
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +5 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +6 -0
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts +7 -0
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +18 -0
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.js +1 -0
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +6 -4
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts +11 -0
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +16 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +10 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +16 -0
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +32 -10
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +3 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +6 -3
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +12 -0
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +15 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +13 -0
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +31 -3
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +79 -4
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts +17 -0
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js +35 -4
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts +7 -0
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +182 -169
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +20 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.js +18 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +20 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts +7 -0
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +187 -170
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +19 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts +13 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +25 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +20 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +7 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +12 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +4 -3
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +4 -3
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +11 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -3
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +15 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +35 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts +14 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +32 -4
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +17 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +34 -4
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts +5 -3
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/chunk_restir_resolve.js +8 -3
- package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di.js +1 -0
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +5 -1
- package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
- package/src/shade/renderer/restir/reservoir/shader.js +7 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +7 -0
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +13 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +10 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +19 -0
- package/src/shade/renderer/scene/SceneManager.d.ts +9 -0
- package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
- package/src/shade/renderer/scene/SceneManager.js +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.js +17 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +18 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +12 -0
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +53 -0
- package/src/shade/renderer/shader/ImageShader.d.ts +27 -8
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +70 -1
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +21 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +71 -1
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.js +45 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_screen_coordinate_to_view.js +3 -3
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -62
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +318 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +237 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +22 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts +14 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js +28 -15
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +128 -110
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.js +33 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts +4 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js +12 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js +7 -0
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +108 -0
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js +23 -4
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.js +56 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.js +2 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.js +319 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +33 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +140 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts +74 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.js +166 -0
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +680 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +86 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.js +178 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +67 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.js +205 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts +14 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.js +13 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts +65 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.js +252 -0
- package/src/shade/renderer/shadow/contact/FINDINGS.md +413 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.js +105 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.js +39 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.js +92 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.js +128 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts +52 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.js +358 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts +10 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.js +12 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts +13 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.js +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +14 -8
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +20 -86
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.js +79 -0
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.js +12 -12
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +153 -151
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.js +48 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts +10 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts.map +1 -1
- package/src/shade/renderer/texture/GPUTextureContext.js +24 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +219 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +671 -0
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +26 -2
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +108 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +5 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +6 -0
- package/src/shade/renderer/volumetrics/NOTES.md +50 -0
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.js +30 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +51 -13
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +98 -13
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +9 -0
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/SceneVolumetrics.js +78 -68
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +326 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +7 -4
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +21 -9
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts +19 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.js +53 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +12 -3
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +85 -48
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +21 -1
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts +98 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.js +115 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts +9 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.js +24 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts +27 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.js +91 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts +35 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.js +92 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts +10 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.js +121 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +38 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +311 -290
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.js +28 -49
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +3 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +24 -18
- package/src/shade/renderer/water/chunk_water_transport.d.ts +0 -1
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +0 -17
- package/src/shade/renderer/water/shader_water.d.ts +4 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +27 -16
- package/src/shade/renderer/water/shader_water_avboit.d.ts +0 -4
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +0 -63
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +43 -9
- package/src/engine/network/transport/Channel.d.ts +0 -85
- package/src/engine/network/transport/Channel.d.ts.map +0 -1
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts +0 -155
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +0 -105
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts +0 -103
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/fragment_send.d.ts +0 -61
- package/src/engine/network/transport/fragments/fragment_send.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/packet_size.d.ts +0 -99
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts +0 -6
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.js +0 -16
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.js +0 -46
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts +0 -10
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.js +0 -127
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.js +0 -39
|
@@ -1,35 +1,48 @@
|
|
|
1
1
|
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
+
* Khronos PBR Neutral, with the display's peak in place of the specification's 1.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
+
* - At `peak` 1 it is the specification: base colours under 0.8 come out 1:1, less the 0.04 Fresnel offset, and a
|
|
7
|
+
* highlight compresses toward 1 and desaturates toward white.
|
|
8
|
+
* - At a higher peak the compression starts at the same place, converges on the peak instead of 1, and desaturates by
|
|
9
|
+
* how much it compressed. Below the start every peak writes the same colour, so an SDR and an HDR display agree
|
|
10
|
+
* there.
|
|
11
|
+
*
|
|
12
|
+
* The specification has no HDR form. Lalish's write-up names the 0.8 start as the place to adapt it. Keeping the start
|
|
13
|
+
* where it is, rather than moving it with the peak, keeps SDR and HDR closest; HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md
|
|
14
|
+
* beside this file has the measurements.
|
|
15
|
+
*
|
|
16
|
+
* Input: non-negative linear Rec.709. Output: linear Rec.709, never above `peak`, which must be at least 1.
|
|
17
|
+
*
|
|
18
|
+
* @see https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral
|
|
6
19
|
* @see https://modelviewer.dev/examples/tone-mapping
|
|
7
20
|
* @type {CodeChunk}
|
|
8
21
|
*/
|
|
9
22
|
export const chunk_tonemap_khronos_pbr = CodeChunk.from(
|
|
10
23
|
//language=WGSL
|
|
11
24
|
`
|
|
12
|
-
fn tonemap_khronos_pbr( in_color: vec3<f32
|
|
25
|
+
fn tonemap_khronos_pbr( in_color: vec3<f32>, peak: f32 ) -> vec3<f32> {
|
|
13
26
|
|
|
14
27
|
const startCompression = 0.8 - 0.04;
|
|
15
28
|
const desaturation = 0.15;
|
|
16
|
-
|
|
29
|
+
|
|
17
30
|
let x = min(in_color.r, min(in_color.g, in_color.b));
|
|
18
31
|
let offset = select( 0.04, x - 6.25 * x * x, x < 0.08);
|
|
19
32
|
var color = in_color - offset;
|
|
20
|
-
|
|
21
|
-
let
|
|
22
|
-
if (
|
|
33
|
+
|
|
34
|
+
let color_peak = max(color.r, max(color.g, color.b));
|
|
35
|
+
if (color_peak < startCompression) {
|
|
23
36
|
return color;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
let d =
|
|
27
|
-
let newPeak =
|
|
28
|
-
color *= newPeak /
|
|
29
|
-
|
|
30
|
-
let g = 1. - 1. / (desaturation * (
|
|
31
|
-
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let d = peak - startCompression;
|
|
40
|
+
let newPeak = peak - d * d / (color_peak + d - startCompression);
|
|
41
|
+
color *= newPeak / color_peak;
|
|
42
|
+
|
|
43
|
+
let g = 1. - 1. / (desaturation * (color_peak - newPeak) + 1.);
|
|
44
|
+
|
|
32
45
|
return mix(color, newPeak * vec3(1, 1, 1), g);
|
|
33
46
|
}
|
|
34
47
|
`
|
|
35
|
-
);
|
|
48
|
+
);
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* GT7 tone mapping, after Polyphony's sample code (`gt7_tone_mapping.cpp`, SIGGRAPH 2025 PBS course).
|
|
3
|
+
*
|
|
4
|
+
* One function for every display, which is the point of the operator: `peak_nits` is the display's peak, and
|
|
5
|
+
* `paper_white_nits` is the luminance the input's 1.0 shows at. The output is in units of that paper white, in
|
|
6
|
+
* Rec.709. SDR is the sample code's `initializeAsSDR()`: peak and paper white both at {@link chunk_PAPER_WHITE_NITS},
|
|
7
|
+
* so the output reaches 1.0 and no further. HDR keeps the same paper white and raises the peak, so everything below
|
|
8
|
+
* the SDR shoulder comes out the same on both.
|
|
9
|
+
*
|
|
10
|
+
* It follows the sample code in the curve, the chroma fade, the blend ratio and the clamp at the target. It blends
|
|
11
|
+
* in ICtCp where the sample code blends in RGB. That costs up to 0.3 sRGB codes in the mid-tones and up to 14 in
|
|
12
|
+
* saturated highlights, measured against the compiled sample code over 648 inputs.
|
|
13
|
+
*
|
|
2
14
|
* `REF_LUMINANCE` is the paper's "Standard 1.0 unit" and must stay equal to the `REFERENCE_LUMINANCE` in
|
|
3
15
|
* {@link chunk_eotfSt2084} / {@link chunk_inverseEotfSt2084}, which this function round-trips through. It is
|
|
4
16
|
* not the BT.2408 SDR white of 203 nits used on the CPU side; see the note on `chunk_eotfSt2084` for how the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_tonemap_gt7.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js"],"names":[],"mappings":"AAUA
|
|
1
|
+
{"version":3,"file":"chunk_tonemap_gt7.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,gCAFU,SAAS,CAkGlB;0BAhIyB,mCAAmC"}
|
|
@@ -1,111 +1,129 @@
|
|
|
1
|
-
import { CodeChunk } from "../../../../compiler/CodeChunk.js";
|
|
2
|
-
import { chunk_CRM_FROM_REC2020_TO_REC709 } from "../../conversion/chunk_CRM_FROM_REC2020_TO_REC709.js";
|
|
3
|
-
import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../../conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
|
|
4
|
-
import { chunk_eotfSt2084 } from "../../iCtCp/chunk_eotf_st2084.js";
|
|
5
|
-
import { chunk_iCtCp_to_rgb } from "../../iCtCp/chunk_iCtCp_to_rgb.js";
|
|
6
|
-
import { chunk_inverseEotfSt2084 } from "../../iCtCp/chunk_inverse_eotf_st2084.js";
|
|
7
|
-
import { chunk_rgb_to_iCtCp } from "../../iCtCp/chunk_rgb_to_iCtCp.js";
|
|
8
|
-
import { chunk_gt_evaluate_curve } from "./chunk_gt_evaluate_curve.js";
|
|
9
|
-
import { GT7_TONE_MAPPING_CURVE_STRUCT } from "./GT7_TONE_MAPPING_CURVE_STRUCT.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
curve.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
1
|
+
import { CodeChunk } from "../../../../compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_CRM_FROM_REC2020_TO_REC709 } from "../../conversion/chunk_CRM_FROM_REC2020_TO_REC709.js";
|
|
3
|
+
import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../../conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
|
|
4
|
+
import { chunk_eotfSt2084 } from "../../iCtCp/chunk_eotf_st2084.js";
|
|
5
|
+
import { chunk_iCtCp_to_rgb } from "../../iCtCp/chunk_iCtCp_to_rgb.js";
|
|
6
|
+
import { chunk_inverseEotfSt2084 } from "../../iCtCp/chunk_inverse_eotf_st2084.js";
|
|
7
|
+
import { chunk_rgb_to_iCtCp } from "../../iCtCp/chunk_rgb_to_iCtCp.js";
|
|
8
|
+
import { chunk_gt_evaluate_curve } from "./chunk_gt_evaluate_curve.js";
|
|
9
|
+
import { GT7_TONE_MAPPING_CURVE_STRUCT } from "./GT7_TONE_MAPPING_CURVE_STRUCT.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* GT7 tone mapping, after Polyphony's sample code (`gt7_tone_mapping.cpp`, SIGGRAPH 2025 PBS course).
|
|
13
|
+
*
|
|
14
|
+
* One function for every display, which is the point of the operator: `peak_nits` is the display's peak, and
|
|
15
|
+
* `paper_white_nits` is the luminance the input's 1.0 shows at. The output is in units of that paper white, in
|
|
16
|
+
* Rec.709. SDR is the sample code's `initializeAsSDR()`: peak and paper white both at {@link chunk_PAPER_WHITE_NITS},
|
|
17
|
+
* so the output reaches 1.0 and no further. HDR keeps the same paper white and raises the peak, so everything below
|
|
18
|
+
* the SDR shoulder comes out the same on both.
|
|
19
|
+
*
|
|
20
|
+
* It follows the sample code in the curve, the chroma fade, the blend ratio and the clamp at the target. It blends
|
|
21
|
+
* in ICtCp where the sample code blends in RGB. That costs up to 0.3 sRGB codes in the mid-tones and up to 14 in
|
|
22
|
+
* saturated highlights, measured against the compiled sample code over 648 inputs.
|
|
23
|
+
*
|
|
24
|
+
* `REF_LUMINANCE` is the paper's "Standard 1.0 unit" and must stay equal to the `REFERENCE_LUMINANCE` in
|
|
25
|
+
* {@link chunk_eotfSt2084} / {@link chunk_inverseEotfSt2084}, which this function round-trips through. It is
|
|
26
|
+
* not the BT.2408 SDR white of 203 nits used on the CPU side; see the note on `chunk_eotfSt2084` for how the
|
|
27
|
+
* three reference whites in this engine relate.
|
|
28
|
+
*
|
|
29
|
+
* @see "Driving Toward Reality: Physically Based Tone Mapping and Perceptual Fidelity in Gran Turismo 7"
|
|
30
|
+
* @see chunk_eotfSt2084
|
|
31
|
+
* @type {CodeChunk}
|
|
32
|
+
*/
|
|
33
|
+
export const chunk_tonemap_gt7 = CodeChunk.from(
|
|
34
|
+
//language=WGSL
|
|
35
|
+
`
|
|
36
|
+
fn tonemap_gt7(
|
|
37
|
+
rgb_rec709:vec3<f32>,
|
|
38
|
+
peak_nits: f32,
|
|
39
|
+
paper_white_nits: f32,
|
|
40
|
+
) -> vec3<f32>{
|
|
41
|
+
|
|
42
|
+
// Constants for the GT7 "Standard" 1.0 unit
|
|
43
|
+
const REF_LUMINANCE: f32 = 100.0;
|
|
44
|
+
|
|
45
|
+
// input is in rec.709, the tonemapper is in rec.2020
|
|
46
|
+
var color_linear = CRM_FROM_REC709_TO_REC2020 * rgb_rec709;
|
|
47
|
+
|
|
48
|
+
// normalize to paper white
|
|
49
|
+
let paper_white = paper_white_nits / REF_LUMINANCE;
|
|
50
|
+
color_linear *= paper_white;
|
|
51
|
+
|
|
52
|
+
var curve: ${GT7_TONE_MAPPING_CURVE_STRUCT.wgsl_ref};
|
|
53
|
+
// initialize curve
|
|
54
|
+
const alpha = 0.25;
|
|
55
|
+
const gray_point = 0.538;
|
|
56
|
+
const linear_section = 0.444;
|
|
57
|
+
const toe_strength = 1.280;
|
|
58
|
+
|
|
59
|
+
let peak_intensity = peak_nits / REF_LUMINANCE;
|
|
60
|
+
|
|
61
|
+
//
|
|
62
|
+
curve.peakIntensity = peak_intensity;
|
|
63
|
+
curve.midPoint = gray_point;
|
|
64
|
+
curve.linearSection = linear_section;
|
|
65
|
+
curve.toeStrength = toe_strength;
|
|
66
|
+
|
|
67
|
+
// Pre-compute constants for the shoulder region.
|
|
68
|
+
let k = (linear_section - 1.0) / (alpha - 1.0);
|
|
69
|
+
curve.kA = peak_intensity * linear_section + peak_intensity * k;
|
|
70
|
+
curve.kB = -peak_intensity * k * exp(linear_section / k);
|
|
71
|
+
curve.kC = -1.0 / (k * peak_intensity);
|
|
72
|
+
|
|
73
|
+
//
|
|
74
|
+
// PATH A: Create "Twisted" RGB (Per-channel Mapping)
|
|
75
|
+
// This creates the "film/camera-like" look where highlights shift to CMY/White
|
|
76
|
+
var rgb_twisted: vec3<f32>;
|
|
77
|
+
rgb_twisted.r = gt_evaluate_curve(&curve, color_linear.r);
|
|
78
|
+
rgb_twisted.g = gt_evaluate_curve(&curve, color_linear.g);
|
|
79
|
+
rgb_twisted.b = gt_evaluate_curve(&curve, color_linear.b);
|
|
80
|
+
|
|
81
|
+
// PATH B: Create "Untwisted" RGB (Luminance from Twisted, Chroma from Original)
|
|
82
|
+
// 1. Get ICtCp for both Original and Twisted
|
|
83
|
+
let ictcp_original = rgb_to_iCtCp(color_linear);
|
|
84
|
+
let ictcp_twisted = rgb_to_iCtCp(rgb_twisted);
|
|
85
|
+
|
|
86
|
+
// GT7ToneMapping::fadeStart_ and fadeEnd_, as fractions of the target's own intensity
|
|
87
|
+
const FADE_START = 0.98;
|
|
88
|
+
const FADE_END = 1.16;
|
|
89
|
+
|
|
90
|
+
// 2. Fade the original's chroma toward white as its intensity reaches the target's. Relative to the target,
|
|
91
|
+
// so the fade sits at the shoulder for every peak, a 250 cd/m² SDR target as much as a 1000 cd/m² display.
|
|
92
|
+
let target_intensity = rgb_to_iCtCp(vec3<f32>(peak_intensity)).x;
|
|
93
|
+
let shoulder_saturation_scale = 1.0 - smoothstep(FADE_START, FADE_END, ictcp_original.x / target_intensity);
|
|
94
|
+
|
|
95
|
+
// GT7ToneMapping::blendRatio_: the untwisted colour's share, 0.6, so the twisted colour keeps 0.4
|
|
96
|
+
const BLEND_RATIO = 0.6;
|
|
97
|
+
|
|
98
|
+
// Mix between the Twisted (Per-channel) and Untwisted (ICtCp reconstructed) versions. The sample code blends
|
|
99
|
+
// in RGB; this blends in ICtCp, which the talk says works as well (slides 150 and 153).
|
|
100
|
+
let ictcp_final = vec3<f32>(
|
|
101
|
+
ictcp_twisted.x,
|
|
102
|
+
mix(ictcp_twisted.yz, ictcp_original.yz * shoulder_saturation_scale, BLEND_RATIO)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
var final_color = iCtCp_to_rgb(ictcp_final);
|
|
106
|
+
|
|
107
|
+
// never past the target: the sample code's min(blended, framebufferLuminanceTarget_). The shoulder converges
|
|
108
|
+
// on 1.185 times the peak, so without this a white overshoots the display by 18.5%.
|
|
109
|
+
final_color = min(final_color, vec3<f32>(peak_intensity));
|
|
110
|
+
|
|
111
|
+
// renormalize
|
|
112
|
+
final_color /= paper_white;
|
|
113
|
+
|
|
114
|
+
// go back to rec.709
|
|
115
|
+
final_color = CRM_FROM_REC2020_TO_REC709 * final_color;
|
|
116
|
+
|
|
117
|
+
return final_color;
|
|
118
|
+
}
|
|
119
|
+
`, [
|
|
120
|
+
chunk_CRM_FROM_REC709_TO_REC2020,
|
|
121
|
+
chunk_CRM_FROM_REC2020_TO_REC709,
|
|
122
|
+
GT7_TONE_MAPPING_CURVE_STRUCT.declaration_chunk,
|
|
123
|
+
chunk_gt_evaluate_curve,
|
|
124
|
+
chunk_iCtCp_to_rgb,
|
|
125
|
+
chunk_rgb_to_iCtCp,
|
|
126
|
+
chunk_eotfSt2084,
|
|
127
|
+
chunk_inverseEotfSt2084,
|
|
128
|
+
]
|
|
111
129
|
)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a ray starts from a surface position rebuilt from the depth buffer.
|
|
3
|
+
*
|
|
4
|
+
* {@link chunk_offset_ray} offsets in proportion to the position's own magnitude, which is the error of
|
|
5
|
+
* a ray's hit. A position rebuilt from depth is off by an amount that grows with its distance from the
|
|
6
|
+
* camera instead, so ground near the world's origin seen from far away gets almost no offset (1.5e-5 m
|
|
7
|
+
* at y = 0, whatever the distance), starts under its own surface and shadows itself. This first steps
|
|
8
|
+
* along the geometric normal in proportion to that distance.
|
|
9
|
+
*
|
|
10
|
+
* `DEPTH_RAY_NORMAL_OFFSET` is measured: on an RTX 4090 at 1578×802 (contact-shadow playground, still
|
|
11
|
+
* camera), counting pixels a ray toward the sun's centre finds shadowed, `offset_ray` alone gives
|
|
12
|
+
* 180,140 in `combine` and 96,352 in `grazing` (the far ground shadowing itself); 43,101 and 45,579 at
|
|
13
|
+
* 1e-6 of the distance; 25,166 and 9,709 at 1e-5, where both settle (3e-5 … 3e-4 within 0.2% of it); at
|
|
14
|
+
* 1e-3 real contacts start to go. 3e-5 is three times the onset.
|
|
15
|
+
*
|
|
16
|
+
* @type {CodeChunk}
|
|
17
|
+
*/
|
|
18
|
+
export const chunk_offset_ray_from_depth: CodeChunk;
|
|
19
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
20
|
+
//# sourceMappingURL=chunk_offset_ray_from_depth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_offset_ray_from_depth.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,0CAFU,SAAS,CAcZ;0BAhCmB,gCAAgC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_offset_ray } from "./chunk_offset_ray.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Where a ray starts from a surface position rebuilt from the depth buffer.
|
|
6
|
+
*
|
|
7
|
+
* {@link chunk_offset_ray} offsets in proportion to the position's own magnitude, which is the error of
|
|
8
|
+
* a ray's hit. A position rebuilt from depth is off by an amount that grows with its distance from the
|
|
9
|
+
* camera instead, so ground near the world's origin seen from far away gets almost no offset (1.5e-5 m
|
|
10
|
+
* at y = 0, whatever the distance), starts under its own surface and shadows itself. This first steps
|
|
11
|
+
* along the geometric normal in proportion to that distance.
|
|
12
|
+
*
|
|
13
|
+
* `DEPTH_RAY_NORMAL_OFFSET` is measured: on an RTX 4090 at 1578×802 (contact-shadow playground, still
|
|
14
|
+
* camera), counting pixels a ray toward the sun's centre finds shadowed, `offset_ray` alone gives
|
|
15
|
+
* 180,140 in `combine` and 96,352 in `grazing` (the far ground shadowing itself); 43,101 and 45,579 at
|
|
16
|
+
* 1e-6 of the distance; 25,166 and 9,709 at 1e-5, where both settle (3e-5 … 3e-4 within 0.2% of it); at
|
|
17
|
+
* 1e-3 real contacts start to go. 3e-5 is three times the onset.
|
|
18
|
+
*
|
|
19
|
+
* @type {CodeChunk}
|
|
20
|
+
*/
|
|
21
|
+
export const chunk_offset_ray_from_depth = CodeChunk.from(
|
|
22
|
+
//language=WGSL
|
|
23
|
+
`
|
|
24
|
+
const DEPTH_RAY_NORMAL_OFFSET: f32 = 3e-5;
|
|
25
|
+
|
|
26
|
+
fn offset_ray_from_depth(position: vec3<f32>, geometric_normal: vec3<f32>, camera_position: vec3<f32>) -> vec3<f32> {
|
|
27
|
+
let view_distance = length(position - camera_position);
|
|
28
|
+
|
|
29
|
+
return offset_ray(position + geometric_normal * (DEPTH_RAY_NORMAL_OFFSET * view_distance), geometric_normal);
|
|
30
|
+
}
|
|
31
|
+
`, [
|
|
32
|
+
chunk_offset_ray
|
|
33
|
+
]);
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @see "Practical multiple scattering compensation for microfacet models" by Emmanuel Turquin
|
|
3
3
|
* Approximates multiple-scattering to preserve energy.
|
|
4
|
+
*
|
|
5
|
+
* `specularF0` is the surface's F0, the metalness blend of `specularF0_dielectric` and `specularF0_metal`.
|
|
6
|
+
* The pure two are needed because the term is quadratic in F0 while metalness blends linearly; see
|
|
7
|
+
* `MULTISCATTER.md` in `chunk/material`.
|
|
4
8
|
*/
|
|
5
9
|
export const chunk_compute_multiscattering_specular: CodeChunk;
|
|
6
10
|
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_compute_multiscattering_specular.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"chunk_compute_multiscattering_specular.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,+DA2CC;0BArDyB,6BAA6B"}
|
|
@@ -3,6 +3,10 @@ import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* @see "Practical multiple scattering compensation for microfacet models" by Emmanuel Turquin
|
|
5
5
|
* Approximates multiple-scattering to preserve energy.
|
|
6
|
+
*
|
|
7
|
+
* `specularF0` is the surface's F0, the metalness blend of `specularF0_dielectric` and `specularF0_metal`.
|
|
8
|
+
* The pure two are needed because the term is quadratic in F0 while metalness blends linearly; see
|
|
9
|
+
* `MULTISCATTER.md` in `chunk/material`.
|
|
6
10
|
*/
|
|
7
11
|
export const chunk_compute_multiscattering_specular = CodeChunk.from(
|
|
8
12
|
// language=WGSL
|
|
@@ -10,6 +14,8 @@ export const chunk_compute_multiscattering_specular = CodeChunk.from(
|
|
|
10
14
|
fn compute_multiscattering_specular(
|
|
11
15
|
AB: vec2<f32>,
|
|
12
16
|
specularF0: vec3<f32>,
|
|
17
|
+
specularF0_dielectric: vec3<f32>,
|
|
18
|
+
specularF0_metal: vec3<f32>,
|
|
13
19
|
specularF90: f32,
|
|
14
20
|
single_scatter: ptr<function, vec3<f32>>,
|
|
15
21
|
multi_scatter: ptr<function, vec3<f32>>
|
|
@@ -30,13 +36,18 @@ fn compute_multiscattering_specular(
|
|
|
30
36
|
|
|
31
37
|
let Ess_clamped = max(Ess, 1e-4); // Avoid div by zero
|
|
32
38
|
let Kms = Ems / Ess_clamped;
|
|
39
|
+
|
|
40
|
+
// Fms = F0 makes the term quadratic in F0, so at the metalness blend of two F0s it is not the blend of
|
|
41
|
+
// the term at each: it falls short by Kms * A * m(1 - m)(F0_metal - F0_dielectric)^2. That is the
|
|
42
|
+
// product below, written without the metalness; zero for a pure dielectric and for a pure metal.
|
|
43
|
+
let F0_variance = (f0 - specularF0_dielectric) * (specularF0_metal - f0);
|
|
33
44
|
|
|
34
45
|
// write out
|
|
35
46
|
*single_scatter += FssEss;
|
|
36
47
|
|
|
37
48
|
// The multi-scattering contribution is the single scattering scaled by (Fms * Kms).
|
|
38
49
|
// Note: This maintains the "shape" of the specular highlight.
|
|
39
|
-
*multi_scatter += FssEss * (Fms * Kms);
|
|
50
|
+
*multi_scatter += FssEss * (Fms * Kms) + Kms * AB.x * F0_variance;
|
|
40
51
|
|
|
41
52
|
}
|
|
42
53
|
`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MATERIAL_SHADING_INFO_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js"],"names":[],"mappings":"AAIA,
|
|
1
|
+
{"version":3,"file":"MATERIAL_SHADING_INFO_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js"],"names":[],"mappings":"AAIA,wDAuB0B;6BA1BG,4BAA4B"}
|
|
@@ -16,6 +16,13 @@ export const MATERIAL_SHADING_INFO_STRUCT = WebGPUStruct.from({
|
|
|
16
16
|
specularF0: vec3f,
|
|
17
17
|
specularF90: f32,
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* The two F0s that `specularF0` blends by metalness: the dielectric's (from its IOR) and the metal's (its
|
|
21
|
+
* base color). Multiple-scattering compensation needs them apart, see `compute_multiscattering_specular`.
|
|
22
|
+
*/
|
|
23
|
+
specularF0_dielectric: vec3f,
|
|
24
|
+
specularF0_metal: vec3f,
|
|
25
|
+
|
|
19
26
|
emissive: vec3f,
|
|
20
27
|
opacity: f32,
|
|
21
28
|
}, "MaterialShadingInfo");
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Multiple-scattering specular compensation
|
|
2
|
+
|
|
3
|
+
Single-scattering GGX loses the light that bounces between microfacets more than once, and it loses the most
|
|
4
|
+
on rough metals: a white metal at roughness 1 reflects 0.31 of a uniform sky (1 − ln 2 at N·V = 1). Both
|
|
5
|
+
paths now restore it with Turquin's compensation (2019, eq. 16), from the split-sum LUT `tSplitSum`:
|
|
6
|
+
|
|
7
|
+
- **Indirect**, `compute_indirect_specular` → `compute_multiscattering_specular`, as before.
|
|
8
|
+
- **Direct**, `re_direct_multiscatter`: one LUT fetch per pass that shades direct light, after its last
|
|
9
|
+
light, scales the accumulated direct specular by (single + multiple) / single scattering. The ratio
|
|
10
|
+
depends on N·V, roughness and F0 alone, so it serves every light. It is called by
|
|
11
|
+
`shade_standard_material_direct` (the deferred and the forward paths), its ReSTIR twin, and
|
|
12
|
+
`restir_resolve`, so a ReSTIR pixel fetches twice (its directional lights, then its resampled light);
|
|
13
|
+
that cost is not measured. Not by the ReSTIR target function: that is a resampling weight, and the
|
|
14
|
+
compensation is a per-pixel scale of one lobe.
|
|
15
|
+
|
|
16
|
+
It uses the material's roughness, not the roughness a sphere light widens it to in `re_direct_physical`.
|
|
17
|
+
|
|
18
|
+
## Why GI does not already cover it
|
|
19
|
+
|
|
20
|
+
The indirect path's compensation scales the environment's light. The sun and local lights reach a pixel
|
|
21
|
+
only through `re_direct_physical`, a separate additive pass. Measured in the Sponza playground with its
|
|
22
|
+
shipped sun (intensity 7.2) and default IBL environment, the G-buffer read as rough gold
|
|
23
|
+
(F0 1.0, 0.766, 0.336) in both the deferred pass and the indirect resolve, each pass replayed into cleared
|
|
24
|
+
targets so that each pass's own contribution is measured. Means over shaded pixels, linear:
|
|
25
|
+
|
|
26
|
+
| view | roughness | direct red, before → after | indirect red | direct share | luminance lost before |
|
|
27
|
+
|---|---|---|---|---|---|
|
|
28
|
+
| sunlit exterior | 0.8 | 0.734 → 1.193 | 0.577 | 64% | 22% (26% in red) |
|
|
29
|
+
| sunlit exterior | 0.5 | 0.939 → 1.063 | 0.576 | 61% | 6% |
|
|
30
|
+
| shaded atrium | 0.8 | 0.013 → 0.022 | 1.170 | 2% | 0.6% |
|
|
31
|
+
|
|
32
|
+
Where the sun does not reach, GI dominates and the loss was already compensated. On sunlit rough metal,
|
|
33
|
+
direct light is most of the pixel. Dielectrics barely move: Turquin's scale at F0 0.04 is at most 1.09.
|
|
34
|
+
|
|
35
|
+
## Metalness
|
|
36
|
+
|
|
37
|
+
Turquin's Fms = F0 makes the term quadratic in F0; metalness blends a dielectric F0 and a metal F0
|
|
38
|
+
linearly. Evaluated at the blend, the term falls short by Kms · A · m(1 − m)(F0_metal − F0_dielectric)², so
|
|
39
|
+
`compute_multiscattering_specular` takes both pure F0s (`specularF0_dielectric` and `specularF0_metal` on
|
|
40
|
+
`MaterialShadingInfo`) and adds that back, written as a product that needs no metalness. EEVEE, Frostbite
|
|
41
|
+
and three.js (#32190) evaluate the two separately and mix. For the albedo this is the same sum: exactly so
|
|
42
|
+
in the indirect path, and in the direct path summed over a sky. Per light it is not, because the direct
|
|
43
|
+
path applies the sum as one per-pixel ratio to the blend's lobe: under one directional light, a white
|
|
44
|
+
surface at metalness 0.5 comes out −1.8% to +7.8% of the separately evaluated mix (worst at roughness 1,
|
|
45
|
+
N·V 0.2, the light in the mirror direction). The blended F0 it replaced was up to 30% short there (roughness
|
|
46
|
+
1, N·V 0.9, lit from beside the viewer).
|
|
47
|
+
|
|
48
|
+
The indirect diffuse sits under the dielectric part only, so it keeps what the *dielectric's* specular
|
|
49
|
+
leaves, not the blend's: the blend's also subtracted the metal's reflection, which the `1 − metalness` in
|
|
50
|
+
`diffuse` had already removed.
|
|
51
|
+
|
|
52
|
+
Measured against applying the term at the blended F0 (`deferred/white_furnace.spec.js`, white base,
|
|
53
|
+
metalness 0.5): the direct specular came up to 0.157 of the sky short, the indirect resolve up to 0.33.
|
|
54
|
+
Split, the direct is within 0.0028 of the blend and the indirect is the blend to one f32 ulp.
|
|
55
|
+
|
|
56
|
+
## What the furnace holds
|
|
57
|
+
|
|
58
|
+
`deferred/white_furnace.spec.js` lights one texel through the real passes: `shader_deferred_main` (a
|
|
59
|
+
uniform sky as directional lights from GGX visible-normal sampling, or one point light through the cluster)
|
|
60
|
+
and `shader_resolve_indirect_lighting`. It holds:
|
|
61
|
+
|
|
62
|
+
1. a white metal's direct light is the sky less only `F_Hauber`'s dip over the half vectors that view can
|
|
63
|
+
reach, a floor derived per N·V (0.32 – 0.99 before, 0.93 – 1.00 now);
|
|
64
|
+
2. the direct specular at any metalness is the blend of the pure dielectric's and the pure metal's, white
|
|
65
|
+
and gold, every channel, to the 0.0028 the Fresnel offset leaves (1.7e-5 without it);
|
|
66
|
+
3. the indirect resolve is that blend to float rounding (0.67 – 0.90 of the sky at metalness 0.25 – 0.75
|
|
67
|
+
before);
|
|
68
|
+
4. for a pure dielectric and a pure gold, the indirect specular exceeds the direct by no less than 0 and no
|
|
69
|
+
more than the Fresnel dip the LUT drops: this, not the white furnace, is what sees where the LUT is read;
|
|
70
|
+
5. a point light is compensated as a directional light is;
|
|
71
|
+
6. the ReSTIR twin shades its directional lights as the brute-force pass does;
|
|
72
|
+
7. each channel is shaded by its own colour alone.
|
|
73
|
+
|
|
74
|
+
Every mutant of the adversarial review is killed — the call doubled or moved ahead of the cluster loop, F0
|
|
75
|
+
for the variance, the variance's sign or half of it, either path's LUT read with its coordinates swapped or at
|
|
76
|
+
roughness², the guard at 1e-1, the diffuse coupled to the blend, a dielectric F0 of 0.08, the term at
|
|
77
|
+
0.5, 0.9, 0.97 or 1.1 of itself, Fms = 1, the diffuse compensated too, a metal F0 of 1 in either path, one
|
|
78
|
+
channel's ratio for all or none for blue, the ReSTIR twin's call removed — but one: `restir_resolve`'s own
|
|
79
|
+
call. That pass needs the ray-tracing group and is not run at this tier.
|
|
80
|
+
|
|
81
|
+
What is left on purpose:
|
|
82
|
+
|
|
83
|
+
- **The direct lobe's Fresnel dip.** `F_Hauber(1, 1, VoH) = 1 − VoH (1 − VoH)⁴` is below 1, least at
|
|
84
|
+
VoH = 1/5 (1 − 256/3125); the compensation does not hide it. That is the 0.93 at low roughness, grazing.
|
|
85
|
+
- **The LUT's edge.** Texel centres are (i + 0.5) / 64, so roughness 1 reads 0.992's albedo: 3% at
|
|
86
|
+
roughness 1, N·V 1.
|
|
87
|
+
- **The resolve's horizon occlusion.** Its bent-normal specular occlusion cuts a lobe reaching under the
|
|
88
|
+
horizon even with nothing there: 0.0041 at roughness 0.51, N·V 0.10. The spec divides it out.
|
|
89
|
+
|
|
90
|
+
## Cost
|
|
91
|
+
|
|
92
|
+
RTX 4090, Sponza from inside the atrium at 1898 × 982 (every pixel shaded), one sun, "Shade From G-Buffer"
|
|
93
|
+
with and without the call, interleaved in one capture (4-frame blocks, alternating order, 4 captures per
|
|
94
|
+
view): 79.8 against 74.6 µs and 89.6 against 83.0 µs, +7%, ~0.2% of the frame. A byte-identical twin read
|
|
95
|
+
0.997 – 1.009 of the shipped pass.
|
|
96
|
+
|
|
97
|
+
## Measured and not changed here
|
|
98
|
+
|
|
99
|
+
- **Direct diffuse is not coupled to the specular.** EON's albedo is the base colour, and the direct
|
|
100
|
+
path adds the specular on top, so a white dielectric returns 1.01 – 1.49 of a uniform sky through direct
|
|
101
|
+
light (the most at low roughness, grazing). The indirect path couples them.
|
|
102
|
+
- **Direct and indirect Fresnel differ.** The LUT splits `F_Hauber` into `f0 · A + f90 · B` and drops its
|
|
103
|
+
`− VoH (1 − VoH)⁴` term, so the indirect specular is up to 0.068 of the sky above the direct for the same
|
|
104
|
+
dielectric (0.288 against 0.220 at roughness 0.26, N·V 0.26).
|
|
105
|
+
- **Light the LPV injects is single-scattering.** `graph_lpv_shade.js` shades a probe ray's hit with its own
|
|
106
|
+
`BRDF_GGX` and (1 − F) diffuse, so in LPV mode a rough metal bounces its uncompensated direct light.
|
|
107
|
+
- **The path tracer is single-scattering**, so for rough metals it is not the reference: it reflects what
|
|
108
|
+
the rasterizer did before this.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_compute_indirect_specular.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js"],"names":[],"mappings":"AAKA,
|
|
1
|
+
{"version":3,"file":"chunk_compute_indirect_specular.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js"],"names":[],"mappings":"AAKA,wDAsEC;0BA3EyB,6BAA6B"}
|
|
@@ -13,6 +13,8 @@ fn compute_indirect_specular(
|
|
|
13
13
|
view_direction: vec3<f32>,
|
|
14
14
|
material_diffuse: vec3<f32>,
|
|
15
15
|
material_specularF0: vec3<f32>,
|
|
16
|
+
material_specularF0_dielectric: vec3<f32>,
|
|
17
|
+
material_specularF0_metal: vec3<f32>,
|
|
16
18
|
material_specularF90: f32,
|
|
17
19
|
material_roughness: f32
|
|
18
20
|
) -> mat2x3<f32> {
|
|
@@ -28,17 +30,34 @@ fn compute_indirect_specular(
|
|
|
28
30
|
compute_multiscattering_specular(
|
|
29
31
|
f_ab,
|
|
30
32
|
material_specularF0,
|
|
33
|
+
material_specularF0_dielectric,
|
|
34
|
+
material_specularF0_metal,
|
|
31
35
|
material_specularF90,
|
|
32
36
|
&single_scattering,
|
|
33
|
-
&multi_scattering
|
|
37
|
+
&multi_scattering
|
|
34
38
|
);
|
|
35
39
|
|
|
36
40
|
let totalScattering = single_scattering + multi_scattering;
|
|
37
|
-
|
|
41
|
+
|
|
38
42
|
var indirect_specular = radiance * totalScattering;
|
|
39
|
-
|
|
43
|
+
|
|
44
|
+
// diffuse lies under the dielectric part of the surface only (material_diffuse carries its 1 - metalness),
|
|
45
|
+
// so it keeps what the dielectric's specular leaves; the blend's would subtract the metal's reflection too
|
|
46
|
+
var single_scattering_dielectric = vec3<f32>( 0.0 );
|
|
47
|
+
var multi_scattering_dielectric = vec3<f32>( 0.0 );
|
|
48
|
+
|
|
49
|
+
compute_multiscattering_specular(
|
|
50
|
+
f_ab,
|
|
51
|
+
material_specularF0_dielectric,
|
|
52
|
+
material_specularF0_dielectric,
|
|
53
|
+
material_specularF0_dielectric,
|
|
54
|
+
material_specularF90,
|
|
55
|
+
&single_scattering_dielectric,
|
|
56
|
+
&multi_scattering_dielectric
|
|
57
|
+
);
|
|
58
|
+
|
|
40
59
|
// diffuse refelections will only be a portion of whatever remain after spec
|
|
41
|
-
let conservation_factor = saturate(vec3<f32>(1.0) -
|
|
60
|
+
let conservation_factor = saturate(vec3<f32>(1.0) - (single_scattering_dielectric + multi_scattering_dielectric));
|
|
42
61
|
|
|
43
62
|
let cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;
|
|
44
63
|
let diffuse = material_diffuse * conservation_factor;
|