@meimu/mutracer 0.2.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 (372) 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/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  // https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
4
4
  // See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.
5
5
  export const bloomBrightDefine = /* wgsl */ `
6
- fn tS(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
6
+ fn vE(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
7
7
  return a + b + c - min(min(a, b), c) - max(max(a, b), c);
8
8
  }
9
9
  `;
@@ -11,26 +11,26 @@ export const bloomBrightMain = /* wgsl */ `
11
11
 
12
12
  let d = vec3i(1, 1, 0);
13
13
 
14
- var dk = load_colorTex(uv, 0);
14
+ var texel = load_colorTex(uv, 0);
15
15
  let s1 = load_colorTex(uv - d.xz, 0);
16
16
  let s2 = load_colorTex(uv + d.xz, 0);
17
17
  let s3 = load_colorTex(uv - d.zy, 0);
18
18
  let s4 = load_colorTex(uv + d.zy, 0);
19
- dk = tS(tS(dk, s1, s2), s3, s4);
19
+ texel = vE(vE(texel, s1, s2), s3, s4);
20
20
 
21
21
 
22
- let lum = dot(dk.rgb, vec3f(0.2125, 0.7154, 0.0721));
22
+ let lum = dot(texel.rgb, vec3f(0.2125, 0.7154, 0.0721));
23
23
  var color: vec4f;
24
- if (lum > threshold && dk.a > 0.0) {
25
- color = vec4f(dk.rgb * scale, dk.a);
24
+ if (lum > threshold && texel.a > 0.0) {
25
+ color = vec4f(texel.rgb * scale, texel.a);
26
26
  } else {
27
27
 
28
- color = vec4f(vec3(0.0), dk.a);
28
+ color = vec4f(vec3(0.0), texel.a);
29
29
  }
30
30
  output.color = color;
31
31
  `;
32
32
  export const bloomDownDefine = /* wgsl */ `
33
- fn xP(c: vec3f) -> f32 {
33
+ fn Am(c: vec3f) -> f32 {
34
34
  return max(max(c.r, c.g), c.b);
35
35
  }
36
36
  `;
@@ -44,25 +44,25 @@ output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
44
44
  + sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
45
45
  `;
46
46
  export const bloomBlurDefine = /* wgsl */ `
47
- const xT = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
47
+ const Au = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
48
48
  `;
49
49
  export const bloomBlurMain = /* wgsl */ `
50
- let xG = vec2f(colorTexRegion());
51
- let off = direction / xG * size;
50
+ let Ae = vec2f(colorTexRegion());
51
+ let off = direction / Ae * size;
52
52
 
53
53
  var sum = vec4f(0.0);
54
- var uE = 0.0;
54
+ var wr = 0.0;
55
55
  for (var i = 0; i < 9; i++) {
56
- let w = xT[i];
56
+ let w = Au[i];
57
57
  sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
58
- uE += w;
58
+ wr += w;
59
59
  }
60
- output.color = sum / max(uE, 0.01);
60
+ output.color = sum / max(wr, 0.01);
61
61
  `;
62
62
  export const bloomBlendMain = /* wgsl */ `
