@woosh/meep-engine 3.11.1 → 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.
Files changed (225) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  4. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +294 -290
  5. package/src/engine/graphics3/ParticipatingMedia.d.ts +111 -0
  6. package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -0
  7. package/src/engine/graphics3/ParticipatingMedia.js +203 -0
  8. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +34 -0
  9. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -0
  10. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +73 -0
  11. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +87 -0
  12. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -0
  13. package/src/engine/graphics3/ParticipatingMediaSystem3.js +184 -0
  14. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  15. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  16. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  17. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  18. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  19. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  20. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  21. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  22. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  23. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  24. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  25. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  26. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  27. package/src/shade/device/immediate_data_supported.js +53 -0
  28. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  29. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  30. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  31. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  32. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  33. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  34. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  35. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  36. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  37. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  38. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  39. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  40. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  41. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  42. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  43. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  44. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  45. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  46. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  47. package/src/shade/playground/volumetrics_froxel/README.md +104 -1
  48. package/src/shade/playground/volumetrics_froxel/index.html +20 -1
  49. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  50. package/src/shade/playground/volumetrics_froxel/main.js +298 -0
  51. package/src/shade/playground/volumetrics_froxel/measure.d.ts +119 -0
  52. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -0
  53. package/src/shade/playground/volumetrics_froxel/measure.js +559 -0
  54. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  55. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  56. package/src/shade/renderer/GraphicsContext.js +13 -1
  57. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  58. package/src/shade/renderer/Renderer.js +22 -18
  59. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  60. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  61. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  62. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  63. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  64. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  65. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  66. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  67. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  68. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  69. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  70. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  71. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  72. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  73. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  74. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  75. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  76. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  77. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  78. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  79. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  80. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  81. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  82. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  83. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  84. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  85. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  86. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  87. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  88. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  89. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  90. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  91. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  92. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  93. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
  94. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  95. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  96. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  97. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  98. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  99. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
  100. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  101. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  102. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  103. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  104. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  105. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  106. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  107. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  108. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  109. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  110. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  111. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  112. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  113. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  114. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  115. package/src/shade/renderer/shader/ComputeShader.js +6 -2
  116. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  117. package/src/shade/renderer/shader/ImageShader.js +4 -1
  118. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  119. package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
  120. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  121. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  122. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  123. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  124. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  125. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  126. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  127. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  128. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  129. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  130. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  131. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  132. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  133. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  134. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  135. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  136. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  137. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  138. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  139. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  140. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  141. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  142. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  143. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  144. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  145. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  146. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  147. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  148. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  149. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  150. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  151. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  152. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  153. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  154. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  155. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  156. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  157. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  158. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  159. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  160. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  161. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  162. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  163. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  164. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  165. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  166. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  167. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts +14 -13
  168. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  169. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +133 -129
  170. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  171. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  172. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  173. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +480 -315
  174. package/src/shade/renderer/volumetrics/NOTES.md +887 -8
  175. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +5 -0
  176. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  177. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +21 -2
  178. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +26 -0
  179. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
  180. package/src/shade/renderer/volumetrics/SceneVolumetrics.js +64 -21
  181. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.d.ts.map +1 -1
  182. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.js +84 -28
  183. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts +98 -0
  184. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts.map +1 -0
  185. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.js +111 -0
  186. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts +84 -0
  187. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts.map +1 -0
  188. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.js +252 -0
  189. package/src/shade/renderer/volumetrics/chunk_integrate_optical_depth.js +75 -75
  190. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts +43 -0
  191. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts.map +1 -0
  192. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -0
  193. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +20 -0
  194. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -0
  195. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +48 -0
  196. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts +38 -0
  197. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -0
  198. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +130 -0
  199. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +18 -3
  200. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  201. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +193 -70
  202. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -0
  203. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  204. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +83 -15
  205. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  206. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  207. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  208. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +58 -0
  209. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -0
  210. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +290 -0
  211. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +25 -0
  212. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  213. package/src/shade/wgsl/emulator/CPUBitmapData.js +33 -0
  214. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2228 -2215
  215. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  216. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +210 -2
  217. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts +69 -0
  218. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts.map +1 -0
  219. package/src/shade/wgsl/emulator/cpu_texture_gather.js +148 -0
  220. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts +16 -0
  221. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts.map +1 -1
  222. package/src/shade/wgsl/emulator/cpu_texture_sample.js +176 -172
  223. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  224. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  225. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,205 +1,216 @@
