@woosh/meep-engine 3.60.3 → 3.60.4

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.
Files changed (163) hide show
  1. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +3 -0
  2. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  3. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +6 -0
  4. package/package.json +1 -1
  5. package/src/engine/ecs/ik/PLAN.md +1 -1
  6. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +1 -2
  7. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts +14 -0
  8. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts.map +1 -0
  9. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.js +22 -0
  10. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +19 -3
  11. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  12. package/src/engine/graphics/ecs/trail3d/Trail3D.js +31 -4
  13. package/src/engine/graphics/ecs/trail3d/advance_trail.js +1 -1
  14. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +5 -5
  15. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +1 -1
  16. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +6 -6
  17. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +10 -0
  18. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +1 -1
  19. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -1
  20. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +2 -2
  21. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +2 -2
  22. package/src/shade/playground/probe_clipmap/README.md +1 -0
  23. package/src/shade/playground/probe_clipmap/index.html +5 -0
  24. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  25. package/src/shade/playground/probe_clipmap/main.js +16 -2
  26. package/src/shade/playground/vgeo_scene/README.md +1 -1
  27. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +4 -6
  28. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -1
  29. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +34 -36
  30. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +1 -1
  31. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  32. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +162 -163
  33. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +1 -1
  34. package/src/shade/renderer/atmosphere/compute_mie_absorption.js +1 -1
  35. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +1 -1
  36. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +1 -1
  37. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -164
  38. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +1 -1
  39. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +2 -2
  40. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +2 -2
  41. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +2 -2
  42. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +1 -1
  43. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +1 -1
  44. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +4 -5
  45. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  46. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +6 -7
  47. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +1 -1
  48. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +2 -4
  49. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +1 -1
  50. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +3 -10
  51. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  52. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -0
  53. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +119 -38
  54. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +2 -2
  55. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +12 -0
  56. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  57. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +22 -0
  58. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +4 -1
  59. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  60. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +50 -4
  61. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +6 -0
  62. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  63. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +7 -0
  64. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts +13 -0
  65. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts.map +1 -0
  66. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.js +13 -0
  67. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +17 -0
  68. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  69. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +20 -0
  70. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts +18 -0
  71. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts.map +1 -0
  72. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.js +42 -0
  73. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  74. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +5 -4
  75. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +4 -0
  76. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  77. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +13 -2
  78. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts +52 -0
  79. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts.map +1 -0
  80. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.js +250 -0
  81. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +7 -7
  82. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +2 -2
  83. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts +39 -0
  84. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts.map +1 -0
  85. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.js +119 -0
  86. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +15 -7
  87. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  88. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +66 -83
  89. package/src/shade/renderer/light/environment/graph_filter_environment_map.d.ts.map +1 -1
  90. package/src/shade/renderer/light/environment/graph_filter_environment_map.js +15 -6
  91. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts +3 -0
  92. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts.map +1 -0
  93. package/src/shade/renderer/light/environment/shader_blur_environment_map.js +111 -0
  94. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts +3 -0
  95. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts.map +1 -0
  96. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.js +128 -0
  97. package/src/shade/renderer/light/environment/shader_downsample_environment_map.d.ts.map +1 -1
  98. package/src/shade/renderer/light/environment/shader_downsample_environment_map.js +0 -1
  99. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +1 -4
  100. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +2 -2
  101. package/src/shade/renderer/postprocess/nss/NOTES.md +14 -21
  102. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -3
  103. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  104. package/src/shade/renderer/postprocess/nss/NSS.js +1 -3
  105. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts +5 -6
  106. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts.map +1 -1
  107. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.js +9 -10
  108. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  109. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +48 -49
  110. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  111. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +12 -16
  112. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +246 -246
  113. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +1 -2
  114. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -1
  115. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +34 -35
  116. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts +2 -2
  117. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js +2 -2
  118. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +1 -1
  119. package/src/shade/renderer/shader/chunk/atmosphere/chunk_compute_extinction.js +1 -1
  120. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +1 -1
  121. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +1 -1
  122. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +4 -7
  123. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.d.ts +3 -3
  124. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.js +3 -3
  125. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +12 -19
  126. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +9 -10
  127. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -1
  128. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +9 -10
  129. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +4 -4
  130. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +5 -5
  131. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +1 -1
  132. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +1 -2
  133. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -1
  134. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +1 -2
  135. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts +14 -1
  136. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts.map +1 -1
  137. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.js +19 -6
  138. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts +10 -1
  139. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts.map +1 -1
  140. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.js +14 -6
  141. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.d.ts +1 -1
  142. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.js +1 -1
  143. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +9 -14
  144. package/src/shade/renderer/shadow/contact/FINDINGS.md +5 -5
  145. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +2 -3
  146. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -1
  147. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +7 -8
  148. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +1 -1
  149. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -12
  150. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +2 -2
  151. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
  152. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +3 -4
  153. package/src/shade/renderer/texture/mipmaps/NOTES.md +1 -2
  154. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +1 -1
  155. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +0 -19
  156. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  157. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +2 -52
  158. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts +0 -13
  159. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts.map +0 -1
  160. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.js +0 -198
  161. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts +0 -15
  162. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts.map +0 -1
  163. package/src/view/elements/progress/segmented/segment_frame_transform.js +0 -69
