@woosh/meep-engine 3.53.0 → 3.54.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/core/math/noise/worley_noise_2d.d.ts +14 -0
- package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
- package/src/core/math/noise/worley_noise_2d.js +74 -0
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +447 -450
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -22
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +892 -951
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/generation/foliage/FOLIAGE_DESIGN.md +2 -1
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +4 -3
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/BarkMaterialConfig.js +6 -6
- package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
- package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageBarkType.js +16 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +58 -5
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -181
- package/src/generation/foliage/index.d.ts +2 -1
- package/src/generation/foliage/index.js +44 -43
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_bark_material.js +23 -95
- package/src/generation/foliage/material/make_foliage_material.d.ts +29 -3
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_foliage_material.js +605 -359
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -1
- package/src/generation/foliage/mesh/branch_collar_project.js +205 -203
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +15 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -502
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -1047
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +2 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -415
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +870 -837
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -121
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +10 -7
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -179
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -1104
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +6 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
- package/src/shade/playground/foliage_wind/foliage_world.js +602 -593
- package/src/shade/playground/foliage_wind/index.html +260 -254
- package/src/shade/playground/foliage_wind/main.js +275 -263
- 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/geometry/sdf/GPUGeometrySDFManager.js +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
- package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
- 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 +67 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +21 -38
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
- package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
- package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
- package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
|
@@ -1,27 +1,30 @@
|
|
|
1
|
-
import { RenderPipelineDescriptor } from "../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
|
|
2
1
|
import { DepthStencilState } from "../../../descriptor/pipeline/render/DepthStencilState.js";
|
|
3
|
-
import {
|
|
2
|
+
import { RenderPipelineDescriptor } from "../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
|
|
4
3
|
import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
5
4
|
import { chunk_sample_volumetrics } from "../../deferred/chunk_sample_volumetrics.js";
|
|
6
5
|
import { AVBOIT_EXTINCT_TRANSMITTANCE } from "../../rasterize/native/avboit/AVBOIT_CONSTANTS.js";
|
|
7
|
-
import { AVBOIT_WARP_STRUCT } from "../../rasterize/native/avboit/AVBOIT_WARP_STRUCT.js";
|
|
8
6
|
import { AVBOIT_DRAW_TARGETS } from "../../rasterize/native/avboit/avboit_draw_fragment_body.js";
|
|
9
|
-
import {
|
|
7
|
+
import { AVBOIT_WARP_STRUCT } from "../../rasterize/native/avboit/AVBOIT_WARP_STRUCT.js";
|
|
10
8
|
import { chunk_avboit_footprint_bias } from "../../rasterize/native/avboit/chunk_avboit_footprint_bias.js";
|
|
11
9
|
import { chunk_avboit_sample_transmittance } from "../../rasterize/native/avboit/chunk_avboit_sample_transmittance.js";
|
|
12
|
-
import {
|
|
10
|
+
import { chunk_avboit_view_depth_to_virtual } from "../../rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js";
|
|
13
11
|
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
14
12
|
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
13
|
+
import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
|
|
14
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
15
15
|
import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
16
|
-
import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
|
|
17
16
|
import { chunk_view_mip_bias } from "../../view/chunk_view_mip_bias.js";
|
|
17
|
+
import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
|
|
18
|
+
import {
|
|
19
|
+
irradiance_clipmap_add_resources
|
|
20
|
+
} from "../../volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js";
|
|
18
21
|
import { VOLUMETRICS_METADATA_STRUCT } from "../../volumetrics/VOLUMETRICS_METADATA_STRUCT.js";
|
|
19
22
|
import { EMITTER_FLAG } from "../data/PARTICLE_EMITTER_STRUCT.js";
|
|
20
23
|
import { PARTICLE_SOFT_FADE_RANGE } from "../ParticleConstants.js";
|
|
21
24
|
import { chunk_particle_avboit_contribution } from "./chunk_particle_avboit_contribution.js";
|
|
22
|
-
import { chunk_particle_scene_view_depth } from "./chunk_particle_scene_view_depth.js";
|
|
23
25
|
import { chunk_particle_billboard_vertex } from "./chunk_particle_billboard_vertex.js";
|
|
24
26
|
import { chunk_particle_lighting } from "./chunk_particle_lighting.js";
|
|
27
|
+
import { chunk_particle_scene_view_depth } from "./chunk_particle_scene_view_depth.js";
|
|
25
28
|
|
|
26
29
|
/**
|
|
27
30
|
* The particles' AVBOIT draw: the billboard quads at internal resolution, depth-tested against the
|
|
@@ -30,28 +33,13 @@ import { chunk_particle_lighting } from "./chunk_particle_lighting.js";
|
|
|
30
33
|
*
|
|
31
34
|
* Per fragment: the atlas sample times the particle colour, the soft-depth fade against the scene
|
|
32
35
|
* depth, lighting for an emitter flagged `EMITTER_FLAG.LIGHTING` (`chunk_particle_lighting`: the
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* and a fragment the volume already calls extinct is discarded unshaded. An emitter without the
|
|
36
|
-
* flag is its own colour, which is what an additive one wants.
|
|
37
|
-
*
|
|
38
|
-
* What is written depends on how the particle blends:
|
|
39
|
-
*
|
|
40
|
-
* - **alpha / premultiplied** — a surface: `color += premultiplied × T`, `norm += coverage × T`,
|
|
41
|
-
* `extinction += -log(1 - coverage)`, the same three the meshes write, with an untinted
|
|
42
|
-
* `T_self = 1 - coverage`; the splat recorded exactly that.
|
|
43
|
-
* - **additive** — light: `emission += premultiplied × T`, nothing else. It joins the resolve
|
|
44
|
-
* attenuated by what is in front of it and outside the coverage normalization, which is what an
|
|
45
|
-
* additive fragment means.
|
|
46
|
-
*
|
|
47
|
-
* The scene depth is bound twice: as the read-only depth attachment the pipeline tests against, and
|
|
48
|
-
* as the texture the soft fade reads. Both are reads, which WebGPU allows within one pass; the pass
|
|
49
|
-
* is recorded with the attachment read-only for that reason.
|
|
36
|
+
* world-space irradiance clipmap and cached far-field SH), the volumetric fog composite, then the
|
|
37
|
+
* transmittance of everything in front from the integral texture.
|
|
50
38
|
*/
|
|
51
39
|
|
|
52
40
|
const resources = new ShaderResourceSetDescriptor();
|
|
53
41
|
|
|
54
|
-
resources.createGroup()
|
|
42
|
+
const group = resources.createGroup()
|
|
55
43
|
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
56
44
|
.addUniform("view", VIEW_UNIFORM_STRUCT)
|
|
57
45
|
.addStorageBuffer("warp", AVBOIT_WARP_STRUCT)
|
|
@@ -67,10 +55,10 @@ resources.createGroup()
|
|
|
67
55
|
// volumetrics (composited inline)
|
|
68
56
|
.addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
|
|
69
57
|
.addTexture("tVolumetrics", "float", "3d")
|
|
70
|
-
.addTexture("tSTBN_vec3", "float", "3d")
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
58
|
+
.addTexture("tSTBN_vec3", "float", "3d");
|
|
59
|
+
|
|
60
|
+
// lighting (chunk_particle_lighting): world-space irradiance clipmap + cached far-field SH fallback
|
|
61
|
+
irradiance_clipmap_add_resources(group, { include_far_field: true });
|
|
74
62
|
|
|
75
63
|
const body = CodeChunk.from(
|
|
76
64
|
/* language=wgsl */ `
|
|
@@ -111,16 +99,11 @@ fn vs_general(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32
|
|
|
111
99
|
|
|
112
100
|
@fragment
|
|
113
101
|
fn fs_main(in : ParticleVertexOut) -> ParticleAVBOITDrawOutput {
|
|
114
|
-
let screen_uv = in.clip.xy / vec2<f32>(f32(view.width), f32(view.height));
|
|
115
|
-
let uv_bias = view_uv_derivative_bias(view.upscale_ratio);
|
|
116
|
-
let uv_ddx = dpdx(in.uv) * uv_bias.x;
|
|
102
|
+
let screen_uv = in.clip.xy / vec2<f32>(f32(view.width), f32(view.height));
|
|
103
|
+
let uv_bias = view_uv_derivative_bias(view.upscale_ratio);
|
|
104
|
+
let uv_ddx = dpdx(in.uv) * uv_bias.x;
|
|
117
105
|
let uv_ddy = dpdy(in.uv) * uv_bias.y;
|
|
118
106
|
|
|
119
|
-
// a billboard, stretched or not, is built from the camera's right and up and lies in the view plane,
|
|
120
|
-
// so its footprint is zero; a horizontal, vertical or world-facing quad seen at an angle runs
|
|
121
|
-
// through depth across a voxel (avboit_footprint_bias). An additive particle writes nothing into
|
|
122
|
-
// the volume, so nothing of its own is there to occlude it, and takes none. The derivative is
|
|
123
|
-
// taken here, in uniform control flow, whatever the blend
|
|
124
107
|
let footprint = select(
|
|
125
108
|
avboit_footprint_bias(&warp, fwidth(avboit_view_depth_to_virtual(&warp, in.view_depth))),
|
|
126
109
|
0.0,
|
|
@@ -170,7 +153,7 @@ fn fs_main(in : ParticleVertexOut) -> ParticleAVBOITDrawOutput {
|
|
|
170
153
|
chunk_sample_volumetrics,
|
|
171
154
|
chunk_avboit_view_depth_to_virtual,
|
|
172
155
|
chunk_avboit_footprint_bias,
|
|
173
|
-
chunk_avboit_sample_transmittance,
|
|
156
|
+
chunk_avboit_sample_transmittance,
|
|
174
157
|
chunk_view_mip_bias,
|
|
175
158
|
]);
|
|
176
159
|
|
|
@@ -53,7 +53,7 @@ export class NSS {
|
|
|
53
53
|
* @returns {number}
|
|
54
54
|
*/
|
|
55
55
|
static recommended_jitter_sequence_size(upscale_ratio: number): number;
|
|
56
|
-
static "__#
|
|
56
|
+
static "__#203@#preprocess_tensor_descriptor"(render_w: any, render_h: any): TextureResourceDescriptor;
|
|
57
57
|
/**
|
|
58
58
|
* @param {GraphicsContext} graphics
|
|
59
59
|
*/
|
package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_query_depth_from_screen_space_bb.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_query_depth_from_screen_space_bb.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qDAFU,SAAS,CAsDZ;0BA7DmB,6BAA6B"}
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
2
|
-
import { AABB3_STRUCT } from "../geometry/aabb3/AABB3_STRUCT.js";
|
|
3
|
-
import { chunk_min4 } from "../math/chunk_min4.js";
|
|
4
|
-
import { chunk_ndc_to_uv } from "../texture/chunk_ndc_to_uv.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
let
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
let
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
let
|
|
42
|
-
let
|
|
43
|
-
let
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
let
|
|
47
|
-
let
|
|
48
|
-
let
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
chunk_ndc_to_uv
|
|
62
|
-
]);
|
|
1
|
+
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
2
|
+
import { AABB3_STRUCT } from "../geometry/aabb3/AABB3_STRUCT.js";
|
|
3
|
+
import { chunk_min4 } from "../math/chunk_min4.js";
|
|
4
|
+
import { chunk_ndc_to_uv } from "../texture/chunk_ndc_to_uv.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* TODO check out this post https://x.com/anki3d/status/1713238150418518023
|
|
8
|
+
* @type {CodeChunk}
|
|
9
|
+
*/
|
|
10
|
+
export const chunk_query_depth_from_screen_space_bb = CodeChunk.from(
|
|
11
|
+
//language=WGSL
|
|
12
|
+
`
|
|
13
|
+
fn query_depth_from_screen_space_bb(
|
|
14
|
+
pb: ${AABB3_STRUCT.wgsl_ref},
|
|
15
|
+
hzb: texture_2d<f32>,
|
|
16
|
+
) -> f32 {
|
|
17
|
+
var n_min = saturate( ndc_to_uv(pb.min.xy) );
|
|
18
|
+
var n_max = saturate( ndc_to_uv(pb.max.xy) );
|
|
19
|
+
|
|
20
|
+
let bb_dim = abs(n_max - n_min);
|
|
21
|
+
|
|
22
|
+
let hzb_size_u = textureDimensions(hzb);
|
|
23
|
+
let hzb_size_f = vec2<f32>(hzb_size_u);
|
|
24
|
+
|
|
25
|
+
let bb_dim_hz = bb_dim * hzb_size_f;
|
|
26
|
+
|
|
27
|
+
let longest_edge = max(bb_dim_hz.x, bb_dim_hz.y);
|
|
28
|
+
|
|
29
|
+
let mip_level_count = textureNumLevels(hzb);
|
|
30
|
+
|
|
31
|
+
let mip_level = min(
|
|
32
|
+
u32( ceil(log2( max(longest_edge, 1.0) ) ) ),
|
|
33
|
+
mip_level_count - 1
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let mip_resolution = textureDimensions(hzb, mip_level);
|
|
37
|
+
let mip_resolution_f = vec2<f32>(mip_resolution);
|
|
38
|
+
let max_coord = mip_resolution - vec2(1u);
|
|
39
|
+
|
|
40
|
+
// sample 4 corners, we know that they fit in a 2x2 footprint at most
|
|
41
|
+
let p0 = min(vec2<u32>(n_min * mip_resolution_f), max_coord);
|
|
42
|
+
let p3 = min(vec2<u32>(n_max * mip_resolution_f), max_coord);
|
|
43
|
+
let p1 = vec2(p3.x, p0.y);
|
|
44
|
+
let p2 = vec2(p0.x, p3.y);
|
|
45
|
+
|
|
46
|
+
let d0 = textureLoad(hzb, p0, mip_level).x;
|
|
47
|
+
let d1 = textureLoad(hzb, p1, mip_level).x;
|
|
48
|
+
let d2 = textureLoad(hzb, p2, mip_level).x;
|
|
49
|
+
let d3 = textureLoad(hzb, p3, mip_level).x;
|
|
50
|
+
|
|
51
|
+
// value that's most far away from us
|
|
52
|
+
let min_depth = min4(d0, d1, d2, d3);
|
|
53
|
+
|
|
54
|
+
let depth_delta = pb.max.z - min_depth;
|
|
55
|
+
|
|
56
|
+
return depth_delta;
|
|
57
|
+
}
|
|
58
|
+
`, [
|
|
59
|
+
AABB3_STRUCT.declaration_chunk,
|
|
60
|
+
chunk_min4,
|
|
61
|
+
chunk_ndc_to_uv
|
|
62
|
+
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_hash_lowbias32_vec2u.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,yCAFU,SAAS,CAclB;0BAlByB,gCAAgC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_hash_lowbias32 } from "../chunk_hash_lowbias32.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @type {CodeChunk}
|
|
6
|
+
*/
|
|
7
|
+
export const chunk_hash_lowbias32_vec2u = CodeChunk.from(
|
|
8
|
+
//language=WGSL
|
|
9
|
+
`
|
|
10
|
+
fn hash_lowbias32_vec2u(v:vec2<u32>) -> u32{
|
|
11
|
+
let combined = v.x * 0x85ebca6bu +
|
|
12
|
+
v.y * 0xc2b2ae35u;
|
|
13
|
+
|
|
14
|
+
return hash_lowbias32(combined);
|
|
15
|
+
}
|
|
16
|
+
`,[
|
|
17
|
+
chunk_hash_lowbias32,
|
|
18
|
+
]
|
|
19
|
+
)
|
package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_ffx_sssr_get_mip_resolution.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_ffx_sssr_get_mip_resolution.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js"],"names":[],"mappings":"AAGA,0DAUE;0BAbwB,6BAA6B"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
2
|
+
import { SCREEN_HZB_RESOURCE } from "./SCREEN_SPACE_RESOURCES.js";
|
|
3
|
+
|
|
4
|
+
export const chunk_ffx_sssr_get_mip_resolution = CodeChunk.from(
|
|
5
|
+
//language=WGSL
|
|
6
|
+
`
|
|
7
|
+
fn ffx_sssr_get_mip_resolution(screen_dimensions:vec2<f32>, mip_level:i32) -> vec2<f32>{
|
|
8
|
+
if (mip_level <= 0) {
|
|
9
|
+
return screen_dimensions;
|
|
10
|
+
}
|
|
11
|
+
return vec2<f32>(textureDimensions(tHZB, mip_level - 1));
|
|
12
|
+
}
|
|
13
|
+
`
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
chunk_ffx_sssr_get_mip_resolution.requireResource(SCREEN_HZB_RESOURCE);
|
package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_ffx_sssr_hierarchical_raymarch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,mDAFU,SAAS,
|
|
1
|
+
{"version":3,"file":"chunk_ffx_sssr_hierarchical_raymarch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,mDAFU,SAAS,CAuGZ;0BApHmB,6BAA6B"}
|
package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js
CHANGED
|
@@ -1,117 +1,118 @@
|
|
|
1
|
-
import { chunk_is_background } from "../depth/chunk_is_background.js";
|
|
2
|
-
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
3
|
-
import { chunk_rcp_v2 } from "../geometry/vec2/chunk_rcp_v2.js";
|
|
4
|
-
import { F32_MAX_DEFINITION } from "../math/F32_MAX_DEFINITION.js";
|
|
5
|
-
import { chunk_ffx_sssr_advance_ray } from "./chunk_ffx_sssr_advance_ray.js";
|
|
6
|
-
import { chunk_ffx_sssr_get_mip_resolution } from "./chunk_ffx_sssr_get_mip_resolution.js";
|
|
7
|
-
import { chunk_ffx_sssr_initial_advance_ray } from "./chunk_ffx_sssr_initial_advance_ray.js";
|
|
8
|
-
import { chunk_ffx_sssr_load_depth } from "./chunk_ffx_sssr_load_depth.js";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
*
|
|
12
|
-
* Requires origin and direction of the ray to be in screen space [0, 1] x [0, 1]
|
|
13
|
-
* NOTE: "low occupancy" exit was removed, as WebGPU doesn't have pre-requisite API for it
|
|
14
|
-
* @see https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/1bbe66e7ea0d358e84af4471a90aa9c35b583de0/samples/hybridreflections/shaders/ffx_sssr_intersect.h#L110
|
|
15
|
-
* @type {CodeChunk}
|
|
16
|
-
*/
|
|
17
|
-
export const chunk_ffx_sssr_hierarchical_raymarch = CodeChunk.from(
|
|
18
|
-
//language=WGSL
|
|
19
|
-
`
|
|
20
|
-
fn ffx_sssr_hierarchical_raymarch(
|
|
21
|
-
origin: vec3<f32>,
|
|
22
|
-
direction: vec3<f32>,
|
|
23
|
-
screen_size: vec2<f32>,
|
|
24
|
-
most_detailed_mip: i32,
|
|
25
|
-
max_traversal_intersections:u32,
|
|
26
|
-
valid_hit: ptr<function, bool>,
|
|
27
|
-
_num_iters: ptr<function, u32>,
|
|
28
|
-
) -> vec3<f32> {
|
|
29
|
-
|
|
30
|
-
let inv_direction = select( vec3(F32_MAX), 1.0 / direction, abs(direction) > vec3(1.0e-12));
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
var current_mip_resolution = ffx_sssr_get_mip_resolution(screen_size, current_mip);
|
|
37
|
-
var current_mip_resolution_inv = 1.0 / (current_mip_resolution);
|
|
38
|
-
|
|
39
|
-
// Offset to the bounding boxes uv space to intersect the ray with the center of the next pixel.
|
|
40
|
-
// This means we ever so slightly over shoot into the next region.
|
|
41
|
-
var uv_offset = 0.005 * exp2(f32(most_detailed_mip)) / screen_size;
|
|
42
|
-
uv_offset = select( uv_offset, -uv_offset, direction.xy < vec2(0.0) );
|
|
43
|
-
|
|
44
|
-
// Offset applied depending on current mip resolution to move the boundary to the left/right upper/lower border depending on ray direction.
|
|
45
|
-
let floor_offset = select(vec2(1.0), vec2(0.0), direction.xy < vec2(0.0)); // TODO can replace with 'step'
|
|
46
|
-
|
|
47
|
-
// Initially advance ray to avoid immediate self intersections.
|
|
48
|
-
var current_t:f32;
|
|
49
|
-
var position:vec3<f32>;
|
|
50
|
-
|
|
51
|
-
ffx_sssr_initial_advance_ray(
|
|
52
|
-
origin,
|
|
53
|
-
direction,
|
|
54
|
-
inv_direction,
|
|
55
|
-
current_mip_resolution,
|
|
56
|
-
current_mip_resolution_inv,
|
|
57
|
-
floor_offset,
|
|
58
|
-
uv_offset,
|
|
59
|
-
&position,
|
|
60
|
-
¤t_t
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
var i = 0u;
|
|
64
|
-
for (
|
|
65
|
-
;
|
|
66
|
-
i < max_traversal_intersections && current_mip >= most_detailed_mip;
|
|
67
|
-
i++
|
|
68
|
-
) {
|
|
69
|
-
|
|
70
|
-
if (any(position.xy > vec2(1.0, 1.0)) || any(position.xy < vec2(0.0, 0.0))){
|
|
71
|
-
// outside of the viewport
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (is_background(position.z)){
|
|
76
|
-
// hit sky/background, out of Z bounds basically
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
let current_mip_position = current_mip_resolution * position.xy;
|
|
81
|
-
let surface_z = ffx_sssr_load_depth(vec2<i32>(current_mip_position), current_mip);
|
|
82
|
-
|
|
83
|
-
let skipped_tile = ffx_sssr_advance_ray(
|
|
84
|
-
origin,
|
|
85
|
-
direction,
|
|
86
|
-
inv_direction,
|
|
87
|
-
current_mip_position,
|
|
88
|
-
current_mip_resolution_inv,
|
|
89
|
-
floor_offset,
|
|
90
|
-
uv_offset,
|
|
91
|
-
surface_z,
|
|
92
|
-
&position,
|
|
93
|
-
¤t_t
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
current_mip
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
1
|
+
import { chunk_is_background } from "../depth/chunk_is_background.js";
|
|
2
|
+
import { CodeChunk } from "../../compiler/CodeChunk.js";
|
|
3
|
+
import { chunk_rcp_v2 } from "../geometry/vec2/chunk_rcp_v2.js";
|
|
4
|
+
import { F32_MAX_DEFINITION } from "../math/F32_MAX_DEFINITION.js";
|
|
5
|
+
import { chunk_ffx_sssr_advance_ray } from "./chunk_ffx_sssr_advance_ray.js";
|
|
6
|
+
import { chunk_ffx_sssr_get_mip_resolution } from "./chunk_ffx_sssr_get_mip_resolution.js";
|
|
7
|
+
import { chunk_ffx_sssr_initial_advance_ray } from "./chunk_ffx_sssr_initial_advance_ray.js";
|
|
8
|
+
import { chunk_ffx_sssr_load_depth } from "./chunk_ffx_sssr_load_depth.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
* Requires origin and direction of the ray to be in screen space [0, 1] x [0, 1]
|
|
13
|
+
* NOTE: "low occupancy" exit was removed, as WebGPU doesn't have pre-requisite API for it
|
|
14
|
+
* @see https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/1bbe66e7ea0d358e84af4471a90aa9c35b583de0/samples/hybridreflections/shaders/ffx_sssr_intersect.h#L110
|
|
15
|
+
* @type {CodeChunk}
|
|
16
|
+
*/
|
|
17
|
+
export const chunk_ffx_sssr_hierarchical_raymarch = CodeChunk.from(
|
|
18
|
+
//language=WGSL
|
|
19
|
+
`
|
|
20
|
+
fn ffx_sssr_hierarchical_raymarch(
|
|
21
|
+
origin: vec3<f32>,
|
|
22
|
+
direction: vec3<f32>,
|
|
23
|
+
screen_size: vec2<f32>,
|
|
24
|
+
most_detailed_mip: i32,
|
|
25
|
+
max_traversal_intersections:u32,
|
|
26
|
+
valid_hit: ptr<function, bool>,
|
|
27
|
+
_num_iters: ptr<function, u32>,
|
|
28
|
+
) -> vec3<f32> {
|
|
29
|
+
|
|
30
|
+
let inv_direction = select( vec3(F32_MAX), 1.0 / direction, abs(direction) > vec3(1.0e-12));
|
|
31
|
+
let max_mip = i32(textureNumLevels(tHZB));
|
|
32
|
+
|
|
33
|
+
// Start on mip with highest detail.
|
|
34
|
+
var current_mip = min(most_detailed_mip, max_mip);
|
|
35
|
+
|
|
36
|
+
var current_mip_resolution = ffx_sssr_get_mip_resolution(screen_size, current_mip);
|
|
37
|
+
var current_mip_resolution_inv = 1.0 / (current_mip_resolution);
|
|
38
|
+
|
|
39
|
+
// Offset to the bounding boxes uv space to intersect the ray with the center of the next pixel.
|
|
40
|
+
// This means we ever so slightly over shoot into the next region.
|
|
41
|
+
var uv_offset = 0.005 * exp2(f32(most_detailed_mip)) / screen_size;
|
|
42
|
+
uv_offset = select( uv_offset, -uv_offset, direction.xy < vec2(0.0) );
|
|
43
|
+
|
|
44
|
+
// Offset applied depending on current mip resolution to move the boundary to the left/right upper/lower border depending on ray direction.
|
|
45
|
+
let floor_offset = select(vec2(1.0), vec2(0.0), direction.xy < vec2(0.0)); // TODO can replace with 'step'
|
|
46
|
+
|
|
47
|
+
// Initially advance ray to avoid immediate self intersections.
|
|
48
|
+
var current_t:f32;
|
|
49
|
+
var position:vec3<f32>;
|
|
50
|
+
|
|
51
|
+
ffx_sssr_initial_advance_ray(
|
|
52
|
+
origin,
|
|
53
|
+
direction,
|
|
54
|
+
inv_direction,
|
|
55
|
+
current_mip_resolution,
|
|
56
|
+
current_mip_resolution_inv,
|
|
57
|
+
floor_offset,
|
|
58
|
+
uv_offset,
|
|
59
|
+
&position,
|
|
60
|
+
¤t_t
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
var i = 0u;
|
|
64
|
+
for (
|
|
65
|
+
;
|
|
66
|
+
i < max_traversal_intersections && current_mip >= most_detailed_mip;
|
|
67
|
+
i++
|
|
68
|
+
) {
|
|
69
|
+
|
|
70
|
+
if (any(position.xy > vec2(1.0, 1.0)) || any(position.xy < vec2(0.0, 0.0))){
|
|
71
|
+
// outside of the viewport
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (is_background(position.z)){
|
|
76
|
+
// hit sky/background, out of Z bounds basically
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let current_mip_position = current_mip_resolution * position.xy;
|
|
81
|
+
let surface_z = ffx_sssr_load_depth(vec2<i32>(current_mip_position), current_mip);
|
|
82
|
+
|
|
83
|
+
let skipped_tile = ffx_sssr_advance_ray(
|
|
84
|
+
origin,
|
|
85
|
+
direction,
|
|
86
|
+
inv_direction,
|
|
87
|
+
current_mip_position,
|
|
88
|
+
current_mip_resolution_inv,
|
|
89
|
+
floor_offset,
|
|
90
|
+
uv_offset,
|
|
91
|
+
surface_z,
|
|
92
|
+
&position,
|
|
93
|
+
¤t_t
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
current_mip = min(current_mip + select(-1, 1, skipped_tile), max_mip);
|
|
97
|
+
if (current_mip >= most_detailed_mip) {
|
|
98
|
+
current_mip_resolution = ffx_sssr_get_mip_resolution(screen_size, current_mip);
|
|
99
|
+
current_mip_resolution_inv = 1.0 / current_mip_resolution;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
*_num_iters = i;
|
|
105
|
+
|
|
106
|
+
*valid_hit = (current_mip <= most_detailed_mip && i > 0);
|
|
107
|
+
|
|
108
|
+
return position;
|
|
109
|
+
}
|
|
110
|
+
`, [
|
|
111
|
+
F32_MAX_DEFINITION,
|
|
112
|
+
chunk_rcp_v2,
|
|
113
|
+
chunk_ffx_sssr_get_mip_resolution,
|
|
114
|
+
chunk_ffx_sssr_initial_advance_ray,
|
|
115
|
+
chunk_ffx_sssr_advance_ray,
|
|
116
|
+
chunk_ffx_sssr_load_depth,
|
|
117
|
+
chunk_is_background
|
|
118
|
+
]);
|