@meimu/mutracer 0.3.0 → 0.3.1

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 (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -50,28 +50,28 @@ padding2: u32,
50
50
  @group(0)@binding(1)var<storage,read_write>grid:array<Bucket>;
51
51
  @group(0)@binding(2)var<uniform>parameters:Parameters;
52
52
  @group(0)@binding(4)var headers:texture_storage_2d<r32uint,write>;
53
- fn xu(yp:vec3i)->u32 {
54
- let p=bitcast<vec3u>(yp);
53
+ fn zv(sF:vec3i)->u32 {
54
+ let p=bitcast<vec3u>(sF);
55
55
  return ((p.x*73856093u)^(p.y*19349663u)^(p.z*83492791u))&(parameters.buckets-1u);
56
56
  }
57
- fn tM(p:vec3f,layer:u32)->u32 {
57
+ fn vq(p:vec3f,layer:u32)->u32 {
58
58
  let radius=select(parameters.radius,parameters.fineRadius,layer==1u);
59
- let lv=select(radius,2.0*radius,layer==1u);
60
- return xu(vec3i(floor(p/lv)));
59
+ let mo=select(radius,2.0*radius,layer==1u);
60
+ return zv(vec3i(floor(p/mo)));
61
61
  }
62
- fn os(layer:u32)->u32 {
62
+ fn pl(layer:u32)->u32 {
63
63
  return layer*(parameters.buckets+parameters.buckets/256u);
64
64
  }
65
- fn fm(i:u32,value:u32) {
65
+ fn fE(i:u32,value:u32) {
66
66
  let width=textureDimensions(headers).x;
67
67
  textureStore(headers,vec2i(vec2u(i%width,i/width)),vec4u(value));
68
68
  }
69
- fn pi(i:u32)->vec4u {
69
+ fn qs(i:u32)->vec4u {
70
70
  let width=textureDimensions(photons).x;
71
71
  return textureLoad(photons,vec2i(vec2u(i%width,i/width)),0);
72
72
  }
73
- fn qv(i:u32)->vec3f {
74
- return bitcast<vec3f>(pi(i).xyz);
73
+ fn rI(i:u32)->vec3f {
74
+ return bitcast<vec3f>(qs(i).xyz);
75
75
  }
76
76
  @compute @workgroup_size(64)
77
77
  fn count(@builtin(global_invocation_id)id:vec3u) {
@@ -79,16 +79,16 @@ if(id.x+id.y*4194240u>=parameters.count) {
79
79
  return;
80
80
  }
81
81
  let index=id.x+id.y*4194240u;
82
- if(pi(index).w==0u) {
82
+ if(qs(index).w==0u) {
83
83
  return;
84
84
  }
85
85
  for(var layer=0u;layer<2u;layer++) {
86
- atomicAdd(&grid[os(layer)+tM(qv(index),layer)].count,1u);
86
+ atomicAdd(&grid[pl(layer)+vq(rI(index),layer)].count,1u);
87
87
  }
88
88
  }
89
89
 
90
90
  var<workgroup> scan:array<u32,256>;
91
- fn iU(local:u32,value:u32)->u32 {
91
+ fn jA(local:u32,value:u32)->u32 {
92
92
  scan[local]=value;
93
93
  workgroupBarrier();
94
94
  for(var stride=1u;stride<256u;stride*=2u) {
@@ -104,80 +104,80 @@ return scan[local];
104
104
  }
105
105
  @compute @workgroup_size(256)
106
106
  fn scanBlocks(@builtin(local_invocation_index)local:u32,@builtin(workgroup_id)group:vec3u) {
107
- let index=os(group.y)+group.x*256u+local;
107
+ let index=pl(group.y)+group.x*256u+local;
108
108
  let count=atomicLoad(&grid[index].count);
109
- let prefix=iU(local,count);
109
+ let prefix=jA(local,count);
110
110
  grid[index].offset=prefix-count;
111
111
  if(local==255u) {
112
- atomicStore(&grid[os(group.y)+parameters.buckets+group.x].count,prefix);
112
+ atomicStore(&grid[pl(group.y)+parameters.buckets+group.x].count,prefix);
113
113
  }
114
114
  }
115
115
  @compute @workgroup_size(256)
116
116
  fn scanSums(@builtin(local_invocation_index)local:u32,@builtin(workgroup_id)group:vec3u) {
117
117
  let blocks=parameters.buckets/256u;
118
- let xo=(blocks+255u)/256u;
119
- let first=local*xo;
120
- let start=os(group.y)+parameters.buckets;
118
+ let chunk=(blocks+255u)/256u;
119
+ let first=local*chunk;
120
+ let start=pl(group.y)+parameters.buckets;
121
121
  var count=0u;
122
- for(var i=first;i<min(first+xo,blocks);i++) {
122
+ for(var i=first;i<min(first+chunk,blocks);i++) {
123
123
  count+=atomicLoad(&grid[start+i].count);
124
124
  }
125
- let prefix=iU(local,count);
125
+ let prefix=jA(local,count);
126
126
  var offset=prefix-count;
127
- for(var i=first;i<min(first+xo,blocks);i++) {
127
+ for(var i=first;i<min(first+chunk,blocks);i++) {
128
128
  grid[start+i].offset=offset;
129
129
  offset+=atomicLoad(&grid[start+i].count);
130
130
  }
131
131
  if(local==255u&&group.y==0u) {
132
- fm(0u,bitcast<u32>(parameters.radius));
133
- fm(1u,prefix);
134
- fm(2u,bitcast<u32>(parameters.screenPixels));
135
- fm(3u,bitcast<u32>(parameters.skipQuery));
136
- fm(4u,parameters.count);
137
- fm(5u,parameters.buckets);
138
- fm(6u,bitcast<u32>(parameters.fineRadius));
139
- fm(7u,parameters.experiments);
132
+ fE(0u,bitcast<u32>(parameters.radius));
133
+ fE(1u,prefix);
134
+ fE(2u,bitcast<u32>(parameters.screenPixels));
135
+ fE(3u,bitcast<u32>(parameters.skipQuery));
136
+ fE(4u,parameters.count);
137
+ fE(5u,parameters.buckets);
138
+ fE(6u,bitcast<u32>(parameters.fineRadius));
139
+ fE(7u,parameters.experiments);
140
140
  }
141
141
  }
142
142
  @compute @workgroup_size(64)
143
143
  fn scatter(@builtin(global_invocation_id)id:vec3u) {
144
- let eA=id.x+id.y*4194240u;
144
+ let eJ=id.x+id.y*4194240u;
145
145
  for(var layer=0u;layer<2u;layer++) {
146
- let start=os(layer);
147
- if(eA<parameters.buckets) {
148
- let offset=grid[start+eA].offset+grid[start+parameters.buckets+eA/256u].offset;
149
- fm(8u+layer*parameters.buckets*2u+eA*2u,offset);
150
- fm(9u+layer*parameters.buckets*2u+eA*2u,atomicLoad(&grid[start+eA].count));
146
+ let start=pl(layer);
147
+ if(eJ<parameters.buckets) {
148
+ let offset=grid[start+eJ].offset+grid[start+parameters.buckets+eJ/256u].offset;
149
+ fE(8u+layer*parameters.buckets*2u+eJ*2u,offset);
150
+ fE(9u+layer*parameters.buckets*2u+eJ*2u,atomicLoad(&grid[start+eJ].count));
151
151
  }
152
- if(eA<parameters.count&&pi(eA).w!=0u) {
153
- let su=tM(qv(eA),layer);
154
- let index=grid[start+su].offset+grid[start+parameters.buckets+su/256u].offset+atomicAdd(&grid[start+su].cursor,1u);
155
- fm(8u+parameters.buckets*4u+layer*parameters.count+index,eA);
152
+ if(eJ<parameters.count&&qs(eJ).w!=0u) {
153
+ let tU=vq(rI(eJ),layer);
154
+ let index=grid[start+tU].offset+grid[start+parameters.buckets+tU/256u].offset+atomicAdd(&grid[start+tU].cursor,1u);
155
+ fE(8u+parameters.buckets*4u+layer*parameters.count+index,eJ);
156
156
  }
157
157
  }
158
158
  }
159
159
  `;
160
160
  /** Packed photon payload: position f32 x3, RGBE8 flux, two octahedral directions. */
161
161
  export const photonPackingWgsl = /* wgsl */ `
162
- fn rd(v:vec2f)->vec2f {
162
+ fn sv(v:vec2f)->vec2f {
163
163
  return select(vec2f(-1.0),vec2f(1.0),v>=vec2f(0.0));
164
164
  }
165
- fn pN(n:vec3f)->vec2f {
165
+ fn qR(n:vec3f)->vec2f {
166
166
  let p=n/(abs(n.x)+abs(n.y)+abs(n.z));
167
- let uv=select(p.xy,(vec2f(1.0)-abs(p.yx))*rd(p.xy),p.z<0.0);
167
+ let uv=select(p.xy,(vec2f(1.0)-abs(p.yx))*sv(p.xy),p.z<0.0);
168
168
  return uv*.5+.5;
169
169
  }
170
- fn pM(uv:vec2f)->vec3f {
170
+ fn qQ(uv:vec2f)->vec3f {
171
171
  let p=uv*2.0-1.0;
172
172
  var n=vec3f(p,1.0-abs(p.x)-abs(p.y));
173
173
  if(n.z<0.0) {
174
- n=vec3f((vec2f(1.0)-abs(n.yx))*rd(n.xy),n.z);
174
+ n=vec3f((vec2f(1.0)-abs(n.yx))*sv(n.xy),n.z);
175
175
  }
176
176
  return normalize(n);
177
177
  }
178
178
 
179
179
 
180
- fn sS(value:vec3f)->u32 {
180
+ fn us(value:vec3f)->u32 {
181
181
  let peak=max(max(value.x,value.y),value.z);
182
182
  if(!(peak>0.0)) {
183
183
  return 0u;
@@ -204,8 +204,8 @@ fn photonIndexWord(i:u32)->u32 {
204
204
  let width=textureDimensions(photonMapGrid).x;
205
205
  return textureLoad(photonMapGrid,vec2i(vec2u(i%width,i/width)),0).x;
206
206
  }
207
- fn wp(yp:vec3i)->u32 {
208
- let p=bitcast<vec3u>(yp);
207
+ fn ym(sF:vec3i)->u32 {
208
+ let p=bitcast<vec3u>(sF);
209
209
  return ((p.x*73856093u)^(p.y*19349663u)^(p.z*83492791u))&(photonIndexWord(5u)-1u);
210
210
  }
211
211
 
@@ -220,77 +220,77 @@ let offset=b.xyz/b.w;
220
220
  let eye=cameraUniform.viewInv[3].xyz;
221
221
  let forward=normalize(cameraUniform.viewInv[2].xyz);
222
222
  let depth=abs(dot(si.position-eye,forward));
223
- let xe=max(abs(dot(origin-eye,forward)),1e-8);
223
+ let zg=max(abs(dot(origin-eye,forward)),1e-8);
224
224
  let perspective=abs(inverse[2].w)>1e-8;
225
- let footprint=length(offset-origin)*select(1.0,depth/xe,perspective);
225
+ let footprint=length(offset-origin)*select(1.0,depth/zg,perspective);
226
226
  let cosine=abs(dot(si.faceNormal,normalize(si.position-eye)));
227
227
  return max(1e-8,footprint/sqrt(max(.0625,cosine)));
228
228
  }
229
- fn rI(si:SurfaceInteraction,prepared:OpenPbrPreparedBsdf,vb:bool,visible:bool)->vec3f {
229
+ fn sY(si:SurfaceInteraction,prepared:OpenPbrPreparedBsdf,wP:bool,visible:bool)->vec3f {
230
230
  if(samplingBounce>CAUSTIC_PHOTON_MAX_DEPTH||isCausticSpecular(prepared.material)||prepared.material.materialType==SHADOW_CATCHER) {
231
231
  return vec3f(0.0);
232
232
  }
233
- if(CAUSTIC_LIGHT_TRACING&&vb) {
233
+ if(CAUSTIC_LIGHT_TRACING&&wP) {
234
234
  return vec3f(0.0);
235
235
  }
236
- let mn=bitcast<f32>(photonIndexWord(0u));
236
+ let ni=bitcast<f32>(photonIndexWord(0u));
237
237
  let screenPixels=bitcast<f32>(photonIndexWord(2u));
238
- if(!(mn>0.0)||bitcast<f32>(photonIndexWord(3u))==1.0||(bitcast<f32>(photonIndexWord(3u))==2.0&&visible)) {
238
+ if(!(ni>0.0)||bitcast<f32>(photonIndexWord(3u))==1.0||(bitcast<f32>(photonIndexWord(3u))==2.0&&visible)) {
239
239
  return vec3f(0.0);
240
240
  }
241
- var radius=mn;
241
+ var radius=ni;
242
242
  let experiments=photonIndexWord(7u);
243
- let wa=f32(experiments>>8u);
244
- let tf=select(wa,screenPixels,visible);
245
- if(tf>0.0) {
246
- radius=min(radius,photonPixelFootprint(si)*tf);
243
+ let xW=f32(experiments>>8u);
244
+ let uI=select(xW,screenPixels,visible);
245
+ if(uI>0.0) {
246
+ radius=min(radius,photonPixelFootprint(si)*uI);
247
247
  }
248
248
  let layer=select(0u,1u,visible&&screenPixels>0.0);
249
- let lv=select(mn,2.0*bitcast<f32>(photonIndexWord(6u)),layer==1u);
250
- let sG=vec3i(floor((si.position-vec3f(radius))/lv));
251
- let tS=vec3i(floor((si.position+vec3f(radius))/lv));
249
+ let mo=select(ni,2.0*bitcast<f32>(photonIndexWord(6u)),layer==1u);
250
+ let uf=vec3i(floor((si.position-vec3f(radius))/mo));
251
+ let vB=vec3i(floor((si.position+vec3f(radius))/mo));
252
252
  let buckets=photonIndexWord(5u);
253
- let tb=8u+layer*buckets*2u;
253
+ let uE=8u+layer*buckets*2u;
254
254
  let indexStart=8u+buckets*4u+layer*photonIndexWord(4u);
255
255
  let emitted=f32(photonIndexWord(4u));
256
256
  var sum=vec3f(0.0);
257
- for(var z=sG.z;z<=tS.z;z++) {
258
- for(var y=sG.y;y<=tS.y;y++) {
259
- for(var x=sG.x;x<=tS.x;x++) {
260
- let sU=vec3i(x,y,z);
257
+ for(var z=uf.z;z<=vB.z;z++) {
258
+ for(var y=uf.y;y<=vB.y;y++) {
259
+ for(var x=uf.x;x<=vB.x;x++) {
260
+ let uw=vec3i(x,y,z);
261
261
 
262
262
 
263
- let uP=vec3f(sU)*lv;
264
- let padding=max(vec3f(lv*1e-5),abs(uP)*1e-6);
265
- let xV=clamp(si.position,uP-padding,uP+vec3f(lv)+padding);
266
- if(distance(xV,si.position)>=radius) { continue; }
267
- let su=wp(sU);
268
- let offset=photonIndexWord(tb+su*2u);
269
- let count=photonIndexWord(tb+1u+su*2u);
263
+ let wy=vec3f(uw)*mo;
264
+ let padding=max(vec3f(mo*1e-5),abs(wy)*1e-6);
265
+ let pQ=clamp(si.position,wy-padding,wy+vec3f(mo)+padding);
266
+ if(distance(pQ,si.position)>=radius) { continue; }
267
+ let tU=ym(uw);
268
+ let offset=photonIndexWord(uE+tU*2u);
269
+ let count=photonIndexWord(uE+1u+tU*2u);
270
270
  for(var i=offset;i<offset+count;i++) {
271
271
  let index=photonIndexWord(indexStart+i);
272
272
  let record=photonLoad(index);
273
273
  let position=bitcast<vec3f>(record.xyz);
274
274
 
275
- if(any(vec3i(floor(position/lv))!=sU)||distance(position,si.position)>=radius) {
275
+ if(any(vec3i(floor(position/mo))!=uw)||distance(position,si.position)>=radius) {
276
276
  continue;
277
277
  }
278
- var jY=radius;
278
+ var kE=radius;
279
279
  if((experiments&1u)!=0u) {
280
280
  let scale=bitcast<f32>(photonIndexWord(8u+buckets*4u+u32(emitted)*3u+index));
281
- jY=min(radius,mn*scale);
282
- if(!(jY>0.0)||distance(position,si.position)>=jY) { continue; }
281
+ kE=min(radius,ni*scale);
282
+ if(!(kE>0.0)||distance(position,si.position)>=kE) { continue; }
283
283
  }
284
284
  let directions=photonIndexWord(8u+buckets*4u+u32(emitted)*2u+index);
285
- let normal=pM(vec2f(f32(directions&255u)/255.0,f32((directions>>8u)&127u)/127.0));
285
+ let normal=qQ(vec2f(f32(directions&255u)/255.0,f32((directions>>8u)&127u)/127.0));
286
286
  if(dot(normal,si.faceNormal)<0.9) {
287
287
  continue;
288
288
  }
289
289
  if(CAUSTIC_MNEE&&samplingBounce<=CAUSTIC_MNEE_MAX_DEPTH&&(directions&32768u)!=0u&&prepared.material.baseWeight*(1.0-prepared.material.baseMetalness)*(1.0-prepared.material.transmissionWeight)>0.0&&prepared.material.subsurfaceWeight==0.0) {
290
290
  continue;
291
291
  }
292
- let hQ=pM(vec2f(f32((directions>>16u)&255u),f32(directions>>24u))/255.0);
293
- let cosine=abs(dot(si.faceNormal,hQ));
292
+ let iA=qQ(vec2f(f32((directions>>16u)&255u),f32(directions>>24u))/255.0);
293
+ let cosine=abs(dot(si.faceNormal,iA));
294
294
  if(cosine<=0.0) {
295
295
  continue;
296
296
  }
@@ -299,8 +299,8 @@ if(SPECTRAL) {
299
299
  flux=sampling_spectral_rgb_filter(flux,si.spectralChannel);
300
300
  }
301
301
  var pdf:f32;
302
- let response=openpbr_eval_prepared(prepared,hQ,&pdf);
303
- sum+=response*flux/cosine*(radius*radius)/(jY*jY);
302
+ let response=openpbr_eval_prepared(prepared,iA,&pdf);
303
+ sum+=response*flux/cosine*(radius*radius)/(kE*kE);
304
304
  }
305
305
  }
306
306
  }
@@ -317,15 +317,15 @@ export function photonDirectQuerySource(enabled = false) {
317
317
  if (!enabled)
318
318
  return photonQueryWgsl;
319
319
  return photonQueryWgsl
320
- .replace('var sum=vec3f(0.0);', `let rL=ak(aC,rtUniform.sequenceSeed^0x91e10da5u);
321
- let vT=vec2u(cB(rL^0x68bc21ebu),cB(rL^0x967a889bu));
322
- let tj=aI+vT;
323
- let vS=(tj.x&1u)|((tj.y&1u)<<1u);
320
+ .replace('var sum=vec3f(0.0);', `let tb=ak(aC,rtUniform.sequenceSeed^0x91e10da5u);
321
+ let xO=vec2u(cD(tb^0x68bc21ebu),cD(tb^0x967a889bu));
322
+ let uL=aJ+xO;
323
+ let xN=(uL.x&1u)|((uL.y&1u)<<1u);
324
324
  var sum=vec3f(0.0);`)
325
- .replace('let record=photonLoad(index);', `if(vb&&(ak(index,rL^0x02e5be93u)&3u)!=vS) { continue; }
325
+ .replace('let record=photonLoad(index);', `if(wP&&(ak(index,tb^0x02e5be93u)&3u)!=xN) { continue; }
326
326
  let record=photonLoad(index);`)
327
327
  .replace('var flux=photonDecodeFlux(record.w)/emitted;', `var flux=photonDecodeFlux(record.w)/emitted;
328
- if(vb) { flux*=4.0; }`);
328
+ if(wP) { flux*=4.0; }`);
329
329
  }
330
330
  /** Evidence-only per-query counters; no extra bindings or public render options. */
331
331
  export function photonQuerySource(debugGroup = -1, directSubset = false) {
@@ -22,18 +22,18 @@ const T_SIZE = vec2u(256, 64);
22
22
  const MS_ALTITUDES = 32u;
23
23
  const SV_SIZE = vec2u(96, 192);
24
24
 
25
- fn bj(r: f32, mu: f32, radius: f32) -> f32 { return (radius - r) * (radius + r) + r * r * mu * mu; }
26
- fn mV(r: f32, mu: f32) -> bool { return mu < 0.0 && bj(r, mu, R_GROUND) >= 0.0; }
27
- fn kT(r: f32, mu: f32) -> f32 { return max(-r * mu - sqrt(max(bj(r, mu, R_GROUND), 0.0)), 0.0); }
28
- fn iS(r: f32, mu: f32) -> f32 { return max(-r * mu + sqrt(max(bj(r, mu, R_TOP), 0.0)), 0.0); }
29
- fn oo(r: f32) -> vec3f {
25
+ fn bk(r: f32, mu: f32, radius: f32) -> f32 { return (radius - r) * (radius + r) + r * r * mu * mu; }
26
+ fn nW(r: f32, mu: f32) -> bool { return mu < 0.0 && bk(r, mu, R_GROUND) >= 0.0; }
27
+ fn lM(r: f32, mu: f32) -> f32 { return max(-r * mu - sqrt(max(bk(r, mu, R_GROUND), 0.0)), 0.0); }
28
+ fn jx(r: f32, mu: f32) -> f32 { return max(-r * mu + sqrt(max(bk(r, mu, R_TOP), 0.0)), 0.0); }
29
+ fn pj(r: f32) -> vec3f {
30
30
  let h = max(r - R_GROUND, 0.0);
31
31
  return vec3f(exp(-h / 8.0), exp(-h / 1.2) * ${TURBIDITY}, max(0.0, 1.0 - abs(h - 25.0) / 15.0));
32
32
  }
33
33
  fn extinction(d: vec3f) -> vec3f { return RAYLEIGH * d.x + MIE_EXTINCTION * d.y + OZONE * d.z; }
34
- fn mB(x: f32) -> f32 { return x * x * (R_TOP - R_GROUND); }
35
- fn hy(h: f32) -> f32 { return sqrt(clamp(h / (R_TOP - R_GROUND), 0.0, 1.0)); }
36
- fn eR(table: texture_2d<f32>, p: vec2f) -> vec3f {
34
+ fn nE(x: f32) -> f32 { return x * x * (R_TOP - R_GROUND); }
35
+ fn hT(h: f32) -> f32 { return sqrt(clamp(h / (R_TOP - R_GROUND), 0.0, 1.0)); }
36
+ fn fd(table: texture_2d<f32>, p: vec2f) -> vec3f {
37
37
  let size = vec2i(textureDimensions(table));
38
38
  let q = clamp(p, vec2f(0.0), vec2f(size - 1));
39
39
  let i = min(vec2i(floor(q)), max(size - 2, vec2i(0)));
@@ -45,25 +45,25 @@ let c = textureLoad(table, vec2i(i.x, j.y), 0).rgb;
45
45
  let d = textureLoad(table, j, 0).rgb;
46
46
  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
47
47
  }
48
- fn fv(r: f32, mu: f32) -> vec3f {
49
- return eR(transmittanceTable, vec2f((clamp(mu, -1.0, 1.0) + 1.0) * 0.5 * f32(T_SIZE.x - 1u), hy(r - R_GROUND) * f32(T_SIZE.y - 1u)));
48
+ fn fK(r: f32, mu: f32) -> vec3f {
49
+ return fd(transmittanceTable, vec2f((clamp(mu, -1.0, 1.0) + 1.0) * 0.5 * f32(T_SIZE.x - 1u), hT(r - R_GROUND) * f32(T_SIZE.y - 1u)));
50
50
  }
51
- fn mI(nu: f32) -> f32 {
51
+ fn nK(nu: f32) -> f32 {
52
52
  let g2 = MIE_G * MIE_G;
53
53
  return 3.0 / (8.0 * PI) * ((1.0 - g2) * (1.0 + nu * nu)) / ((2.0 + g2) * pow(1.0 + g2 - 2.0 * MIE_G * nu, 1.5));
54
54
  }
55
- struct yk { radiance: vec3f, throughput: vec3f }
56
- fn vG(origin: vec3f, dir: vec3f, steps: u32, full: bool, uD: vec3f) -> yk {
55
+ struct Ai { radiance: vec3f, throughput: vec3f }
56
+ fn xu(origin: vec3f, dir: vec3f, steps: u32, full: bool, wl: vec3f) -> Ai {
57
57
  let r = length(origin);
58
58
  let mu = dot(origin, dir) / r;
59
- let ground = mV(r, mu);
60
- var len = iS(r, mu);
61
- if (ground) { len = kT(r, mu); }
59
+ let ground = nW(r, mu);
60
+ var len = jx(r, mu);
61
+ if (ground) { len = lM(r, mu); }
62
62
  let nu = dot(dir, params.sun.xyz);
63
- var ja = 1.0 / (4.0 * PI);
64
- var sh = ja;
65
- if (full) { ja = 3.0 / (16.0 * PI) * (1.0 + nu * nu); sh = mI(nu); }
66
- var result = yk(vec3f(0.0), vec3f(0.0));
63
+ var jF = 1.0 / (4.0 * PI);
64
+ var tH = jF;
65
+ if (full) { jF = 3.0 / (16.0 * PI) * (1.0 + nu * nu); tH = nK(nu); }
66
+ var result = Ai(vec3f(0.0), vec3f(0.0));
67
67
  var view = vec3f(1.0);
68
68
  var previous = 0.0;
69
69
  for (var i = 0u; i < steps; i++) {
@@ -73,34 +73,34 @@ let dt = next - previous;
73
73
  let p = origin + dir * (0.5 * (previous + next));
74
74
  previous = next;
75
75
  let pr = length(p);
76
- let d = oo(pr);
76
+ let d = pj(pr);
77
77
  let e = extinction(d);
78
- let vk = fv(pr, dot(p, params.sun.xyz) / pr);
79
- let np = RAYLEIGH * d.x;
80
- let nl = MIE_SCATTERING * d.y;
78
+ let wZ = fK(pr, dot(p, params.sun.xyz) / pr);
79
+ let om = RAYLEIGH * d.x;
80
+ let ol = MIE_SCATTERING * d.y;
81
81
  var ms = vec3f(0.0);
82
- if (full) { ms = eR(multipleTable, vec2f(hy(pr - R_GROUND) * f32(MS_ALTITUDES - 1u), 0.0)); }
83
- let source = vk * (np * ja + nl * sh) + (np + nl) * ms;
82
+ if (full) { ms = fd(multipleTable, vec2f(hT(pr - R_GROUND) * f32(MS_ALTITUDES - 1u), 0.0)); }
83
+ let source = wZ * (om * jF + ol * tH) + (om + ol) * ms;
84
84
  let segment = exp(-e * dt);
85
85
  let weight = (1.0 - segment) / max(e, vec3f(1e-9));
86
86
  result.radiance += view * source * weight;
87
- result.throughput += view * (np + nl) * weight;
87
+ result.throughput += view * (om + ol) * weight;
88
88
  view *= segment;
89
89
  }
90
90
  if (ground) {
91
91
  let p = origin + dir * len;
92
92
  let pr = length(p);
93
- let tD = dot(p, params.sun.xyz) / pr;
94
- let irradiance = fv(pr, tD) * max(tD, 0.0) + uD;
93
+ let vd = dot(p, params.sun.xyz) / pr;
94
+ let irradiance = fK(pr, vd) * max(vd, 0.0) + wl;
95
95
  result.radiance += view * ALBEDO / PI * irradiance;
96
96
  }
97
97
  return result;
98
98
  }
99
- fn qd(row: f32) -> f32 {
99
+ fn rl(row: f32) -> f32 {
100
100
  let x = row / f32(SV_SIZE.y - 1u) * 2.0 - 1.0;
101
101
  return sign(x) * x * x * (PI / 2.0);
102
102
  }
103
- fn hL(e: f32) -> f32 {
103
+ fn ir(e: f32) -> f32 {
104
104
  let x = sign(e) * sqrt(abs(e) / (PI / 2.0));
105
105
  return clamp((x + 1.0) * 0.5, 0.0, 1.0) * f32(SV_SIZE.y - 1u);
106
106
  }
@@ -108,40 +108,40 @@ return clamp((x + 1.0) * 0.5, 0.0, 1.0) * f32(SV_SIZE.y - 1u);
108
108
  fn transmittance(@builtin(global_invocation_id) id: vec3u) {
109
109
  if (any(id.xy >= T_SIZE)) { return; }
110
110
  let mu = f32(id.x) / f32(T_SIZE.x - 1u) * 2.0 - 1.0;
111
- let r = R_GROUND + mB(f32(id.y) / f32(T_SIZE.y - 1u));
112
- if (mV(r, mu)) { textureStore(output, vec2i(id.xy), vec4f(0.0, 0.0, 0.0, 1.0)); return; }
113
- let len = iS(r, mu);
111
+ let r = R_GROUND + nE(f32(id.y) / f32(T_SIZE.y - 1u));
112
+ if (nW(r, mu)) { textureStore(output, vec2i(id.xy), vec4f(0.0, 0.0, 0.0, 1.0)); return; }
113
+ let len = jx(r, mu);
114
114
  var depth = vec3f(0.0);
115
115
  for (var i = 0u; i < 48u; i++) {
116
116
  let t = (f32(i) + 0.5) / 48.0 * len;
117
- depth += extinction(oo(sqrt(t * t + 2.0 * r * mu * t + r * r))) * (len / 48.0);
117
+ depth += extinction(pj(sqrt(t * t + 2.0 * r * mu * t + r * r))) * (len / 48.0);
118
118
  }
119
119
  textureStore(output, vec2i(id.xy), vec4f(exp(-depth), 1.0));
120
120
  }
121
121
  @compute @workgroup_size(8, 8)
122
122
  fn multiple(@builtin(global_invocation_id) id: vec3u) {
123
123
  if (id.x >= MS_ALTITUDES || id.y > 0u) { return; }
124
- let r = R_GROUND + mB(f32(id.x) / f32(MS_ALTITUDES - 1u));
124
+ let r = R_GROUND + nE(f32(id.x) / f32(MS_ALTITUDES - 1u));
125
125
  var second = vec3f(0.0);
126
- var qC = vec3f(0.0);
126
+ var rQ = vec3f(0.0);
127
127
  for (var i = 0u; i < 64u; i++) {
128
128
  let mu = 1.0 - 2.0 * (f32(i) + 0.5) / 64.0;
129
129
  let phi = f32(i) * PI * (3.0 - sqrt(5.0));
130
130
  let s = sqrt(1.0 - mu * mu);
131
- let result = vG(vec3f(0.0, r, 0.0), vec3f(s * cos(phi), mu, s * sin(phi)), 20u, false, vec3f(0.0));
131
+ let result = xu(vec3f(0.0, r, 0.0), vec3f(s * cos(phi), mu, s * sin(phi)), 20u, false, vec3f(0.0));
132
132
  second += result.radiance / 64.0;
133
- qC += result.throughput / 64.0;
133
+ rQ += result.throughput / 64.0;
134
134
  }
135
- textureStore(output, vec2i(id.xy), vec4f(second / (1.0 - qC), 1.0));
135
+ textureStore(output, vec2i(id.xy), vec4f(second / (1.0 - rQ), 1.0));
136
136
  }
137
137
  @compute @workgroup_size(8, 8)
138
138
  fn skyView(@builtin(global_invocation_id) id: vec3u) {
139
139
  if (any(id.xy >= SV_SIZE)) { return; }
140
- let e = qd(f32(id.y));
140
+ let e = rl(f32(id.y));
141
141
  let phi = f32(id.x) / f32(SV_SIZE.x - 1u) * PI;
142
142
  var sky = vec3f(0.0);
143
143
  if (params.size.w > 0.0) { sky = textureLoad(irradianceTable, vec2i(0), 0).rgb; }
144
- let result = vG(vec3f(0.0, R_GROUND + CAMERA_ALTITUDE, 0.0), vec3f(cos(e) * cos(phi), sin(e), cos(e) * sin(phi)), 40u, true, sky);
144
+ let result = xu(vec3f(0.0, R_GROUND + CAMERA_ALTITUDE, 0.0), vec3f(cos(e) * cos(phi), sin(e), cos(e) * sin(phi)), 40u, true, sky);
145
145
  textureStore(output, vec2i(id.xy), vec4f(result.radiance, 1.0));
146
146
  }
147
147
  @compute @workgroup_size(8, 8)
@@ -153,44 +153,44 @@ let e = (f32(i) + 0.5) / 128.0 * (PI / 2.0);
153
153
  let weight = 2.0 * sin(e) * cos(e) * (PI / 2.0 / 128.0) * (PI / 48.0);
154
154
  for (var j = 0u; j < 48u; j++) {
155
155
  let phi = (f32(j) + 0.5) / 48.0 * PI;
156
- sky += eR(skyTable, vec2f(phi / PI * f32(SV_SIZE.x - 1u), hL(e))) * weight;
156
+ sky += fd(skyTable, vec2f(phi / PI * f32(SV_SIZE.x - 1u), ir(e))) * weight;
157
157
  }
158
158
  }
159
159
  if (id.x == 0u) { textureStore(output, vec2i(id.xy), vec4f(sky, 1.0)); return; }
160
- let vk = fv(R_GROUND + CAMERA_ALTITUDE, params.sun.y);
161
- let xE = vec3f(0.2126, 0.7152, 0.0722);
162
- let horizontal = dot(sky, xE) + dot(vk, xE) * max(params.sun.y, 0.0);
160
+ let wZ = fK(R_GROUND + CAMERA_ALTITUDE, params.sun.y);
161
+ let lQ = vec3f(0.2126, 0.7152, 0.0722);
162
+ let horizontal = dot(sky, lQ) + dot(wZ, lQ) * max(params.sun.y, 0.0);
163
163
  let scale = ${ILLUMINANCE} / sqrt(max(horizontal, ${REFERENCE_ILLUMINANCE} * 1e-3) * ${REFERENCE_ILLUMINANCE});
164
- textureStore(output, vec2i(id.xy), vec4f(vk, scale));
164
+ textureStore(output, vec2i(id.xy), vec4f(wZ, scale));
165
165
  }
166
- fn gU(cR: vec2f) -> vec3f {
167
- let theta = cR.y / params.size.y * PI;
168
- let phi = cR.x / params.size.x * 2.0 * PI;
166
+ fn hs(texel: vec2f) -> vec3f {
167
+ let theta = texel.y / params.size.y * PI;
168
+ let phi = texel.x / params.size.x * 2.0 * PI;
169
169
  return vec3f(-sin(theta) * cos(phi), cos(theta), -sin(theta) * sin(phi));
170
170
  }
171
171
  @compute @workgroup_size(8, 8)
172
172
  fn map(@builtin(global_invocation_id) id: vec3u) {
173
173
  if (any(id.xy >= vec2u(params.size.xy))) { return; }
174
- let cR = vec2f(id.xy) + 0.5;
175
- let dir = gU(cR);
176
- let tg = abs(atan2(dir.z, dir.x) - params.sun.w);
177
- let wO = tg - floor(tg / (2.0 * PI)) * (2.0 * PI);
178
- let dU = min(wO, 2.0 * PI - wO);
174
+ let texel = vec2f(id.xy) + 0.5;
175
+ let dir = hs(texel);
176
+ let uJ = abs(atan2(dir.z, dir.x) - params.sun.w);
177
+ let yP = uJ - floor(uJ / (2.0 * PI)) * (2.0 * PI);
178
+ let ea = min(yP, 2.0 * PI - yP);
179
179
  let e = asin(clamp(dir.y, -1.0, 1.0));
180
- var radiance = eR(skyTable, vec2f(dU / PI * f32(SV_SIZE.x - 1u), hL(e)));
180
+ var radiance = fd(skyTable, vec2f(ea / PI * f32(SV_SIZE.x - 1u), ir(e)));
181
181
  let sun = textureLoad(irradianceTable, vec2i(1, 0), 0);
182
182
  let radius = params.sunWorld.w;
183
- let rM = PI / params.size.y;
184
- if (acos(clamp(dot(dir, params.sunWorld.xyz), -1.0, 1.0)) < radius + 3.0 * rM / max(sqrt(1.0 - dir.y * dir.y), 0.05)) {
183
+ let tc = PI / params.size.y;
184
+ if (acos(clamp(dot(dir, params.sunWorld.xyz), -1.0, 1.0)) < radius + 3.0 * tc / max(sqrt(1.0 - dir.y * dir.y), 0.05)) {
185
185
  var coverage = 0.0;
186
186
  for (var y = 0u; y < 6u; y++) { for (var x = 0u; x < 6u; x++) {
187
- let d = gU(cR - 0.5 + (vec2f(f32(x), f32(y)) + 0.5) / 6.0);
187
+ let d = hs(texel - 0.5 + (vec2f(f32(x), f32(y)) + 0.5) / 6.0);
188
188
  let angle = 2.0 * asin(min(length(d - params.sunWorld.xyz) * 0.5, 1.0));
189
189
  let t = angle / radius;
190
190
  if (t < 1.0) { coverage += 1.0 - 0.6 * (1.0 - sqrt(1.0 - t * t)); }
191
191
  } }
192
- let rK = 2.0 * PI * (1.0 - cos(radius));
193
- radiance += coverage / 36.0 / (rK * (1.0 - 0.6 / 3.0)) * sun.rgb;
192
+ let ta = 2.0 * PI * (1.0 - cos(radius));
193
+ radiance += coverage / 36.0 / (ta * (1.0 - 0.6 / 3.0)) * sun.rgb;
194
194
  }
195
195
  textureStore(output, vec2i(id.xy), vec4f(radiance * sun.a * params.scale.xyz + params.ambient.xyz, 1.0));
196
196
  }
@@ -9,7 +9,21 @@ export interface RayTraceInputHooks {
9
9
  uniformJitter: boolean;
10
10
  }
11
11
  export interface RayTraceShaderOptions {
12
+ /** Internal host budget. Default 20 preserves the native AOT contract. */
13
+ maxPathEvents?: number;
14
+ /** Web TLAS leaf boxes. Default false retains the native layout. */
15
+ perInstanceBounds?: boolean;
16
+ /** Full RGB reservoir targets for browser spectral paths. Default false. */
17
+ channelIndependentRis?: boolean;
18
+ /** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */
19
+ shareSpectralPrefix?: boolean;
20
+ independentTextures?: boolean;
21
+ /** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */
22
+ displayAovStorage?: boolean;
12
23
  hasDisplacement: boolean;
24
+ /** Browser camera extension; false preserves the native uniform layout. */
25
+ cameraProjectionInverse?: boolean;
26
+ compactVertices?: boolean;
13
27
  debugGroup?: number;
14
28
  /** Invocation block edge; the native host matches dispatch to this value. Default 8. */
15
29
  workgroupSize?: number;