@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,100 +1,99 @@
|
|
|
1
|
-
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Idea is to down-sample any kind of texture.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {
|
|
18
|
-
* @param {
|
|
19
|
-
* @
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
assert.
|
|
31
|
-
|
|
32
|
-
assert.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
let output_texel_size2 = 0.5 /
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
let
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
let
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
let
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
vec2<i32>(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
vec2<i32>(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Idea is to down-sample any kind of texture.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const min = generate_downsampler_code({
|
|
9
|
+
* type: f32,
|
|
10
|
+
* initial_value: "1e10"
|
|
11
|
+
* reduction_code: "output = min( texel.r, output );"
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} options
|
|
15
|
+
* @param {WebGPUType} options.type
|
|
16
|
+
* @param {string} options.reduction_code
|
|
17
|
+
* @param {string} options.initial_value
|
|
18
|
+
* @param {CodeChunk[]} [options.dependencies] Additional dependencies, referenced in the reduction code
|
|
19
|
+
* @return {CodeChunk}
|
|
20
|
+
*/
|
|
21
|
+
export function generate_downsampler_code({
|
|
22
|
+
type,
|
|
23
|
+
reduction_code,
|
|
24
|
+
initial_value,
|
|
25
|
+
dependencies = [],
|
|
26
|
+
}) {
|
|
27
|
+
|
|
28
|
+
assert.isString(initial_value, 'initial_value');
|
|
29
|
+
assert.isString(reduction_code, 'reduction_code');
|
|
30
|
+
assert.isArray(dependencies, 'dependencies');
|
|
31
|
+
|
|
32
|
+
assert.defined(type, 'type');
|
|
33
|
+
assert.equal(type.isWebGPUType, true, 'type must be a WebGPUType');
|
|
34
|
+
|
|
35
|
+
const deps = [
|
|
36
|
+
...dependencies,
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
if (type.requires_declaration) {
|
|
40
|
+
deps.push(type.declaration_chunk);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return CodeChunk.from(
|
|
44
|
+
//language=WGSL
|
|
45
|
+
`
|
|
46
|
+
@compute @workgroup_size(8, 8, 1)
|
|
47
|
+
fn main(
|
|
48
|
+
@builtin(global_invocation_id) global_id: vec3<u32>,
|
|
49
|
+
) {
|
|
50
|
+
if (any(global_id.xy >= output_resolution)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let output_resolution_f = vec2<f32>(output_resolution);
|
|
55
|
+
let uv = (vec2<f32>(global_id.xy) + 0.5) / output_resolution_f;
|
|
56
|
+
let output_texel_size2 = 0.5 / output_resolution_f;
|
|
57
|
+
|
|
58
|
+
// texel bounds in UV space
|
|
59
|
+
let uv_min = uv - output_texel_size2;
|
|
60
|
+
let uv_max = uv + output_texel_size2;
|
|
61
|
+
|
|
62
|
+
// compute bounds in source texture
|
|
63
|
+
let source_resolution = textureDimensions(tInput);
|
|
64
|
+
let source_resolution_f = vec2<f32>(source_resolution);
|
|
65
|
+
|
|
66
|
+
// minor epsilon to avoid float rounding errors
|
|
67
|
+
const EPSILON = 1e-6;
|
|
68
|
+
|
|
69
|
+
// Nudge the bounds slightly inward to absorb floating-point drift
|
|
70
|
+
let safe_uv_min = uv_min + EPSILON;
|
|
71
|
+
let safe_uv_max = uv_max - EPSILON;
|
|
72
|
+
|
|
73
|
+
let source_bounds_min = max(
|
|
74
|
+
vec2<i32>( floor( safe_uv_min * source_resolution_f ) ),
|
|
75
|
+
vec2<i32>( 0 ),
|
|
76
|
+
);
|
|
77
|
+
let source_bounds_max = min(
|
|
78
|
+
vec2<i32>( ceil( safe_uv_max * source_resolution_f ) ),
|
|
79
|
+
vec2<i32>( source_resolution ),
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
var output:${type.wgsl_ref} = ${initial_value};
|
|
83
|
+
|
|
84
|
+
for( var y = source_bounds_min.y; y < source_bounds_max.y; y++ ){
|
|
85
|
+
for( var x = source_bounds_min.x; x < source_bounds_max.x; x++ ){
|
|
86
|
+
|
|
87
|
+
let texel = textureLoad(tInput, vec2<i32>(x,y), 0);
|
|
88
|
+
|
|
89
|
+
// output will be written using the snippet below
|
|
90
|
+
${reduction_code}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
textureStore(tOutput, vec2<i32>(global_id.xy), vec4<f32>(output, 0.0, 0.0));
|
|
96
|
+
}
|
|
97
|
+
`, deps);
|
|
98
|
+
|
|
99
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picks power-of-two alignments `[align_w, align_h]` for HZB mip 0 within the allowed area bloat.
|
|
3
|
+
*
|
|
4
|
+
* Starting from the largest shared power-of-two alignment that fits within `max_bloat`, chases
|
|
5
|
+
* lowest set bits (`d += d & -d`) along each axis to minimize reduction dispatches, maximize
|
|
6
|
+
* SPD-covered mips and exact 2:1 (`2x2`) transitions, and push any remaining odd polyphase
|
|
7
|
+
* transitions to coarser mip levels.
|
|
8
|
+
*
|
|
9
|
+
* @param {number} source_w - Source width in pixels.
|
|
10
|
+
* @param {number} source_h - Source height in pixels.
|
|
11
|
+
* @param {number} [max_bloat=1.05] - Maximum area multiplier relative to unaligned half-res.
|
|
12
|
+
* @returns {[number, number]} Power-of-two alignment factors `[align_w, align_h]`.
|
|
13
|
+
*/
|
|
14
|
+
export function hzb_pick_alignment(source_w: number, source_h: number, max_bloat?: number): [number, number];
|
|
15
|
+
//# sourceMappingURL=hzb_pick_alignment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hzb_pick_alignment.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/hzb_pick_alignment.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,6CALW,MAAM,YACN,MAAM,cACN,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,CAAC,CAoI5B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { msb_32 } from "../../../core/binary/msb_32.js";
|
|
3
|
+
import { bitCount } from "../../../core/binary/operations/bitCount.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Picks power-of-two alignments `[align_w, align_h]` for HZB mip 0 within the allowed area bloat.
|
|
7
|
+
*
|
|
8
|
+
* Starting from the largest shared power-of-two alignment that fits within `max_bloat`, chases
|
|
9
|
+
* lowest set bits (`d += d & -d`) along each axis to minimize reduction dispatches, maximize
|
|
10
|
+
* SPD-covered mips and exact 2:1 (`2x2`) transitions, and push any remaining odd polyphase
|
|
11
|
+
* transitions to coarser mip levels.
|
|
12
|
+
*
|
|
13
|
+
* @param {number} source_w - Source width in pixels.
|
|
14
|
+
* @param {number} source_h - Source height in pixels.
|
|
15
|
+
* @param {number} [max_bloat=1.05] - Maximum area multiplier relative to unaligned half-res.
|
|
16
|
+
* @returns {[number, number]} Power-of-two alignment factors `[align_w, align_h]`.
|
|
17
|
+
*/
|
|
18
|
+
export function hzb_pick_alignment(source_w, source_h, max_bloat = 1.05) {
|
|
19
|
+
assert.greaterThan(max_bloat, 1, 'max_bloat must be greater than 1');
|
|
20
|
+
assert.isNonNegativeInteger(source_w, 'source_w');
|
|
21
|
+
assert.isNonNegativeInteger(source_h, 'source_h');
|
|
22
|
+
|
|
23
|
+
const half_w = source_w >>> 1;
|
|
24
|
+
const half_h = source_h >>> 1;
|
|
25
|
+
|
|
26
|
+
if (half_w === 0 || half_h === 0) {
|
|
27
|
+
return [1, 1];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const max_area = half_w * half_h * max_bloat;
|
|
31
|
+
|
|
32
|
+
let base_align = 1;
|
|
33
|
+
|
|
34
|
+
while (base_align < half_w && base_align < half_h) {
|
|
35
|
+
const next_align = base_align << 1;
|
|
36
|
+
const mask = next_align - 1;
|
|
37
|
+
|
|
38
|
+
const w = (half_w + mask) & ~mask;
|
|
39
|
+
const h = (half_h + mask) & ~mask;
|
|
40
|
+
|
|
41
|
+
if (w * h > max_area) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
base_align = next_align;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const base_mask = base_align - 1;
|
|
49
|
+
const w0 = (half_w + base_mask) & ~base_mask;
|
|
50
|
+
const h0 = (half_h + base_mask) & ~base_mask;
|
|
51
|
+
|
|
52
|
+
let best_w = w0;
|
|
53
|
+
let best_h = h0;
|
|
54
|
+
let best_steps = Infinity;
|
|
55
|
+
let best_spd_mips = -1;
|
|
56
|
+
let best_2x2 = -1;
|
|
57
|
+
let best_odd_axes = Infinity;
|
|
58
|
+
let best_odd_work = Infinity;
|
|
59
|
+
let best_area = Infinity;
|
|
60
|
+
|
|
61
|
+
for (let w = w0; w * h0 <= max_area; w += (w & -w)) {
|
|
62
|
+
const msb_w = msb_32(w);
|
|
63
|
+
const odd_w = w ^ (1 << msb_w);
|
|
64
|
+
|
|
65
|
+
for (let h = h0; ; h += (h & -h)) {
|
|
66
|
+
const area = w * h;
|
|
67
|
+
if (area > max_area) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const msb_h = msb_32(h);
|
|
72
|
+
const odd_h = h ^ (1 << msb_h);
|
|
73
|
+
const total_transitions = msb_w > msb_h ? msb_w : msb_h;
|
|
74
|
+
const odd_any = odd_w | odd_h;
|
|
75
|
+
|
|
76
|
+
let steps = 0;
|
|
77
|
+
let spd_mips = 0;
|
|
78
|
+
let mip = 0;
|
|
79
|
+
|
|
80
|
+
while (mip < total_transitions) {
|
|
81
|
+
let count = 0;
|
|
82
|
+
while (count < 4 && (mip + count) < total_transitions && ((odd_any >>> (mip + count)) & 1) === 0) {
|
|
83
|
+
count++;
|
|
84
|
+
}
|
|
85
|
+
steps++;
|
|
86
|
+
if (count >= 2) {
|
|
87
|
+
spd_mips += count;
|
|
88
|
+
mip += count;
|
|
89
|
+
} else {
|
|
90
|
+
mip += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const count_2x2 = total_transitions - bitCount(odd_any);
|
|
95
|
+
const count_odd_axes = bitCount(odd_w) + bitCount(odd_h);
|
|
96
|
+
|
|
97
|
+
let odd_work = 0;
|
|
98
|
+
let rem = odd_any;
|
|
99
|
+
while (rem !== 0) {
|
|
100
|
+
const lsb = rem & -rem;
|
|
101
|
+
const m = msb_32(lsb);
|
|
102
|
+
const taps_x = ((odd_w >>> m) & 1) + 2;
|
|
103
|
+
const taps_y = ((odd_h >>> m) & 1) + 2;
|
|
104
|
+
const out_w = (w >>> (m + 1)) || 1;
|
|
105
|
+
const out_h = (h >>> (m + 1)) || 1;
|
|
106
|
+
odd_work += out_w * out_h * (taps_x * taps_y - 4);
|
|
107
|
+
rem ^= lsb;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const is_better =
|
|
111
|
+
steps < best_steps ||
|
|
112
|
+
(steps === best_steps && (
|
|
113
|
+
spd_mips > best_spd_mips ||
|
|
114
|
+
(spd_mips === best_spd_mips && (
|
|
115
|
+
count_2x2 > best_2x2 ||
|
|
116
|
+
(count_2x2 === best_2x2 && (
|
|
117
|
+
count_odd_axes < best_odd_axes ||
|
|
118
|
+
(count_odd_axes === best_odd_axes && (
|
|
119
|
+
odd_work < best_odd_work ||
|
|
120
|
+
(odd_work === best_odd_work && area < best_area)
|
|
121
|
+
))
|
|
122
|
+
))
|
|
123
|
+
))
|
|
124
|
+
));
|
|
125
|
+
|
|
126
|
+
if (is_better) {
|
|
127
|
+
best_w = w;
|
|
128
|
+
best_h = h;
|
|
129
|
+
best_steps = steps;
|
|
130
|
+
best_spd_mips = spd_mips;
|
|
131
|
+
best_2x2 = count_2x2;
|
|
132
|
+
best_odd_axes = count_odd_axes;
|
|
133
|
+
best_odd_work = odd_work;
|
|
134
|
+
best_area = area;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if ((h & (h - 1)) === 0) {
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if ((w & (w - 1)) === 0) {
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return [best_w & -best_w, best_h & -best_h];
|
|
148
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {Object} HZBReductionStep
|
|
3
|
+
* @property {number} base_mip Source mip level index (0-based).
|
|
4
|
+
* @property {number} mip_count Number of consecutive mip levels produced in this step (1..4).
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Plans the sequence of reduction dispatches from HZB mip 0 down to the 1x1 tail.
|
|
8
|
+
*
|
|
9
|
+
* Consecutive mip transitions where neither active (> 1) axis is odd halve cleanly by 2x2 and are
|
|
10
|
+
* coalesced into a single up-to-4-mip SPD dispatch. Any transition from an odd dimension (> 1)
|
|
11
|
+
* requires the conservative polyphase UV-box kernel (`mip_count = 1`).
|
|
12
|
+
*
|
|
13
|
+
* @param {number} width Mip 0 width in texels.
|
|
14
|
+
* @param {number} height Mip 0 height in texels.
|
|
15
|
+
* @returns {HZBReductionStep[]}
|
|
16
|
+
*/
|
|
17
|
+
export function hzb_plan_reduction_steps(width: number, height: number): HZBReductionStep[];
|
|
18
|
+
export type HZBReductionStep = {
|
|
19
|
+
/**
|
|
20
|
+
* Source mip level index (0-based).
|
|
21
|
+
*/
|
|
22
|
+
base_mip: number;
|
|
23
|
+
/**
|
|
24
|
+
* Number of consecutive mip levels produced in this step (1..4).
|
|
25
|
+
*/
|
|
26
|
+
mip_count: number;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=hzb_plan_reduction_steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hzb_plan_reduction_steps.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/hzb_plan_reduction_steps.js"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,gDAJW,MAAM,UACN,MAAM,GACJ,gBAAgB,EAAE,CAuC9B;;;;;cApDa,MAAM;;;;eACN,MAAM"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {Object} HZBReductionStep
|
|
6
|
+
* @property {number} base_mip Source mip level index (0-based).
|
|
7
|
+
* @property {number} mip_count Number of consecutive mip levels produced in this step (1..4).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Plans the sequence of reduction dispatches from HZB mip 0 down to the 1x1 tail.
|
|
12
|
+
*
|
|
13
|
+
* Consecutive mip transitions where neither active (> 1) axis is odd halve cleanly by 2x2 and are
|
|
14
|
+
* coalesced into a single up-to-4-mip SPD dispatch. Any transition from an odd dimension (> 1)
|
|
15
|
+
* requires the conservative polyphase UV-box kernel (`mip_count = 1`).
|
|
16
|
+
*
|
|
17
|
+
* @param {number} width Mip 0 width in texels.
|
|
18
|
+
* @param {number} height Mip 0 height in texels.
|
|
19
|
+
* @returns {HZBReductionStep[]}
|
|
20
|
+
*/
|
|
21
|
+
export function hzb_plan_reduction_steps(width, height) {
|
|
22
|
+
assert.isPositiveInteger(width, 'width');
|
|
23
|
+
assert.isPositiveInteger(height, 'height');
|
|
24
|
+
|
|
25
|
+
const total_mips = texture_mip_level_count(width, height, 1, "2d");
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @type {HZBReductionStep[]}
|
|
29
|
+
*/
|
|
30
|
+
const steps = [];
|
|
31
|
+
|
|
32
|
+
let mip = 0;
|
|
33
|
+
|
|
34
|
+
while (mip < total_mips - 1) {
|
|
35
|
+
let count = 0;
|
|
36
|
+
|
|
37
|
+
while (count < 4 && (mip + count) < total_mips - 1) {
|
|
38
|
+
const w = Math.max(1, width >>> (mip + count));
|
|
39
|
+
const h = Math.max(1, height >>> (mip + count));
|
|
40
|
+
|
|
41
|
+
if ((w > 1 && (w & 1) !== 0) || (h > 1 && (h & 1) !== 0)) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
count++;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (count >= 2) {
|
|
49
|
+
steps.push({ base_mip: mip, mip_count: count });
|
|
50
|
+
mip += count;
|
|
51
|
+
} else {
|
|
52
|
+
steps.push({ base_mip: mip, mip_count: 1 });
|
|
53
|
+
mip += 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return steps;
|
|
58
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Initial reduction pass, works with non-power-of-two resolutions as input
|
|
3
|
-
* @type {
|
|
3
|
+
* @type {ComputeShader}
|
|
4
4
|
*/
|
|
5
|
-
export const shader_hzb_reduce_mip0:
|
|
5
|
+
export const shader_hzb_reduce_mip0: ComputeShader;
|
|
6
6
|
/**
|
|
7
7
|
* Mip1+ reduction pass, works with non-power-of-two resolutions as input
|
|
8
|
-
* @type {
|
|
8
|
+
* @type {ComputeShader}
|
|
9
9
|
*/
|
|
10
|
-
export const shader_hzb_reduce_any:
|
|
11
|
-
import {
|
|
10
|
+
export const shader_hzb_reduce_any: ComputeShader;
|
|
11
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
12
12
|
//# sourceMappingURL=shader_hzb_reduce_any.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_hzb_reduce_any.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_any.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,qCAFU,
|
|
1
|
+
{"version":3,"file":"shader_hzb_reduce_any.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_any.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,qCAFU,aAAa,CAepB;AAGH;;;GAGG;AACH,oCAFU,aAAa,CAcpB;8BAvD2B,4BAA4B"}
|
|
@@ -1,67 +1,57 @@
|
|
|
1
|
-
import { vec2f, vec2u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
-
import {
|
|
3
|
-
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.
|
|
18
|
-
;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Initial reduction pass, works with non-power-of-two resolutions as input
|
|
23
|
-
* @type {
|
|
24
|
-
*/
|
|
25
|
-
export const shader_hzb_reduce_mip0 =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
output.x = min(texel.x, output.x);
|
|
59
|
-
output.y = max(texel.y, output.y);
|
|
60
|
-
`,
|
|
61
|
-
}),
|
|
62
|
-
resources
|
|
63
|
-
}),
|
|
64
|
-
targets: [
|
|
65
|
-
{ format: HZB_TEXTURE_FORMAT }
|
|
66
|
-
]
|
|
67
|
-
})
|
|
1
|
+
import { vec2f, vec2u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
3
|
+
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
+
import { generate_downsampler_code } from "./generate_downsampler_code.js";
|
|
5
|
+
|
|
6
|
+
import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
|
|
7
|
+
|
|
8
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
9
|
+
|
|
10
|
+
// per-pass, eight bytes, read-only: immediate data rather than a uniform buffer. The reduction
|
|
11
|
+
// walks the mip chain a pass at a time and every pass wants a different resolution, which used to
|
|
12
|
+
// mean a persistent table of them bound at a per-mip dynamic offset.
|
|
13
|
+
resources.setImmediate("output_resolution", vec2u);
|
|
14
|
+
|
|
15
|
+
resources.createGroup()
|
|
16
|
+
.addTexture("tInput", "unfilterable-float")
|
|
17
|
+
.addStorageTexture("tOutput", HZB_TEXTURE_FORMAT, "2d", "write-only")
|
|
18
|
+
;
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Initial reduction pass, works with non-power-of-two resolutions as input
|
|
23
|
+
* @type {ComputeShader}
|
|
24
|
+
*/
|
|
25
|
+
export const shader_hzb_reduce_mip0 = ComputeShader.from({
|
|
26
|
+
label: 'HZB / reduce mip0',
|
|
27
|
+
// NOTE: we reduce from depth, so texel read happens from the .R (X) channel for both min and max.
|
|
28
|
+
body: generate_downsampler_code({
|
|
29
|
+
type: vec2f,
|
|
30
|
+
initial_value: 'vec2( 1.0, 0.0 )',
|
|
31
|
+
//language=WGSL
|
|
32
|
+
reduction_code: `
|
|
33
|
+
output.x = min(texel.x, output.x);
|
|
34
|
+
output.y = max(texel.x, output.y);
|
|
35
|
+
`,
|
|
36
|
+
}),
|
|
37
|
+
resources,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Mip1+ reduction pass, works with non-power-of-two resolutions as input
|
|
43
|
+
* @type {ComputeShader}
|
|
44
|
+
*/
|
|
45
|
+
export const shader_hzb_reduce_any = ComputeShader.from({
|
|
46
|
+
label: 'HZB / reduce any resolution',
|
|
47
|
+
body: generate_downsampler_code({
|
|
48
|
+
type: vec2f,
|
|
49
|
+
initial_value: 'vec2( 1.0, 0.0 )',
|
|
50
|
+
//language=WGSL
|
|
51
|
+
reduction_code: `
|
|
52
|
+
output.x = min(texel.x, output.x);
|
|
53
|
+
output.y = max(texel.y, output.y);
|
|
54
|
+
`,
|
|
55
|
+
}),
|
|
56
|
+
resources,
|
|
57
|
+
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Same as standard first mip reduction, but with a clipping region.
|
|
3
3
|
* Primarily used for shadow maps where shadows are atlased into a single texture
|
|
4
|
-
* @type {
|
|
4
|
+
* @type {ComputeShader}
|
|
5
5
|
*/
|
|
6
|
-
export const shader_hzb_reduce_mip0_clip:
|
|
7
|
-
import {
|
|
6
|
+
export const shader_hzb_reduce_mip0_clip: ComputeShader;
|
|
7
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
8
8
|
//# sourceMappingURL=shader_hzb_reduce_mip0_clip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_hzb_reduce_mip0_clip.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_hzb_reduce_mip0_clip.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js"],"names":[],"mappings":"AAqGA;;;;GAIG;AACH,0CAFU,aAAa,CAMpB;8BA3G2B,4BAA4B"}
|