1
- import { u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
- import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
4
- import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
5
- import { ATMOSPHERE_HEIGHT_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js";
6
- import {
7
- C_MIE_ABSORPTION_DECLARATION,
8
- C_MIE_SCATTERING_DECLARATION
9
- } from "../shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js";
10
- import { C_OZONE_DECLARATION } from "../shader/chunk/atmosphere/C_OZONE_DECLARATION.js";
11
- import { C_RAYLEIGH_DECLARATION } from "../shader/chunk/atmosphere/C_RAYLEIGH_DECLARATION.js";
12
- import { chunk_atmosphere_density } from "../shader/chunk/atmosphere/chunk_atmosphere_density.js";
13
- import { chunk_atmosphere_height } from "../shader/chunk/atmosphere/chunk_atmosphere_height.js";
14
- import {
15
- chunk_position_relative_to_planet_center
16
- } from "../shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js";
17
-
18
- import { chunk_sphere_intersection_nearest } from "../shader/chunk/atmosphere/chunk_sphere_intersection_nearest.js";
19
- import {
20
- chunk_phase_mie_cornette_shanks
21
- } from "../shader/chunk/atmosphere/phase/chunk_phase_mie_cornette_shanks.js";
22
- import { chunk_phase_rayleigh } from "../shader/chunk/atmosphere/phase/chunk_phase_rayleigh.js";
23
- import { PLANET_CENTER_DECLARATION } from "../shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js";
24
- import { PLANET_RADIUS_DECLARATION } from "../shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.js";
25
- import { chunk_mat4_extract_position } from "../shader/chunk/geometry/mat4/chunk_mat4_extract_position.js";
26
- import {
27
- chunk_uv_octahedral_unit_decode
28
- } from "../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
29
- import { chunk_light_get_sun } from "../shader/chunk/light/sky/chunk_sample_sky_color.js";
30
- import { chunk_safe_acos } from "../shader/chunk/math/chunk_safe_acos.js";
31
- import { chunk_safe_sqrt } from "../shader/chunk/math/chunk_safe_sqrt.js";
32
- import { PI_DECLARATION } from "../shader/chunk/math/PI_DECLARATION.js";
33
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
34
- import { ImageShader } from "../shader/ImageShader.js";
35
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
36
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
37
- import { ATMOSPHERE_ALTITUDE_CUTOFF } from "./ATMOSPHERE_ALTITUDE_CUTOFF.js";
38
-
39
- import { chunk_sample_multiscatter_lut } from "./chunk_sample_multiscatter_lut.js";
40
- import { chunk_sample_transmittance_lut } from "./chunk_sample_transmittance_lut.js";
41
- import { MIE_G } from "./MIE_G.js";
42
-
43
- const SETTINGS_STRUCT = WebGPUStruct.from({
44
- steps: u32,
45
- });
46
-
47
- const resources = new ShaderResourceSetDescriptor();
48
-
49
- resources.createGroup()
50
- .addUniform("settings", SETTINGS_STRUCT)
51
- .addUniform("camera", CAMERA_UNIFORM_STRUCT)
52
- .addTexture("tSkyLutTransmittance")
53
- .addTexture("tSkyLutMultiscatter")
54
- ;
55
-
56
- resources.createGroup()
57
- .addStorageBuffer("light_data", WebGPUArray.u32)
58
-
59
- const chunk_raymarch_scattering = CodeChunk.from(
60
- //language=WGSL
61
- `
62
- fn raymarch_scattering(
63
- origin: vec3<f32>,
64
- ray_dir: vec3<f32>,
65
- sun_dir: vec3<f32>,
66
- tMax: f32,
67
- numSteps: f32
68
- ) -> vec3<f32> {
69
- let cosTheta = dot(ray_dir, sun_dir);
70
-
71
- let miePhaseValue = phase_mie(cosTheta, ${MIE_G});
72
- let rayleighPhaseValue = phase_rayleigh(-cosTheta);
73
-
74
- var lum = vec3(0.0);
75
- var transmittance = vec3(1.0);
76
-
77
- var t = 0.0;
78
- for (var i = 0.0; i < numSteps; i += 1.0) {
79
-
80
- let newT = ((i + 0.3)/numSteps)*tMax;
81
- let dt = newT - t;
82
- t = newT;
83
-
84
- let position = origin + t * ray_dir;
85
-
86
- let local_height = atmosphere_height(position);
87
- let local_density = atmosphere_density(local_height);
88
-
89
- let ozone_density = local_density.z;
90
- let ozone_absorption = ozone_density * C_OZONE;
91
-
92
- let mie_density = local_density.y;
93
- let mie_absorption = mie_density * C_MIE_ABSORPTION;
94
- let mie_scattering = mie_density * C_MIE_SCATTERING;
95
-
96
- // note - taken from the Hillaire's atmosphere code: https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Resources/RenderSkyCommon.hlsl#L248
97
- let rayleigh_absorption = 0.0;
98
- let rayleigh_scattering = local_density.x * C_RAYLEIGH;
99
-
100
- let extinction = rayleigh_scattering + rayleigh_absorption + mie_scattering + mie_absorption + ozone_absorption;
101
-
102
-
103
- let sample_transmittance = exp( -dt * extinction );
104
-
105
- let sun_transmittance = sample_transmittance_lut(position, sun_dir);
106
- let psiMS = sample_multiscatter_lut(position, sun_dir);
107
-
108
- let rayleigh_in_scattering = rayleigh_scattering * ( rayleighPhaseValue * sun_transmittance + psiMS );
109
- let mie_in_scattering = mie_scattering * ( miePhaseValue * sun_transmittance + psiMS );
110
- let in_scattering = ( rayleigh_in_scattering + mie_in_scattering );
111
-
112
- // Integrated scattering within path segment.
113
- let scattering_integral = ( in_scattering - in_scattering * sample_transmittance ) / extinction;
114
-
115
- lum += scattering_integral * transmittance;
116
-
117
- transmittance *= sample_transmittance;
118
- }
119
-
120
- return lum;
121
- }
122
- `, [
123
- chunk_atmosphere_height,
124
- chunk_atmosphere_density,
125
- chunk_phase_mie_cornette_shanks,
126
- chunk_phase_rayleigh,
127
- chunk_sample_transmittance_lut,
128
- chunk_sample_multiscatter_lut,
129
- C_MIE_ABSORPTION_DECLARATION,
130
- C_MIE_SCATTERING_DECLARATION,
131
- C_OZONE_DECLARATION,
132
- C_RAYLEIGH_DECLARATION,
133
- ]
134
- );
135
-
136
- const body = CodeChunk.from(
137
- //language=WGSL
138
- `
139
- @fragment
140
- fn main(
141
- @builtin(position) coord: vec4<f32>,
142
- @location(0) uv: vec2<f32>,
143
- ) -> @location(0) vec4<f32> {
144
-
145
- var actual_view_position = mat4_extract_position(camera.transform);
146
-
147
- let relative_position = position_relative_to_planet_center(actual_view_position);
148
-
149
- let up = normalize(relative_position);
150
-
151
- let height = length(relative_position);
152
-
153
- // force view into valid range
154
- let clamped_height = clamp(height , PLANET_RADIUS + ${ATMOSPHERE_ALTITUDE_CUTOFF}, PLANET_RADIUS + ATMOSPHERE_HEIGHT - ${ATMOSPHERE_ALTITUDE_CUTOFF});
155
-
156
- let view_position = up * clamped_height + PLANET_CENTER;
157
-
158
- let rayDir = uv_octahedral_unit_decode(uv);
159
-
160
- let sun = light_get_sun();
161
-
162
- let sunAltitude = ( 0.5 * PI ) - safe_acos( dot(-sun.direction, up) );
163
- let sunDir = vec3(0.0, sin(sunAltitude), -cos(sunAltitude));
164
-
165
- let atmoDist = sphere_intersection_nearest(view_position, rayDir, PLANET_CENTER, PLANET_RADIUS + ATMOSPHERE_HEIGHT);
166
- let groundDist = sphere_intersection_nearest(view_position, rayDir, PLANET_CENTER, PLANET_RADIUS);
167
-
168
- let tMax = select(atmoDist, groundDist, groundDist > 0.0);
169
-
170
- let lum = raymarch_scattering(view_position, rayDir, sunDir, tMax, f32(settings.steps));
171
-
172
- // TODO validate this, it "feels" wrong to me
173
- let irradiance = lum * sun.color;
174
-
175
- return vec4(irradiance, 1.0);
176
-
177
- }
178
- `, [
179
- chunk_safe_acos,
180
- chunk_safe_sqrt,
181
- chunk_light_get_sun,
182
- chunk_position_relative_to_planet_center,
183
- chunk_mat4_extract_position,
184
- PLANET_RADIUS_DECLARATION,
185
- PLANET_CENTER_DECLARATION,
186
- ATMOSPHERE_HEIGHT_DECLARATION,
187
- PI_DECLARATION,
188
- chunk_sphere_intersection_nearest,
189
- chunk_uv_octahedral_unit_decode,
190
- chunk_raymarch_scattering,
191
- ]
192
- );
193
-
194
- export const shader_sky_irradiance_lut = new ImageShader({
195
- descriptor: ShaderDescriptor.from({
196
- label: "Sky / sky irradiance LUT",
197
- body,
198
- resources
199
- }),
200
- targets: [
201
- {
202
- format: "rgba16float"
203
- }
204
- ]
1
+ import { WebGPUArray } from "../shader/type/WebGPUArray.js";
2
+ import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
3
+ import { ATMOSPHERE_HEIGHT_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js";
4
+ import {
5
+ C_MIE_ABSORPTION_DECLARATION,
6
+ C_MIE_SCATTERING_DECLARATION
7
+ } from "../shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js";
8
+ import { C_OZONE_DECLARATION } from "../shader/chunk/atmosphere/C_OZONE_DECLARATION.js";
9
+ import { C_RAYLEIGH_DECLARATION } from "../shader/chunk/atmosphere/C_RAYLEIGH_DECLARATION.js";
10
+ import { ATMOSPHERE_RADII_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js";
11
+ import { chunk_atmosphere_density } from "../shader/chunk/atmosphere/chunk_atmosphere_density.js";
12
+ import { chunk_atmosphere_ray_bounds } from "../shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js";
13
+ import {
14
+ chunk_position_relative_to_planet_center
15
+ } from "../shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js";
16
+
17
+ import {
18
+ chunk_phase_mie_cornette_shanks
19
+ } from "../shader/chunk/atmosphere/phase/chunk_phase_mie_cornette_shanks.js";
20
+ import { chunk_phase_rayleigh } from "../shader/chunk/atmosphere/phase/chunk_phase_rayleigh.js";
21
+ import { PLANET_RADIUS_DECLARATION } from "../shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.js";
22
+ import { chunk_mat4_extract_position } from "../shader/chunk/geometry/mat4/chunk_mat4_extract_position.js";
23
+ import {
24
+ chunk_uv_octahedral_unit_decode
25
+ } from "../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
26
+ import { chunk_light_get_sun } from "../shader/chunk/light/sky/chunk_sample_sky_color.js";
27
+ import { chunk_safe_acos } from "../shader/chunk/math/chunk_safe_acos.js";
28
+ import { PI_DECLARATION } from "../shader/chunk/math/PI_DECLARATION.js";
29
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
30
+ import { ImageShader } from "../shader/ImageShader.js";
31
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
32
+ import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
33
+ import { ATMOSPHERE_ALTITUDE_CUTOFF } from "./ATMOSPHERE_ALTITUDE_CUTOFF.js";
34
+
35
+ import { chunk_sample_multiscatter_lut_params } from "./chunk_sample_multiscatter_lut.js";
36
+ import { chunk_sample_transmittance_lut_params } from "./chunk_sample_transmittance_lut.js";
37
+ import { MIE_G } from "./MIE_G.js";
38
+ import { SAMPLER_SKY_LUT } from "./SAMPLER_SKY_LUT.js";
39
+
40
+ /**
41
+ * Ray-march steps per texel. Compile-time on purpose: as a uniform the march could not be
42
+ * unrolled and its trip count had to be re-tested against an f32 every iteration.
43
+ * @type {number}
44
+ */
45
+ const SKY_IRRADIANCE_LUT_STEPS = 32;
46
+
47
+ const resources = new ShaderResourceSetDescriptor();
48
+
49
+ resources.createGroup()
50
+ .addUniform("camera", CAMERA_UNIFORM_STRUCT)
51
+ // "float" rather than the default "unfilterable-float": both LUTs are rgba16float,
52
+ // which is filterable in core WebGPU, so they go through the texture unit rather than a
53
+ // 4-tap manual bilinear -- see chunk_sample_transmittance_lut.
54
+ .addTexture("tSkyLutTransmittance", "float")
55
+ .addTexture("tSkyLutMultiscatter", "float")
56
+ .addSampler("sSkyLut", "filtering", SAMPLER_SKY_LUT)
57
+ ;
58
+
59
+ resources.createGroup()
60
+ .addStorageBuffer("light_data", WebGPUArray.u32)
61
+
62
+ const chunk_raymarch_scattering = CodeChunk.from(
63
+ //language=WGSL
64
+ `
65
+ const SKY_IRRADIANCE_STEPS = ${SKY_IRRADIANCE_LUT_STEPS}u;
66
+ const SKY_IRRADIANCE_STEPS_F = f32(SKY_IRRADIANCE_STEPS);
67
+
68
+ fn raymarch_scattering(
69
+ origin_rel: vec3<f32>,
70
+ ray_dir: vec3<f32>,
71
+ sun_dir: vec3<f32>,
72
+ tMax: f32
73
+ ) -> vec3<f32> {
74
+ let cosTheta = dot(ray_dir, sun_dir);
75
+
76
+ let miePhaseValue = phase_mie(cosTheta, ${MIE_G});
77
+ let rayleighPhaseValue = phase_rayleigh(-cosTheta);
78
+
79
+ var lum = vec3(0.0);
80
+ var transmittance = vec3(1.0);
81
+
82
+ var t = 0.0;
83
+ for (var step_i = 0u; step_i < SKY_IRRADIANCE_STEPS; step_i++) {
84
+
85
+ let newT = ((f32(step_i) + 0.3)/SKY_IRRADIANCE_STEPS_F)*tMax;
86
+ let dt = newT - t;
87
+ t = newT;
88
+
89
+ // One square root for the whole step. Marching the planet-relative position yields
90
+ // the altitude and the up vector from the same length, and both LUT lookups take
91
+ // that pair directly -- each used to recover it from a world position of its own,
92
+ // which was three lengths and two normalizes per step for one step's worth of work.
93
+ let step_rel = origin_rel + t * ray_dir;
94
+ let step_radius = length(step_rel);
95
+ let up = step_rel / step_radius;
96
+
97
+ let local_height = step_radius - ATMOSPHERE_GROUND_RADIUS;
98
+ let sun_cos_zenith_angle = dot(sun_dir, up);
99
+
100
+ let local_density = atmosphere_density(local_height);
101
+
102
+ let ozone_density = local_density.z;
103
+ let ozone_absorption = ozone_density * C_OZONE;
104
+
105
+ let mie_density = local_density.y;
106
+ let mie_absorption = mie_density * C_MIE_ABSORPTION;
107
+ let mie_scattering = mie_density * C_MIE_SCATTERING;
108
+
109
+ // note - taken from the Hillaire's atmosphere code: https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Resources/RenderSkyCommon.hlsl#L248
110
+ let rayleigh_absorption = 0.0;
111
+ let rayleigh_scattering = local_density.x * C_RAYLEIGH;
112
+
113
+ let extinction = rayleigh_scattering + rayleigh_absorption + mie_scattering + mie_absorption + ozone_absorption;
114
+
115
+
116
+ let sample_transmittance = exp( -dt * extinction );
117
+
118
+ let sun_transmittance = sample_transmittance_lut_params(local_height, sun_cos_zenith_angle);
119
+ let psiMS = sample_multiscatter_lut_params(local_height, sun_cos_zenith_angle);
120
+
121
+ let rayleigh_in_scattering = rayleigh_scattering * ( rayleighPhaseValue * sun_transmittance + psiMS );
122
+ let mie_in_scattering = mie_scattering * ( miePhaseValue * sun_transmittance + psiMS );
123
+ let in_scattering = ( rayleigh_in_scattering + mie_in_scattering );
124
+
125
+ // Integrated scattering within path segment.
126
+ let scattering_integral = ( in_scattering - in_scattering * sample_transmittance ) / extinction;
127
+
128
+ lum += scattering_integral * transmittance;
129
+
130
+ transmittance *= sample_transmittance;
131
+ }
132
+
133
+ return lum;
134
+ }
135
+ `, [
136
+ ATMOSPHERE_RADII_DECLARATION,
137
+ chunk_atmosphere_density,
138
+ chunk_phase_mie_cornette_shanks,
139
+ chunk_phase_rayleigh,
140
+ chunk_sample_transmittance_lut_params,
141
+ chunk_sample_multiscatter_lut_params,
142
+ C_MIE_ABSORPTION_DECLARATION,
143
+ C_MIE_SCATTERING_DECLARATION,
144
+ C_OZONE_DECLARATION,
145
+ C_RAYLEIGH_DECLARATION,
146
+ ]
147
+ );
148
+
149
+ const body = CodeChunk.from(
150
+ //language=WGSL
151
+ `
152
+ @fragment
153
+ fn main(
154
+ @builtin(position) coord: vec4<f32>,
155
+ @location(0) uv: vec2<f32>,
156
+ ) -> @location(0) vec4<f32> {
157
+
158
+ var actual_view_position = mat4_extract_position(camera.transform);
159
+
160
+ let relative_position = position_relative_to_planet_center(actual_view_position);
161
+
162
+ let up = normalize(relative_position);
163
+
164
+ let height = length(relative_position);
165
+
166
+ // force view into valid range
167
+ let clamped_height = clamp(height , PLANET_RADIUS + ${ATMOSPHERE_ALTITUDE_CUTOFF}, PLANET_RADIUS + ATMOSPHERE_HEIGHT - ${ATMOSPHERE_ALTITUDE_CUTOFF});
168
+
169
+ // planet-relative, which is what both the bounds and the march want
170
+ let view_rel = up * clamped_height;
171
+
172
+ let rayDir = uv_octahedral_unit_decode(uv);
173
+
174
+ let sun = light_get_sun();
175
+
176
+ let sunAltitude = ( 0.5 * PI ) - safe_acos( dot(-sun.direction, up) );
177
+ let sunDir = vec3(0.0, sin(sunAltitude), -cos(sunAltitude));
178
+
179
+ // one quadratic setup for both spheres, rather than two calls sharing an origin and a
180
+ // centre that differ only in radius
181
+ let bounds = atmosphere_ray_bounds(view_rel, rayDir);
182
+
183
+ let lum = raymarch_scattering(view_rel, rayDir, sunDir, bounds.t_max);
184
+
185
+ // TODO validate this, it "feels" wrong to me
186
+ let irradiance = lum * sun.color;
187
+
188
+ return vec4(irradiance, 1.0);
189
+
190
+ }
191
+ `, [
192
+ chunk_safe_acos,
193
+ chunk_light_get_sun,
194
+ chunk_position_relative_to_planet_center,
195
+ chunk_mat4_extract_position,
196
+ PLANET_RADIUS_DECLARATION,
197
+ ATMOSPHERE_HEIGHT_DECLARATION,
198
+ PI_DECLARATION,
199
+ chunk_atmosphere_ray_bounds,
200
+ chunk_uv_octahedral_unit_decode,
201
+ chunk_raymarch_scattering,
202
+ ]
203
+ );
204
+
205
+ export const shader_sky_irradiance_lut = new ImageShader({
206
+ descriptor: ShaderDescriptor.from({
207
+ label: "Sky / sky irradiance LUT",
208
+ body,
209
+ resources
210
+ }),
211
+ targets: [
212
+ {
213
+ format: "rgba16float"
214
+ }
215
+ ]
205
216
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_transmittance_lut.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/shader_transmittance_lut.js"],"names":[],"mappings":"AAoDA;;;GAGG;AACH,uCAFU,WAAW,CAWlB;4BA3DyB,0BAA0B"}
1
+ {"version":3,"file":"shader_transmittance_lut.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/shader_transmittance_lut.js"],"names":[],"mappings":"AAgEA;;;GAGG;AACH,uCAFU,WAAW,CAWlB;4BAtEyB,0BAA0B"}
@@ -1,67 +1,79 @@
1
- import { u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
3
- import { ATMOSPHERE_HEIGHT_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js";
4
- import { chunk_get_sun_transmittance } from "../shader/chunk/atmosphere/chunk_get_sun_transmittance.js";
5
- import { chunk_safe_acos } from "../shader/chunk/math/chunk_safe_acos.js";
6
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
7
- import { ImageShader } from "../shader/ImageShader.js";
8
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
9
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
10
-
11
- const TRANSMITTANCE_LUT_SETTINGS_STRUCT = WebGPUStruct.from({
12
- // how many ray-marching steps to take per pixel of LUT, more steps = higher accuracy but lower performance
13
- steps: u32,
14
- });
15
-
16
- const resources = new ShaderResourceSetDescriptor();
17
- resources.createGroup()
18
- .addUniform("settings", TRANSMITTANCE_LUT_SETTINGS_STRUCT)
19
- ;
20
-
21
- /**
22
- * @see https://www.shadertoy.com/view/slSXRW
23
- * @type {CodeChunk}
24
- */
25
- const body = CodeChunk.from(
26
- //language=WGSL
27
- `
28
-
29
- @fragment
30
- fn main(
31
- @builtin(position) coord: vec4<f32>,
32
- @location(0) uv: vec2<f32>,
33
- ) -> @location(0) vec4<f32> {
34
-
35
- let sunCosTheta = 2.0*uv.x - 1.0;
36
- let sunTheta = safe_acos(sunCosTheta);
37
-
38
- let height = ATMOSPHERE_HEIGHT*uv.y;
39
-
40
- let pos = vec3(0.0, height, 0.0);
41
- let sunDir = normalize(vec3(0.0, sunCosTheta, -sin(sunTheta)));
42
-
43
- return vec4(get_sun_transmittance(pos, sunDir, f32(settings.steps)), 1.0);
44
-
45
- }
46
- `, [
47
- chunk_get_sun_transmittance,
48
- chunk_safe_acos,
49
- ATMOSPHERE_HEIGHT_DECLARATION,
50
- ]
51
- );
52
-
53
- /**
54
- * @see https://www.shadertoy.com/view/slSXRW
55
- * @type {ImageShader}
56
- */
57
- export const shader_transmittance_lut = new ImageShader({
58
- descriptor: ShaderDescriptor.from({
59
- label: "Sky / transmittance LUT",
60
- resources,
61
- body
62
- }),
63
- targets: [{
64
- format: "rgba16float",
65
- }]
66
- });
67
-
1
+ import { u32, vec2u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
3
+ import { ATMOSPHERE_HEIGHT_DECLARATION } from "../shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js";
4
+ import { chunk_get_sun_transmittance } from "../shader/chunk/atmosphere/chunk_get_sun_transmittance.js";
5
+ import { chunk_safe_acos } from "../shader/chunk/math/chunk_safe_acos.js";
6
+ import { chunk_sky_lut_texel_to_unit } from "./chunk_sky_lut_texel_to_unit.js";
7
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
8
+ import { ImageShader } from "../shader/ImageShader.js";
9
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
11
+
12
+ const TRANSMITTANCE_LUT_SETTINGS_STRUCT = WebGPUStruct.from({
13
+ // how many ray-marching steps to take per pixel of LUT, more steps = higher accuracy but lower performance
14
+ steps: u32,
15
+ // size of the target being written, which a fragment shader cannot ask for. Needed to
16
+ // know which point of the parameter range each texel stands for -- see
17
+ // chunk_sky_lut_texel_to_unit. Pass the dimensions of the texture actually being drawn
18
+ // into: a mismatch silently skews the whole LUT.
19
+ resolution: vec2u,
20
+ });
21
+
22
+ const resources = new ShaderResourceSetDescriptor();
23
+ resources.createGroup()
24
+ .addUniform("settings", TRANSMITTANCE_LUT_SETTINGS_STRUCT)
25
+ ;
26
+
27
+ /**
28
+ * @see https://www.shadertoy.com/view/slSXRW
29
+ * @type {CodeChunk}
30
+ */
31
+ const body = CodeChunk.from(
32
+ //language=WGSL
33
+ `
34
+
35
+ @fragment
36
+ fn main(
37
+ @builtin(position) coord: vec4<f32>,
38
+ ) -> @location(0) vec4<f32> {
39
+
40
+ // coord.xy is the fragment centre, so flooring it gives this texel's index. The point of
41
+ // each range the texel stands for then comes from sky_lut_texel_to_unit, whose inverse
42
+ // sky_lut_uv every lookup goes through -- a generator that skipped it would write a LUT
43
+ // addressed half a texel off at both ends.
44
+ let unit = sky_lut_texel_to_unit(floor(coord.xy), vec2<f32>(settings.resolution));
45
+
46
+ let sunCosTheta = 2.0*unit.x - 1.0;
47
+ let sunTheta = safe_acos(sunCosTheta);
48
+
49
+ let height = ATMOSPHERE_HEIGHT*unit.y;
50
+
51
+ let pos = vec3(0.0, height, 0.0);
52
+ let sunDir = normalize(vec3(0.0, sunCosTheta, -sin(sunTheta)));
53
+
54
+ return vec4(get_sun_transmittance(pos, sunDir, f32(settings.steps)), 1.0);
55
+
56
+ }
57
+ `, [
58
+ chunk_get_sun_transmittance,
59
+ chunk_safe_acos,
60
+ chunk_sky_lut_texel_to_unit,
61
+ ATMOSPHERE_HEIGHT_DECLARATION,
62
+ ]
63
+ );
64
+
65
+ /**
66
+ * @see https://www.shadertoy.com/view/slSXRW
67
+ * @type {ImageShader}
68
+ */
69
+ export const shader_transmittance_lut = new ImageShader({
70
+ descriptor: ShaderDescriptor.from({
71
+ label: "Sky / transmittance LUT",
72
+ resources,
73
+ body
74
+ }),
75
+ targets: [{
76
+ format: "rgba16float",
77
+ }]
78
+ });
79
+
@@ -1 +1 @@
1
- {"version":3,"file":"graph_assign_clsuters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/cluster/graph_assign_clsuters.js"],"names":[],"mappings":"AA4CA;;;;;;;;GAQG;AACH,iGAFY;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,YAAY,EAAC,MAAM,CAAC;IAAC,kBAAkB,EAAC,MAAM,CAAA;CAAC,CAqHlF"}
1
+ {"version":3,"file":"graph_assign_clsuters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/cluster/graph_assign_clsuters.js"],"names":[],"mappings":"AA4CA;;;;;;;;GAQG;AACH,iGAFY;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,YAAY,EAAC,MAAM,CAAC;IAAC,kBAAkB,EAAC,MAAM,CAAA;CAAC,CAyHlF"}
@@ -1,9 +1,9 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { slice_flat_array } from "../../util/slice_flat_array.js";
3
2
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
4
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
3
  import { graph_import_typed_buffer } from "../../shader/graph/graph_import_typed_buffer.js";
4
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
5
  import { update_frustum_far_plane } from "../../shadow/map/update_frustum_far_plane.js";
6
+ import { slice_flat_array } from "../../util/slice_flat_array.js";
7
7
  import { build_light_cluster_parameters } from "./build_light_cluster_parameters.js";
8
8
  import { LIGHT_CLUSTER_LOCAL_LIGHT_LIMIT } from "./LIGHT_CLUSTER_LOCAL_LIGHT_LIMIT.js";
9
9
  import { LIGHT_CLUSTER_METADATA } from "./LIGHT_CLUSTER_METADATA.js";
@@ -62,6 +62,8 @@ export function graph_assign_clsuters({
62
62
  assert.defined(resolution, 'resolution');
63
63
  assert.isArrayLike(resolution, 'resolution');
64
64
 
65
+ graph.push_scope("assign clusters");
66
+
65
67
  const cluster_params = build_light_cluster_parameters(
66
68
  [], 0,
67
69
  LIGHT_CLUSTER_RESOLUTION_Z,
@@ -161,6 +163,8 @@ export function graph_assign_clsuters({
161
163
  0, 16, // clear offset
162
164
  ));
163
165
 
166
+ graph.pop_scope();
167
+
164
168
  return {
165
169
  cluster_lookup: data.cluster_lookup,
166
170
  cluster_data: data.cluster_data,
@@ -1 +1 @@
1
- {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AAQA;IAQI;;;OAGG;IACH,uCAUC;IAED;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;OAcG;IACH,8JAFa;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAC;QAAC,gBAAgB,EAAC,MAAM,CAAA;KAAC,CAyF5E;;CACJ"}
1
+ {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AAQA;IAQI;;;OAGG;IACH,uCAUC;IAED;;;;OAIG;IACH,UAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;OAcG;IACH,8JAFa;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAC;QAAC,gBAAgB,EAAC,MAAM,CAAA;KAAC,CA6F5E;;CACJ"}
@@ -68,6 +68,8 @@ export class GTAO {
68
68
  resolution
69
69
  }) {
70
70
 
71
+ graph.push_scope("GTAO");
72
+
71
73
  this.resize(...resolution);
72
74
 
73
75
  const h0 = this.#history[frame_index % 2];
@@ -137,6 +139,8 @@ export class GTAO {
137
139
  load_op: "load", // necessary to make sure we blend with existing AO
138
140
  })[0];
139
141
 
142
+ graph.pop_scope();
143
+
140
144
  return {
141
145
  visibility: moments_output,
142
146
  occlusion: filtered_occlusion,