@woosh/meep-engine 3.11.2 → 3.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
- package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +994 -940
- package/src/shade/device/immediate_data_supported.d.ts +33 -0
- package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
- package/src/shade/device/immediate_data_supported.js +53 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
- package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
- package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts +9 -2
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +13 -1
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -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 +35 -35
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +6 -2
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +4 -1
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
- package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
- package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
- package/src/shade/renderer/volumetrics/NOTES.md +238 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +594 -577
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -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 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workgroup shape of this pass, `[x, y, z]` in froxels, read by both the `@workgroup_size` below
|
|
3
|
+
* and the dispatch in `graph_build_volumetrics` so the two cannot drift.
|
|
4
|
+
*
|
|
5
|
+
* Flat in z. Lights are binned into 3D clusters and the largest distance between neighbouring
|
|
6
|
+
* clusters is along depth, so a group spanning z is the one spanning the most unrelated light
|
|
7
|
+
* lists.
|
|
8
|
+
*
|
|
9
|
+
* 64 invocations — one wave64, two warps — is a deliberate trade: 16x16x1 measures faster on the
|
|
10
|
+
* RTX 4090 this was benchmarked on, and is kept off because that part's register file is unusually
|
|
11
|
+
* large and the result is not expected to generalize (AMD favours smaller groups). NOTES.md carries
|
|
12
|
+
* the numbers and the reasoning.
|
|
13
|
+
*
|
|
14
|
+
* @type {number[]}
|
|
15
|
+
*/
|
|
16
|
+
export const VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION: number[];
|
|
1
17
|
export const shader_volumetrics_build_lighting: ComputeShader;
|
|
2
18
|
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
3
19
|
//# sourceMappingURL=shader_volumetrics_build_lighting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"AA6CA;;;;;;;;;;;;;;GAcG;AACH,wDAFU,MAAM,EAAE,CAEiD;AAkXnE,8DAIE;8BA9Z4B,4BAA4B"}
|
|
@@ -43,6 +43,23 @@ import { chunk_volumetrics_column_jitter } from "./chunk_volumetrics_column_jitt
|
|
|
43
43
|
import { chunk_volumetrics_local_light_shadow } from "./chunk_volumetrics_local_light_shadow.js";
|
|
44
44
|
import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Workgroup shape of this pass, `[x, y, z]` in froxels, read by both the `@workgroup_size` below
|
|
48
|
+
* and the dispatch in `graph_build_volumetrics` so the two cannot drift.
|
|
49
|
+
*
|
|
50
|
+
* Flat in z. Lights are binned into 3D clusters and the largest distance between neighbouring
|
|
51
|
+
* clusters is along depth, so a group spanning z is the one spanning the most unrelated light
|
|
52
|
+
* lists.
|
|
53
|
+
*
|
|
54
|
+
* 64 invocations — one wave64, two warps — is a deliberate trade: 16x16x1 measures faster on the
|
|
55
|
+
* RTX 4090 this was benchmarked on, and is kept off because that part's register file is unusually
|
|
56
|
+
* large and the result is not expected to generalize (AMD favours smaller groups). NOTES.md carries
|
|
57
|
+
* the numbers and the reasoning.
|
|
58
|
+
*
|
|
59
|
+
* @type {number[]}
|
|
60
|
+
*/
|
|
61
|
+
export const VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION = [8, 8, 1];
|
|
62
|
+
|
|
46
63
|
const resources = new ShaderResourceSetDescriptor();
|
|
47
64
|
|
|
48
65
|
const primary_group = resources.createGroup()
|
|
@@ -80,7 +97,7 @@ resources.createGroup()
|
|
|
80
97
|
const body = CodeChunk.from(
|
|
81
98
|
//language=WGSL
|
|
82
99
|
`
|
|
83
|
-
@compute @workgroup_size(
|
|
100
|
+
@compute @workgroup_size(${VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION.join(",")})
|
|
84
101
|
fn main(
|
|
85
102
|
@builtin(global_invocation_id) voxel_coord : vec3<u32>
|
|
86
103
|
){
|
|
@@ -213,7 +230,7 @@ fn main(
|
|
|
213
230
|
|
|
214
231
|
let sun = get_directional_light_info_by_index(&light_data, directional_index);
|
|
215
232
|
|
|
216
|
-
let sun_lut_uv = sky_lut_compute_uv(position_ws, sun.direction);
|
|
233
|
+
let sun_lut_uv = sky_lut_compute_uv(position_ws, sun.direction, vec2<f32>(textureDimensions(tSunTransmittance)));
|
|
217
234
|
|
|
218
235
|
let shadow_term = shadowmap_get_directional_light_visibility(
|
|
219
236
|
&light_data,
|
package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_volumetrics_build_participating_media.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_volumetrics_build_participating_media.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js"],"names":[],"mappings":"AAsMA,yEAIE;8BArL4B,4BAA4B"}
|
|
@@ -12,7 +12,9 @@ import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_lumin
|
|
|
12
12
|
import { AABB3_STRUCT } from "../shader/chunk/geometry/aabb3/AABB3_STRUCT.js";
|
|
13
13
|
import { chunk_aabb3_intersects_frustum } from "../shader/chunk/geometry/aabb3/chunk_aabb3_intersects_frustum.js";
|
|
14
14
|
import { chunk_frustum_slice } from "../shader/chunk/geometry/frustum/chunk_frustum_slice.js";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
chunk_frustum_transform_plane_matrix
|
|
17
|
+
} from "../shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js";
|
|
16
18
|
import { chunk_mat4_extract_scale } from "../shader/chunk/geometry/mat4/chunk_mat4_extract_scale.js";
|
|
17
19
|
import { chunk_random } from "../shader/chunk/random/chunk_random.js";
|
|
18
20
|
import { chunk_random_initialize } from "../shader/chunk/random/chunk_random_initialize.js";
|
|
@@ -101,44 +103,53 @@ fn main(
|
|
|
101
103
|
var particle_diameter = 0.0;
|
|
102
104
|
var scattering_luma_sum = 0.0;
|
|
103
105
|
var anisotropic_g = 0.0;
|
|
104
|
-
|
|
106
|
+
|
|
105
107
|
for(var i=0u; i < scene_volumetrics_metadata.instance_count; i++){
|
|
106
|
-
|
|
108
|
+
|
|
107
109
|
let volume = scene_volumes[i];
|
|
108
|
-
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
|
|
111
|
+
// Transform froxel into volume's coordinate space. Points go world -> local through
|
|
112
|
+
// transform_inverse, so planes go by the transpose of *its* inverse, which is just
|
|
113
|
+
// transpose(transform) — already resident, where deriving it costs a generic 4x4 inverse.
|
|
114
|
+
// Full 4x4 rather than a 3x3 basis: the last row carries the translation, and that is what
|
|
115
|
+
// supplies each transformed plane's distance term.
|
|
116
|
+
let local_frustum = frustum_transform_plane_matrix(froxel_frustum, transpose(volume.transform));
|
|
117
|
+
|
|
112
118
|
const unit_bounds = ${AABB3_STRUCT.make({
|
|
113
119
|
min: "vec3(-0.5)",
|
|
114
120
|
max: "vec3(0.5)",
|
|
115
121
|
})};
|
|
116
|
-
|
|
117
|
-
// TODO we can check intersection degree, if froxel is 100% inside the volume - we can skip costly coverage computation.
|
|
118
|
-
|
|
122
|
+
|
|
119
123
|
let aabb_intersects = aabb3_intersects_frustum(unit_bounds, local_frustum);
|
|
120
|
-
|
|
124
|
+
|
|
121
125
|
if(!aabb_intersects){
|
|
122
126
|
// skip
|
|
123
127
|
continue;
|
|
124
128
|
}
|
|
125
|
-
|
|
129
|
+
|
|
130
|
+
// A froxel proved to lie entirely inside the volume has a coverage of exactly 1.0 and, deep
|
|
131
|
+
// enough in, a fade of exactly 1.0 — both skippable. It is not done here because it does not
|
|
132
|
+
// pay: proving it needs the froxel's 8 vertices, which cost the same 8 three-plane
|
|
133
|
+
// intersections the coverage estimator spends, and only 7 to 33 percent of froxels qualify.
|
|
134
|
+
// NOTES.md has the measured hit rates and the arithmetic, and
|
|
135
|
+
// volumetrics_froxel_containment.spec.js keeps the geometry proven if the balance changes.
|
|
136
|
+
|
|
126
137
|
// estimate volume coverage to avoid aliasing and get a better overlap test
|
|
127
138
|
var volume_coverage = frustum_unit_box_coverage(local_frustum);
|
|
128
|
-
|
|
139
|
+
|
|
129
140
|
if(volume_coverage == 0.0){
|
|
130
141
|
// skip
|
|
131
142
|
continue;
|
|
132
143
|
}
|
|
133
|
-
|
|
144
|
+
|
|
134
145
|
let world_scale = mat4_extract_scale(volume.transform);
|
|
135
|
-
|
|
146
|
+
|
|
136
147
|
let edge_fade_factor = compute_volume_fade_factor(
|
|
137
148
|
local_frustum,
|
|
138
149
|
world_scale,
|
|
139
|
-
volume.fade_distance
|
|
150
|
+
volume.fade_distance
|
|
140
151
|
);
|
|
141
|
-
|
|
152
|
+
|
|
142
153
|
let weight = volume.density * volume_coverage * edge_fade_factor;
|
|
143
154
|
|
|
144
155
|
let volume_scattering = volume.particle_spec.scattering * weight;
|
|
@@ -172,7 +183,7 @@ fn main(
|
|
|
172
183
|
chunk_density_mie,
|
|
173
184
|
chunk_cluster_depth_from_z_slice,
|
|
174
185
|
chunk_frustum_slice,
|
|
175
|
-
|
|
186
|
+
chunk_frustum_transform_plane_matrix,
|
|
176
187
|
chunk_aabb3_intersects_frustum,
|
|
177
188
|
chunk_compute_near_far_from_projection,
|
|
178
189
|
chunk_random_initialize,
|