@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,4 +1,6 @@
|
|
|
1
1
|
import { normalize_dynamic_offsets } from "./normalize_dynamic_offsets.js";
|
|
2
|
+
import { pipeline_immediate_size } from "./pipeline_immediate_size.js";
|
|
3
|
+
import { SoftwareGPUImmediateData } from "./SoftwareGPUImmediateData.js";
|
|
2
4
|
import { SoftwareGPUObjectBase } from "./SoftwareGPUObjectBase.js";
|
|
3
5
|
import { write_pass_timestamp } from "./write_pass_timestamp.js";
|
|
4
6
|
|
|
@@ -79,6 +81,14 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
79
81
|
*/
|
|
80
82
|
#scissor = null;
|
|
81
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Immediate data for this pass. Per-encoder state in WebGPU, and a new pass starts over — which
|
|
86
|
+
* is why it is constructed here rather than carried in from the command encoder.
|
|
87
|
+
*
|
|
88
|
+
* @type {SoftwareGPUImmediateData}
|
|
89
|
+
*/
|
|
90
|
+
#immediates;
|
|
91
|
+
|
|
82
92
|
#ended = false;
|
|
83
93
|
|
|
84
94
|
/**
|
|
@@ -99,6 +109,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
99
109
|
|
|
100
110
|
this.#encoder = encoder;
|
|
101
111
|
this.descriptor = descriptor;
|
|
112
|
+
this.#immediates = new SoftwareGPUImmediateData(encoder.device.limits.maxImmediateSize);
|
|
102
113
|
|
|
103
114
|
write_pass_timestamp(descriptor, 'beginningOfPassWriteIndex');
|
|
104
115
|
}
|
|
@@ -138,6 +149,22 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
138
149
|
);
|
|
139
150
|
}
|
|
140
151
|
|
|
152
|
+
/**
|
|
153
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
154
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
155
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
156
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
157
|
+
*/
|
|
158
|
+
setImmediates(range_offset, data, data_offset = 0, data_size) {
|
|
159
|
+
this.#assert_encoding();
|
|
160
|
+
|
|
161
|
+
const message = this.#immediates.write(range_offset, data, data_offset, data_size);
|
|
162
|
+
|
|
163
|
+
if (message !== null) {
|
|
164
|
+
this.#encoder.notify_pass_validation_error(message);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
141
168
|
/**
|
|
142
169
|
* @param {number} slot
|
|
143
170
|
* @param {GPUBuffer} buffer
|
|
@@ -206,6 +233,24 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
206
233
|
this.stencil_reference = reference;
|
|
207
234
|
}
|
|
208
235
|
|
|
236
|
+
/**
|
|
237
|
+
* WebGPU's *Validate immediate data*: every slot the pipeline's immediate range covers must have
|
|
238
|
+
* been written before a command reads it. The bytes default to zero but the slots do not default
|
|
239
|
+
* to set, so a forgotten `setImmediates` is a refused draw on a real device rather than a shader
|
|
240
|
+
* quietly reading zeroes. Catching it here is the whole reason the slot bookkeeping exists.
|
|
241
|
+
*
|
|
242
|
+
* @returns {void}
|
|
243
|
+
*/
|
|
244
|
+
#validate_immediates() {
|
|
245
|
+
const size = pipeline_immediate_size(this.#pipeline);
|
|
246
|
+
|
|
247
|
+
if (size > 0 && !this.#immediates.isRangeSet(0, size)) {
|
|
248
|
+
this.#encoder.notify_pass_validation_error(
|
|
249
|
+
`draw: pipeline declares ${size} bytes of immediate data, and not all of it was set by setImmediates`
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
209
254
|
/**
|
|
210
255
|
* The state a draw would run under, copied so later state changes do not rewrite a draw already
|
|
211
256
|
* recorded.
|
|
@@ -221,6 +266,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
221
266
|
index_buffer: this.#index_buffer,
|
|
222
267
|
viewport: this.#viewport,
|
|
223
268
|
scissor: this.#scissor,
|
|
269
|
+
immediates: this.#immediates.snapshot(),
|
|
224
270
|
};
|
|
225
271
|
}
|
|
226
272
|
|
|
@@ -230,6 +276,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
230
276
|
*/
|
|
231
277
|
draw(vertex_count, instance_count = 1) {
|
|
232
278
|
this.#assert_encoding();
|
|
279
|
+
this.#validate_immediates();
|
|
233
280
|
|
|
234
281
|
this.draws.push({
|
|
235
282
|
...this.#snapshot(),
|
|
@@ -246,6 +293,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
246
293
|
*/
|
|
247
294
|
drawIndexed(index_count, instance_count = 1) {
|
|
248
295
|
this.#assert_encoding();
|
|
296
|
+
this.#validate_immediates();
|
|
249
297
|
|
|
250
298
|
this.draws.push({
|
|
251
299
|
...this.#snapshot(),
|
|
@@ -262,6 +310,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
262
310
|
*/
|
|
263
311
|
drawIndirect(indirect_buffer, indirect_offset) {
|
|
264
312
|
this.#assert_encoding();
|
|
313
|
+
this.#validate_immediates();
|
|
265
314
|
|
|
266
315
|
this.draws.push({
|
|
267
316
|
...this.#snapshot(),
|
|
@@ -281,6 +330,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
|
|
|
281
330
|
*/
|
|
282
331
|
drawIndexedIndirect(indirect_buffer, indirect_offset) {
|
|
283
332
|
this.#assert_encoding();
|
|
333
|
+
this.#validate_immediates();
|
|
284
334
|
|
|
285
335
|
this.draws.push({
|
|
286
336
|
...this.#snapshot(),
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bytes of immediate data a pipeline's layout declares, or 0 when it declares none.
|
|
3
|
+
*
|
|
4
|
+
* A pipeline built with `layout: "auto"` reports 0 rather than deriving a size: deriving one would
|
|
5
|
+
* mean reading the WGSL, and nothing in this folder compiles WGSL.
|
|
6
|
+
*
|
|
7
|
+
* @param {GPUPipelineBase|null} pipeline
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function pipeline_immediate_size(pipeline: GPUPipelineBase | null): number;
|
|
11
|
+
//# sourceMappingURL=pipeline_immediate_size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline_immediate_size.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/pipeline_immediate_size.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,kDAHW,kBAAgB,IAAI,GAClB,MAAM,CAUlB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bytes of immediate data a pipeline's layout declares, or 0 when it declares none.
|
|
3
|
+
*
|
|
4
|
+
* A pipeline built with `layout: "auto"` reports 0 rather than deriving a size: deriving one would
|
|
5
|
+
* mean reading the WGSL, and nothing in this folder compiles WGSL.
|
|
6
|
+
*
|
|
7
|
+
* @param {GPUPipelineBase|null} pipeline
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function pipeline_immediate_size(pipeline) {
|
|
11
|
+
const layout = pipeline?.descriptor?.layout;
|
|
12
|
+
|
|
13
|
+
if (layout === undefined || layout === null || layout === "auto") {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return layout.immediateSize ?? 0;
|
|
18
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineLayoutManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/pipeline/PipelineLayoutManager.js"],"names":[],"mappings":"AAGA;IAMI;;;OAGG;IACH,+BAEC;IAoBD;;;;OAIG;IACH,2DAFa,4BAA0B,SAAS,CAI/C;IAgBD;;;;OAIG;IACH,iFAKC;IAED;;;;OAIG;IACH,8EAEC;;
|
|
1
|
+
{"version":3,"file":"PipelineLayoutManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/pipeline/PipelineLayoutManager.js"],"names":[],"mappings":"AAGA;IAMI;;;OAGG;IACH,+BAEC;IAoBD;;;;OAIG;IACH,2DAFa,4BAA0B,SAAS,CAI/C;IAgBD;;;;OAIG;IACH,iFAKC;IAED;;;;OAIG;IACH,8EAEC;;CAmBJ"}
|
|
@@ -89,8 +89,15 @@ export class GraphicsContext {
|
|
|
89
89
|
* @param {GPUBindingCommandsMixin} pass
|
|
90
90
|
* @param {PipelineDescriptorBase} pipeline
|
|
91
91
|
* @param {GPUBindingResource[][]} [bindings]
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
* @param {{buffer: BinaryBuffer, offset: number, size: number}} [immediate] bytes to hand the
|
|
93
|
+
* pass through `setImmediates`, when the pipeline declares immediate data. Optional so
|
|
94
|
+
* that every caller predating immediates keeps working unchanged.
|
|
95
|
+
*/
|
|
96
|
+
setPipelineBindings(pass: GPUBindingCommandsMixin, pipeline: PipelineDescriptorBase, bindings?: GPUBindingResource[][], immediate?: {
|
|
97
|
+
buffer: BinaryBuffer;
|
|
98
|
+
offset: number;
|
|
99
|
+
size: number;
|
|
100
|
+
}): void;
|
|
94
101
|
/**
|
|
95
102
|
*
|
|
96
103
|
* @param {BufferDescriptor} buffer_descriptor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AAwBA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD
|
|
1
|
+
{"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AAwBA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;;;;OAQG;IACH,gGALW,oBAAoB,EAAE,cACtB;QAAC,MAAM,eAAe;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,QAmE9D;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;mCA9UkC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
|
|
@@ -207,14 +207,26 @@ export class GraphicsContext {
|
|
|
207
207
|
* @param {GPUBindingCommandsMixin} pass
|
|
208
208
|
* @param {PipelineDescriptorBase} pipeline
|
|
209
209
|
* @param {GPUBindingResource[][]} [bindings]
|
|
210
|
+
* @param {{buffer: BinaryBuffer, offset: number, size: number}} [immediate] bytes to hand the
|
|
211
|
+
* pass through `setImmediates`, when the pipeline declares immediate data. Optional so
|
|
212
|
+
* that every caller predating immediates keeps working unchanged.
|
|
210
213
|
*/
|
|
211
214
|
setPipelineBindings(
|
|
212
215
|
pass,
|
|
213
216
|
pipeline,
|
|
214
|
-
bindings
|
|
217
|
+
bindings,
|
|
218
|
+
immediate
|
|
215
219
|
) {
|
|
216
220
|
assert.isArray(bindings, 'bindings');
|
|
217
221
|
|
|
222
|
+
if (immediate !== undefined) {
|
|
223
|
+
// `raw_bytes` is read here rather than cached by the caller: BinaryBuffer rebinds it
|
|
224
|
+
// when the backing store grows, so a reference taken earlier can be stale. It is also a
|
|
225
|
+
// Uint8Array, for which `setImmediates` counts offset and size in elements — and its
|
|
226
|
+
// elements are bytes, so the range passes through unchanged.
|
|
227
|
+
pass.setImmediates(0, immediate.buffer.raw_bytes, immediate.offset, immediate.size);
|
|
228
|
+
}
|
|
229
|
+
|
|
218
230
|
const bind_group_descriptors = pipeline.layout.bindGroupLayouts;
|
|
219
231
|
|
|
220
232
|
const bind_group_count = bindings.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUSky.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/GPUSky.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUSky.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/GPUSky.js"],"names":[],"mappings":"AAUA;IAuCI;;;OAGG;IACH,uCAmBC;IAlDD;;;OAGG;IACH,2CAEC;IAOD;;;OAGG;IACH,iDAEC;IAiCD,gBAGC;IAED,cAYC;IAED;;OAEG;IACH,eA+CC;;CAEJ;kCA3IiC,iCAAiC"}
|
|
@@ -1,143 +1,146 @@
|
|
|
1
|
-
import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
|
|
2
|
-
import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
|
|
3
|
-
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
*
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.#lut_transmittance
|
|
60
|
-
this.#lut_transmittance.descriptor.
|
|
61
|
-
this.#lut_transmittance.descriptor.
|
|
62
|
-
this.#lut_transmittance.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
this.#lut_multiple_scattering
|
|
66
|
-
this.#lut_multiple_scattering.descriptor.
|
|
67
|
-
this.#lut_multiple_scattering.descriptor.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
1
|
+
import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
|
|
2
|
+
import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
|
|
3
|
+
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
4
|
+
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
5
|
+
import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
|
|
6
|
+
import { debug_draw_texture } from "../texture/debug_draw_texture.js";
|
|
7
|
+
import { GPUTextureContext } from "../texture/GPUTextureContext.js";
|
|
8
|
+
import { shader_multiscatter_lut } from "./shader_multiscatter_lut.js";
|
|
9
|
+
import { shader_transmittance_lut } from "./shader_transmittance_lut.js";
|
|
10
|
+
|
|
11
|
+
export class GPUSky {
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @type {GraphicsContext}
|
|
15
|
+
*/
|
|
16
|
+
#graphics;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @type {GPUTextureContext}
|
|
20
|
+
*/
|
|
21
|
+
#lut_transmittance;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @returns {GPUTextureContext}
|
|
26
|
+
*/
|
|
27
|
+
get lut_transmittance() {
|
|
28
|
+
return this.#lut_transmittance;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @type {GPUTextureContext}
|
|
33
|
+
*/
|
|
34
|
+
#lut_multiple_scattering;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @returns {GPUTextureContext}
|
|
39
|
+
*/
|
|
40
|
+
get lut_multiple_scattering() {
|
|
41
|
+
return this.#lut_multiple_scattering;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @type {boolean}
|
|
47
|
+
*/
|
|
48
|
+
#needs_update = true;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* @param {GraphicsContext} graphics
|
|
53
|
+
*/
|
|
54
|
+
constructor(graphics) {
|
|
55
|
+
this.#graphics = graphics;
|
|
56
|
+
|
|
57
|
+
const device = graphics.device;
|
|
58
|
+
|
|
59
|
+
this.#lut_transmittance = new GPUTextureContext(device);
|
|
60
|
+
this.#lut_transmittance.descriptor.label = "Sky / Transmittance LUT";
|
|
61
|
+
this.#lut_transmittance.descriptor.format = "rgba16float";
|
|
62
|
+
this.#lut_transmittance.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
|
|
63
|
+
this.#lut_transmittance.resize(256, 64);
|
|
64
|
+
|
|
65
|
+
this.#lut_multiple_scattering = new GPUTextureContext(device);
|
|
66
|
+
this.#lut_multiple_scattering.descriptor.label = "Sky / Multiple Scattering LUT";
|
|
67
|
+
this.#lut_multiple_scattering.descriptor.format = "rgba16float";
|
|
68
|
+
// written by a compute shader, so STORAGE_BINDING rather than RENDER_ATTACHMENT
|
|
69
|
+
this.#lut_multiple_scattering.descriptor.usage = GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
|
|
70
|
+
this.#lut_multiple_scattering.resize(32, 32);
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
destroy() {
|
|
76
|
+
this.#lut_transmittance.destroy();
|
|
77
|
+
this.#lut_multiple_scattering.destroy();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
debug() {
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
let y = 50;
|
|
84
|
+
debug_draw_texture({ texture: this.#lut_transmittance, x: 50, y: y });
|
|
85
|
+
|
|
86
|
+
y += this.#lut_transmittance.size[1] + 50;
|
|
87
|
+
|
|
88
|
+
debug_draw_texture({ texture: this.#lut_multiple_scattering, x: 50, y: y });
|
|
89
|
+
|
|
90
|
+
y += this.#lut_multiple_scattering.size[1] + 50;
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
*/
|
|
97
|
+
update() {
|
|
98
|
+
if (!this.#needs_update) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const graph = new FrameGraph("sky update");
|
|
103
|
+
|
|
104
|
+
const command_ctx = ShadeGPUCommandContext.create(
|
|
105
|
+
this.#graphics,
|
|
106
|
+
"Renderer/main"
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const gr_transmittance = graph.import_resource("transmittance", TextureResourceDescriptor.fromTexture(this.#lut_transmittance.gpu_texture), this.#lut_transmittance);
|
|
110
|
+
const gr_multiscatter = graph.import_resource("multiscatter", TextureResourceDescriptor.fromTexture(this.#lut_multiple_scattering.gpu_texture), this.#lut_multiple_scattering);
|
|
111
|
+
|
|
112
|
+
graph_image_pass({
|
|
113
|
+
graph,
|
|
114
|
+
shader: shader_transmittance_lut,
|
|
115
|
+
inputs: {
|
|
116
|
+
settings: {
|
|
117
|
+
steps: 40,
|
|
118
|
+
// read off the texture rather than restated, so the two cannot disagree
|
|
119
|
+
resolution: [this.#lut_transmittance.width, this.#lut_transmittance.height],
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
output: [gr_transmittance]
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
graph_compute_pass({
|
|
127
|
+
graph,
|
|
128
|
+
shader: shader_multiscatter_lut,
|
|
129
|
+
// one workgroup per LUT texel, counted off the texture being written so the
|
|
130
|
+
// dispatch cannot cover a different area than the shader stores into
|
|
131
|
+
group_count: [this.#lut_multiple_scattering.width, this.#lut_multiple_scattering.height, 1],
|
|
132
|
+
bindings: {
|
|
133
|
+
tSkyLutTransmittance: gr_transmittance,
|
|
134
|
+
tSkyLutMultiscatterOut: gr_multiscatter
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
command_ctx.encodeGraph(graph);
|
|
139
|
+
|
|
140
|
+
command_ctx.finish();
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
this.#needs_update = false;
|
|
144
|
+
}
|
|
145
|
+
|
|
143
146
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directions are drawn on an 8x8 grid, stratified in azimuth and in the cosine of the polar
|
|
3
|
+
* angle. Matches Hillaire's `SQRTSAMPLECOUNT`.
|
|
4
|
+
* @type {number}
|
|
5
|
+
*/
|
|
6
|
+
export const MULTISCATTER_LUT_SQRT_SAMPLES: number;
|
|
7
|
+
/**
|
|
8
|
+
* One thread integrates one direction, so this is also the workgroup size.
|
|
9
|
+
*
|
|
10
|
+
* 64 is Hillaire's `[numthreads(1,1,64)]` count. It is a multiple of every legal subgroup
|
|
11
|
+
* size up to 64, and the reduction handles a subgroup wider than the workgroup, so no
|
|
12
|
+
* hardware needs a different number here.
|
|
13
|
+
* @type {number}
|
|
14
|
+
*/
|
|
15
|
+
export const MULTISCATTER_LUT_DIRECTION_COUNT: number;
|
|
16
|
+
/**
|
|
17
|
+
* Ray-march steps per direction. Hillaire's `SampleCountIni` for this LUT; the comment there
|
|
18
|
+
* reads "a minimum set of step is required for accuracy unfortunately".
|
|
19
|
+
*
|
|
20
|
+
* Compile-time on purpose: as a uniform the inner loop cannot be unrolled and the trip count
|
|
21
|
+
* has to be re-tested against an f32 every iteration.
|
|
22
|
+
* @type {number}
|
|
23
|
+
*/
|
|
24
|
+
export const MULTISCATTER_LUT_STEPS: number;
|
|
25
|
+
/**
|
|
26
|
+
* Upper bound on the number of subgroups in one workgroup, which is how many partial sums
|
|
27
|
+
* the cross-subgroup reduction has to combine.
|
|
28
|
+
*
|
|
29
|
+
* WGSL pins the subgroup size to a power of two in [4, 128], so the worst case is
|
|
30
|
+
* {@link MULTISCATTER_LUT_DIRECTION_COUNT} / 4.
|
|
31
|
+
* @type {number}
|
|
32
|
+
*/
|
|
33
|
+
export const MULTISCATTER_LUT_MAX_SUBGROUP_PARTIALS: number;
|
|
34
|
+
//# sourceMappingURL=MULTISCATTER_LUT_CONFIG.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MULTISCATTER_LUT_CONFIG.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;;;;GAOG;AACH,+CAFU,MAAM,CAE8F;AAE9G;;;;;;;GAOG;AACH,qCAFU,MAAM,CAEyB;AAEzC;;;;;;;GAOG;AACH,qDAFU,MAAM,CAE2E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directions are drawn on an 8x8 grid, stratified in azimuth and in the cosine of the polar
|
|
3
|
+
* angle. Matches Hillaire's `SQRTSAMPLECOUNT`.
|
|
4
|
+
* @type {number}
|
|
5
|
+
*/
|
|
6
|
+
export const MULTISCATTER_LUT_SQRT_SAMPLES = 8;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* One thread integrates one direction, so this is also the workgroup size.
|
|
10
|
+
*
|
|
11
|
+
* 64 is Hillaire's `[numthreads(1,1,64)]` count. It is a multiple of every legal subgroup
|
|
12
|
+
* size up to 64, and the reduction handles a subgroup wider than the workgroup, so no
|
|
13
|
+
* hardware needs a different number here.
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
export const MULTISCATTER_LUT_DIRECTION_COUNT = MULTISCATTER_LUT_SQRT_SAMPLES * MULTISCATTER_LUT_SQRT_SAMPLES;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Ray-march steps per direction. Hillaire's `SampleCountIni` for this LUT; the comment there
|
|
20
|
+
* reads "a minimum set of step is required for accuracy unfortunately".
|
|
21
|
+
*
|
|
22
|
+
* Compile-time on purpose: as a uniform the inner loop cannot be unrolled and the trip count
|
|
23
|
+
* has to be re-tested against an f32 every iteration.
|
|
24
|
+
* @type {number}
|
|
25
|
+
*/
|
|
26
|
+
export const MULTISCATTER_LUT_STEPS = 20;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Upper bound on the number of subgroups in one workgroup, which is how many partial sums
|
|
30
|
+
* the cross-subgroup reduction has to combine.
|
|
31
|
+
*
|
|
32
|
+
* WGSL pins the subgroup size to a power of two in [4, 128], so the worst case is
|
|
33
|
+
* {@link MULTISCATTER_LUT_DIRECTION_COUNT} / 4.
|
|
34
|
+
* @type {number}
|
|
35
|
+
*/
|
|
36
|
+
export const MULTISCATTER_LUT_MAX_SUBGROUP_PARTIALS = MULTISCATTER_LUT_DIRECTION_COUNT / 4;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filtering sampler for the sky LUTs (transmittance, multiple-scattering).
|
|
3
|
+
*
|
|
4
|
+
* Both LUTs are `rgba16float`, which is filterable in core WebGPU — only the 32-bit float
|
|
5
|
+
* formats need the `float32-filterable` feature — so these can go through the texture unit
|
|
6
|
+
* instead of the 4-tap manual bilinear in `texture_sample_bilinear_uv`.
|
|
7
|
+
*
|
|
8
|
+
* `min` and `mag` are both set: the LUTs are single-mip and sampled with an explicit LOD of
|
|
9
|
+
* 0, which selects the magnification filter, but relying on that alone would silently fall
|
|
10
|
+
* back to point sampling if either LUT ever grew mips.
|
|
11
|
+
*
|
|
12
|
+
* Clamp-to-edge reproduces the manual filter's per-corner clamping exactly: `uv` is
|
|
13
|
+
* saturated by `sky_lut_uv`, and at the edges both bilinear taps collapse onto the edge
|
|
14
|
+
* texel.
|
|
15
|
+
*
|
|
16
|
+
* @type {Readonly<SamplerDescriptor>}
|
|
17
|
+
*/
|
|
18
|
+
export const SAMPLER_SKY_LUT: Readonly<SamplerDescriptor>;
|
|
19
|
+
import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
|
|
20
|
+
//# sourceMappingURL=SAMPLER_SKY_LUT.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SAMPLER_SKY_LUT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,8BAFU,SAAS,iBAAiB,CAAC,CAOjC;kCAxB8B,+CAA+C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Filtering sampler for the sky LUTs (transmittance, multiple-scattering).
|
|
5
|
+
*
|
|
6
|
+
* Both LUTs are `rgba16float`, which is filterable in core WebGPU — only the 32-bit float
|
|
7
|
+
* formats need the `float32-filterable` feature — so these can go through the texture unit
|
|
8
|
+
* instead of the 4-tap manual bilinear in `texture_sample_bilinear_uv`.
|
|
9
|
+
*
|
|
10
|
+
* `min` and `mag` are both set: the LUTs are single-mip and sampled with an explicit LOD of
|
|
11
|
+
* 0, which selects the magnification filter, but relying on that alone would silently fall
|
|
12
|
+
* back to point sampling if either LUT ever grew mips.
|
|
13
|
+
*
|
|
14
|
+
* Clamp-to-edge reproduces the manual filter's per-corner clamping exactly: `uv` is
|
|
15
|
+
* saturated by `sky_lut_uv`, and at the edges both bilinear taps collapse onto the edge
|
|
16
|
+
* texel.
|
|
17
|
+
*
|
|
18
|
+
* @type {Readonly<SamplerDescriptor>}
|
|
19
|
+
*/
|
|
20
|
+
export const SAMPLER_SKY_LUT = Object.freeze(SamplerDescriptor.from({
|
|
21
|
+
magFilter: "linear",
|
|
22
|
+
minFilter: "linear",
|
|
23
|
+
addressModeU: "clamp-to-edge",
|
|
24
|
+
addressModeV: "clamp-to-edge",
|
|
25
|
+
}));
|