@@ -1,163 +1,162 @@
1
- import { ATMOSPHERE_RADII_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js";
2
- import {
3
- C_MIE_ABSORPTION_DECLARATION,
4
- C_MIE_SCATTERING_DECLARATION
5
- } from "../shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js";
6
- import { C_OZONE_DECLARATION } from "../shader/chunk/atmosphere/C_OZONE_DECLARATION.js";
7
- import { C_RAYLEIGH_DECLARATION } from "../shader/chunk/atmosphere/C_RAYLEIGH_DECLARATION.js";
8
- import { chunk_atmosphere_density } from "../shader/chunk/atmosphere/chunk_atmosphere_density.js";
9
- import { chunk_atmosphere_ray_bounds } from "../shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js";
10
- import {
11
- chunk_position_relative_to_planet_center
12
- } from "../shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js";
13
- import {
14
- chunk_phase_mie_cornette_shanks
15
- } from "../shader/chunk/atmosphere/phase/chunk_phase_mie_cornette_shanks.js";
16
- import { chunk_phase_rayleigh } from "../shader/chunk/atmosphere/phase/chunk_phase_rayleigh.js";
17
- import { PI_DECLARATION } from "../shader/chunk/math/PI_DECLARATION.js";
18
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
19
- import { chunk_sample_transmittance_lut_params } from "./chunk_sample_transmittance_lut.js";
20
- import { MIE_G } from "./MIE_G.js";
21
- import { MULTISCATTER_LUT_STEPS } from "./MULTISCATTER_LUT_CONFIG.js";
22
-
23
-
24
- /**
25
- * One direction's contribution to Equations (5) and (7) from the paper: `out_lum` is the
26
- * second-order in-scattered luminance along `rayDir`, `out_fms` the luminance that would
27
- * come back if the medium scattered one unit of light isotropically. The caller integrates
28
- * over the direction set -- see {@link chunk_multiscatter_sample_direction} -- by taking the
29
- * mean, which is what the paper's uniform phase p_u = 1/(4*PI) reduces to.
30
- *
31
- * Splitting one direction out of the loop is what lets `shader_multiscatter_lut` put a
32
- * thread on each of the 64 directions, the way Hillaire's `NewMultiScattCS` does.
33
- *
34
- * `pos` is assumed to be inside the atmosphere and at or above the surface, which is what
35
- * makes the far root of the outer sphere the atmosphere exit.
36
- *
37
- * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
38
- * @see https://www.shadertoy.com/view/slSXRW
39
- * @type {CodeChunk}
40
- */
41
- export const chunk_get_multiscatter_values = CodeChunk.from(
42
- //language=WGSL
43
- `
44
- const MULTISCATTER_GROUND_ALBEDO = vec3(0.3);
45
- const MULTISCATTER_STEPS = ${MULTISCATTER_LUT_STEPS}u;
46
- const MULTISCATTER_STEPS_F = f32(MULTISCATTER_STEPS);
47
-
48
- fn get_multiscatter_values(
49
- pos: vec3<f32>,
50
- sunDir: vec3<f32>,
51
- rayDir: vec3<f32>,
52
- out_lum: ptr<function,vec3<f32>>,
53
- out_fms: ptr<function,vec3<f32>>,
54
- ) {
55
- let rel = position_relative_to_planet_center(pos);
56
-
57
- // one quadratic setup for both spheres; in case we're looking down, the ground is as far
58
- // as the march goes
59
- let bounds = atmosphere_ray_bounds(rel, rayDir);
60
-
61
- let tMax = bounds.t_max;
62
-
63
- let cosTheta = dot(rayDir, sunDir);
64
-
65
- let miePhaseValue = phase_mie(cosTheta, ${MIE_G});
66
- let rayleighPhaseValue = phase_rayleigh(-cosTheta);
67
-
68
- var lum = vec3(0.0);
69
- var lumFactor = vec3(0.0);
70
- var transmittance = vec3(1.0);
71
-
72
- var t = 0.0;
73
- for (var stepI = 0u; stepI < MULTISCATTER_STEPS; stepI++) {
74
- let newT = ( (f32(stepI) + 0.3) / MULTISCATTER_STEPS_F ) * tMax;
75
- let dt = newT - t;
76
- t = newT;
77
-
78
- // Stepping the planet-relative position directly: building the world position only
79
- // to have the LUT lookup subtract the planet centre back off it was the second of
80
- // two square roots per step.
81
- let step_rel = rel + t * rayDir;
82
- let step_radius = length(step_rel);
83
- let up = step_rel / step_radius;
84
-
85
- let local_height = step_radius - ATMOSPHERE_GROUND_RADIUS;
86
- let local_density = atmosphere_density(local_height);
87
-
88
- let ozone_density = local_density.z;
89
- let ozone_absorption = ozone_density * C_OZONE;
90
-
91
- let mie_density = local_density.y;
92
- let mie_absorption = mie_density * C_MIE_ABSORPTION;
93
- let mie_scattering = mie_density * C_MIE_SCATTERING;
94
-
95
- // note - taken from the Hillaire's atmosphere code: https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Resources/RenderSkyCommon.hlsl#L248
96
- let rayleigh_absorption = 0.0;
97
- let rayleigh_scattering = local_density.x * C_RAYLEIGH;
98
-
99
- let extinction = rayleigh_scattering + rayleigh_absorption + mie_scattering + mie_absorption + ozone_absorption;
100
-
101
-
102
- let sample_transmittance = exp(-dt * extinction);
103
-
104
- // Integrate within each segment.
105
- let scatteringNoPhase = rayleigh_scattering + mie_scattering;
106
- let scatteringF = (scatteringNoPhase - scatteringNoPhase * sample_transmittance) / extinction;
107
- lumFactor += transmittance * scatteringF;
108
-
109
- // This is slightly different from the paper, but I think the paper has a mistake?
110
- // In equation (6), I think S(x,w_s) should be S(x-tv,w_s).
111
- let sun_transmittance = sample_transmittance_lut_params(local_height, dot(sunDir, up));
112
-
113
- let rayleighInScattering = rayleigh_scattering * rayleighPhaseValue;
114
- let mieInScattering = mie_scattering * miePhaseValue;
115
- let inScattering = (rayleighInScattering + mieInScattering) * sun_transmittance;
116
-
117
- // Integrated scattering within path segment.
118
- let scatteringIntegral = (inScattering - inScattering * sample_transmittance) / extinction;
119
-
120
- lum += scatteringIntegral * transmittance;
121
- transmittance *= sample_transmittance;
122
- }
123
-
124
- if (bounds.hits_ground) {
125
-
126
- // Light bounced off the planet. Hillaire reaches this through
127
- // IntegrateScatteredLuminance:
128
- // L += ... * throughput * NdotL * Atmosphere.GroundAlbedo / PI
129
- // The surface is Lambertian, hence albedo/PI, and the cosine belongs to the hit
130
- // point rather than to \`pos\`: along a shallow ray the two are hundreds of
131
- // kilometres apart and can sit on opposite sides of the terminator.
132
- let hit_up = normalize(rel + bounds.ground_distance * rayDir);
133
-
134
- let sun_cos_zenith_angle = dot(hit_up, sunDir);
135
-
136
- // the hit lies on the surface by construction, so its LUT altitude is exactly zero
137
- let sun_transmittance = sample_transmittance_lut_params(0.0, sun_cos_zenith_angle);
138
-
139
- lum += transmittance
140
- * saturate(sun_cos_zenith_angle)
141
- * (MULTISCATTER_GROUND_ALBEDO / PI)
142
- * sun_transmittance;
143
- }
144
-
145
- *out_fms = lumFactor;
146
- *out_lum = lum;
147
-
148
- }
149
- `, [
150
- PI_DECLARATION,
151
- ATMOSPHERE_RADII_DECLARATION,
152
- C_OZONE_DECLARATION,
153
- C_MIE_SCATTERING_DECLARATION,
154
- C_MIE_ABSORPTION_DECLARATION,
155
- C_RAYLEIGH_DECLARATION,
156
- chunk_atmosphere_density,
157
- chunk_atmosphere_ray_bounds,
158
- chunk_phase_mie_cornette_shanks,
159
- chunk_phase_rayleigh,
160
- chunk_position_relative_to_planet_center,
161
- chunk_sample_transmittance_lut_params,
162
- ]
163
- )
1
+ import { ATMOSPHERE_RADII_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js";
2
+ import {
3
+ C_MIE_ABSORPTION_DECLARATION,
4
+ C_MIE_SCATTERING_DECLARATION
5
+ } from "../shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js";
6
+ import { C_OZONE_DECLARATION } from "../shader/chunk/atmosphere/C_OZONE_DECLARATION.js";
7
+ import { C_RAYLEIGH_DECLARATION } from "../shader/chunk/atmosphere/C_RAYLEIGH_DECLARATION.js";
8
+ import { chunk_atmosphere_density } from "../shader/chunk/atmosphere/chunk_atmosphere_density.js";
9
+ import { chunk_atmosphere_ray_bounds } from "../shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js";
10
+ import {
11
+ chunk_position_relative_to_planet_center
12
+ } from "../shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js";
13
+ import {
14
+ chunk_phase_mie_cornette_shanks
15
+ } from "../shader/chunk/atmosphere/phase/chunk_phase_mie_cornette_shanks.js";
16
+ import { chunk_phase_rayleigh } from "../shader/chunk/atmosphere/phase/chunk_phase_rayleigh.js";
17
+ import { PI_DECLARATION } from "../shader/chunk/math/PI_DECLARATION.js";
18
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
19
+ import { chunk_sample_transmittance_lut_params } from "./chunk_sample_transmittance_lut.js";
20
+ import { MIE_G } from "./MIE_G.js";
21
+ import { MULTISCATTER_LUT_STEPS } from "./MULTISCATTER_LUT_CONFIG.js";
22
+
23
+
24
+ /**
25
+ * One direction's contribution to Equations (5) and (7) from the paper: `out_lum` is the
26
+ * second-order in-scattered luminance along `rayDir`, `out_fms` the luminance that would
27
+ * come back if the medium scattered one unit of light isotropically. The caller integrates
28
+ * over the direction set -- see {@link chunk_multiscatter_sample_direction} -- by taking the
29
+ * mean, which is what the paper's uniform phase p_u = 1/(4*PI) reduces to.
30
+ *
31
+ * Splitting one direction out of the loop is what lets `shader_multiscatter_lut` put a
32
+ * thread on each of the 64 directions.
33
+ *
34
+ * `pos` is assumed to be inside the atmosphere and at or above the surface, which is what
35
+ * makes the far root of the outer sphere the atmosphere exit.
36
+ *
37
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
38
+ * @see https://www.shadertoy.com/view/slSXRW
39
+ * @type {CodeChunk}
40
+ */
41
+ export const chunk_get_multiscatter_values = CodeChunk.from(
42
+ //language=WGSL
43
+ `
44
+ const MULTISCATTER_GROUND_ALBEDO = vec3(0.3);
45
+ const MULTISCATTER_STEPS = ${MULTISCATTER_LUT_STEPS}u;
46
+ const MULTISCATTER_STEPS_F = f32(MULTISCATTER_STEPS);
47
+
48
+ fn get_multiscatter_values(
49
+ pos: vec3<f32>,
50
+ sunDir: vec3<f32>,
51
+ rayDir: vec3<f32>,
52
+ out_lum: ptr<function,vec3<f32>>,
53
+ out_fms: ptr<function,vec3<f32>>,
54
+ ) {
55
+ let rel = position_relative_to_planet_center(pos);
56
+
57
+ // one quadratic setup for both spheres; in case we're looking down, the ground is as far
58
+ // as the march goes
59
+ let bounds = atmosphere_ray_bounds(rel, rayDir);
60
+
61
+ let tMax = bounds.t_max;
62
+
63
+ let cosTheta = dot(rayDir, sunDir);
64
+
65
+ let miePhaseValue = phase_mie(cosTheta, ${MIE_G});
66
+ let rayleighPhaseValue = phase_rayleigh(-cosTheta);
67
+
68
+ var lum = vec3(0.0);
69
+ var lumFactor = vec3(0.0);
70
+ var transmittance = vec3(1.0);
71
+
72
+ var t = 0.0;
73
+ for (var stepI = 0u; stepI < MULTISCATTER_STEPS; stepI++) {
74
+ let newT = ( (f32(stepI) + 0.3) / MULTISCATTER_STEPS_F ) * tMax;
75
+ let dt = newT - t;
76
+ t = newT;
77
+
78
+ // Stepping the planet-relative position directly: building the world position only
79
+ // to have the LUT lookup subtract the planet centre back off it was the second of
80
+ // two square roots per step.
81
+ let step_rel = rel + t * rayDir;
82
+ let step_radius = length(step_rel);
83
+ let up = step_rel / step_radius;
84
+
85
+ let local_height = step_radius - ATMOSPHERE_GROUND_RADIUS;
86
+ let local_density = atmosphere_density(local_height);
87
+
88
+ let ozone_density = local_density.z;
89
+ let ozone_absorption = ozone_density * C_OZONE;
90
+
91
+ let mie_density = local_density.y;
92
+ let mie_absorption = mie_density * C_MIE_ABSORPTION;
93
+ let mie_scattering = mie_density * C_MIE_SCATTERING;
94
+
95
+ let rayleigh_absorption = 0.0;
96
+ let rayleigh_scattering = local_density.x * C_RAYLEIGH;
97
+
98
+ let extinction = rayleigh_scattering + rayleigh_absorption + mie_scattering + mie_absorption + ozone_absorption;
99
+
100
+
101
+ let sample_transmittance = exp(-dt * extinction);
102
+
103
+ // Integrate within each segment.
104
+ let scatteringNoPhase = rayleigh_scattering + mie_scattering;
105
+ let scatteringF = (scatteringNoPhase - scatteringNoPhase * sample_transmittance) / extinction;
106
+ lumFactor += transmittance * scatteringF;
107
+
108
+ // This is slightly different from the paper, but I think the paper has a mistake?
109
+ // In equation (6), I think S(x,w_s) should be S(x-tv,w_s).
110
+ let sun_transmittance = sample_transmittance_lut_params(local_height, dot(sunDir, up));
111
+
112
+ let rayleighInScattering = rayleigh_scattering * rayleighPhaseValue;
113
+ let mieInScattering = mie_scattering * miePhaseValue;
114
+ let inScattering = (rayleighInScattering + mieInScattering) * sun_transmittance;
115
+
116
+ // Integrated scattering within path segment.
117
+ let scatteringIntegral = (inScattering - inScattering * sample_transmittance) / extinction;
118
+
119
+ lum += scatteringIntegral * transmittance;
120
+ transmittance *= sample_transmittance;
121
+ }
122
+
123
+ if (bounds.hits_ground) {
124
+
125
+ // Light bounced off the planet. Hillaire reaches this through
126
+ // IntegrateScatteredLuminance:
127
+ // L += ... * throughput * NdotL * Atmosphere.GroundAlbedo / PI
128
+ // The surface is Lambertian, hence albedo/PI, and the cosine belongs to the hit
129
+ // point rather than to \`pos\`: along a shallow ray the two are hundreds of
130
+ // kilometres apart and can sit on opposite sides of the terminator.
131
+ let hit_up = normalize(rel + bounds.ground_distance * rayDir);
132
+
133
+ let sun_cos_zenith_angle = dot(hit_up, sunDir);
134
+
135
+ // the hit lies on the surface by construction, so its LUT altitude is exactly zero
136
+ let sun_transmittance = sample_transmittance_lut_params(0.0, sun_cos_zenith_angle);
137
+
138
+ lum += transmittance
139
+ * saturate(sun_cos_zenith_angle)
140
+ * (MULTISCATTER_GROUND_ALBEDO / PI)
141
+ * sun_transmittance;
142
+ }
143
+
144
+ *out_fms = lumFactor;
145
+ *out_lum = lum;
146
+
147
+ }
148
+ `, [
149
+ PI_DECLARATION,
150
+ ATMOSPHERE_RADII_DECLARATION,
151
+ C_OZONE_DECLARATION,
152
+ C_MIE_SCATTERING_DECLARATION,
153
+ C_MIE_ABSORPTION_DECLARATION,
154
+ C_RAYLEIGH_DECLARATION,
155
+ chunk_atmosphere_density,
156
+ chunk_atmosphere_ray_bounds,
157
+ chunk_phase_mie_cornette_shanks,
158
+ chunk_phase_rayleigh,
159
+ chunk_position_relative_to_planet_center,
160
+ chunk_sample_transmittance_lut_params,
161
+ ]
162
+ )
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/Game.cpp#L707
2
+ * Compute Mie absorption from scattering and extinction coefficients.
3
3
  * @param {number[]} scattering
4
4
  * @param {number[]} extinction
5
5
  * @returns {number[]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/Game.cpp#L707
2
+ * Compute Mie absorption from scattering and extinction coefficients.
3
3
  * @param {number[]} scattering
4
4
  * @param {number[]} extinction
5
5
  * @returns {number[]}
@@ -10,7 +10,7 @@ import { compute_mie_absorption } from "../compute_mie_absorption.js";
10
10
  * Earth-like atmospheric parametrization
11
11
  *
12
12
  * NOTE: all values are in Km (not m)
13
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/SkyAtmosphereCommon.cpp#L11
13
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
14
14
  */
15
15
  export const ATMOSPHERE_EARTH = {
16
16
  BottomRadius: 6378,
@@ -2,7 +2,7 @@ import { f32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
2
  import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
3
 
4
4
  /**
5
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Resources/SkyAtmosphereCommon.hlsl#L81
5
+ * Atmosphere parameters uniform struct ("A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire 2020).
6
6
  * @type {WebGPUStruct}
7
7
  */
8
8
  const ATMOSPHERE_PARAMETERS_STRUCT = WebGPUStruct.from({