@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
@@ -1,27 +1,30 @@
1
- import { MAX_PATH_EVENTS } from '../pathLimits.js';
1
+ import { spectralPrefixGlsl, prefixCheckpoint, prefixSave, prefixRestore, prefixRandomBindings } from './chunks/spectralPrefix.glsl.js';
2
+ import { researchTransport } from '../researchTransport.js';
3
+ import { MAX_PATH_EVENTS_WEBGL } from '../pathLimits.js';
2
4
  import cameraRayGlsl from './chunks/cameraRay.glsl.js';
3
5
  // Portions adapted from ray-tracing-renderer@0.10.15
4
6
  // (https://github.com/hoverinc/ray-tracing-renderer).
5
7
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
6
8
  import commonGlsl from './chunks/common.glsl.js';
7
- import rayTraceCore from './chunks/rayTraceCore.glsl.js';
9
+ import { createRayTraceCoreGlsl } from './chunks/rayTraceCore.glsl.js';
8
10
  import textureLinear from './chunks/textureLinear.glsl.js';
9
- import materialBufferGlsl from './chunks/materialBuffer.glsl.js';
11
+ import { createMaterialBufferGlsl } from './chunks/materialBuffer.glsl.js';
10
12
  import intersect from './chunks/intersect.glsl.js';
11
13
  import randGlsl from './chunks/rand.glsl.js';
12
14
  import random from './chunks/random.glsl.js';
13
15
  import envMap from './chunks/envMap.glsl.js';
14
- import sampleMaterialGlsl from './chunks/sampleMaterial.glsl.js';
16
+ import { createSampleMaterialGlsl } from './chunks/sampleMaterial.glsl.js';
15
17
  import sampleLightGlsl from './chunks/sampleLight.glsl.js';
16
18
  import { FragmentShader, glsl, Shader } from '../shader.js';
17
19
  import openPbrBsdfGlsl from './chunks/openPbrBsdf.glsl.js';
18
20
  import samplingGlsl from './chunks/sampling.glsl.js';
21
+ import { spectrumGlsl } from '../spectrum.js';
19
22
  import { isIntelMac } from '../util.js';
20
23
  import uvProjectionGlsl from './chunks/uvProjection.glsl.js';
21
24
  const doubleTransmissionCheckCode = glsl `
22
25
  #if defined(HAS_TRANSMISSION) || defined(HAS_ALPHA)
23
26
  if (!si.isTransparency && BOUNCES < 16 && depth * 2 > BOUNCES) {
24
- aa.abort = true;
27
+ path.abort = true;
25
28
  return;
26
29
  }
27
30
  #endif
@@ -32,27 +35,40 @@ return;
32
35
  // So here the code are injected separately.
33
36
  const bounceCodeOnIntelMac = glsl `
34
37
 
