@woosh/meep-engine 3.67.0 → 3.68.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/package.json +1 -1
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +4 -9
- package/src/engine/graphics3/load_cube_environment.js +3 -3
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/probe_clipmap/index.html +43 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap/main.js +29 -0
- package/src/shade/renderer/Renderer.d.ts +7 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +213 -15
- package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
- package/src/shade/renderer/ShadeIndirectLightingMode.js +9 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +22 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.js +160 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts +45 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.js +57 -0
- package/src/shade/renderer/atmosphere/GPUSky.d.ts +23 -8
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +91 -34
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +17 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +55 -25
- package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts +164 -0
- package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/SceneAtmosphere.js +308 -0
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +3 -12
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +52 -89
- package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts +14 -0
- package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.js +103 -0
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +10 -4
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +95 -57
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +10 -14
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +97 -69
- package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts +17 -0
- package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.js +117 -48
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +8 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +65 -35
- package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +2 -1
- package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/compute_mie_absorption.js +6 -6
- package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts +41 -0
- package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.js +123 -0
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +21 -64
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts +6 -2
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +55 -179
- package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts +7 -0
- package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/shader_sky_view_lut.js +111 -0
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts +0 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +68 -79
- package/src/shade/renderer/deferred/shader_background.js +1 -1
- package/src/shade/renderer/deferred/shader_background_sky.d.ts +5 -0
- package/src/shade/renderer/deferred/shader_background_sky.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_background_sky.js +130 -0
- package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts +2 -1
- package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts.map +1 -1
- package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.js +6 -2
- package/src/shade/renderer/extension/ViewTextures.d.ts +3 -2
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +3 -2
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +20 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts +47 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.js +246 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +4 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +8 -148
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +4 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +9 -58
- package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts +142 -0
- package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.js +938 -0
- package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts +192 -0
- package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.js +231 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts +11 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.js +25 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts +110 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.js +197 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts +150 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.js +408 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts +23 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.js +63 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts +24 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.js +61 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts +39 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.js +126 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts +21 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.js +74 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts +20 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.js +26 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts +24 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.js +57 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts +22 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.js +53 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts +62 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.js +156 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts +18 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.js +50 -0
- package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts +21 -0
- package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.js +54 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts +67 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.js +509 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts +20 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.js +128 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts +62 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.js +478 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts +69 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.js +457 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts +27 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.js +219 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts +22 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.js +151 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts +66 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.js +301 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts +59 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.js +364 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts +40 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.js +275 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -1
- package/src/shade/renderer/grass/blade/GPUGrassBlades.js +17 -2
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +18 -8
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -1
- package/src/shade/renderer/grass/blade/grass_blade_resolve.js +114 -32
- package/src/shade/renderer/light/GPULightCollection.d.ts +1 -1
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +213 -80
- package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.d.ts +1 -2
- package/src/shade/renderer/light/environment/chunk_sample_environment_color.d.ts.map +1 -0
- package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.js +3 -4
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -1
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +1 -1
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts +1 -1
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +1 -1
- package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts +1 -1
- package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.js +1 -1
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +2 -0
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +2 -0
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts +6 -0
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +9 -1
- package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +4 -3
- package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts +17 -0
- package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.js +16 -0
- package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts +21 -0
- package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.js +30 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -5
- 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 +19 -17
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +2 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +2 -1
- package/src/shade/renderer/scene/Scene.d.ts +9 -2
- package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/Scene.js +10 -2
- package/src/shade/renderer/shader/ImageShader.d.ts +24 -12
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +11 -8
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts +3 -1
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js +11 -3
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +2 -11
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +23 -32
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.js +14 -2
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.js +4 -2
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.js +11 -3
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +68 -69
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts +4 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.js +46 -39
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js +5 -3
- package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts +18 -10
- package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.js +30 -27
- package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.js +30 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.js +60 -0
- package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.d.ts → io/chunk_light_get_sun.d.ts} +3 -6
- package/src/shade/renderer/shader/chunk/light/io/chunk_light_get_sun.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.js → io/chunk_light_get_sun.js} +6 -26
- package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_soft_shadows.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +3 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -2
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +743 -739
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +2 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +19 -17
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +5 -3
- package/src/shade/renderer/water/chunk_water_gi.js +2 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts +0 -2
- package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts.map +0 -1
- package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +0 -45
- package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts +0 -2
- package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts.map +0 -1
- package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.js +0 -17
- package/src/engine/graphics/sh3/sky/hosek/README.md +0 -4
- package/src/engine/graphics/sh3/sky/hosek/data.d.ts +0 -17
- package/src/engine/graphics/sh3/sky/hosek/data.d.ts.map +0 -1
- package/src/engine/graphics/sh3/sky/hosek/data.js +0 -3744
- package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts +0 -2
- package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts.map +0 -1
- package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.js +0 -71
- package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts +0 -26
- package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts.map +0 -1
- package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +0 -70
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts +0 -22
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts.map +0 -1
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +0 -388
- package/src/engine/graphics3/make_default_environment.d.ts +0 -15
- package/src/engine/graphics3/make_default_environment.d.ts.map +0 -1
- package/src/engine/graphics3/make_default_environment.js +0 -111
- package/src/shade/renderer/atmosphere/MIE_G.d.ts +0 -6
- package/src/shade/renderer/atmosphere/MIE_G.d.ts.map +0 -1
- package/src/shade/renderer/atmosphere/MIE_G.js +0 -5
- package/src/shade/renderer/atmosphere/chunk_sample_environment_color.d.ts.map +0 -1
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts +0 -4
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts.map +0 -1
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +0 -44
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +0 -2
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +0 -43
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.js +0 -6
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.js +0 -18
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts +0 -14
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.js +0 -86
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts +0 -8
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.js +0 -125
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.js +0 -17
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.js +0 -38
- package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +0 -16
- package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +0 -28
- package/src/shade/renderer/shader/chunk/light/sky/chunk_sample_sky_color.d.ts.map +0 -1
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts +0 -26
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +0 -1
- package/src/shade/renderer/view/GPUViewSkyContext.js +0 -170
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
|
|
2
|
+
import { chunk_project_position_from_depth } from "../../shader/chunk/camera/chunk_project_position_from_depth.js";
|
|
3
|
+
import { chunk_is_background } from "../../shader/chunk/depth/chunk_is_background.js";
|
|
4
|
+
import {
|
|
5
|
+
chunk_decode_g_buffer_face_normal
|
|
6
|
+
} from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.js";
|
|
7
|
+
import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
|
|
8
|
+
import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
9
|
+
import { chunk_sh3_cosine_convolved_basis_at } from "../../shader/chunk/spherical_harmonics/chunk_sh3_basis_at.js";
|
|
10
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
11
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
12
|
+
import { ShaderResourceDescriptor } from "../../shader/resource/ShaderResourceDescriptor.js";
|
|
13
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
14
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
15
|
+
import { STBN_VEC2_RESOURCE } from "../../STATIC_GRAPHICS_ENGINE_ASSET_RESOURCES.js";
|
|
16
|
+
import { chunk_probe_clipmap_sample_radiance } from "../probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js";
|
|
17
|
+
import { PROBE_CLIPMAP_SAMPLING_GROUP } from "../probe_clipmap/probe/chunk_probe_clipmap_pick.js";
|
|
18
|
+
import {
|
|
19
|
+
chunk_screen_probe,
|
|
20
|
+
chunk_screen_probe_counts,
|
|
21
|
+
chunk_screen_probe_ray_jitter,
|
|
22
|
+
SCREEN_PROBE_DISPATCH_READ_RESOURCE,
|
|
23
|
+
SCREEN_PROBE_EXPOSURE_PREVIOUS_RESOURCE,
|
|
24
|
+
SCREEN_PROBE_EXPOSURE_RESOURCE,
|
|
25
|
+
SCREEN_PROBE_FRAME_RESOURCE,
|
|
26
|
+
SCREEN_PROBE_PICKS_READ_RESOURCE,
|
|
27
|
+
SCREEN_PROBE_RAY_INFO_WRITE_RESOURCE,
|
|
28
|
+
SCREEN_PROBES_PREVIOUS_RESOURCE,
|
|
29
|
+
SCREEN_PROBES_READ_RESOURCE
|
|
30
|
+
} from "./chunk_screen_probe.js";
|
|
31
|
+
import {
|
|
32
|
+
SCREEN_PROBE_CAMERA_PREVIOUS_RESOURCE,
|
|
33
|
+
SCREEN_PROBE_CAMERA_RESOURCE,
|
|
34
|
+
SCREEN_PROBE_DEPTH_RESOURCE,
|
|
35
|
+
SCREEN_PROBE_PBR_RESOURCE,
|
|
36
|
+
SCREEN_PROBE_VELOCITY_RESOURCE
|
|
37
|
+
} from "./chunk_screen_probe_surface.js";
|
|
38
|
+
import { chunk_screen_probe_brdf_density } from "./chunk_screen_probe_brdf_density.js";
|
|
39
|
+
import { chunk_screen_probe_lighting_history } from "./chunk_screen_probe_lighting_history.js";
|
|
40
|
+
import { chunk_screen_probe_ray_sort } from "./chunk_screen_probe_ray_sort.js";
|
|
41
|
+
import { chunk_screen_probe_workgroup_sum } from "./chunk_screen_probe_workgroup_sum.js";
|
|
42
|
+
import {
|
|
43
|
+
SCREEN_PROBE_BRDF_PIXEL_WEIGHT,
|
|
44
|
+
SCREEN_PROBE_MIN_PDF,
|
|
45
|
+
SCREEN_PROBE_OCTAHEDRON_LIMIT,
|
|
46
|
+
SCREEN_PROBE_THREAD_WORKGROUP_SIZE
|
|
47
|
+
} from "./SCREEN_PROBE.js";
|
|
48
|
+
|
|
49
|
+
/** Each probe's BRDF density, SH3 in three `vec4`s: coefficients 0–3, 4–7, and 8 alone. @type {ShaderResourceDescriptor} */
|
|
50
|
+
export const SCREEN_PROBE_BRDF_READ_RESOURCE = ShaderResourceDescriptor.storageBuffer("screen_probe_brdf", WebGPUArray.vec4f);
|
|
51
|
+
/** @type {ShaderResourceDescriptor} */
|
|
52
|
+
export const SCREEN_PROBE_BRDF_WRITE_RESOURCE = ShaderResourceDescriptor.storageBuffer("screen_probe_brdf", WebGPUArray.vec4f, true);
|
|
53
|
+
|
|
54
|
+
/** Each probe texel's lighting density, `r32float`, a texel a texel in the probes' atlas. @type {ShaderResourceDescriptor} */
|
|
55
|
+
export const SCREEN_PROBE_LIGHTING_PDF_READ_RESOURCE = ShaderResourceDescriptor.texture("screen_probe_lighting_pdf", "unfilterable-float");
|
|
56
|
+
/** @type {ShaderResourceDescriptor} */
|
|
57
|
+
export const SCREEN_PROBE_LIGHTING_PDF_WRITE_RESOURCE = ShaderResourceDescriptor.storageTexture("screen_probe_lighting_pdf", "r32float", "2d", "write-only");
|
|
58
|
+
|
|
59
|
+
/** Last frame's probe radiance after the spatial filter, `rgba16float`. @type {ShaderResourceDescriptor} */
|
|
60
|
+
export const SCREEN_PROBE_RADIANCE_HISTORY_RESOURCE = ShaderResourceDescriptor.texture("screen_probe_radiance_history", "unfilterable-float");
|
|
61
|
+
|
|
62
|
+
/** The G-buffer's shading normals. @type {ShaderResourceDescriptor} */
|
|
63
|
+
export const SCREEN_PROBE_NORMAL_RESOURCE = ShaderResourceDescriptor.texture("tNormal", "uint");
|
|
64
|
+
|
|
65
|
+
const brdf_resources = new ShaderResourceSetDescriptor();
|
|
66
|
+
|
|
67
|
+
brdf_resources.createGroup()
|
|
68
|
+
.add(SCREEN_PROBE_FRAME_RESOURCE)
|
|
69
|
+
.add(SCREEN_PROBE_CAMERA_RESOURCE)
|
|
70
|
+
.add(SCREEN_PROBES_READ_RESOURCE)
|
|
71
|
+
.add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
|
|
72
|
+
.add(SCREEN_PROBE_BRDF_WRITE_RESOURCE)
|
|
73
|
+
.add(SCREEN_PROBE_DEPTH_RESOURCE)
|
|
74
|
+
.add(SCREEN_PROBE_PBR_RESOURCE)
|
|
75
|
+
.add(SCREEN_PROBE_NORMAL_RESOURCE);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A probe's BRDF density (Lumen's `ScreenProbeComputeBRDFProbabilityDensityFunctionCS`): a workgroup a probe, a lane a
|
|
79
|
+
* pixel of an 8 × 8 grid over the square of 2D pixels about it, the pixels whose light interpolates from it. The centre
|
|
80
|
+
* lane takes the probe's own pixel.
|
|
81
|
+
*
|
|
82
|
+
* A pixel counts where it stands on the probe's surface: the probe's plane weight from the pixel's plane is past
|
|
83
|
+
* `SCREEN_PROBE_BRDF_PIXEL_WEIGHT` (the centre always counts). It adds its clamped cosine lobe about its shading normal
|
|
84
|
+
* as SH3 (`sh3_cosine_convolved_basis_at`, Lumen's `CalcDiffuseTransferSH3`), and the probe's density is the mean of
|
|
85
|
+
* the lobes: at a direction, how much the pixels' diffuse would weigh light from it.
|
|
86
|
+
*
|
|
87
|
+
* Lumen offsets its grid by `t/8·2D − 1` pixels, to one side of the probe; here the cells are centred on it, as the
|
|
88
|
+
* pixels that read the probe are.
|
|
89
|
+
*
|
|
90
|
+
* @type {ComputeShader}
|
|
91
|
+
*/
|
|
92
|
+
export const shader_screen_probe_brdf_pdf = ComputeShader.from({
|
|
93
|
+
label: "Screen Probe BRDF PDF",
|
|
94
|
+
resources: brdf_resources,
|
|
95
|
+
body: CodeChunk.from(
|
|
96
|
+
//language=WGSL
|
|
97
|
+
`
|
|
98
|
+
@compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
|
|
99
|
+
fn main(
|
|
100
|
+
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
|
101
|
+
@builtin(local_invocation_index) lane: u32,
|
|
102
|
+
@builtin(subgroup_invocation_id) subgroup_lane: u32,
|
|
103
|
+
@builtin(subgroup_size) subgroup_size: u32,
|
|
104
|
+
) {
|
|
105
|
+
let probe = folded_workgroup_index(workgroup_id);
|
|
106
|
+
|
|
107
|
+
if (probe >= screen_probe_count()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
let record = screen_probes[probe];
|
|
112
|
+
|
|
113
|
+
if (record.depth <= 0.0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
let frame = screen_probe_frame;
|
|
118
|
+
let span = f32(1u << frame.downsample_shift);
|
|
119
|
+
|
|
120
|
+
// an 8 × 8 grid of cells over [-D, D) about the probe, the centre lane on the probe's own pixel
|
|
121
|
+
let cell = vec2<f32>(f32(lane & 7u), f32(lane >> 3u));
|
|
122
|
+
let centre = lane == 36u;
|
|
123
|
+
let offset = select((cell + 0.5) * (span * 0.25) - span, vec2<f32>(0.0), centre);
|
|
124
|
+
let pixel = vec2<u32>(clamp(vec2<f32>(screen_probe_pixel_decode(record.pixel)) + offset, vec2<f32>(0.0), vec2<f32>(frame.view_size - 1u)));
|
|
125
|
+
|
|
126
|
+
var lobe = array<f32, 9>();
|
|
127
|
+
var counted = 0.0;
|
|
128
|
+
|
|
129
|
+
let device_depth = textureLoad(tDepth, pixel, 0).r;
|
|
130
|
+
|
|
131
|
+
if (!is_background(device_depth)) {
|
|
132
|
+
let uv = (vec2<f32>(pixel) + 0.5) / vec2<f32>(frame.view_size);
|
|
133
|
+
let position = project_position_from_depth(uv, device_depth, camera.view_projection_matrix_inverse);
|
|
134
|
+
let face = decode_g_buffer_face_normal(textureLoad(tPBR, pixel, 0));
|
|
135
|
+
let plane = vec4<f32>(face, dot(face, position));
|
|
136
|
+
|
|
137
|
+
if (centre || screen_probe_plane_weight(plane, record.position, record.depth) > ${SCREEN_PROBE_BRDF_PIXEL_WEIGHT}) {
|
|
138
|
+
lobe = sh3_cosine_convolved_basis_at(decode_g_buffer_normal(textureLoad(tNormal, pixel, 0).x));
|
|
139
|
+
counted = 1.0;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let s0 = screen_probe_workgroup_sum(vec4<f32>(lobe[0], lobe[1], lobe[2], lobe[3]), lane, subgroup_lane, subgroup_size);
|
|
144
|
+
let s1 = screen_probe_workgroup_sum(vec4<f32>(lobe[4], lobe[5], lobe[6], lobe[7]), lane, subgroup_lane, subgroup_size);
|
|
145
|
+
let s2 = screen_probe_workgroup_sum(vec4<f32>(lobe[8], counted, 0.0, 0.0), lane, subgroup_lane, subgroup_size);
|
|
146
|
+
|
|
147
|
+
if (lane == 0u) {
|
|
148
|
+
// the centre always counts, so the count is at least one
|
|
149
|
+
let mean = 1.0 / max(s2.y, 1.0);
|
|
150
|
+
|
|
151
|
+
screen_probe_brdf[probe * 3u] = s0 * mean;
|
|
152
|
+
screen_probe_brdf[probe * 3u + 1u] = s1 * mean;
|
|
153
|
+
screen_probe_brdf[probe * 3u + 2u] = vec4<f32>(s2.x * mean, 0.0, 0.0, 0.0);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
`, [
|
|
157
|
+
chunk_screen_probe,
|
|
158
|
+
chunk_screen_probe_counts,
|
|
159
|
+
chunk_screen_probe_workgroup_sum,
|
|
160
|
+
chunk_folded_workgroup_index,
|
|
161
|
+
chunk_is_background,
|
|
162
|
+
chunk_project_position_from_depth,
|
|
163
|
+
chunk_decode_g_buffer_face_normal,
|
|
164
|
+
chunk_decode_g_buffer_normal,
|
|
165
|
+
chunk_sh3_cosine_convolved_basis_at,
|
|
166
|
+
]),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const lighting_resources = new ShaderResourceSetDescriptor();
|
|
170
|
+
|
|
171
|
+
lighting_resources.createGroup()
|
|
172
|
+
.add(SCREEN_PROBE_FRAME_RESOURCE)
|
|
173
|
+
.add(SCREEN_PROBE_EXPOSURE_RESOURCE)
|
|
174
|
+
.add(SCREEN_PROBE_EXPOSURE_PREVIOUS_RESOURCE)
|
|
175
|
+
.add(SCREEN_PROBE_CAMERA_PREVIOUS_RESOURCE)
|
|
176
|
+
.add(SCREEN_PROBE_VELOCITY_RESOURCE)
|
|
177
|
+
.add(SCREEN_PROBES_READ_RESOURCE)
|
|
178
|
+
.add(SCREEN_PROBES_PREVIOUS_RESOURCE)
|
|
179
|
+
.add(SCREEN_PROBE_PICKS_READ_RESOURCE)
|
|
180
|
+
.add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
|
|
181
|
+
.add(SCREEN_PROBE_RADIANCE_HISTORY_RESOURCE)
|
|
182
|
+
.add(SCREEN_PROBE_LIGHTING_PDF_WRITE_RESOURCE)
|
|
183
|
+
.add(STBN_VEC2_RESOURCE);
|
|
184
|
+
|
|
185
|
+
lighting_resources.addGroup(PROBE_CLIPMAP_SAMPLING_GROUP);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* A probe's lighting density (Lumen's `ScreenProbeComputeLightingProbabilityDensityFunctionCS`): a workgroup a probe,
|
|
189
|
+
* its lanes over its n² texels.
|
|
190
|
+
*
|
|
191
|
+
* - **History**: last frame's four uniform probes around the probe's surface point that stood on its surface
|
|
192
|
+
* (`screen_probe_lighting_history`), each giving its filtered radiance in the same texel, since a texel is a
|
|
193
|
+
* direction in the world. They are averaged, pre-exposed as last frame's exposure left them and brought to this
|
|
194
|
+
* frame's (`screen_probe_exposure` over `screen_probe_exposure_previous`), as Lumen rescales its history.
|
|
195
|
+
* - **The rest**: the share of the four that gave nothing, 1 − accepted / 4, is the world-space probes' radiance the
|
|
196
|
+
* probe's pick reads (`screen_probe_picks`), along the texel's direction at this frame's jitter, pre-exposed by this
|
|
197
|
+
* frame's exposure. Where nothing was picked, the history alone, or one where there is none: a density that ranks
|
|
198
|
+
* nothing.
|
|
199
|
+
* - The density is each texel's luminance over the probe's sum.
|
|
200
|
+
*
|
|
201
|
+
* @type {ComputeShader}
|
|
202
|
+
*/
|
|
203
|
+
export const shader_screen_probe_lighting_pdf = ComputeShader.from({
|
|
204
|
+
label: "Screen Probe Lighting PDF",
|
|
205
|
+
resources: lighting_resources,
|
|
206
|
+
body: CodeChunk.from(
|
|
207
|
+
//language=WGSL
|
|
208
|
+
`
|
|
209
|
+
const SCREEN_PROBE_TEXEL_LIMIT = ${SCREEN_PROBE_OCTAHEDRON_LIMIT * SCREEN_PROBE_OCTAHEDRON_LIMIT}u;
|
|
210
|
+
|
|
211
|
+
var<workgroup> screen_probe_texel_pdf: array<f32, SCREEN_PROBE_TEXEL_LIMIT>;
|
|
212
|
+
|
|
213
|
+
// a history probe's radiance in a texel, none where it gave none: a uniform probe's place in last frame's atlas is its
|
|
214
|
+
// tile's
|
|
215
|
+
fn screen_probe_history_radiance(index: u32, texel: vec2<u32>) -> vec3<f32> {
|
|
216
|
+
if (index == SCREEN_PROBE_HISTORY_NONE) {
|
|
217
|
+
return vec3<f32>(0.0);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
let columns = screen_probe_frame.previous_tile_count.x;
|
|
221
|
+
let base = vec2<u32>(index % columns, index / columns) * screen_probe_frame.octahedron_resolution;
|
|
222
|
+
|
|
223
|
+
return textureLoad(screen_probe_radiance_history, base + texel, 0).rgb;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
fn screen_probe_picked_radiance(pick: ScreenProbePick, direction: vec3<f32>) -> vec3<f32> {
|
|
227
|
+
var radiance = vec3<f32>(0.0);
|
|
228
|
+
|
|
229
|
+
// each share by name
|
|
230
|
+
if (pick.weights.x > 0.0) { radiance += pick.weights.x * probe_clipmap_radiance(pick.slots.x, direction).rgb; }
|
|
231
|
+
if (pick.weights.y > 0.0) { radiance += pick.weights.y * probe_clipmap_radiance(pick.slots.y, direction).rgb; }
|
|
232
|
+
if (pick.weights.z > 0.0) { radiance += pick.weights.z * probe_clipmap_radiance(pick.slots.z, direction).rgb; }
|
|
233
|
+
if (pick.weights.w > 0.0) { radiance += pick.weights.w * probe_clipmap_radiance(pick.slots.w, direction).rgb; }
|
|
234
|
+
|
|
235
|
+
return radiance;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
@compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
|
|
239
|
+
fn main(
|
|
240
|
+
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
|
241
|
+
@builtin(local_invocation_index) lane: u32,
|
|
242
|
+
@builtin(subgroup_invocation_id) subgroup_lane: u32,
|
|
243
|
+
@builtin(subgroup_size) subgroup_size: u32,
|
|
244
|
+
) {
|
|
245
|
+
let probe = folded_workgroup_index(workgroup_id);
|
|
246
|
+
|
|
247
|
+
if (probe >= screen_probe_count()) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
let record = screen_probes[probe];
|
|
252
|
+
|
|
253
|
+
if (record.depth <= 0.0) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
let frame = screen_probe_frame;
|
|
258
|
+
let n = frame.octahedron_resolution;
|
|
259
|
+
let texels = n * n;
|
|
260
|
+
let pick = screen_probe_picks[probe];
|
|
261
|
+
let picked = dot(pick.weights, vec4<f32>(1.0)) > 0.0;
|
|
262
|
+
|
|
263
|
+
// last frame's four uniform probes around the point, where they stood on its surface
|
|
264
|
+
let history = screen_probe_lighting_history(record);
|
|
265
|
+
let accepted = dot(select(vec4<f32>(0.0), vec4<f32>(1.0), history != vec4<u32>(SCREEN_PROBE_HISTORY_NONE)), vec4<f32>(1.0));
|
|
266
|
+
let rest = 1.0 - saturate(accepted / 4.0);
|
|
267
|
+
let exposure = screen_probe_exposure.value;
|
|
268
|
+
let rescale = exposure / max(screen_probe_exposure_previous.value, 1e-20);
|
|
269
|
+
let jitter = screen_probe_ray_jitter(screen_probe_noise_tile(probe, screen_probe_pixel_decode(record.pixel)));
|
|
270
|
+
|
|
271
|
+
var local_sum = 0.0;
|
|
272
|
+
|
|
273
|
+
for (var t = lane; t < texels; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
274
|
+
let texel = vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift);
|
|
275
|
+
|
|
276
|
+
var lighting = vec3<f32>(0.0);
|
|
277
|
+
|
|
278
|
+
if (accepted > 0.0) {
|
|
279
|
+
lighting = (screen_probe_history_radiance(history.x, texel) + screen_probe_history_radiance(history.y, texel)
|
|
280
|
+
+ screen_probe_history_radiance(history.z, texel) + screen_probe_history_radiance(history.w, texel)) * (rescale / accepted);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (rest > 0.0 && picked) {
|
|
284
|
+
let direction = screen_probe_ray_direction(screen_probe_ray_info_pack(texel, 1u), jitter);
|
|
285
|
+
|
|
286
|
+
lighting += (rest * exposure) * screen_probe_picked_radiance(pick, direction);
|
|
287
|
+
} else if (accepted == 0.0) {
|
|
288
|
+
lighting = vec3<f32>(1.0);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
let pdf = rgb_to_luminance(lighting);
|
|
292
|
+
|
|
293
|
+
screen_probe_texel_pdf[t] = pdf;
|
|
294
|
+
local_sum += pdf;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
let total = screen_probe_workgroup_sum(vec4<f32>(local_sum, 0.0, 0.0, 0.0), lane, subgroup_lane, subgroup_size).x;
|
|
298
|
+
let inverse = 1.0 / max(total, 1e-4);
|
|
299
|
+
|
|
300
|
+
for (var t = lane; t < texels; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
301
|
+
textureStore(screen_probe_lighting_pdf, screen_probe_texel(probe, t), vec4<f32>(screen_probe_texel_pdf[t] * inverse, 0.0, 0.0, 0.0));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
`, [
|
|
305
|
+
chunk_screen_probe,
|
|
306
|
+
chunk_screen_probe_counts,
|
|
307
|
+
chunk_screen_probe_ray_jitter,
|
|
308
|
+
chunk_screen_probe_workgroup_sum,
|
|
309
|
+
chunk_folded_workgroup_index,
|
|
310
|
+
chunk_screen_probe_lighting_history,
|
|
311
|
+
chunk_rgb_to_luminance,
|
|
312
|
+
chunk_probe_clipmap_sample_radiance,
|
|
313
|
+
]),
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const rays_resources = new ShaderResourceSetDescriptor();
|
|
317
|
+
|
|
318
|
+
rays_resources.createGroup()
|
|
319
|
+
.add(SCREEN_PROBE_FRAME_RESOURCE)
|
|
320
|
+
.add(SCREEN_PROBES_READ_RESOURCE)
|
|
321
|
+
.add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
|
|
322
|
+
.add(SCREEN_PROBE_BRDF_READ_RESOURCE)
|
|
323
|
+
.add(SCREEN_PROBE_LIGHTING_PDF_READ_RESOURCE)
|
|
324
|
+
.add(SCREEN_PROBE_RAY_INFO_WRITE_RESOURCE);
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* A probe's rays (Lumen's `ScreenProbeGenerateRaysCS`): a workgroup a probe, its lanes over its n² rays, each written
|
|
328
|
+
* as the texel and level it falls in (`screen_probe_ray_info_pack`), a ray's slot its place in the sorted order.
|
|
329
|
+
*
|
|
330
|
+
* 1. **Density**: each texel's BRDF density at its centre, `max(0, Σ brdf·Y(ω))`; times its lighting density · n².
|
|
331
|
+
* A texel any of whose directions the BRDF density reaches `SCREEN_PROBE_MIN_PDF` is held there
|
|
332
|
+
* (`screen_probe_brdf_keeps`), so the light ranks texels and only the pixels' lobes cull one; another falls under
|
|
333
|
+
* it unless its light lifts it.
|
|
334
|
+
* 2. **Sort**: the probe's own rays, ascending by density, ties in index order (`screen_probe_ray_sort`: the engine's
|
|
335
|
+
* bitonic network in the workgroup's memory, O(n² log² n) a probe, where Lumen ranks every ray against every other,
|
|
336
|
+
* O(n⁴)).
|
|
337
|
+
* 3. **Reassignment**: the sorted rays in threes from the lowest; a three whose highest is under the minimum gives
|
|
338
|
+
* its rays to the highest texel not yet given, from the top: that texel splits into its four children at twice the
|
|
339
|
+
* resolution, the three take three children and the texel the fourth. One level only, as Lumen's parallel path.
|
|
340
|
+
* A child holds a quarter of its parent's solid angle (the map is equal-area), which the composite weighs it by.
|
|
341
|
+
*
|
|
342
|
+
* With importance sampling off, or where the probe stands on no surface, ray i is texel i at the probe's own n.
|
|
343
|
+
*
|
|
344
|
+
* @type {ComputeShader}
|
|
345
|
+
*/
|
|
346
|
+
export const shader_screen_probe_generate_rays = ComputeShader.from({
|
|
347
|
+
label: "Screen Probe Generate Rays",
|
|
348
|
+
resources: rays_resources,
|
|
349
|
+
body: CodeChunk.from(
|
|
350
|
+
//language=WGSL
|
|
351
|
+
`
|
|
352
|
+
const SCREEN_PROBE_TEXEL_LIMIT = ${SCREEN_PROBE_OCTAHEDRON_LIMIT * SCREEN_PROBE_OCTAHEDRON_LIMIT}u;
|
|
353
|
+
|
|
354
|
+
var<workgroup> screen_probe_split: atomic<u32>;
|
|
355
|
+
|
|
356
|
+
fn screen_probe_brdf_of(probe: u32) -> ScreenProbeBRDF {
|
|
357
|
+
return ScreenProbeBRDF(screen_probe_brdf[probe * 3u], screen_probe_brdf[probe * 3u + 1u], screen_probe_brdf[probe * 3u + 2u].x);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
@compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
|
|
361
|
+
fn main(
|
|
362
|
+
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
|
363
|
+
@builtin(local_invocation_index) lane: u32,
|
|
364
|
+
) {
|
|
365
|
+
let probe = folded_workgroup_index(workgroup_id);
|
|
366
|
+
|
|
367
|
+
if (probe >= screen_probe_count()) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
let frame = screen_probe_frame;
|
|
372
|
+
let n = frame.octahedron_resolution;
|
|
373
|
+
let count = n * n;
|
|
374
|
+
let record = screen_probes[probe];
|
|
375
|
+
|
|
376
|
+
if (frame.importance_sampling == 0u || record.depth <= 0.0) {
|
|
377
|
+
for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
378
|
+
textureStore(screen_probe_ray_info, screen_probe_texel(probe, t), vec4<u32>(screen_probe_ray_info_pack(vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift), 1u), 0u, 0u, 0u));
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
let scale = f32(count);
|
|
385
|
+
let brdf = screen_probe_brdf_of(probe);
|
|
386
|
+
|
|
387
|
+
for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
388
|
+
let texel = vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift);
|
|
389
|
+
let direction = uv_equal_area_sphere_decode((vec2<f32>(texel) + 0.5) / f32(n));
|
|
390
|
+
|
|
391
|
+
let density = screen_probe_brdf_density(brdf, direction);
|
|
392
|
+
let lighting = textureLoad(screen_probe_lighting_pdf, screen_probe_texel(probe, t), 0).r;
|
|
393
|
+
|
|
394
|
+
var pdf = density * lighting * scale;
|
|
395
|
+
|
|
396
|
+
// the light ranks what the lobes keep, it culls nothing
|
|
397
|
+
if (screen_probe_brdf_keeps(brdf, texel, n)) {
|
|
398
|
+
pdf = max(pdf, ${SCREEN_PROBE_MIN_PDF});
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// held off −0, so the density's bits order as it does
|
|
402
|
+
screen_probe_sort[t] = vec2<u32>(screen_probe_ray_info_pack(texel, 1u), bitcast<u32>(abs(pdf)));
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
if (lane == 0u) {
|
|
406
|
+
atomicStore(&screen_probe_split, 0u);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
workgroupBarrier();
|
|
410
|
+
|
|
411
|
+
screen_probe_ray_sort(lane, ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u, count);
|
|
412
|
+
|
|
413
|
+
// threes of the lowest under the minimum give their rays to the highest, one texel each from the top
|
|
414
|
+
for (var i = lane; i < count; i += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
415
|
+
let three = i / 3u;
|
|
416
|
+
let member = i - 3u * three;
|
|
417
|
+
let split = count - 1u - three;
|
|
418
|
+
let highest = 3u * three + 2u;
|
|
419
|
+
|
|
420
|
+
if (highest < split && bitcast<f32>(screen_probe_sort[count + highest].y) < ${SCREEN_PROBE_MIN_PDF}) {
|
|
421
|
+
let parent = screen_probe_sort[count + split].x;
|
|
422
|
+
let child = screen_probe_ray_info_texel(parent) * 2u + vec2<u32>((member + 1u) & 1u, (member + 1u) >> 1u);
|
|
423
|
+
|
|
424
|
+
screen_probe_sort[count + i] = vec2<u32>(screen_probe_ray_info_pack(child, screen_probe_ray_info_level(parent) - 1u), 0u);
|
|
425
|
+
|
|
426
|
+
if (member == 0u) {
|
|
427
|
+
atomicAdd(&screen_probe_split, 1u);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
workgroupBarrier();
|
|
433
|
+
|
|
434
|
+
let split_count = atomicLoad(&screen_probe_split);
|
|
435
|
+
|
|
436
|
+
// and each split texel takes its first child
|
|
437
|
+
for (var i = lane; i < split_count; i += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
438
|
+
let at = count + count - 1u - i;
|
|
439
|
+
let parent = screen_probe_sort[at].x;
|
|
440
|
+
|
|
441
|
+
screen_probe_sort[at] = vec2<u32>(screen_probe_ray_info_pack(screen_probe_ray_info_texel(parent) * 2u, screen_probe_ray_info_level(parent) - 1u), 0u);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
workgroupBarrier();
|
|
445
|
+
|
|
446
|
+
for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
|
|
447
|
+
textureStore(screen_probe_ray_info, screen_probe_texel(probe, t), vec4<u32>(screen_probe_sort[count + t].x, 0u, 0u, 0u));
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
`, [
|
|
451
|
+
chunk_screen_probe,
|
|
452
|
+
chunk_screen_probe_counts,
|
|
453
|
+
chunk_folded_workgroup_index,
|
|
454
|
+
chunk_screen_probe_ray_sort,
|
|
455
|
+
chunk_screen_probe_brdf_density,
|
|
456
|
+
]),
|
|
457
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The screen probes' deferred indirect light in one pass, for SSR off: the diffuse is the screen probes' (the temporal
|
|
3
|
+
* filter's output, E at the bent normal), and the specular the world-space probes', picked and resolved as the probe
|
|
4
|
+
* clipmap's fused pass takes it (`probe_clipmap_radiance_of`), the environment's where no probe weighs anything. The
|
|
5
|
+
* two are resolved as `shader_resolve_indirect_lighting` resolves the IBL pair: AO multiplies the diffuse, the
|
|
6
|
+
* specular is occluded along its lobe, and the result is added to the scene's colour.
|
|
7
|
+
*
|
|
8
|
+
* @type {ImageShader}
|
|
9
|
+
*/
|
|
10
|
+
export const shader_screen_probe_indirect_lighting: ImageShader;
|
|
11
|
+
/**
|
|
12
|
+
* The screen probes' deferred diffuse, for SSR on: the temporal filter's output, E at the bent normal, times AO, as
|
|
13
|
+
* the IBL pass bakes AO in at the source, so `shader_resolve_indirect_lighting` and SSR's hits read it as any mode's.
|
|
14
|
+
*
|
|
15
|
+
* @type {ImageShader}
|
|
16
|
+
*/
|
|
17
|
+
export const shader_screen_probe_diffuse: ImageShader;
|
|
18
|
+
/**
|
|
19
|
+
* Keep the frame's lit colour of the opaque surfaces for the next frame's screen traces: a thread a pixel, copied as
|
|
20
|
+
* it stands once the indirect light is added, before fog and transparencies, which are not the surfaces' radiance.
|
|
21
|
+
*
|
|
22
|
+
* @type {ComputeShader}
|
|
23
|
+
*/
|
|
24
|
+
export const shader_screen_probe_color_capture: ComputeShader;
|
|
25
|
+
import { ImageShader } from "../../shader/ImageShader.js";
|
|
26
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
27
|
+
//# sourceMappingURL=shader_screen_probe_indirect_lighting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_screen_probe_indirect_lighting.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.js"],"names":[],"mappings":"AAmDA;;;;;;;;GAQG;AACH,oDAFU,WAAW,CA8FlB;AAQH;;;;;GAKG;AACH,0CAFU,WAAW,CAyBlB;AAQH;;;;;GAKG;AACH,gDAFU,aAAa,CAiBpB;4BAxMyB,6BAA6B;8BAD3B,+BAA+B"}
|