@woosh/meep-engine 3.67.0 → 3.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  3. package/src/engine/graphics3/GraphicsEngine.js +4 -9
  4. package/src/engine/graphics3/load_cube_environment.js +3 -3
  5. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  6. package/src/shade/playground/probe_clipmap/index.html +43 -0
  7. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  8. package/src/shade/playground/probe_clipmap/main.js +29 -0
  9. package/src/shade/renderer/Renderer.d.ts +7 -0
  10. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  11. package/src/shade/renderer/Renderer.js +213 -15
  12. package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
  13. package/src/shade/renderer/ShadeIndirectLightingMode.js +9 -0
  14. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +22 -0
  15. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +1 -0
  16. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.js +160 -0
  17. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts +45 -0
  18. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts.map +1 -0
  19. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.js +57 -0
  20. package/src/shade/renderer/atmosphere/GPUSky.d.ts +23 -8
  21. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  22. package/src/shade/renderer/atmosphere/GPUSky.js +91 -34
  23. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +17 -0
  24. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -1
  25. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +55 -25
  26. package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts +164 -0
  27. package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts.map +1 -0
  28. package/src/shade/renderer/atmosphere/SceneAtmosphere.js +308 -0
  29. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +3 -12
  30. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  31. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +52 -89
  32. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts +14 -0
  33. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts.map +1 -0
  34. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.js +103 -0
  35. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +10 -4
  36. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  37. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +95 -57
  38. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +10 -14
  39. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  40. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +97 -69
  41. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts +17 -0
  42. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts.map +1 -1
  43. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.js +117 -48
  44. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +8 -0
  45. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  46. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +65 -35
  47. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +2 -1
  48. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts.map +1 -1
  49. package/src/shade/renderer/atmosphere/compute_mie_absorption.js +6 -6
  50. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts +41 -0
  51. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts.map +1 -0
  52. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.js +123 -0
  53. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  54. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +21 -64
  55. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts +6 -2
  56. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  57. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +55 -179
  58. package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts +7 -0
  59. package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts.map +1 -0
  60. package/src/shade/renderer/atmosphere/shader_sky_view_lut.js +111 -0
  61. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts +0 -1
  62. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  63. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +68 -79
  64. package/src/shade/renderer/deferred/shader_background.js +1 -1
  65. package/src/shade/renderer/deferred/shader_background_sky.d.ts +5 -0
  66. package/src/shade/renderer/deferred/shader_background_sky.d.ts.map +1 -0
  67. package/src/shade/renderer/deferred/shader_background_sky.js +130 -0
  68. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts +2 -1
  69. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts.map +1 -1
  70. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.js +6 -2
  71. package/src/shade/renderer/extension/ViewTextures.d.ts +3 -2
  72. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  73. package/src/shade/renderer/extension/ViewTextures.js +3 -2
  74. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  75. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  76. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  77. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  78. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  79. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +1 -1
  80. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +20 -1
  81. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  82. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +29 -0
  83. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts +47 -0
  84. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts.map +1 -0
  85. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.js +246 -0
  86. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +4 -15
  87. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  88. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +8 -148
  89. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +4 -9
  90. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  91. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +9 -58
  92. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts +142 -0
  93. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts.map +1 -0
  94. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.js +938 -0
  95. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts +192 -0
  96. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts.map +1 -0
  97. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.js +231 -0
  98. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts +11 -0
  99. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts.map +1 -0
  100. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.js +25 -0
  101. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts +110 -0
  102. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts.map +1 -0
  103. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.js +197 -0
  104. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts +150 -0
  105. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts.map +1 -0
  106. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.js +408 -0
  107. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts +23 -0
  108. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts.map +1 -0
  109. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.js +63 -0
  110. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts +24 -0
  111. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts.map +1 -0
  112. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.js +61 -0
  113. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts +39 -0
  114. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts.map +1 -0
  115. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.js +126 -0
  116. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts +21 -0
  117. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts.map +1 -0
  118. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.js +74 -0
  119. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts +20 -0
  120. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts.map +1 -0
  121. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.js +26 -0
  122. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts +24 -0
  123. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts.map +1 -0
  124. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.js +57 -0
  125. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts +22 -0
  126. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts.map +1 -0
  127. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.js +53 -0
  128. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts +62 -0
  129. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts.map +1 -0
  130. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.js +156 -0
  131. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts +18 -0
  132. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts.map +1 -0
  133. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.js +50 -0
  134. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts +21 -0
  135. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts.map +1 -0
  136. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.js +54 -0
  137. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts +67 -0
  138. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts.map +1 -0
  139. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.js +509 -0
  140. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts +20 -0
  141. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts.map +1 -0
  142. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.js +128 -0
  143. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts +62 -0
  144. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts.map +1 -0
  145. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.js +478 -0
  146. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts +69 -0
  147. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts.map +1 -0
  148. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.js +457 -0
  149. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts +27 -0
  150. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts.map +1 -0
  151. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.js +219 -0
  152. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts +22 -0
  153. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts.map +1 -0
  154. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.js +151 -0
  155. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts +66 -0
  156. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts.map +1 -0
  157. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.js +301 -0
  158. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts +59 -0
  159. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts.map +1 -0
  160. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.js +364 -0
  161. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts +40 -0
  162. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts.map +1 -0
  163. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.js +275 -0
  164. package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -1
  165. package/src/shade/renderer/grass/blade/GPUGrassBlades.js +17 -2
  166. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +18 -8
  167. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -1
  168. package/src/shade/renderer/grass/blade/grass_blade_resolve.js +114 -32
  169. package/src/shade/renderer/light/GPULightCollection.d.ts +1 -1
  170. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  171. package/src/shade/renderer/light/GPULightCollection.js +213 -80
  172. package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.d.ts +1 -2
  173. package/src/shade/renderer/light/environment/chunk_sample_environment_color.d.ts.map +1 -0
  174. package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.js +3 -4
  175. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  176. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -1
  177. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +1 -1
  178. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts +1 -1
  179. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +1 -1
  180. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts +1 -1
  181. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.js +1 -1
  182. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +1 -1
  183. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  184. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +2 -0
  185. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +2 -0
  186. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts +6 -0
  187. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
  188. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +9 -1
  189. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
  190. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +4 -3
  191. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts +17 -0
  192. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts.map +1 -0
  193. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.js +16 -0
  194. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts +21 -0
  195. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts.map +1 -0
  196. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.js +30 -0
  197. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -5
  198. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +19 -17
  200. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +2 -0
  201. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  202. package/src/shade/renderer/scene/GPUSceneContext.js +2 -1
  203. package/src/shade/renderer/scene/Scene.d.ts +9 -2
  204. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  205. package/src/shade/renderer/scene/Scene.js +10 -2
  206. package/src/shade/renderer/shader/ImageShader.d.ts +24 -12
  207. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  208. package/src/shade/renderer/shader/ImageShader.js +11 -8
  209. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts +3 -1
  210. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts.map +1 -1
  211. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js +11 -3
  212. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +2 -11
  213. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -1
  214. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +23 -32
  215. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts +6 -0
  216. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts.map +1 -1
  217. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.js +14 -2
  218. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.d.ts.map +1 -1
  219. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.js +4 -2
  220. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.d.ts.map +1 -1
  221. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.js +11 -3
  222. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -1
  223. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +68 -69
  224. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts +4 -1
  225. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts.map +1 -1
  226. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.js +46 -39
  227. package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.d.ts.map +1 -1
  228. package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js +5 -3
  229. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts +18 -10
  230. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts.map +1 -1
  231. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.js +30 -27
  232. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts +14 -0
  233. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts.map +1 -0
  234. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.js +30 -0
  235. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts +21 -0
  236. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts.map +1 -0
  237. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.js +60 -0
  238. package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.d.ts → io/chunk_light_get_sun.d.ts} +3 -6
  239. package/src/shade/renderer/shader/chunk/light/io/chunk_light_get_sun.d.ts.map +1 -0
  240. package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.js → io/chunk_light_get_sun.js} +6 -26
  241. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_soft_shadows.js +1 -1
  242. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +3 -1
  243. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  244. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -2
  245. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  246. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +743 -739
  247. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +2 -0
  248. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  249. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +19 -17
  250. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
  251. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +5 -3
  252. package/src/shade/renderer/water/chunk_water_gi.js +2 -0
  253. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  254. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  255. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts +0 -2
  256. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts.map +0 -1
  257. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +0 -45
  258. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts +0 -2
  259. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts.map +0 -1
  260. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.js +0 -17
  261. package/src/engine/graphics/sh3/sky/hosek/README.md +0 -4
  262. package/src/engine/graphics/sh3/sky/hosek/data.d.ts +0 -17
  263. package/src/engine/graphics/sh3/sky/hosek/data.d.ts.map +0 -1
  264. package/src/engine/graphics/sh3/sky/hosek/data.js +0 -3744
  265. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts +0 -2
  266. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts.map +0 -1
  267. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.js +0 -71
  268. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts +0 -26
  269. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts.map +0 -1
  270. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +0 -70
  271. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts +0 -22
  272. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts.map +0 -1
  273. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +0 -388
  274. package/src/engine/graphics3/make_default_environment.d.ts +0 -15
  275. package/src/engine/graphics3/make_default_environment.d.ts.map +0 -1
  276. package/src/engine/graphics3/make_default_environment.js +0 -111
  277. package/src/shade/renderer/atmosphere/MIE_G.d.ts +0 -6
  278. package/src/shade/renderer/atmosphere/MIE_G.d.ts.map +0 -1
  279. package/src/shade/renderer/atmosphere/MIE_G.js +0 -5
  280. package/src/shade/renderer/atmosphere/chunk_sample_environment_color.d.ts.map +0 -1
  281. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts +0 -4
  282. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts.map +0 -1
  283. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +0 -44
  284. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +0 -2
  285. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +0 -1
  286. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +0 -43
  287. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts +0 -3
  288. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts.map +0 -1
  289. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.js +0 -6
  290. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts +0 -3
  291. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts.map +0 -1
  292. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.js +0 -18
  293. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts +0 -14
  294. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts.map +0 -1
  295. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.js +0 -86
  296. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts +0 -8
  297. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts.map +0 -1
  298. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.js +0 -125
  299. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts +0 -3
  300. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts.map +0 -1
  301. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.js +0 -17
  302. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts +0 -3
  303. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts.map +0 -1
  304. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.js +0 -38
  305. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +0 -16
  306. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts.map +0 -1
  307. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +0 -28
  308. package/src/shade/renderer/shader/chunk/light/sky/chunk_sample_sky_color.d.ts.map +0 -1
  309. package/src/shade/renderer/view/GPUViewSkyContext.d.ts +0 -26
  310. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +0 -1
  311. package/src/shade/renderer/view/GPUViewSkyContext.js +0 -170