35
- for(int xK = 0; xK < BOUNCES; xK++) {{
36
- if (aa.abort) {
37
- return vec4(aa.li, aa.alpha);
38
+ for(int Aj = 0; Aj < BOUNCES; Aj++) {{
39
+ if (path.abort) {
40
+ return vec4(path.li, path.alpha);
38
41
  }
39
- bounce(aa, depth, si, mat, outAux);
42
+ bounce(path, depth, si, mat, outAux);
40
43
  }}
41
44
  `;
42
45
  const bounceCodeOnOther = glsl `
43
- bool wY = !si.isTransparency;
44
- int rT = min(BOUNCES, bounceLimit);
45
- for(int idx = 0; idx < min(BOUNCES * 3, ${MAX_PATH_EVENTS}); idx++) {
46
- if (wY && idx > rT) {
47
- aa.abort = true;
46
+ bool isOpaque = !si.isTransparency;
47
+ int activeBounceLimit = min(BOUNCES, bounceLimit);
48
+ for(int idx = 0; idx < min(BOUNCES * 3, ${MAX_PATH_EVENTS_WEBGL}); idx++) {
49
+ if (isOpaque && idx > activeBounceLimit) {
50
+ path.abort = true;
48
51
  }
49
- if (aa.abort) {
50
- return vec4(aa.li, aa.alpha);
52
+ if (path.abort) {
53
+ return vec4(path.li, path.alpha);
51
54
  }
52
- bounce(aa, depth, si, mat, outAux);
55
+ bounce(path, depth, si, mat, outAux);
53
56
  }
54
57
  `;
55
- export default function createRayTraceFragmentShader() {
58
+ export default function createRayTraceFragmentShader(...options) {
59
+ const channelIndependentLight = options[0]?.channelIndependentLight ?? false;
60
+ const sharePrefix = options[0]?.shareSpectralPrefix ?? false;
61
+ const surfacePrefix = {
62
+ path: ['Path', 'path'], si: ['SurfaceInteraction', 'si'], mat: ['OpenPbrResolvedMaterial', 'mat'],
63
+ aux: ['RayTraceAuxiliary', 'outAux'], depth: ['int', 'depth'], event: ['int', 'idx'],
64
+ ignored: ['bool', 'sampleIgnored'], opaque: ['bool', 'isOpaque'], ...prefixRandomBindings
65
+ };
66
+ const research = researchTransport()?.fragment(typeof options[0] === 'object' ? [] : options);
67
+ const enabled = research?.enabled ?? false;
68
+ const fragments = research?.fragments;
69
+ const materialBufferGlsl = createMaterialBufferGlsl(fragments);
70
+ const rayTraceCore = createRayTraceCoreGlsl(fragments);
71
+ const sampleMaterialGlsl = createSampleMaterialGlsl(fragments, channelIndependentLight);
56
72
  const intelMac = isIntelMac();
57
73
  return new FragmentShader({
58
74
  name: 'rayTraceFrag',
@@ -61,19 +77,23 @@ export default function createRayTraceFragmentShader() {
61
77
  BOUNCES: 2
62
78
  },
63
79
  uniforms: {
80
+ emissiveLightData: Shader.uniform('sampler2D'), emissiveLightColumns: Shader.uniform('int'),
81
+ emissiveChoiceOffset: Shader.uniform('int'), emissiveChoiceCount: Shader.uniform('int'), emissivePmfOffset: Shader.uniform('int'),
82
+ emissiveWeightTotal: Shader.uniform('float', 0),
64
83
  cameraApertureRadius: Shader.uniform('float', 0),
65
84
  cameraFocusDistance: Shader.uniform('float', 10),
66
85
  viewProjectionInv: Shader.uniform('mat4'),
86
+ projectionInv: Shader.uniform('mat4'),
67
87
  viewInv: Shader.uniform('mat4'),
68
88
  transmissiveOutputAlphaMin: Shader.uniform('float'),
69
89
  openPbrEnergyLut: Shader.uniform('sampler2D'),
70
90
  viewportSize: Shader.uniform('vec2'),
71
- wavelength: Shader.uniform('float', 0),
91
+ spectralChannel: Shader.uniform('int', 0),
72
92
  bevelEnabled: Shader.uniform('bool', true),
73
93
  dispersionWavelengths: Shader.uniform('int', 3),
74
94
  bounceLimit: Shader.uniform('int', 8)
75
95
  },
76
- includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],
96
+ includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap, ...(research?.mixin ? [research.mixin] : [])],
77
97
  main: glsl `
78
98
  ${commonGlsl}
79
99
 
@@ -91,13 +111,16 @@ ${intersect.main}
91
111
  ${envMap.main}
92
112
 
93
113
  ${samplingGlsl}
114
+ ${spectrumGlsl}
94
115
  ${openPbrBsdfGlsl}
95
116
 
96
- float nl;
97
- float bp;
117
+ float rq;
118
+ float pathWavelength;
119
+ int rp;
120
+ int pathChannel;
98
121
 
99
122
  ${sampleLightGlsl}
100
- ${sampleMaterialGlsl}
123
+ ${research?.declarations ?? ''}${sampleMaterialGlsl}
101
124
 
102
125
  ${cameraRayGlsl}
103
126
  struct RayTraceAuxiliary {
@@ -109,8 +132,8 @@ bool isBlank;
109
132
  bool isShadowCatcher;
110
133
  };
111
134
 
112
- void bounce(inout Path aa, inout int depth, inout SurfaceInteraction si, inout OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
113
- bT = uint(max(depth, 0));
135
+ ${sharePrefix ? spectralPrefixGlsl + prefixCheckpoint('spSurface', surfacePrefix) : ''}void ${sharePrefix ? 'shadeSurfaceVertex' : 'bounce'}(inout Path path, inout int depth, inout SurfaceInteraction si, inout OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux${sharePrefix ? ', out bool sampleIgnored' : ''}) {${sharePrefix ? '\n sampleIgnored = false;' : ''}
136
+ samplingBounce = uint(max(depth, 0));
114
137
 
115
138
 
116
139
 
@@ -119,11 +142,11 @@ ${intelMac ? doubleTransmissionCheckCode : ''}
119
142
 
120
143
  bool isShadowCatcher = mat.materialType == SHADOW_CATCHER;
121
144
  if (isShadowCatcher) {
122
- if (aa.fromEye) {
145
+ if (path.fromEye) {
123
146
 
124
147
 
125
148
  outAux.albedo = vec3(1.0);
126
- outAux.normal = dot(si.normal, aa.ray.d) > 0.0 ? -si.normal : si.normal;
149
+ outAux.normal = dot(si.normal, path.ray.d) > 0.0 ? -si.normal : si.normal;
127
150
  si.hit = false;
128
151
  outAux.isShadowCatcher = true;
129
152
  }
@@ -131,97 +154,97 @@ else {
131
154
 
132
155
 
133
156
  #ifdef USE_ENVMAP
134
- if (aa.isNextRefraction) {
157
+ if (path.isNextRefraction) {
135
158
 
136
159
 
137
160
 
138
- vec4 bg = cG(aa.ray.o, aa.ray.d);
139
- bg.rgb = aj(bg.rgb, bp);
140
- float da = aa.scatteringIsDelta ? 1.0
141
- : aK(aa.scatteringPdf,
142
- iT(dm(aa.ray.d)) * envLightSelectionPmf);
143
- aa.li += da * aa.beta * bg.rgb * bg.a;
144
- aa.alpha = max(aa.alpha, bg.a);
161
+ vec4 bg = cq(path.ray.o, path.ray.d);
162
+ bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
163
+ float cP = path.scatteringIsDelta ? 1.0
164
+ : aG(path.scatteringPdf,
165
+ envMapPdf(cU(path.ray.d)) * envLightSelectionPmf);
166
+ path.li += cP * path.beta * bg.rgb * bg.a;
167
+ path.alpha = max(path.alpha, bg.a);
145
168
  }
146
169
  else {
147
- vec2 vo = dm(aa.ray.d);
148
- vec3 emission = textureLinear(envMap, vo).rgb;
149
- emission = aj(emission, bp);
150
- aa.li += aa.beta * emission *
151
- aK(
152
- aa.scatteringPdf,
153
- iT(vo) * envLightSelectionPmf
170
+ vec2 xp = cU(path.ray.d);
171
+ vec3 emission = textureLinear(envMap, xp).rgb;
172
+ emission = sampling_spectral_rgb_filter(emission, pathChannel);
173
+ path.li += path.beta * emission *
174
+ aG(
175
+ path.scatteringPdf,
176
+ envMapPdf(xp) * envLightSelectionPmf
154
177
  );
155
178
  }
156
179
  #else
157
- vec4 bg = cG(aa.ray.o, aa.ray.d);
158
- bg.rgb = aj(bg.rgb, bp);
159
- aa.li += aa.beta * bg.rgb * bg.a;
180
+ vec4 bg = cq(path.ray.o, path.ray.d);
181
+ bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
182
+ path.li += path.beta * bg.rgb * bg.a;
160
183
  #endif
161
- aa.abort = true;
184
+ path.abort = true;
162
185
  return;
163
186
  }
164
187
  }
165
188
 
166
189
  if (!si.hit) {
167
190
 
168
- vec4 bg = cG(aa.ray.o, aa.ray.d);
191
+ vec4 bg = cq(path.ray.o, path.ray.d);
169
192
 
170
193
 
171
194
 
172
- bg.rgb = aj(bg.rgb, bp);
173
- if (aa.fromEye) {
174
- aa.li = bg.rgb * bg.a;
175
- aa.alpha = bg.a;
195
+ bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
196
+ if (path.fromEye) {
197
+ path.li = bg.rgb * bg.a;
198
+ path.alpha = bg.a;
176
199
 
177
200
  outAux.isBlank = bg.a < 0.01;
178
201
  }
179
202
  else {
180
- Ray cam = fj(v_Texcoord + tg());
181
- bool nK = dot(cam.d, aa.ray.d) > 0.0;
203
+ Ray cam = cV(v_Texcoord + uH());
204
+ bool ou = dot(cam.d, path.ray.d) > 0.0;
182
205
  if (transmissiveOutputAlphaMin < 1.0) {
183
- if (nK) {
184
- aa.alpha = max(aa.alpha, bg.a);
206
+ if (ou) {
207
+ path.alpha = max(path.alpha, bg.a);
185
208
  } else {
186
- aa.alpha = 1.0;
209
+ path.alpha = 1.0;
187
210
  }
188
211
  }
189
212
  #if !defined(USE_ENVMAP)
190
213
 
191
- if (nK) {
192
- aa.li = aa.beta * aK(aa.scatteringPdf, 1.0) * bg.rgb;
214
+ if (ou) {
215
+ path.li += path.beta * aG(path.scatteringPdf, 1.0) * bg.rgb;
193
216
  }
194
217
  #endif
195
218
  }
196
- aa.abort = true;
219
+ path.abort = true;
197
220
  return;
198
221
  }
199
222
 
200
- bool aJ = false;
223
+ ${sharePrefix ? ' sampleIgnored = false;' : ' bool sampleIgnored = false;'}
201
224
  if ((mat.materialType == STANDARD || mat.materialType == UNLIT)) {
202
225
  if (transmissiveOutputAlphaMin < 1.0) {
203
226
 
204
227
  float alpha = max(1.0 - mat.transmissionWeight, 1.0 - pow(1.0 - transmissiveOutputAlphaMin, float(depth)));
205
- aa.alpha = max(alpha, aa.alpha);
228
+ path.alpha = max(alpha, path.alpha);
206
229
  }
207
230
  float alpha = mat.alpha;
208
231
  if (alpha < 1.0) {
209
232
 
210
233
 
211
- aa.alpha = max(aa.alpha, alpha);
212
- if (eC(3u) > alpha) {
213
- aJ = true;
234
+ path.alpha = max(path.alpha, alpha);
235
+ if (cm(3u) > alpha) {
236
+ sampleIgnored = true;
214
237
  }
215
238
  }
216
- if (!aJ) {
217
- mL(si, mat, aa);
239
+ if (!sampleIgnored) {
240
+ nB(si, mat, path);
218
241
  }
219
242
  else {
220
- aa.ray.o = si.position + aa.ray.d * EPS;
243
+ path.ray.o = si.position + path.ray.d * EPS;
221
244
  }
222
245
  }
223
246
 
224
- if (!si.albedoSampled && !aJ) {
247
+ if (!si.albedoSampled && !sampleIgnored) {
225
248
 
226
249
  if ((mat.materialType == STANDARD || mat.materialType == UNLIT) &&
227
250
  !(mat.transmissionWeight > 0.5 ||
@@ -243,100 +266,105 @@ si.albedoSampled = true;
243
266
 
244
267
 
245
268
  #ifdef USE_RR
246
- if (depth >= RR_MAX && !aJ) {
269
+ int wj = path.scatteringMediumEntered ? RR_MAX : 2;
270
+ if (depth >= wj && !sampleIgnored) {
247
271
 
248
- float pn = max(max(aa.beta.x, aa.beta.y), aa.beta.z);
249
- float q = max(0.0, 1.0 - pn);
250
- if (dp(cE(RUSSIAN_ROULETTE)) < q) {
272
+ float ql = max(max(path.beta.x, path.beta.y), path.beta.z);
273
+ float q = max(0.0, 1.0 - ql);
274
+ if (sample1D(aX(RUSSIAN_ROULETTE)) < q) {
251
275
 
252
276
 
253
- aa.alpha = 1.0;
254
- aa.abort = true;
277
+ path.alpha = 1.0;
278
+ path.abort = true;
255
279
  }
256
280
  else {
257
- aa.beta /= 1.0 - q;
281
+ path.beta /= 1.0 - q;
258
282
  }
259
283
  }
260
284
  #endif
261
285
 
262
- if (aa.abort) {
286
+ if (path.abort) {
263
287
  return;
264
288
  }
265
289
 
266
-
267
- intersectScene(aa.ray, si, true);
268
- dg(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
290
+ ${sharePrefix ? /* glsl */ ` return;
291
+ }
292
+ void qU(inout Path path, inout int depth, inout SurfaceInteraction si, inout OpenPbrResolvedMaterial mat, bool sampleIgnored) {
293
+ ` : ''}
294
+ ${sharePrefix ? '' : /* glsl */ ` intersectScene(path.ray, si, true);
295
+ getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
269
296
  si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
270
-
297
+ `}
271
298
 
272
299
 
273
300
 
274
301
  if (dispersionWavelengths == 1 && si.hit && mat.transmissionWeight > 0.001 && mat.transmissionDispersionScale > 0.001) {
275
- bp = nl;
302
+ pathWavelength = rq;
303
+ pathChannel = rp;
276
304
  }
277
- if (mat.transmissionWeight > 0.001 && bp > 0.0) {
278
- mat.specularIor = ee(
279
- bp,
305
+ if (mat.transmissionWeight > 0.001 && pathWavelength > 0.0) {
306
+ mat.specularIor = sampling_cauchy_ior(
307
+ pathWavelength,
280
308
  mat.specularIor,
281
309
  mat.transmissionDispersionScale,
282
310
  mat.dispersionAbbeNumber
283
311
  );
284
312
  }
285
313
 
286
- if (aJ) {
314
+ if (sampleIgnored) {
287
315
  return;
288
316
  }
289
317
 
290
- bool hM = eC(3u) < mat.alpha;
318
+ bool hN = cm(3u) < mat.alpha;
291
319
  #ifdef NUM_LIGHTS
292
320
 
293
321
  LightSampleRec lightSample;
294
322
  for (int i = 0; i < NUM_LIGHTS; i++) {
295
323
 
296
- Light light = rB(i);
297
- float d = nr(aa.ray, light, lightSample);
298
- bool lY = si.hit && d > distance(si.position, aa.ray.o);
299
- if (d != INF && !(lY && hM)) {
324
+ Light light = fetchLight(i);
325
+ float d = iB(path.ray, light, lightSample);
326
+ bool mz = si.hit && d > distance(si.position, path.ray.o);
327
+ if (d != INF && !(mz && hN)) {
300
328
  lightSample.pdf *= light.selectionPmf;
301
- float fl = aK(aa.scatteringPdf, lightSample.pdf);
302
- lightSample.emission = aj(lightSample.emission, bp);
303
- aa.li += fl * aa.beta * lightSample.emission;
329
+ float misWeight = aG(path.scatteringPdf, lightSample.pdf);
330
+ lightSample.emission = sampling_spectral_rgb_filter(lightSample.emission, pathChannel);
331
+ ${enabled ? 'if (!causticHitOwned(path)) { ' : ''}path.li += misWeight * path.beta * lightSample.emission;${enabled ? ' }' : ''}
304
332
 
305
- aa.alpha = 1.0;
306
- aa.abort = true;
333
+ path.alpha = 1.0;
334
+ path.abort = true;
307
335
  }
308
336
  }
309
337
  #endif
310
338
 
311
339
  #ifdef USE_ENVMAP
312
- if (!(si.hit && hM)) {
313
- if (aa.isNextRefraction) {
314
-
315
-
316
- vec4 bg = cG(aa.ray.o, aa.ray.d);
317
- bg.rgb = aj(bg.rgb, bp);
318
- float da = aa.scatteringIsDelta ? 1.0
319
- : aK(aa.scatteringPdf,
320
- iT(dm(aa.ray.d)) * envLightSelectionPmf);
321
- aa.li += da * aa.beta * bg.rgb * bg.a;
322
- aa.alpha = max(aa.alpha, bg.a);
323
- aa.abort = true;
340
+ if (!(si.hit && hN)) {
341
+ if (path.isNextRefraction) {
342
+
343
+
344
+ vec4 bg = cq(path.ray.o, path.ray.d);
345
+ bg.rgb = sampling_spectral_rgb_filter(bg.rgb, pathChannel);
346
+ float cP = path.scatteringIsDelta ? 1.0
347
+ : aG(path.scatteringPdf,
348
+ envMapPdf(cU(path.ray.d)) * envLightSelectionPmf);
349
+ path.li += cP * path.beta * bg.rgb * bg.a;
350
+ path.alpha = max(path.alpha, bg.a);
351
+ path.abort = true;
324
352
  return;
325
353
  }
326
- vec2 uv = dm(aa.ray.d);
354
+ vec2 uv = cU(path.ray.d);
327
355
  vec3 emission = textureLinear(envMap, uv).rgb;
328
- float fl = aK(
329
- aa.scatteringPdf,
330
- iT(uv) * envLightSelectionPmf
356
+ float misWeight = aG(
357
+ path.scatteringPdf,
358
+ envMapPdf(uv) * envLightSelectionPmf
331
359
  );
332
- emission = aj(emission, bp);
333
- aa.li += aa.beta * emission * fl;
360
+ emission = sampling_spectral_rgb_filter(emission, pathChannel);
361
+ path.li += path.beta * emission * misWeight;
334
362
 
335
363
 
336
364
  #if !defined(USE_BACKGROUND)
337
- aa.alpha = 1.0;
365
+ path.alpha = 1.0;
338
366
  #endif
339
- aa.abort = true;
367
+ path.abort = true;
340
368
  return;
341
369
  }
342
370
  #endif
@@ -345,177 +373,210 @@ depth++;
345
373
  }
346
374
 
347
375
 
348
- vec2 ld(float radius, float xi) {
376
+ vec2 lD(float radius, float xi) {
349
377
  float x = 0.25;
350
- for (int oD = 0; oD < 10; oD++) {
378
+ for (int iteration = 0; iteration < 10; iteration++) {
351
379
  float x2 = x * x;
352
380
  float x3 = x2 * x;
353
- float lw = 1.0 - x;
381
+ float lU = 1.0 - x;
354
382
  float value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
355
383
  4.0 * x2 * x3 - xi;
356
- float mX = 20.0 * x * lw * lw * lw;
357
- if (abs(value) < 1e-6 || mX == 0.0) break;
358
- x = clamp(x - value / mX, 0.0, 1.0);
384
+ float nL = 20.0 * x * lU * lU * lU;
385
+ if (abs(value) < 1e-6 || nL == 0.0) break;
386
+ x = clamp(x - value / nL, 0.0, 1.0);
359
387
  }
360
- float jL = x * radius;
388
+ float jW = x * radius;
361
389
  return vec2(
362
- jL,
363
- sqrt(max(radius * radius - jL * jL, 0.0))
390
+ jW,
391
+ sqrt(max(radius * radius - jW * jW, 0.0))
364
392
  );
365
393
  }
366
394
 
367
- float jj(float radius, float gM) {
368
- if (gM >= radius) return 0.0;
369
- float pa = radius - gM;
370
- return pa * pa * pa;
395
+ float bevelCubicPdf(float radius, float gO) {
396
+ if (gO >= radius) return 0.0;
397
+ float falloff = radius - gO;
398
+ return falloff * falloff * falloff;
371
399
  }
372
400
 
373
401
 
374
- vec3 nj(SurfaceInteraction source, float radius) {
402
+ vec3 kB(SurfaceInteraction source, float radius) {
375
403
  vec3 geometricNormal = source.faceNormal;
376
404
  if (dot(geometricNormal, source.vertexNormal) < 0.0) geometricNormal = -geometricNormal;
377
405
  vec3 tangent;
378
406
  vec3 bitangent;
379
- aP(geometricNormal, tangent, bitangent);
380
- vec3 iW = vec3(0.0);
381
-
382
- for (int iG = 0; iG < BEVEL_SAMPLES; iG++) {
383
- vec2 qf = dZ(CAMERA_BEVEL_BASE + uint(iG));
384
- float cJ = qf.x;
385
- float pv = qf.y;
386
- vec3 dz = geometricNormal;
387
- vec3 fW = tangent;
388
- vec3 eA = bitangent;
389
- float gu = 0.5;
390
- float iB = 0.25;
391
- float gT = 0.25;
392
- if (cJ < 0.5) {
393
- cJ *= 2.0;
394
- }
395
- else if (cJ < 0.75) {
396
- vec3 nI = dz;
397
- dz = fW;
398
- fW = nI;
399
- gu = 0.25;
400
- iB = 0.5;
401
- cJ = (cJ - 0.5) * 4.0;
407
+ sampling_orthonormal_basis(geometricNormal, tangent, bitangent);
408
+ vec3 jd = vec3(0.0);
409
+
410
+ for (int iN = 0; iN < BEVEL_SAMPLES; iN++) {
411
+ vec2 rh = sample2D(CAMERA_BEVEL_BASE + uint(iN));
412
+ float cu = rh.x;
413
+ float qt = rh.y;
414
+ vec3 dc = geometricNormal;
415
+ vec3 fU = tangent;
416
+ vec3 eo = bitangent;
417
+ float gw = 0.5;
418
+ float iH = 0.25;
419
+ float gV = 0.25;
420
+ if (cu < 0.5) {
421
+ cu *= 2.0;
422
+ }
423
+ else if (cu < 0.75) {
424
+ vec3 os = dc;
425
+ dc = fU;
426
+ fU = os;
427
+ gw = 0.25;
428
+ iH = 0.5;
429
+ cu = (cu - 0.5) * 4.0;
402
430
  }
403
431
  else {
404
- vec3 nI = dz;
405
- dz = eA;
406
- eA = nI;
407
- gu = 0.25;
408
- gT = 0.5;
409
- cJ = (cJ - 0.75) * 4.0;
410
- }
411
-
412
- vec2 hj = ld(radius, pv);
413
- float phi = TWOPI * cJ;
414
- vec3 rw = hj.x *
415
- (cos(phi) * fW + sin(phi) * eA);
432
+ vec3 os = dc;
433
+ dc = eo;
434
+ eo = os;
435
+ gw = 0.25;
436
+ gV = 0.5;
437
+ cu = (cu - 0.75) * 4.0;
438
+ }
439
+
440
+ vec2 hm = lD(radius, qt);
441
+ float phi = TWOPI * cu;
442
+ vec3 sI = hm.x *
443
+ (cos(phi) * fU + sin(phi) * eo);
416
444
  Ray ray;
417
- gC(
445
+ initRay(
418
446
  ray,
419
- source.position + dz * hj.y + rw,
420
- -dz
447
+ source.position + dc * hm.y + sI,
448
+ -dc
421
449
  );
422
450
  SurfaceInteraction hit;
423
451
  intersectSceneBevel(
424
452
  ray,
425
453
  hit,
426
454
  source.instanceIndex,
427
- max(2.0 * hj.y, EPS)
455
+ max(2.0 * hm.y, EPS)
428
456
  );
429
457
  if (!hit.hit) continue;
430
458
 
431
- float lA = gu * abs(dot(dz, hit.faceNormal));
432
- float nC = iB * abs(dot(fW, hit.faceNormal));
433
- float kG = gT * abs(dot(eA, hit.faceNormal));
434
- float weight = lA / max(
435
- lA * lA + nC * nC +
436
- kG * kG,
459
+ float lV = gw * abs(dot(dc, hit.faceNormal));
460
+ float oi = iH * abs(dot(fU, hit.faceNormal));
461
+ float kR = gV * abs(dot(eo, hit.faceNormal));
462
+ float weight = lV / max(
463
+ lV * lV + oi * oi +
464
+ kR * kR,
437
465
  1e-8
438
466
  );
439
- weight *= jj(radius, distance(hit.position, source.position)) /
440
- max(jj(radius, hj.x), 1e-8);
441
- iW += weight * hit.vertexNormal;
467
+ weight *= bevelCubicPdf(radius, distance(hit.position, source.position)) /
468
+ max(bevelCubicPdf(radius, hm.x), 1e-8);
469
+ jd += weight * hit.vertexNormal;
442
470
  }
443
471
 
444
- if (dot(iW, iW) <= 1e-12) return source.normal;
445
- vec3 kg = normalize(iW);
446
- vec3 result = source.normal + kg - source.vertexNormal;
472
+ if (dot(jd, jd) <= 1e-12) return source.normal;
473
+ vec3 kt = normalize(jd);
474
+ vec3 result = source.normal + kt - source.vertexNormal;
447
475
  return dot(result, result) > 1e-12 ? normalize(result) : source.normal;
448
476
  }
449
477
 
450
- vec4 cT(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
451
- Path aa;
452
- aa.ray = ray;
453
- aa.li = vec3(0);
454
- aa.alpha = transmissiveOutputAlphaMin < 1.0 ? 0.0 : 1.0;
455
- aa.beta = vec3(1.0);
456
- aa.fromEye = true;
457
- aa.scatteringPdf = 0.0;
458
- aa.scatteringIsDelta = false;
459
- aa.isNextRefraction = false;
460
- aa.abort = false;
478
+ vec4 cJ(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
479
+ Path path; path.scatteringMediumEntered = false;
480
+ path.ray = ray;
481
+ path.li = vec3(0);
482
+ path.alpha = transmissiveOutputAlphaMin < 1.0 ? 0.0 : 1.0;
483
+ path.beta = vec3(1.0);
484
+ path.fromEye = true;${enabled ? /* glsl */ `
485
+ path.causticK = 0; path.causticSingleT = false;
486
+ path.causticReceiverPrimary = false; path.causticHasReceiver = false; path.causticMneeReceiver=false;` : ''}
487
+ path.scatteringPdf = 0.0;
488
+ path.scatteringIsDelta = false;
489
+ path.isNextRefraction = false;
490
+ path.abort = false;
461
491
  int depth = 0;
462
- ${intelMac ? bounceCodeOnIntelMac : bounceCodeOnOther}
463
- return vec4(aa.li, aa.alpha);
492
+ ${sharePrefix ? /* glsl */ ` int spSlot = qz++;
493
+ if (spActive && spChannel > 1 && eB[spSlot].ready) return rN(spSlot, outAux);
494
+ bool isOpaque = !si.isTransparency;
495
+ bool sampleIgnored = false, spResume = false;
496
+ int spEvent = 0;
497
+ if (spActive && spChannel > 1 && fC == spSlot) {
498
+ int idx = 0;
499
+ ${prefixRestore('spSurface', surfacePrefix)}
500
+ spEvent = idx; spResume = true; qA(path);
501
+ }
502
+ int activeBounceLimit = min(BOUNCES, bounceLimit);
503
+ for (int idx = ${intelMac ? '0' : 'spEvent'}; idx < ${intelMac ? 'BOUNCES' : `min(BOUNCES * 3, ${MAX_PATH_EVENTS_WEBGL})`}; idx++) {
504
+ ${intelMac ? ' if (idx < spEvent) continue;' : ' if (isOpaque && idx > activeBounceLimit) path.abort = true;'}
505
+ if (path.abort) break;
506
+ if (!spResume) {
507
+ shadeSurfaceVertex(path, depth, si, mat, outAux, sampleIgnored);
508
+ if (!path.abort) {
509
+ intersectScene(path.ray, si, true);
510
+ getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
511
+ si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
512
+ }
513
+ }
514
+ spResume = false;
515
+ if (!path.abort) {
516
+ if (spActive && mat.transmissionWeight > 0.001 && gf(mat)) {
517
+ ${prefixSave('spSurface', surfacePrefix)}
518
+ fC = spSlot; qA(path);
519
+ }
520
+ qU(path, depth, si, mat, sampleIgnored);
521
+ }
522
+ }
523
+ return spFinish(spSlot, vec4(path.li, path.alpha), outAux);` : /* glsl */ `${intelMac ? bounceCodeOnIntelMac : bounceCodeOnOther}
524
+ return vec4(path.li, path.alpha);`}
464
525
  }
465
526
 
466
- vec4 iU(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
527
+ vec4 jb(SurfaceInteraction si, Ray ray, OpenPbrResolvedMaterial mat, inout RayTraceAuxiliary outAux) {
467
528
  float coverage = clamp(mat.alpha, 0.0, 1.0);
468
529
  if (!si.hit || (mat.materialType != STANDARD && mat.materialType != UNLIT) || coverage >= 1.0) {
469
- return cT(si, ray, mat, outAux);
530
+ return cJ(si, ray, mat, outAux);
470
531
  }
471
532
 
472
533
 
473
534
 
474
535
 
475
536
 
476
- Ray uG = ray;
477
- uG.o = si.position + ray.d * (EPS * 0.02);
478
- SurfaceInteraction kf = si;
479
- kf.albedoSampled = false;
480
- intersectScene(uG, kf, false);
481
- OpenPbrResolvedMaterial oS;
482
- dg(oS, kf.materialIndex, kf.uv, kf.uv1, kf.instanceIndex, kf.vertexColor);
483
- RayTraceAuxiliary ez = outAux;
484
- if (kf.hit && (oS.materialType == STANDARD || oS.materialType == UNLIT)) {
485
- ez.albedo = oS.transmissionWeight > 0.5
537
+ Ray wt = ray;
538
+ wt.o = si.position + ray.d * (EPS * 0.02);
539
+ SurfaceInteraction kq = si;
540
+ kq.albedoSampled = false;
541
+ intersectScene(wt, kq, false);
542
+ OpenPbrResolvedMaterial pN;
543
+ getMaterial(pN, kq.materialIndex, kq.uv, kq.uv1, kq.instanceIndex, kq.vertexColor);
544
+ RayTraceAuxiliary backAux = outAux;
545
+ if (kq.hit && (pN.materialType == STANDARD || pN.materialType == UNLIT)) {
546
+ backAux.albedo = pN.transmissionWeight > 0.5
486
547
  ? vec3(1.0)
487
- : oS.baseColor;
488
- ez.normal = dot(
489
- kf.normal,
490
- kf.position - vec3(viewInv[3])
548
+ : pN.baseColor;
549
+ backAux.normal = dot(
550
+ kq.normal,
551
+ kq.position - vec3(viewInv[3])
491
552
  ) > 0.0
492
- ? -kf.normal
493
- : kf.normal;
494
- kf.albedoSampled = oS.transmissionWeight > 0.5;
553
+ ? -kq.normal
554
+ : kq.normal;
555
+ kq.albedoSampled = pN.transmissionWeight > 0.5;
495
556
  }
496
- vec4 back = cT(kf, uG, oS, ez);
557
+ vec4 back = cJ(kq, wt, pN, backAux);
497
558
  if (coverage <= 0.0) {
498
- outAux = ez;
559
+ outAux = backAux;
499
560
  return back;
500
561
  }
501
562
 
502
- SurfaceInteraction xA = si;
503
- OpenPbrResolvedMaterial vp = mat;
504
- vp.alpha = 1.0;
505
- RayTraceAuxiliary se = outAux;
506
- vec4 front = cT(xA, ray, vp, se);
507
- outAux.albedo = mix(ez.albedo, se.albedo, coverage);
508
- vec3 dl = mix(ez.normal, se.normal, coverage);
509
- outAux.normal = dot(dl, dl) > 1e-12
510
- ? normalize(dl)
563
+ SurfaceInteraction zY = si;
564
+ OpenPbrResolvedMaterial xq = mat;
565
+ xq.alpha = 1.0;
566
+ RayTraceAuxiliary tA = outAux;
567
+ vec4 front = cJ(zY, ray, xq, tA);
568
+ outAux.albedo = mix(backAux.albedo, tA.albedo, coverage);
569
+ vec3 aS = mix(backAux.normal, tA.normal, coverage);
570
+ outAux.normal = dot(aS, aS) > 1e-12
571
+ ? normalize(aS)
511
572
  : vec3(0.0);
512
- outAux.isBlank = ez.isBlank && se.isBlank;
573
+ outAux.isBlank = backAux.isBlank && tA.isBlank;
513
574
  return mix(back, front, coverage);
514
575
  }
515
576
 
516
577
 
517
578
 
518
- vec4 iu(Ray ray, out RayTraceAuxiliary outAux) {
579
+ vec4 hq(Ray ray, out RayTraceAuxiliary outAux) {
519
580
 
520
581
  SurfaceInteraction si;
521
582
  OpenPbrResolvedMaterial mat;
@@ -528,13 +589,13 @@ si.mediumScattering = vec3(0.0);
528
589
  si.mediumAnisotropy = 0.0;
529
590
  #endif
530
591
 
531
- intersectScene(ray, si, false);
532
- dg(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
592
+ ${sharePrefix ? ' if (spChannel == 1) {\n' : ''} intersectScene(ray, si, false);
593
+ getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
533
594
  si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
534
595
 
535
596
  #ifdef HAS_BEVEL
536
597
  if (bevelEnabled && mat.bevel > 0.0) {
537
- si.normal = nj(si, mat.bevel);
598
+ si.normal = kB(si, mat.bevel);
538
599
  }
539
600
  #endif
540
601
 
@@ -550,33 +611,47 @@ outAux.normal = dot(si.normal, si.position - vec3(viewInv[3])) > 0.0
550
611
  si.albedoSampled = mat.transmissionWeight > 0.5;
551
612
  }
552
613
 
553
- if (mat.transmissionDispersionScale > 0.001) {
554
- mat.specularIor = ee(
555
- bp,
614
+ ${sharePrefix ? /* glsl */ ` lY = qI(si, mat, outAux, s0, hashedCounter, samplingBounce);
615
+ } else {
616
+ si = lY.si; mat = lY.mat; outAux = lY.aux;
617
+ s0 = lY.rng; hashedCounter = lY.counter; samplingBounce = lY.bounce;
618
+ }
619
+ spActive = ${enabled ? 'false' : '!(mat.transmissionDispersionScale > 0.001 && mat.specularIor != 1.0)'};
620
+ pathChannel = spActive ? 0 : spChannel;
621
+ qz = 0;
622
+ ` : ''} if (mat.transmissionDispersionScale > 0.001) {
623
+ mat.specularIor = sampling_cauchy_ior(
624
+ pathWavelength,
556
625
  mat.specularIor,
557
626
  mat.transmissionDispersionScale,
558
627
  mat.dispersionAbbeNumber
559
628
  );
560
629
  }
561
- return iU(si, ray, mat, outAux);
630
+ return jb(si, ray, mat, outAux);
562
631
  }
563
632
 
564
- void main() {
633
+ void ${sharePrefix ? 'traceSpectralWavelength' : 'main'}(${sharePrefix ? 'int channel' : ''}) {
565
634
 
566
- rG();
567
- gW(v_Texcoord * viewportSize, int(uint(sampleCount) ^ dG(uint(sequenceSeed))));
635
+ ${fragments?.debugInit ?? ''} sP();
636
+ fA(v_Texcoord * viewportSize, int(uint(sampleCount) ^ cD(uint(sequenceSeed))));
568
637
 
569
638
 
570
- bp = dispersionWavelengths == 1 ? 0.0 : wavelength;
571
- nl = wavelength;
572
- if (dispersionWavelengths == 1 && wavelength > 0.0) {
573
- float channel = floor(dp(CAMERA_WAVELENGTH) * 3.0);
574
- nl = channel < 1.0 ? 650.0 : channel < 2.0 ? 510.0 : 475.0;
639
+ ${sharePrefix ? ' spChannel = channel;\n' : ''} pathWavelength = 0.0;
640
+ pathChannel = 0;
641
+ if (spectralChannel > 0) {
642
+ float aE = sample1D(CAMERA_WAVELENGTH);
643
+ if (dispersionWavelengths == 1) {
644
+ rp = min(int(aE * 3.0), 2) + 1;
645
+ rq = ce(rp - 1, fract(aE * 3.0));
646
+ } else {
647
+ pathChannel = ${sharePrefix ? 'spChannel' : 'spectralChannel'};
648
+ pathWavelength = ce(${sharePrefix ? 'spChannel' : 'spectralChannel'} - 1, aE);
649
+ }
575
650
  }
576
651
 
577
652
 
578
653
 
579
- Ray cam = oG();
654
+ Ray cam = pq();
580
655
 
581
656
  RayTraceAuxiliary outAux;
582
657
  outAux.albedo = vec3(0.0);
@@ -584,40 +659,51 @@ outAux.normal = vec3(0.0);
584
659
  outAux.isBlank = false;
585
660
  outAux.isShadowCatcher = false;
586
661
 
587
- vec4 aW = iu(cam, outAux);
662
+ vec4 liAndAlpha = hq(cam, outAux);
588
663
 
589
664
 
590
665
 
591
666
  #ifdef CLAMPING
592
667
  float clamping = float(CLAMPING);
593
- aW.rgb = clamp(aW.rgb, -clamping, clamping);
668
+ liAndAlpha.rgb = clamp(liAndAlpha.rgb, -clamping, clamping);
594
669
  #endif
595
670
 
596
671
 
597
- if (bp > 0.0) {
672
+ if (pathWavelength > 0.0) {
598
673
 
599
- aW.rgb *= 3.0;
674
+ liAndAlpha.rgb *= 3.0;
600
675
  if (dispersionWavelengths != 1) {
601
676
 
602
677
 
603
- aW.a /= 3.0;
678
+ liAndAlpha.a /= 3.0;
604
679
  }
605
680
  }
606
- if (!(aW.x < INF && aW.x > -EPS)) {
607
- aW = vec4(0, 0, 0, 1);
681
+ if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {
682
+ liAndAlpha = vec4(0, 0, 0, 1);
608
683
  }
609
684
 
610
- out_color = aW;
685
+ out_color = ${research?.debugOutput || 'liAndAlpha'};
611
686
  out_albedo = vec4(outAux.albedo, outAux.isBlank ? 0.0 : 1.0);
612
687
  out_normal = vec4(outAux.normal, 1.0);
613
688
 
614
689
 
615
- float jP = dot(aW.rgb, vec3(0.2126, 0.7152, 0.0722));
690
+ float jZ = dot(liAndAlpha.rgb, vec3(0.2126, 0.7152, 0.0722));
616
691
  out_moments = outAux.isShadowCatcher
617
692
  ? vec4(0.0)
618
- : vec4(jP, jP * jP, 1.0, 0.0);
693
+ : vec4(jZ, jZ * jZ, 1.0, 0.0);
619
694
 
620
- }`
695
+ }${sharePrefix ? /* glsl */ `
696
+ void main() {
697
+ eB[0].ready = false; eB[1].ready = false;
698
+ vec4 color = vec4(0.0), albedo = vec4(0.0), normal = vec4(0.0), moments = vec4(0.0);
699
+
700
+ for (int channel = 1; channel <= dispersionWavelengths; channel++) {
701
+ traceSpectralWavelength(channel);
702
+ color += out_color; albedo += out_albedo; normal += out_normal; moments += out_moments;
703
+ }
704
+ out_color = color; out_albedo = albedo; out_normal = normal; out_moments = moments;
705
+ }
706
+ ` : ''}`
621
707
  });
622
708
  }
623
709
  //# sourceMappingURL=rayTrace.frag.js.map