63
- let xQ = sample_colorTex1_linearSampler(uv2);
64
- let xR = sample_colorTex2_linearSampler(uv2);
65
- output.color = mix(xQ, xR, weight);
63
+ let Ao = sample_colorTex1_linearSampler(uv2);
64
+ let Ap = sample_colorTex2_linearSampler(uv2);
65
+ output.color = mix(Ao, Ap, weight);
66
66
  `;
67
67
  export const BLOOM_LEVELS = 6;
68
68
  export function bloomBlurSize(radius) {
@@ -0,0 +1,6 @@
1
+ export declare const CAUSTIC_UNIFORM_BYTES = 112;
2
+ export declare const causticUnitRandomWgsl = "\n fn causticUnitRandom(value:f32)->f32 {\n return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);\n }\n";
3
+ export declare function causticLightCompute(constants: Record<string, boolean | number>, blasLayoutMask: number, hasDisplacement: boolean, mode?: 'lightTracing' | 'photonMapping', sceneIntersections?: string, fullEmissionRandom?: boolean, perInstanceBounds?: boolean, compactVertices?: boolean, independentTextures?: boolean): string;
4
+ export declare const causticAccumulateCompute = "\n @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;\n @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&accumulation)) {\n return;\n }\n let i=pixel*3u;\n accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);\n }\n";
5
+ /** Native buffer resolve has the same independent batch normalization as web. */
6
+ export declare const causticBufferCompositeCompute = "\n @group(0)@binding(0)var<storage,read>pt:array<vec4f>;\n @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;\n @group(0)@binding(2)var<storage,read>normal:array<vec4f>;\n @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;\n @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&output)) {\n return;\n }\n let c=caustics[pixel];\n let p=pt[pixel];\n output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);\n }\n";
@@ -0,0 +1,539 @@
1
+ import { PHOTON_GRID_SIZE, photonPackingWgsl } from './photonMap.compute.js';
2
+ import { SPECTRUM_PHOTON_DISTRIBUTION, SPECTRUM_WAVELENGTH_RANGE, spectrumWgsl } from '../spectrum.js';
3
+ import background from './chunks/background.wgsl.js';
4
+ import atomic from './chunks/causticAtomic.wgsl.js';
5
+ import adjoint from './chunks/causticAdjoint.wgsl.js';
6
+ import common from './chunks/common.wgsl.js';
7
+ import core from './chunks/rayTraceCore.wgsl.js';
8
+ import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
9
+ import intersect from './chunks/intersect.wgsl.js';
10
+ import rand from './chunks/rand.wgsl.js';
11
+ import random from './chunks/random.wgsl.js';
12
+ import env from './chunks/envMap.wgsl.js';
13
+ import sampling from './chunks/sampling.wgsl.js';
14
+ import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
15
+ import light from './chunks/sampleLight.wgsl.js';
16
+ import uv from './chunks/uvProjection.wgsl.js';
17
+ import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
18
+ import { wgpuShaderPreamble } from '../wgpuShaderSource.js';
19
+ import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
20
+ export const CAUSTIC_UNIFORM_BYTES = 112;
21
+ export const causticUnitRandomWgsl = /* wgsl */ `
22
+ fn causticUnitRandom(value:f32)->f32 {
23
+ return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);
24
+ }
25
+ `;
26
+ // Preserve the dormant R1 uniform slot and shader spelling for source parity.
27
+ // Production packs zero; only an explicitly registered research adapter sets it.
28
+ export function causticLightCompute(constants, blasLayoutMask, hasDisplacement, mode = 'lightTracing', sceneIntersections = '', fullEmissionRandom = true, perInstanceBounds = false, compactVertices = false, independentTextures = false) {
29
+ const frames = !!constants.USE_ANISOTROPY_DIRECTIONS || !!constants.USE_COAT_NORMAL_FRAMES, coat = !!constants.USE_COAT_NORMAL_FRAMES;
30
+ return ((independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, true) +
31
+ /* wgsl */ `
32
+ ${Object.keys(WGPU_SCENE_FEATURE_BITS)
33
+ .map((name) => `const ${name} = ${!!constants[name]};`)
34
+ .join('\n')}
35
+ ${common}
36
+ ${core({ independentTextures, compactVertices, hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
37
+ ${uv}
38
+ ${createMaterialBufferWgsl({ independentTextures, hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
39
+ ${intersect({
40
+ perInstanceBounds,
41
+ compactVertices,
42
+ hasDisplacement,
43
+ blasLayoutMask,
44
+ hasAnisotropyDirections: frames,
45
+ hasCoatNormals: coat,
46
+ sceneIntersections
47
+ })}
48
+ ${rand}
49
+ ${random}
50
+ ${env}
51
+ ${sampling}
52
+ ${spectrumWgsl}
53
+ ${createOpenPbrBsdfWgsl(frames, coat)}
54
+ ${light}
55
+ ${background.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${{ USE_BACKGROUND: 1, USE_BACKGROUND_MAP: 2, USE_GROUNDED_BACKGROUND: 4 }[name]}) != 0)`)}
56
+ ${causticPartitionWGSL(false, false)}
57
+ ${adjoint}
58
+ struct CausticLightUniform {
59
+ casterSphere: vec4f,
60
+ viewProjection: mat4x4f,
61
+ photonCount: u32,
62
+ batch: u32,
63
+ mnee: u32,
64
+ cameraScale: f32,
65
+ casterCount: u32,
66
+ choiceCount: u32,
67
+ orthographic: u32,
68
+ experiments: u32,
69
+ }
70
+ @group(3) @binding(0) var<uniform> caustic: CausticLightUniform;
71
+ ${mode === 'lightTracing'
72
+ ? '@group(3) @binding(1) var<storage,read_write> splats: array<atomic<u32>>;'
73
+ : `${photonPackingWgsl}
74
+ @group(3)@binding(1)var photons:texture_storage_2d<rgba32uint,write>;
75
+ @group(3)@binding(3)var photonDirections:texture_storage_2d<r32uint,write>;
76
+ fn photonStore(i:u32,value:vec4u) {
77
+ let width=textureDimensions(photons).x;
78
+ textureStore(photons,vec2i(vec2u(i%width,i/width)),value);
79
+ }
80
+ fn qX(i:u32,value:u32) {
81
+ let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
82
+ let index=8u+buckets*4u+caustic.photonCount*2u+i;
83
+ let width=textureDimensions(photonDirections).x;
84
+ textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(value));
85
+ }
86
+ `}
87
+ @group(3) @binding(2) var causticDistribution:texture_2d<f32>;
88
+
89
+
90
+ ${causticUnitRandomWgsl}
91
+ fn fN(dim:u32)->f32{return ${fullEmissionRandom ? 'causticUnitRandom(sample1D(dim))' : 'sample1D(dim)'}
92
+ ;
93
+ }
94
+ fn ie(dim:u32)->vec2f {
95
+ let value=sample2D(dim);
96
+ return
97
+ ${fullEmissionRandom ? 'vec2f(causticUnitRandom(value.x),causticUnitRandom(value.y))' : 'value'}
98
+ ;
99
+ }
100
+ fn oF(i:u32)->vec4f {
101
+ let width=textureDimensions(causticDistribution).x;
102
+ return textureLoad(causticDistribution,vec2i(vec2u(i%width,i/width)),0);
103
+ }
104
+ fn dz(i:u32)->vec4f {
105
+ return oF(i);
106
+ }
107
+
108
+
109
+
110
+ var<private> lu:vec3f;
111
+ var<private> causticEmissionAreaPdf:f32;
112
+ fn lE(origin:vec3f,position:vec3f,normal:vec3f,emission:vec3f,area:f32,pmf:f32,result:ptr<function,LightSampleRec>) {
113
+ lu=position;
114
+ causticEmissionAreaPdf=pmf/max(area,1e-20);
115
+ let offset=position-origin;
116
+ (*result).dist=length(offset);
117
+ (*result).direction=offset/max((*result).dist,1e-20);
118
+ (*result).normal=normal;
119
+ (*result).emission=emission;
120
+ (*result).pdf=pmf;
121
+ }
122
+ fn sE(origin:vec3f,rnd:vec3f,result:ptr<function,LightSampleRec>) {
123
+ causticEmissionAreaPdf=0.0;
124
+ (*result).pdf=0.0;
125
+ (*result).sourceType=0u;
126
+ (*result).isDelta=false;
127
+ if(caustic.choiceCount==0u) {
128
+ return;
129
+ }
130
+ let scaled=rnd.z*f32(caustic.choiceCount);
131
+ let column=min(u32(scaled),caustic.choiceCount-1u);
132
+ let entry=oF(caustic.casterCount+column*2u);
133
+ let selected=select(bitcast<u32>(entry.y),column,fract(scaled)<entry.x);
134
+ let choice=bitcast<vec4u>(oF(caustic.casterCount+selected*2u));
135
+ let pmf=oF(caustic.casterCount+selected*2u+1u).x;
136
+ (*result).sourceIndex=choice.w;
137
+ if(choice.z==1u) {
138
+ (*result).sourceType=0u;
139
+ iM(rnd.xy,result);
140
+ (*result).pdf*=pmf;
141
+ }
142
+ else if(choice.z==2u) {
143
+ (*result).sourceType=2u;
144
+ var light=analyticLights[choice.w];
145
+ let kind=i32(light.litType);
146
+ if(kind==RECT_LIGHT) {
147
+ let position=light.position+light.u*(rnd.x-.5)+light.v*(rnd.y-.5);
148
+ lE(origin,position,normalize(cross(light.u,light.v)),light.emission,light.area,pmf,result);
149
+ (*result).isDelta=light.radiusOrSpread<=.001;
150
+ bD(light,position,light.position-.5*(light.u+light.v),result);
151
+ }
152
+ else if((kind==SPHERE_LIGHT||kind==SPOT_LIGHT)&&light.radiusOrSpread>0.0) {
153
+ let z=1.0-2.0*rnd.x;
154
+ let dw=sqrt(max(0.0,1.0-z*z));
155
+ let normal=vec3f(dw*cos(TWOPI*rnd.y),dw*sin(TWOPI*rnd.y),z);
156
+ lE(origin,light.position+light.radiusOrSpread*normal,normal,light.emission,light.area,pmf,result);
157
+ }
158
+ else {
159
+ light.selectionPmf=1.0;
160
+ sampleAnalyticLight(light,origin,rnd.xy,result);
161
+ (*result).pdf*=pmf;
162
+ }
163
+ }
164
+ else {
165
+ (*result).sourceType=1u;
166
+ let triangle=getEmissiveTriangle(i32(choice.w));
167
+ let u=sqrt(rnd.x);
168
+ let bary=vec3f(1.0-u,u*(1.0-rnd.y),u*rnd.y);
169
+ let position=bary.x*triangle.p0+bary.y*triangle.p1+bary.z*triangle.p2;
170
+ let normal=normalize(cross(triangle.p1-triangle.p0,triangle.p2-triangle.p0));
171
+ let uv=bary.x*triangle.uv0+bary.y*triangle.uv1+bary.z*triangle.uv2;
172
+ let uv1=bary.x*triangle.secondaryUv0+bary.y*triangle.secondaryUv1+bary.z*triangle.secondaryUv2;
173
+ lE(origin,position,normal,getMaterialEmission(i32(triangle.materialIndex),uv,uv1),triangle.area,pmf,result);
174
+ }
175
+ (*result).selectionPmf=pmf;
176
+ }
177
+ fn mf(s:vec4f,origin:vec3f)->f32 {
178
+ let bG=dot(s.xyz-origin,s.xyz-origin);
179
+ return select(-1.0,sqrt(max(0.0,1.0-s.w*s.w/bG)),bG>s.w*s.w);
180
+ }
181
+
182
+
183
+ fn dS(s:vec4f)->f32 {
184
+ if((caustic.experiments&2u)==0u) { return 1.0; }
185
+ let vb=caustic.viewProjection*vec4f(s.xyz,1.0);
186
+ let m=caustic.viewProjection;
187
+ let extent=s.w*max(length(vec3f(m[0].x,m[1].x,m[2].x)),length(vec3f(m[0].y,m[1].y,m[2].y)));
188
+ if(vb.w<=0.0||abs(vb.x)>vb.w+extent||abs(vb.y)>vb.w+extent) { return .05; }
189
+ return .05+min(1.0,extent*extent/max(vb.w*vb.w,1e-20));
190
+ }
191
+ fn tV(origin:vec3f,rnd:vec3f,pdf:ptr<function,f32>,lh:ptr<function,f32>)->vec3f {
192
+ var total=0.0;
193
+ for(var i=0u;i<caustic.casterCount;i++) {
194
+ total+=(1.0-mf(dz(i),origin))*dS(dz(i));
195
+ }
196
+ var choice=rnd.z*total;
197
+ var selected=dz(0u);
198
+ for(var i=0u;i<caustic.casterCount;i++) {
199
+ let sphere=dz(i);
200
+ selected=sphere;
201
+ choice-=(1.0-mf(sphere,origin))*dS(sphere);
202
+ if(choice<=0.0) {
203
+ break;
204
+ }
205
+ }
206
+ *lh=selected.w;
207
+ let offset=selected.xyz-origin;
208
+ let axis=normalize(select(vec3f(0.0,0.0,1.0),offset,dot(offset,offset)>1e-20));
209
+ let cosine=mix(1.0,mf(selected,origin),rnd.x);
210
+ let wk=sqrt(max(0.0,1.0-cosine*cosine));
211
+ var t:vec3f;
212
+ var b:vec3f;
213
+ sampling_orthonormal_basis(axis,&t,&b);
214
+ let direction=axis*cosine+(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y))*wk;
215
+
216
+ var overlaps=0.0;
217
+ for(var i=0u;i<caustic.casterCount;i++) {
218
+ let sphere=dz(i);
219
+ let c=mf(sphere,origin);
220
+ if(c<0.0||dot(normalize(sphere.xyz-origin),direction)>=c) {
221
+ overlaps+=dS(sphere);
222
+ }
223
+ }
224
+ *pdf=overlaps/max(TWOPI*total,1e-20);
225
+ return direction;
226
+ }
227
+ ${mode === 'lightTracing'
228
+ ? /* wgsl */ `${atomic}
229
+ fn causticCameraConnect(si: SurfaceInteraction, material: OpenPbrResolvedMaterial, iA: Ray, flux: vec3f, extinction: vec3f) {
230
+ let eye=cameraUniform.viewInv[3].xyz;
231
+ let forward=-normalize(cameraUniform.viewInv[2].xyz);
232
+ let sQ=ie(causticDim(68u));
233
+ let radius=cameraUniform.apertureRadius*sqrt(sQ.x);
234
+ var wJ=eye+radius*(cos(TWOPI*sQ.y)*cameraUniform.viewInv[0].xyz+sin(TWOPI*sQ.y)*cameraUniform.viewInv[1].xyz);
235
+ if(caustic.orthographic!=0u) {
236
+ wJ=si.position-forward*dot(si.position-eye,forward);
237
+ }
238
+ let zJ=wJ-si.position;
239
+ let bG=dot(zJ,zJ);
240
+ let direction=normalize(zJ);
241
+ let ye=wJ+(si.position-wJ)*cameraUniform.focusDistance/max(dot(si.position-wJ,forward),1e-12);
242
+ let sc=select(ye,si.position,caustic.orthographic!=0u);
243
+ let vb=caustic.viewProjection*vec4f(sc,1.0);
244
+ if(vb.w<=0.0||dot(si.position-eye,forward)<=0.0) {
245
+ return;
246
+ }
247
+ let yY=vb.xy/vb.w*0.5+0.5;
248
+ if(any(yY<vec2f(0.0))||any(yY>=vec2f(1.0))) {
249
+ return;
250
+ }
251
+ var shadow:Ray;
252
+ initRay(&shadow,si.position+EPS*direction,direction);
253
+ if(intersectSceneShadow(shadow,sqrt(bG)-2.0*EPS,si.triangleIndex,si.instanceIndex)) {
254
+ return;
255
+ }
256
+ var m=material;
257
+ let normal=select(-si.normal,si.normal,dot(si.normal,-iA.d)>=0.0);
258
+ m.inside=dot(si.faceNormal,-iA.d)<0.0;
259
+ m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
260
+ ${frames
261
+ ? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
262
+ : ''}
263
+ ${coat
264
+ ? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,-iA.d)>=0.0);`
265
+ : ''}
266
+ let prepared=bX(si.tangent,m,-iA.d,normal);
267
+ var pdf:f32;
268
+ let response=openpbr_eval_prepared(prepared,direction,&pdf);
269
+ let ne=dot(-direction,-normalize(cameraUniform.viewInv[2].xyz));
270
+ if(ne<=0.0) {
271
+ return;
272
+ }
273
+ let yf=caustic.cameraScale*rtUniform.outputSize.x*rtUniform.outputSize.y /
274
+ select(max(bG*ne*ne*ne,1e-12),1.0,caustic.orthographic!=0u);
275
+ let transmittance=exp(-extinction*sqrt(bG));
276
+ let value=flux*transmittance*response*causticAdjoint(-iA.d,direction,normal,si.faceNormal)*yf/f32(caustic.photonCount);
277
+ let pixel=vec2u(yY*rtUniform.outputSize);
278
+ let index=(pixel.x+pixel.y*u32(rtUniform.outputSize.x))*3u;
279
+ lF(index,value.x);
280
+ lF(index+1u,value.y);
281
+ lF(index+2u,value.z);
282
+ }
283
+ `
284
+ : ''}
285
+ @compute @workgroup_size(64)
286
+ fn main(@builtin(global_invocation_id) id:vec3u) {
287
+ let photonIndex=id.x+id.y*4194240u;
288
+ if(photonIndex>=caustic.photonCount) {
289
+ return;
290
+ }
291
+ ${mode === 'photonMapping' ? 'photonStore(photonIndex,vec4u(0u));' : ''}
292
+ aJ=vec2u(photonIndex%u32(rtUniform.outputSize.x),photonIndex/u32(rtUniform.outputSize.x));
293
+ aC=caustic.batch;
294
+ samplingBounce=0u;
295
+ hashedCounter=0u;
296
+ fA(aJ,i32(ak(caustic.batch,rtUniform.sequenceSeed)));
297
+ var wavelength=0.0;
298
+ var wavelengthPdf=1.0;
299
+ if(SPECTRAL) {
300
+ wavelength=spectrumSample(${SPECTRUM_PHOTON_DISTRIBUTION}u,fN(causticDim(69u)),&wavelengthPdf);
301
+ }
302
+ var ls:LightSampleRec;
303
+ sE(caustic.casterSphere.xyz,vec3f(ie(causticDim(60u)),fN(causticDim(61u))),&ls);
304
+ if(ls.pdf<=0.0) {
305
+ return;
306
+ }
307
+ var infinite=ls.sourceType==0u;
308
+ if(ls.sourceType==2u) {
309
+ infinite=i32(analyticLights[ls.sourceIndex].litType)==DIRECTIONAL_LIGHT;
310
+ }
311
+ var origin=caustic.casterSphere.xyz+ls.direction*ls.dist;
312
+ if(causticEmissionAreaPdf>0.0) { origin=lu; }
313
+ var direction:vec3f;
314
+ var flux:vec3f;
315
+ var lh=caustic.casterSphere.w;
316
+ if(infinite) {
317
+ direction=-ls.direction;
318
+
319
+ var area=0.0;
320
+ for(var i=0u;i<caustic.casterCount;i++) {
321
+ let s=dz(i);
322
+ area+=s.w*s.w*dS(s);
323
+ }
324
+ var choice=fN(causticDim(63u))*area;
325
+ var sphere=dz(0u);
326
+ for(var i=0u;i<caustic.casterCount;i++) {
327
+ sphere=dz(i);
328
+ choice-=sphere.w*sphere.w*dS(sphere);
329
+ if(choice<=0.0) {
330
+ break;
331
+ }
332
+ }
333
+ lh=sphere.w;
334
+ var t:vec3f;
335
+ var b:vec3f;
336
+ sampling_orthonormal_basis(direction,&t,&b);
337
+ let rnd=ie(causticDim(62u));
338
+ origin=sphere.xyz-direction*dot(sphere.xyz-caustic.casterSphere.xyz,direction)-direction*caustic.casterSphere.w;
339
+ origin+=sphere.w*sqrt(rnd.x)*(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y));
340
+ var overlaps=0.0;
341
+ for(var i=0u;i<caustic.casterCount;i++) {
342
+ let s=dz(i);
343
+ let offset=origin-s.xyz;
344
+ let sc=offset-direction*dot(offset,direction);
345
+ if(dot(sc,sc)<=s.w*s.w) {
346
+ overlaps+=dS(s);
347
+ }
348
+ }
349
+ let diskPdf=overlaps/max(PI*area,1e-20);
350
+ flux=ls.emission/(ls.pdf*diskPdf);
351
+ }
352
+ else if(ls.sourceType==2u&&i32(analyticLights[ls.sourceIndex].litType)==RECT_LIGHT&&ls.isDelta) {
353
+
354
+ direction=ls.normal;
355
+ flux=ls.emission/causticEmissionAreaPdf;
356
+ }
357
+ else {
358
+ var areaPdf=ls.pdf*abs(dot(ls.normal,-ls.direction))/max(ls.dist*ls.dist,1e-20);
359
+ if(causticEmissionAreaPdf>0.0) { areaPdf=causticEmissionAreaPdf; }
360
+ if(ls.isDelta) {
361
+ areaPdf=ls.selectionPmf;
362
+ }
363
+ if(areaPdf<=0.0) {
364
+ return;
365
+ }
366
+ var directionPdf:f32;
367
+ direction=tV(origin,vec3f(ie(causticDim(62u)),fN(causticDim(63u))),&directionPdf,&lh);
368
+ var emission=ls.emission;
369
+ var nN=max(0.0,dot(ls.normal,direction));
370
+ if(ls.sourceType==2u) {
371
+ let source=analyticLights[ls.sourceIndex];
372
+ emission=source.emission;
373
+ if(i32(source.litType)==SPOT_LIGHT) {
374
+ emission*=evaluateSpotEmissionMultiplier(source,direction);
375
+ }
376
+ if(ls.isDelta) {
377
+ nN=1.0;
378
+ }
379
+ if(i32(source.litType)==RECT_LIGHT&&nN<cos(0.5*PI*source.radiusOrSpread)) {
380
+ return;
381
+ }
382
+ if(i32(source.litType)==RECT_LIGHT) {
383
+ var vX:LightSampleRec;
384
+ vX.emission=emission;
385
+ bD(source,origin,source.position-0.5*(source.u+source.v),&vX);
386
+ emission=vX.emission;
387
+ }
388
+ }
389
+ flux=emission*nN/(areaPdf*directionPdf);
390
+ }
391
+ if(SPECTRAL) {
392
+ flux*=spectrumRgb(wavelength)/(wavelengthPdf*${SPECTRUM_WAVELENGTH_RANGE}.0);
393
+ }
394
+ var ray:Ray;
395
+ initRay(&ray,origin+EPS*direction,direction);
396
+ var xk=0u;
397
+ var yN=false;
398
+ var extinction=vec3f(0.0);
399
+ var scattering=vec3f(0.0);
400
+ var si:SurfaceInteraction;
401
+ for(var depth=0;
402
+ ${mode === 'photonMapping' ? 'depth<=max(rtUniform.bounces,0)' : 'depth<20'}
403
+ ;
404
+ depth++) {
405
+ samplingBounce=u32(depth);
406
+ si.triangleIndex=-1;
407
+ intersectScene(ray,&si,0,true,depth>0);
408
+ if(!si.hit) {
409
+ return;
410
+ }
411
+ var m:OpenPbrResolvedMaterial;
412
+ getMaterial(&m,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
413
+ if(m.alpha<1.0&&fN(causticDim(79u))>=m.alpha) {
414
+ initRay(&ray,si.position+EPS*ray.d,ray.d);
415
+ continue;
416
+ }
417
+ if(m.materialType==SHADOW_CATCHER) {
418
+ return;
419
+ }
420
+ let segment=distance(ray.o,si.position);
421
+ let channel=min(u32(sample1D(aX(MEDIUM_CHANNEL))*3.0),2u);
422
+ if(extinction[channel]>0.0&&any(scattering>vec3f(0.0))) {
423
+ let sampled=-log(max(sample1D(aX(MEDIUM_DISTANCE)),1e-7))/extinction[channel];
424
+
425
+
426
+ if(sampled<segment) {
427
+ return;
428
+ }
429
+ }
430
+ let transmittance=exp(-extinction*segment);
431
+ let oq=(transmittance.x+transmittance.y+transmittance.z)/3.0;
432
+ flux*=transmittance/select(1.0,max(oq,1e-20),any(scattering>vec3f(0.0)));
433
+ if(SPECTRAL) {
434
+ m.specularIor=sampling_cauchy_ior(spectrumIorWavelength(wavelength),m.specularIor,m.transmissionDispersionScale,m.dispersionAbbeNumber);
435
+ }
436
+ if(!isCausticSpecular(m)) {
437
+ let yi=ls.sourceType!=0u;
438
+ let r1=yi&&xk==1u&&yN&&m.baseWeight*(1.0-m.baseMetalness)*(1.0-m.transmissionWeight)>0.0&&m.subsurfaceWeight==0.0;
439
+ if(xk>0u
440
+ ${mode === 'lightTracing' ? '&&!(caustic.mnee!=0u&&r1)' : ''}){${mode === 'lightTracing'
441
+ ? 'causticCameraConnect(si,m,ray,flux,extinction);'
442
+ : /* wgsl */ `
443
+ let position=bitcast<vec3u>(si.position);
444
+ photonStore(photonIndex,vec4u(position,us(flux)));
445
+ if((caustic.experiments&1u)!=0u) {
446
+ var maximum=1e-8;
447
+ for(var i=0u;i<caustic.casterCount;i++) { maximum=max(maximum,dz(i).w); }
448
+ let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
449
+ let index=8u+buckets*4u+caustic.photonCount*3u+photonIndex;
450
+ let width=textureDimensions(photonDirections).x;
451
+ textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(bitcast<u32>(lh/maximum)));
452
+ }
453
+ let iA=vec2u(round(qR(-ray.d)*255.0));
454
+ let normal=vec2u(round(qR(si.faceNormal)*vec2f(255.0,127.0)));
455
+ qX(photonIndex,normal.x|(normal.y<<8u)|(select(0u,1u,r1)<<15u)|(iA.x<<16u)|(iA.y<<24u));
456
+ `}
457
+ }
458
+ return;
459
+ }
460
+ let view=-ray.d;
461
+ let normal=select(-si.normal,si.normal,dot(si.normal,view)>=0.0);
462
+ m.inside=dot(si.faceNormal,view)<0.0;
463
+ m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
464
+ ${frames
465
+ ? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
466
+ : ''}
467
+ ${coat
468
+ ? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,view)>=0.0);`
469
+ : ''}
470
+ let prepared=bX(si.tangent,m,view,normal);
471
+ var next:vec3f;
472
+ var pdf:f32;
473
+ var transmission:bool;
474
+ var roughness:f32;
475
+ var specular:bool;
476
+ var diffuse:bool;
477
+ var lobe:u32;
478
+ var marginal:f32;
479
+ var full:vec3f;
480
+ let response=dr(prepared,vec3f(sample2D(aX(BSDF_DIRECTION)),sample1D(aX(BSDF_LOBE))),&next,&pdf,&transmission,&roughness,&specular,&diffuse,&lobe,&marginal,&full);
481
+ if(!(pdf>0.0)) {
482
+ return;
483
+ }
484
+ if(xk==0u&&ls.sourceType==0u&&transmission) {
485
+ var reverse:Ray;
486
+ initRay(&reverse,si.position,-ray.d);
487
+ let bg=fI(reverse);
488
+ flux*=bg.rgb*bg.a/max(ls.emission,vec3f(1e-20));
489
+ }
490
+ flux*=response/pdf*causticAdjoint(view,next,normal,si.faceNormal);
491
+
492
+
493
+ if(transmission&&!m.thinWalled) {
494
+ flux/=m.relativeIor*m.relativeIor;
495
+ }
496
+
497
+ if(transmission&&!m.thinWalled&&m.mediumType>0) {
498
+ extinction=select(m.mediumExtinction,vec3f(0.0),m.inside);
499
+ scattering=select(m.mediumScattering,vec3f(0.0),m.inside);
500
+ }
501
+ xk++;
502
+ yN=xk==1u&&((isCausticT(m)&&transmission)||(isCausticR(m)&&!transmission));
503
+ initRay(&ray,si.position+EPS*next,next);
504
+ }
505
+ }
506
+ `);
507
+ }
508
+ export const causticAccumulateCompute = /* wgsl */ `
509
+ @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;
510
+ @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;
511
+ @compute @workgroup_size(64)
512
+ fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {
513
+
514
+ let pixel=id.x+id.y*groups.x*64u;
515
+ if(pixel>=arrayLength(&accumulation)) {
516
+ return;
517
+ }
518
+ let i=pixel*3u;
519
+ accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);
520
+ }
521
+ `;
522
+ /** Native buffer resolve has the same independent batch normalization as web. */
523
+ export const causticBufferCompositeCompute = /* wgsl */ `
524
+ @group(0)@binding(0)var<storage,read>pt:array<vec4f>;
525
+ @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;
526
+ @group(0)@binding(2)var<storage,read>normal:array<vec4f>;
527
+ @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;
528
+ @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {
529
+
530
+ let pixel=id.x+id.y*groups.x*64u;
531
+ if(pixel>=arrayLength(&output)) {
532
+ return;
533
+ }
534
+ let c=caustics[pixel];
535
+ let p=pt[pixel];
536
+ output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);
537
+ }
538
+ `;
539
+ //# sourceMappingURL=causticLight.compute.js.map