@@ -0,0 +1,509 @@
1
+ import { ENVIRONMENT_MAP_SAMPLER_RESOURCE } from "../../light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.js";
2
+ import { LIGHT_DATA_RESOURCE } from "../../light/LIGHT_DATA_RESOURCE.js";
3
+ import {
4
+ WORLD_CLUSTER_DATA_RESOURCE,
5
+ WORLD_CLUSTER_LOOKUP_RESOURCE
6
+ } from "../../light/world_cluster/chunk_world_light_cluster_lookup.js";
7
+ import { CLIPMAP_LEVEL_ARRAY } from "../../shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js";
8
+ import { chunk_rgbe9995_decode } from "../../shader/chunk/color/rgbe9995/chunk_rgbe9995_decode.js";
9
+ import { chunk_rgbe9995_encode } from "../../shader/chunk/color/rgbe9995/chunk_rgbe9995_encode.js";
10
+ import { chunk_uv_equal_area_sphere } from "../../shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.js";
11
+ import {
12
+ chunk_uv_octahedral_unit_decode
13
+ } from "../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
14
+ import {
15
+ chunk_uv_octahedral_unit_encode
16
+ } from "../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
17
+ import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
18
+ import { RECIPROCAL_PI_DECLARATION } from "../../shader/chunk/math/RECIPROCAL_PI_DECLARATION.js";
19
+ import { chunk_hash_to_float01 } from "../../shader/chunk/random/chunk_hash_to_float01.js";
20
+ import { chunk_pcg4d } from "../../shader/chunk/random/pcg/chunk_pcg4d.js";
21
+ import {
22
+ chunk_sh3_color_get_irradiance_at
23
+ } from "../../shader/chunk/spherical_harmonics/chunk_sh3_color_get_irradiance_at.js";
24
+ import { chunk_sample_environment_map } from "../../shader/chunk/texture/sample/chunk_sample_environment_map.js";
25
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
26
+ import { ComputeShader } from "../../shader/ComputeShader.js";
27
+ import { ShaderResourceDescriptor } from "../../shader/resource/ShaderResourceDescriptor.js";
28
+ import { ShaderResourceGroupDescriptor } from "../../shader/resource/ShaderResourceGroupDescriptor.js";
29
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
30
+ import { vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
31
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
32
+ import { BRICK_TRACE_HIT, BRICK_TRACE_MISS } from "../probe_clipmap/brick/BRICK_CLIPMAP.js";
33
+ import {
34
+ BRICK_ATLAS_TEXTURE_RESOURCE,
35
+ BRICK_LEVELS_RESOURCE,
36
+ BRICK_MAP_TEXTURE_RESOURCE,
37
+ BRICK_OCCUPANCY_TEXTURE_RESOURCE,
38
+ BRICK_SAMPLER_RESOURCE,
39
+ chunk_brick_clipmap_trace
40
+ } from "../probe_clipmap/brick/chunk_brick_clipmap_trace.js";
41
+ import {
42
+ BRICK_MATERIAL_ALBEDO_RESOURCE,
43
+ BRICK_MATERIAL_EMISSIVE_RESOURCE
44
+ } from "../probe_clipmap/material/chunk_brick_material.js";
45
+ import {
46
+ PROBE_LEVELS_RESOURCE,
47
+ PROBE_RECORD_STRUCT,
48
+ PROBE_WANTED_BITS_RESOURCE,
49
+ PROBE_WANTED_WRITE_RESOURCE
50
+ } from "../probe_clipmap/probe/chunk_probe_clipmap.js";
51
+ import {
52
+ chunk_probe_clipmap_local_irradiance,
53
+ chunk_probe_clipmap_sun_irradiance
54
+ } from "../probe_clipmap/probe/chunk_probe_clipmap_hit_light.js";
55
+ import { chunk_probe_clipmap_hit_material_pick } from "../probe_clipmap/probe/chunk_probe_clipmap_hit_material.js";
56
+ import {
57
+ chunk_probe_clipmap_pick_in,
58
+ PROBE_CLIPMAP_SAMPLING_GROUP,
59
+ PROBE_DEPTH_SAMPLER_RESOURCE,
60
+ PROBE_SAMPLING_STRUCT
61
+ } from "../probe_clipmap/probe/chunk_probe_clipmap_pick.js";
62
+ import { chunk_probe_clipmap_sample_radiance } from "../probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js";
63
+ import { chunk_probe_clipmap_want } from "../probe_clipmap/probe/chunk_probe_clipmap_want.js";
64
+ import { PROBE_RECEIVER_BIAS_VIEW } from "../probe_clipmap/probe/PROBE_CLIPMAP.js";
65
+ import { PROBE_WANT_SETTINGS } from "../probe_clipmap/probe/shader_probe_clipmap_want.js";
66
+ import {
67
+ chunk_screen_probe,
68
+ chunk_screen_probe_counts,
69
+ SCREEN_PROBE_DISPATCH_READ_RESOURCE,
70
+ SCREEN_PROBE_EXPOSURE_RESOURCE,
71
+ SCREEN_PROBE_FRAME_RESOURCE,
72
+ SCREEN_PROBE_PICKS_READ_RESOURCE,
73
+ SCREEN_PROBE_RAYS_WRITE_RESOURCE,
74
+ SCREEN_PROBE_TRACE_HIT_WRITE_RESOURCE,
75
+ SCREEN_PROBE_TRACE_RADIANCE_WRITE_RESOURCE,
76
+ SCREEN_PROBES_READ_RESOURCE
77
+ } from "./chunk_screen_probe.js";
78
+ import { SCREEN_PROBE_THREAD_WORKGROUP_SIZE } from "./SCREEN_PROBE.js";
79
+
80
+ const brick_group = () => new ShaderResourceGroupDescriptor()
81
+ .add(BRICK_LEVELS_RESOURCE)
82
+ .add(BRICK_MAP_TEXTURE_RESOURCE)
83
+ .add(BRICK_OCCUPANCY_TEXTURE_RESOURCE)
84
+ .add(BRICK_ATLAS_TEXTURE_RESOURCE)
85
+ .add(BRICK_SAMPLER_RESOURCE);
86
+
87
+ // each pass finds a ray's probe's origin and pick (`ScreenProbePick`) at the probe
88
+ const rays_group = () => new ShaderResourceGroupDescriptor()
89
+ .add(SCREEN_PROBE_FRAME_RESOURCE)
90
+ .add(SCREEN_PROBE_RAYS_WRITE_RESOURCE)
91
+ .add(SCREEN_PROBE_PICKS_READ_RESOURCE)
92
+ .add(SCREEN_PROBE_DISPATCH_READ_RESOURCE);
93
+
94
+ const trace_resources = new ShaderResourceSetDescriptor();
95
+
96
+ trace_resources.addGroup(rays_group().add(SCREEN_PROBES_READ_RESOURCE).add(LIGHT_DATA_RESOURCE));
97
+ trace_resources.addGroup(brick_group());
98
+
99
+ /**
100
+ * The bricks' trace of the rays the screen left (Lumen's mesh and global SDF traces): a thread a ray of their list,
101
+ * through its command.
102
+ *
103
+ * - From the probe's origin (`ScreenProbePick#origin`) to the probe's reach (`brick_clipmap_trace`), starting a
104
+ * voxel short of where the screen showed the ray clear. The screen's ray left the surface point, so that distance
105
+ * moves by the origin's offset along this ray, as Lumen's world traces start twice their bias short of the screen's
106
+ * distance, the most their biases move the start along the ray.
107
+ * - **A front-face hit** takes E_dir from the directional lights, shadowed by rays through the bricks
108
+ * (`probe_clipmap_sun_irradiance`), each light's point of its disk drawn from the ray's id and direction.
109
+ * - **A back face** is a hit whose field's gradient runs along the ray: the ray started inside a solid.
110
+ * - **No hit within the reach**, or out of the world: the world-space probes the probe picked answer past it (FAR),
111
+ * or the environment where it picked none (SKY).
112
+ * - **A march that spends its steps** is unresolved: no light.
113
+ *
114
+ * @type {ComputeShader}
115
+ */
116
+ export const shader_screen_probe_brick_trace = ComputeShader.from({
117
+ label: "Screen Probe Brick Trace",
118
+ resources: trace_resources,
119
+ body: CodeChunk.from(
120
+ //language=WGSL
121
+ `
122
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
123
+ fn main(
124
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
125
+ @builtin(local_invocation_index) lane: u32,
126
+ ) {
127
+ let i = folded_workgroup_index(workgroup_id) * ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u + lane;
128
+
129
+ if (i >= screen_probe_brick_ray_count()) {
130
+ return;
131
+ }
132
+
133
+ var entry = screen_probe_rays[i];
134
+
135
+ let probe = entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS;
136
+ let pick = screen_probe_picks[probe];
137
+ let origin = pick.origin;
138
+ let direction = uv_equal_area_sphere_decode(unpack2x16unorm(entry.direction));
139
+ let cascades = screen_probe_frame.brick_cascade_count;
140
+ let atlas_shift = screen_probe_frame.brick_atlas_shift;
141
+ let start = max(entry.t + dot(screen_probes[probe].position - origin.xyz, direction) - origin.w, 0.0);
142
+
143
+ let hit = brick_clipmap_trace(origin.xyz, direction, start, pick.reach, cascades, atlas_shift);
144
+
145
+ var kind = SCREEN_PROBE_TRACE_UNRESOLVED;
146
+ var light = vec3<f32>(0.0);
147
+
148
+ if (hit.kind == ${BRICK_TRACE_HIT}u) {
149
+ if (dot(hit.normal, direction) > 0.0) {
150
+ kind = SCREEN_PROBE_TRACE_BACK;
151
+ } else {
152
+ kind = SCREEN_PROBE_TRACE_HIT;
153
+ light = probe_clipmap_sun_irradiance(hit.position, hit.normal, hit.cascade, vec2<u32>(entry.ray, entry.direction), screen_probe_frame.brick_t_max, cascades, atlas_shift);
154
+ }
155
+ } else if (hit.kind == ${BRICK_TRACE_MISS}u) {
156
+ kind = select(SCREEN_PROBE_TRACE_SKY, SCREEN_PROBE_TRACE_FAR, dot(pick.weights, vec4<f32>(1.0)) > 0.0);
157
+ }
158
+
159
+ entry.t = hit.t;
160
+ entry.normal = select(0u, pack2x16unorm(uv_octahedral_unit_encode(hit.normal)), kind == SCREEN_PROBE_TRACE_HIT);
161
+ entry.flags = kind | (select(0u, hit.cascade, kind == SCREEN_PROBE_TRACE_HIT) << 3u);
162
+ entry.albedo = 0u;
163
+ entry.light = rgbe9995_encode(light);
164
+
165
+ screen_probe_rays[i] = entry;
166
+ }
167
+ `, [
168
+ chunk_screen_probe,
169
+ chunk_screen_probe_counts,
170
+ chunk_brick_clipmap_trace,
171
+ chunk_folded_workgroup_index,
172
+ chunk_uv_equal_area_sphere,
173
+ chunk_uv_octahedral_unit_encode,
174
+ chunk_probe_clipmap_sun_irradiance,
175
+ chunk_rgbe9995_encode,
176
+ ]),
177
+ });
178
+
179
+ const shade_resources = new ShaderResourceSetDescriptor();
180
+
181
+ shade_resources.addGroup(rays_group()
182
+ .addTexture("tEnvironment", "float", "2d")
183
+ .add(ENVIRONMENT_MAP_SAMPLER_RESOURCE));
184
+ shade_resources.addGroup(brick_group()
185
+ .add(BRICK_MATERIAL_ALBEDO_RESOURCE)
186
+ .add(BRICK_MATERIAL_EMISSIVE_RESOURCE));
187
+ shade_resources.addGroup(PROBE_CLIPMAP_SAMPLING_GROUP);
188
+
189
+ /**
190
+ * What each ray left to the bricks brings back (as the probe clipmap's shade): a thread a ray of the list.
191
+ *
192
+ * - **A front-face hit**: `emissive + ρ_d·E_dir/π`, its surface one texel of the brick material at the hit drawn from
193
+ * the ray's id and direction (`probe_clipmap_hit_material_pick`); its diffuse albedo goes into the ray for the light
194
+ * and bounce passes.
195
+ * - **FAR**: the world-space probes the probe picked, each share's radiance along the ray (`probe_clipmap_radiance`):
196
+ * what lies past the reach, as each of them sees it.
197
+ * - **SKY**: the prefiltered environment along the ray, at the roughness whose lobe covers a texel of the probe's
198
+ * octahedron, 1/√n (as the probe clipmap's misses take it for theirs).
199
+ * - A back face and an unresolved march bring nothing.
200
+ *
201
+ * @type {ComputeShader}
202
+ */
203
+ export const shader_screen_probe_brick_shade = ComputeShader.from({
204
+ label: "Screen Probe Brick Shade",
205
+ resources: shade_resources,
206
+ body: CodeChunk.from(
207
+ //language=WGSL
208
+ `
209
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
210
+ fn main(
211
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
212
+ @builtin(local_invocation_index) lane: u32,
213
+ ) {
214
+ let i = folded_workgroup_index(workgroup_id) * ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u + lane;
215
+
216
+ if (i >= screen_probe_brick_ray_count()) {
217
+ return;
218
+ }
219
+
220
+ let entry = screen_probe_rays[i];
221
+ let kind = entry.flags & SCREEN_PROBE_TRACE_KIND_MASK;
222
+ let probe = entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS;
223
+ let direction = uv_equal_area_sphere_decode(unpack2x16unorm(entry.direction));
224
+
225
+ var radiance = vec3<f32>(0.0);
226
+ var albedo = vec3<f32>(0.0);
227
+
228
+ if (kind == SCREEN_PROBE_TRACE_HIT) {
229
+ let position = screen_probe_picks[probe].origin.xyz + entry.t * direction;
230
+ let normal = uv_octahedral_unit_decode(unpack2x16unorm(entry.normal));
231
+ let draw = hash_to_float01(pcg4d(vec4<u32>(entry.ray, entry.direction, 0x510E527Fu, 0u)).x);
232
+ let surface = probe_clipmap_hit_material_pick(position, normal, entry.flags >> 3u, draw, screen_probe_frame.brick_atlas_shift);
233
+
234
+ radiance = surface.emissive + surface.albedo * rgbe9995_decode(entry.light) * RECIPROCAL_PI;
235
+ albedo = surface.albedo;
236
+ } else if (kind == SCREEN_PROBE_TRACE_FAR) {
237
+ let pick = screen_probe_picks[probe];
238
+
239
+ // each share by name
240
+ if (pick.weights.x > 0.0) { radiance += pick.weights.x * probe_clipmap_radiance(pick.slots.x, direction).rgb; }
241
+ if (pick.weights.y > 0.0) { radiance += pick.weights.y * probe_clipmap_radiance(pick.slots.y, direction).rgb; }
242
+ if (pick.weights.z > 0.0) { radiance += pick.weights.z * probe_clipmap_radiance(pick.slots.z, direction).rgb; }
243
+ if (pick.weights.w > 0.0) { radiance += pick.weights.w * probe_clipmap_radiance(pick.slots.w, direction).rgb; }
244
+ } else if (kind == SCREEN_PROBE_TRACE_SKY) {
245
+ radiance = sample_environment_map(tEnvironment, sEnvironment, direction, inverseSqrt(f32(screen_probe_frame.octahedron_resolution)));
246
+ }
247
+
248
+ screen_probe_rays[i].light = rgbe9995_encode(radiance);
249
+ screen_probe_rays[i].albedo = pack4x8unorm(vec4<f32>(albedo, 0.0));
250
+ }
251
+ `, [
252
+ chunk_screen_probe,
253
+ chunk_screen_probe_counts,
254
+ chunk_uv_octahedral_unit_decode,
255
+ chunk_folded_workgroup_index,
256
+ chunk_uv_equal_area_sphere,
257
+ chunk_probe_clipmap_hit_material_pick,
258
+ chunk_probe_clipmap_sample_radiance,
259
+ chunk_sample_environment_map,
260
+ chunk_hash_to_float01,
261
+ chunk_pcg4d,
262
+ chunk_rgbe9995_decode,
263
+ chunk_rgbe9995_encode,
264
+ RECIPROCAL_PI_DECLARATION,
265
+ ]),
266
+ });
267
+
268
+ const light_resources = new ShaderResourceSetDescriptor();
269
+
270
+ light_resources.addGroup(rays_group()
271
+ .add(LIGHT_DATA_RESOURCE)
272
+ .add(WORLD_CLUSTER_LOOKUP_RESOURCE)
273
+ .add(WORLD_CLUSTER_DATA_RESOURCE));
274
+ light_resources.addGroup(brick_group());
275
+
276
+ /**
277
+ * The local lights a front-face hit takes (as the probe clipmap's light pass): a thread a ray of the list, adding
278
+ * `ρ_d·E_loc/π`, one light of the hit's world light cluster cell picked by its light and shadowed by a ray through the
279
+ * bricks (`probe_clipmap_local_irradiance`), drawn from the ray's id and direction.
280
+ *
281
+ * @type {ComputeShader}
282
+ */
283
+ export const shader_screen_probe_brick_light = ComputeShader.from({
284
+ label: "Screen Probe Brick Light",
285
+ resources: light_resources,
286
+ body: CodeChunk.from(
287
+ //language=WGSL
288
+ `
289
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
290
+ fn main(
291
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
292
+ @builtin(local_invocation_index) lane: u32,
293
+ ) {
294
+ let i = folded_workgroup_index(workgroup_id) * ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u + lane;
295
+
296
+ if (i >= screen_probe_brick_ray_count()) {
297
+ return;
298
+ }
299
+
300
+ let entry = screen_probe_rays[i];
301
+ let albedo = unpack4x8unorm(entry.albedo).rgb;
302
+
303
+ // only a front-face hit that bounces anything takes more light
304
+ if ((entry.flags & SCREEN_PROBE_TRACE_KIND_MASK) != SCREEN_PROBE_TRACE_HIT || all(albedo == vec3<f32>(0.0))) {
305
+ return;
306
+ }
307
+
308
+ let direction = uv_equal_area_sphere_decode(unpack2x16unorm(entry.direction));
309
+ let position = screen_probe_picks[entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS].origin.xyz + entry.t * direction;
310
+ let normal = uv_octahedral_unit_decode(unpack2x16unorm(entry.normal));
311
+
312
+ // the pick and its shadow ray's point, apart from the trace's and the shade's draws
313
+ let hash = pcg4d(vec4<u32>(entry.ray, entry.direction, 0xA54FF53Au, 0u));
314
+ let random = vec4<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y), hash_to_float01(hash.z), hash_to_float01(hash.w));
315
+
316
+ let e = probe_clipmap_local_irradiance(entry.flags >> 3u, position, normal, random, screen_probe_frame.brick_cascade_count, screen_probe_frame.brick_atlas_shift) * RECIPROCAL_PI;
317
+
318
+ if (all(e == vec3<f32>(0.0))) {
319
+ return;
320
+ }
321
+
322
+ screen_probe_rays[i].light = rgbe9995_encode(rgbe9995_decode(entry.light) + albedo * e);
323
+ }
324
+ `, [
325
+ chunk_screen_probe,
326
+ chunk_screen_probe_counts,
327
+ chunk_uv_octahedral_unit_decode,
328
+ chunk_folded_workgroup_index,
329
+ chunk_uv_equal_area_sphere,
330
+ chunk_probe_clipmap_local_irradiance,
331
+ chunk_hash_to_float01,
332
+ chunk_pcg4d,
333
+ chunk_rgbe9995_decode,
334
+ chunk_rgbe9995_encode,
335
+ RECIPROCAL_PI_DECLARATION,
336
+ ]),
337
+ });
338
+
339
+ /**
340
+ * One world-space probe set's sampling resources under a prefix, for a pass that picks from two.
341
+ *
342
+ * @param {string} prefix
343
+ * @returns {ShaderResourceGroupDescriptor}
344
+ */
345
+ function probe_set_group(prefix) {
346
+ return new ShaderResourceGroupDescriptor()
347
+ .add(ShaderResourceDescriptor.uniform(`${prefix}_levels`, CLIPMAP_LEVEL_ARRAY))
348
+ .add(ShaderResourceDescriptor.uniform(`${prefix}_sampling`, PROBE_SAMPLING_STRUCT))
349
+ .add(ShaderResourceDescriptor.texture(`${prefix}_indirection`, "uint", "3d"))
350
+ .add(ShaderResourceDescriptor.storageBuffer(`${prefix}_states`, WebGPUArray.from(vec2u)))
351
+ .add(ShaderResourceDescriptor.storageBuffer(`${prefix}_records`, WebGPUArray.from(PROBE_RECORD_STRUCT)))
352
+ .add(ShaderResourceDescriptor.texture(`${prefix}_depth`, "float", "2d"));
353
+ }
354
+
355
+ const bounce_resources = new ShaderResourceSetDescriptor();
356
+
357
+ bounce_resources.addGroup(rays_group()
358
+ .add(SCREEN_PROBE_EXPOSURE_RESOURCE)
359
+ .add(SCREEN_PROBE_TRACE_RADIANCE_WRITE_RESOURCE)
360
+ .add(SCREEN_PROBE_TRACE_HIT_WRITE_RESOURCE)
361
+ .add(PROBE_DEPTH_SAMPLER_RESOURCE));
362
+ bounce_resources.addGroup(probe_set_group("bounce_first"));
363
+ bounce_resources.addGroup(probe_set_group("bounce_fallback"));
364
+
365
+ /**
366
+ * The next bounce a front-face hit takes, and every ray's result into the probes' trace textures (as the probe
367
+ * clipmap's bounce): a thread a ray of the list, after the light pass.
368
+ *
369
+ * - **The bounce**, E_ind: the frustum's world-space probes picked at the hit along its normal, the view back along the
370
+ * ray (`probe_clipmap_pick_in`), with the ray's own noise; where they weigh nothing, the world cache's. Where neither
371
+ * has a probe, no bounce: the next frame's hit wants ask the world cache for them. A hit the frustum's probes served
372
+ * has its albedo cleared, so it wants nothing (`shader_screen_probe_brick_want`). `ρ_d·E_ind/π` is added.
373
+ * - **The result**: the ray's radiance, pre-exposed (`screen_probe_exposure`), and its kind and distance to its texel of
374
+ * `screen_probe_trace_radiance` and `screen_probe_trace_hit`, where the composite reads every ray, the screen's and
375
+ * the bricks' alike.
376
+ *
377
+ * @type {ComputeShader}
378
+ */
379
+ export const shader_screen_probe_brick_bounce = ComputeShader.from({
380
+ label: "Screen Probe Brick Bounce",
381
+ resources: bounce_resources,
382
+ body: CodeChunk.from(
383
+ //language=WGSL
384
+ `
385
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
386
+ fn main(
387
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
388
+ @builtin(local_invocation_index) lane: u32,
389
+ ) {
390
+ let i = folded_workgroup_index(workgroup_id) * ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u + lane;
391
+
392
+ if (i >= screen_probe_brick_ray_count()) {
393
+ return;
394
+ }
395
+
396
+ let entry = screen_probe_rays[i];
397
+ let kind = entry.flags & SCREEN_PROBE_TRACE_KIND_MASK;
398
+ let albedo = unpack4x8unorm(entry.albedo).rgb;
399
+
400
+ var light = rgbe9995_decode(entry.light);
401
+
402
+ if (kind == SCREEN_PROBE_TRACE_HIT && any(albedo != vec3<f32>(0.0))) {
403
+ let direction = uv_equal_area_sphere_decode(unpack2x16unorm(entry.direction));
404
+ let position = screen_probe_picks[entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS].origin.xyz + entry.t * direction;
405
+ let normal = uv_octahedral_unit_decode(unpack2x16unorm(entry.normal));
406
+
407
+ let hash = pcg4d(vec4<u32>(entry.ray, entry.direction, 0x9B05688Cu, 0u));
408
+ let noise = vec2<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y));
409
+
410
+ var probes = probe_clipmap_sh_in(
411
+ &bounce_first_records,
412
+ probe_clipmap_pick_in(&bounce_first_levels, &bounce_first_sampling, bounce_first_indirection, &bounce_first_states, bounce_first_depth, position, normal, -direction, noise),
413
+ );
414
+
415
+ if (probes.found) {
416
+ // served: nothing of the fallback is wanted here
417
+ screen_probe_rays[i].albedo = 0u;
418
+ } else {
419
+ probes = probe_clipmap_sh_in(
420
+ &bounce_fallback_records,
421
+ probe_clipmap_pick_in(&bounce_fallback_levels, &bounce_fallback_sampling, bounce_fallback_indirection, &bounce_fallback_states, bounce_fallback_depth, position, normal, -direction, noise),
422
+ );
423
+ }
424
+
425
+ if (probes.found) {
426
+ light += albedo * sh3_color_get_irradiance_at(normal, probes.sh) * RECIPROCAL_PI;
427
+ }
428
+ }
429
+
430
+ let probe = entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS;
431
+ let texel = screen_probe_texel(probe, entry.ray & SCREEN_PROBE_RAY_SLOT_MASK);
432
+
433
+ textureStore(screen_probe_trace_radiance, texel, vec4<f32>(light * screen_probe_exposure.value, 0.0));
434
+ textureStore(screen_probe_trace_hit, texel, vec4<u32>(screen_probe_trace_hit_pack(kind, entry.t, false), 0u, 0u, 0u));
435
+ }
436
+ `, [
437
+ chunk_screen_probe,
438
+ chunk_screen_probe_counts,
439
+ chunk_uv_octahedral_unit_decode,
440
+ chunk_folded_workgroup_index,
441
+ chunk_uv_equal_area_sphere,
442
+ chunk_probe_clipmap_pick_in,
443
+ chunk_sh3_color_get_irradiance_at,
444
+ chunk_hash_to_float01,
445
+ chunk_pcg4d,
446
+ chunk_rgbe9995_decode,
447
+ RECIPROCAL_PI_DECLARATION,
448
+ ]),
449
+ });
450
+
451
+ const want_resources = new ShaderResourceSetDescriptor();
452
+
453
+ // the world cache's late wants, as `GPUProbeClipmap#write_want_bindings` hands them
454
+ want_resources.setImmediate("settings", PROBE_WANT_SETTINGS);
455
+ want_resources.addGroup(rays_group()
456
+ .add(PROBE_WANTED_WRITE_RESOURCE)
457
+ .add(PROBE_WANTED_BITS_RESOURCE)
458
+ .add(PROBE_LEVELS_RESOURCE));
459
+
460
+ /**
461
+ * The hits' wants (as the probe clipmap's hit wants): a thread a ray of the list, after the bounce. A front-face hit
462
+ * whose albedo the bounce left, which the frustum's world-space probes did not serve, wants the cages its pick reads in
463
+ * the world cache's late set, which the cache's next lifetime takes. Every lane calls `probe_clipmap_want`, wanting or
464
+ * not, from uniform control flow.
465
+ *
466
+ * @type {ComputeShader}
467
+ */
468
+ export const shader_screen_probe_brick_want = ComputeShader.from({
469
+ label: "Screen Probe Brick Want",
470
+ resources: want_resources,
471
+ body: CodeChunk.from(
472
+ //language=WGSL
473
+ `
474
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
475
+ fn main(
476
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
477
+ @builtin(local_invocation_index) lane: u32,
478
+ ) {
479
+ let i = folded_workgroup_index(workgroup_id) * ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u + lane;
480
+
481
+ var wants = false;
482
+ var position = vec3<f32>(0.0);
483
+ var bias_direction = vec3<f32>(0.0, 0.0, 1.0);
484
+
485
+ if (i < screen_probe_brick_ray_count()) {
486
+ let entry = screen_probe_rays[i];
487
+
488
+ wants = (entry.flags & SCREEN_PROBE_TRACE_KIND_MASK) == SCREEN_PROBE_TRACE_HIT && entry.albedo != 0u;
489
+
490
+ if (wants) {
491
+ let direction = uv_equal_area_sphere_decode(unpack2x16unorm(entry.direction));
492
+ let normal = uv_octahedral_unit_decode(unpack2x16unorm(entry.normal));
493
+ position = screen_probe_picks[entry.ray >> SCREEN_PROBE_RAY_SLOT_BITS].origin.xyz + entry.t * direction;
494
+ // the view back along the ray, as the bounce's pick takes it
495
+ bias_direction = mix(normal, -direction, ${PROBE_RECEIVER_BIAS_VIEW});
496
+ }
497
+ }
498
+
499
+ probe_clipmap_want(wants, position, bias_direction, settings.cascade_count, settings.resolution, settings.anchor, settings.select_half, settings.wanted_capacity);
500
+ }
501
+ `, [
502
+ chunk_screen_probe,
503
+ chunk_screen_probe_counts,
504
+ chunk_folded_workgroup_index,
505
+ chunk_uv_equal_area_sphere,
506
+ chunk_uv_octahedral_unit_decode,
507
+ chunk_probe_clipmap_want,
508
+ ]),
509
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Settings of the debug view.
3
+ * @type {WebGPUStruct}
4
+ */
5
+ export const SCREEN_PROBE_DEBUG_SETTINGS: WebGPUStruct;
6
+ /**
7
+ * The screen probes' debug views (`ScreenProbeDebugView`), a thread a pixel, in place of the frame's colour:
8
+ *
9
+ * - **IndirectDiffuse**: the frame's diffuse over π, what a white Lambertian surface sends back of it.
10
+ * - **ProbePlacement**: the same, with each probe's pixel and the eight around it marked, uniform green and adaptive
11
+ * red, and the pixels the probes did not cover this frame blue.
12
+ * - **TraceKinds**: over each tile, the shares of its uniform probe's rays the screen resolved (red), the bricks hit
13
+ * (green), and the world-space probes answered past their reach (blue); the environment's share is left dark.
14
+ *
15
+ * @type {ComputeShader}
16
+ */
17
+ export const shader_screen_probe_debug: ComputeShader;
18
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
19
+ import { ComputeShader } from "../../shader/ComputeShader.js";
20
+ //# sourceMappingURL=shader_screen_probe_debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_screen_probe_debug.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,0CAFU,YAAY,CAKS;AAiB/B;;;;;;;;;;GAUG;AACH,wCAFU,aAAa,CA0EpB;6BAzH0B,mCAAmC;8BAJlC,+BAA+B"}
@@ -0,0 +1,128 @@
1
+ import { chunk_is_background } from "../../shader/chunk/depth/chunk_is_background.js";
2
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
3
+ import { ComputeShader } from "../../shader/ComputeShader.js";
4
+ import { ShaderResourceDescriptor } from "../../shader/resource/ShaderResourceDescriptor.js";
5
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
7
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
8
+ import {
9
+ chunk_screen_probe,
10
+ SCREEN_PROBE_FRAME_RESOURCE,
11
+ SCREEN_PROBE_TILE_COUNTS_READ_RESOURCE,
12
+ SCREEN_PROBE_TILE_PROBES_READ_RESOURCE,
13
+ SCREEN_PROBE_TRACE_HIT_READ_RESOURCE,
14
+ SCREEN_PROBES_READ_RESOURCE
15
+ } from "./chunk_screen_probe.js";
16
+ import { SCREEN_PROBE_DEPTH_RESOURCE } from "./chunk_screen_probe_surface.js";
17
+ import { SCREEN_PROBE_INTEGRATED_READ_RESOURCE } from "./shader_screen_probe_resolve.js";
18
+ import { ScreenProbeDebugView } from "./ScreenProbeDebugView.js";
19
+ import { SCREEN_PROBE_TILE_WORKGROUP_SIZE } from "./SCREEN_PROBE.js";
20
+
21
+ /**
22
+ * Settings of the debug view.
23
+ * @type {WebGPUStruct}
24
+ */
25
+ export const SCREEN_PROBE_DEBUG_SETTINGS = WebGPUStruct.from({
26
+ /** the view, `ScreenProbeDebugView` */
27
+ view: u32,
28
+ }, "ScreenProbeDebugSettings");
29
+
30
+ const resources = new ShaderResourceSetDescriptor();
31
+
32
+ resources.setImmediate("settings", SCREEN_PROBE_DEBUG_SETTINGS);
33
+
34
+ resources.createGroup()
35
+ .add(SCREEN_PROBE_FRAME_RESOURCE)
36
+ .add(SCREEN_PROBES_READ_RESOURCE)
37
+ .add(SCREEN_PROBE_TILE_COUNTS_READ_RESOURCE)
38
+ .add(SCREEN_PROBE_TILE_PROBES_READ_RESOURCE)
39
+ .add(SCREEN_PROBE_DEPTH_RESOURCE)
40
+ .add(SCREEN_PROBE_INTEGRATED_READ_RESOURCE)
41
+ .add(SCREEN_PROBE_TRACE_HIT_READ_RESOURCE)
42
+ .add(ShaderResourceDescriptor.texture("screen_probe_debug_diffuse", "unfilterable-float"))
43
+ .add(ShaderResourceDescriptor.storageTexture("screen_probe_debug_out", "rgba16float", "2d", "write-only"));
44
+
45
+ /**
46
+ * The screen probes' debug views (`ScreenProbeDebugView`), a thread a pixel, in place of the frame's colour:
47
+ *
48
+ * - **IndirectDiffuse**: the frame's diffuse over π, what a white Lambertian surface sends back of it.
49
+ * - **ProbePlacement**: the same, with each probe's pixel and the eight around it marked, uniform green and adaptive
50
+ * red, and the pixels the probes did not cover this frame blue.
51
+ * - **TraceKinds**: over each tile, the shares of its uniform probe's rays the screen resolved (red), the bricks hit
52
+ * (green), and the world-space probes answered past their reach (blue); the environment's share is left dark.
53
+ *
54
+ * @type {ComputeShader}
55
+ */
56
+ export const shader_screen_probe_debug = ComputeShader.from({
57
+ label: "Screen Probe Debug",
58
+ resources,
59
+ body: CodeChunk.from(
60
+ //language=WGSL
61
+ `
62
+ fn screen_probe_debug_marks(pixel: vec2<u32>, probe: u32) -> bool {
63
+ let at = vec2<i32>(screen_probe_pixel_decode(screen_probes[probe].pixel));
64
+ let gap = abs(at - vec2<i32>(pixel));
65
+
66
+ return screen_probes[probe].depth > 0.0 && all(gap <= vec2<i32>(1));
67
+ }
68
+
69
+ @compute @workgroup_size(${SCREEN_PROBE_TILE_WORKGROUP_SIZE}, ${SCREEN_PROBE_TILE_WORKGROUP_SIZE}, 1)
70
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
71
+ let frame = screen_probe_frame;
72
+
73
+ if (any(id.xy >= frame.view_size)) {
74
+ return;
75
+ }
76
+
77
+ let pixel = id.xy;
78
+
79
+ if (is_background(textureLoad(tDepth, pixel, 0).r)) {
80
+ textureStore(screen_probe_debug_out, pixel, vec4<f32>(0.0, 0.0, 0.0, 1.0));
81
+ return;
82
+ }
83
+
84
+ let diffuse = textureLoad(screen_probe_debug_diffuse, pixel, 0).rgb * 0.3183098861837907;
85
+ let tile = min((max(vec2<i32>(pixel) - vec2<i32>(frame.jitter), vec2<i32>(0)) >> vec2<u32>(frame.downsample_shift)), vec2<i32>(frame.tile_count) - 1);
86
+ let tile_index = u32(tile.y) * frame.tile_count.x + u32(tile.x);
87
+
88
+ var color = diffuse;
89
+
90
+ if (settings.view == ${ScreenProbeDebugView.ProbePlacement}u) {
91
+ if (textureLoad(screen_probe_integrated, pixel, 0).a < 0.0) {
92
+ color = vec3<f32>(0.0, 0.0, 1.0);
93
+ }
94
+
95
+ if (screen_probe_debug_marks(pixel, tile_index)) {
96
+ color = vec3<f32>(0.0, 1.0, 0.0);
97
+ }
98
+
99
+ let count = min(screen_probe_tile_counts[tile_index], frame.adaptive_tile_capacity);
100
+
101
+ for (var i = 0u; i < count; i++) {
102
+ if (screen_probe_debug_marks(pixel, frame.uniform_count + screen_probe_tile_probes[tile_index * frame.adaptive_tile_capacity + i])) {
103
+ color = vec3<f32>(1.0, 0.0, 0.0);
104
+ }
105
+ }
106
+ } else if (settings.view == ${ScreenProbeDebugView.TraceKinds}u) {
107
+ let n = frame.octahedron_resolution;
108
+
109
+ var kinds = vec3<f32>(0.0);
110
+
111
+ for (var slot = 0u; slot < n * n; slot++) {
112
+ let kind = screen_probe_trace_hit_kind(textureLoad(screen_probe_trace_hit, screen_probe_texel(tile_index, slot), 0).r);
113
+
114
+ kinds += select(vec3<f32>(0.0), vec3<f32>(1.0, 0.0, 0.0), kind == SCREEN_PROBE_TRACE_SCREEN);
115
+ kinds += select(vec3<f32>(0.0), vec3<f32>(0.0, 1.0, 0.0), kind == SCREEN_PROBE_TRACE_HIT || kind == SCREEN_PROBE_TRACE_BACK);
116
+ kinds += select(vec3<f32>(0.0), vec3<f32>(0.0, 0.0, 1.0), kind == SCREEN_PROBE_TRACE_FAR);
117
+ }
118
+
119
+ color = kinds / f32(n * n);
120
+ }
121
+
122
+ textureStore(screen_probe_debug_out, pixel, vec4<f32>(color, 1.0));
123
+ }
124
+ `, [
125
+ chunk_screen_probe,
126
+ chunk_is_background,
127
+ ]),
128
+ });