@meimu/mutracer 0.0.0-stage → 0.1.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 (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +240 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14360 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +160 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +274 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +123 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +265 -0
  35. package/lib/Render.js +742 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +79 -0
  38. package/lib/RenderLoop.js +236 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1448 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +126 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +623 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +105 -0
  511. package/lib/util/fromTHREE.js +1111 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,119 @@
1
+ // Portions adapted from ray-tracing-renderer@0.10.15
2
+ // (https://github.com/hoverinc/ray-tracing-renderer).
3
+ // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ import cameraRayGlsl from './chunks/cameraRay.glsl.js';
5
+ import common from './chunks/common.glsl.js';
6
+ import rayTraceCore from './chunks/rayTraceCore.glsl.js';
7
+ import textureLinear from './chunks/textureLinear.glsl.js';
8
+ import materialBufferGlsl from './chunks/materialBuffer.glsl.js';
9
+ import intersect from './chunks/intersect.glsl.js';
10
+ import randGlsl from './chunks/rand.glsl.js';
11
+ import random from './chunks/random.glsl.js';
12
+ import envMap from './chunks/envMap.glsl.js';
13
+ import sampleShadowCatcher from './chunks/sampleShadowCatcher.glsl.js';
14
+ import sampleLight from './chunks/sampleLight.glsl.js';
15
+ import { FragmentShader, glsl, Shader } from '../shader.js';
16
+ import samplingGlsl from './chunks/sampling.glsl.js';
17
+ import uvProjectionGlsl from './chunks/uvProjection.glsl.js';
18
+ export default new FragmentShader({
19
+ name: 'shadowCatcher',
20
+ outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],
21
+ defines: {
22
+ BOUNCES: 2
23
+ },
24
+ uniforms: {
25
+ dispersionWavelengths: Shader.uniform('int', 3),
26
+ wavelength: Shader.uniform('float', 0),
27
+ viewportSize: Shader.uniform('vec2'),
28
+ viewProjectionInv: Shader.uniform('mat4'),
29
+ viewInv: Shader.uniform('mat4'),
30
+ cameraApertureRadius: Shader.uniform('float', 0),
31
+ cameraFocusDistance: Shader.uniform('float', 10)
32
+ },
33
+ includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],
34
+ main: glsl `
35
+ ${common}
36
+ ${randGlsl}
37
+ ${random.main}
38
+
39
+ ${textureLinear}
40
+
41
+ ${rayTraceCore.main}
42
+ ${uvProjectionGlsl}
43
+
44
+ ${materialBufferGlsl.main}
45
+ ${intersect.main}
46
+ ${envMap.main}
47
+
48
+ ${samplingGlsl}
49
+ ${sampleLight}
50
+ ${sampleShadowCatcher}
51
+ ${cameraRayGlsl}
52
+
53
+
54
+
55
+ vec4 mj(inout Ray ray, out vec4 background) {
56
+ background = vec4(0.0);
57
+ Path aa;
58
+ aa.ray = ray;
59
+ aa.li = vec3(0);
60
+ aa.alpha = 1.0;
61
+ aa.beta = vec3(1.0);
62
+ aa.fromEye = true;
63
+ aa.scatteringPdf = 0.0;
64
+ aa.abort = false;
65
+
66
+ ad si;
67
+
68
+ cY(aa.ray, si, false);
69
+ if (!si.hit) {
70
+
71
+
72
+
73
+ return vec4(0.0, 0.0, 0.0, 1.0);
74
+ }
75
+
76
+ J mat;
77
+ eT(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex);
78
+ if (mat.materialType != SHADOW_CATCHER) {
79
+
80
+
81
+ return vec4(0.0, 0.0, 0.0, 1.0);
82
+ }
83
+
84
+ vec4 bg = cw(ray.o, ray.d);
85
+ background = vec4(bg.rgb * bg.a, bg.a);
86
+ if (!aa.abort) {
87
+ sampleShadowCatcher(si, 0, aa);
88
+ }
89
+ return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, aa.alpha);
90
+ }
91
+
92
+ void main() {
93
+ se();
94
+ jY(v_Texcoord * viewportSize, int(uint(sampleCount) ^ eg(uint(sequenceSeed))));
95
+
96
+ if (dispersionWavelengths == 1 && wavelength > 0.0) { dz(CAMERA_WAVELENGTH); }
97
+ Ray cam = nv();
98
+ vec4 background;
99
+ vec4 aN = mj(cam, background);
100
+
101
+ if (!(aN.x < INF && aN.x > -EPS)) {
102
+ aN = vec4(0, 0, 0, 1);
103
+ }
104
+
105
+ out_shadowCatcher = aN;
106
+ out_catcherBackground = background;
107
+
108
+
109
+
110
+ float jj = aN.a * (background.a >= 0.01
111
+ ? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))
112
+ : 1.0);
113
+ out_catcherMoments = aN.r > 0.0
114
+ ? vec4(jj, jj * jj, 1.0, 0.0)
115
+ : vec4(0.0);
116
+
117
+ }`
118
+ });
119
+ //# sourceMappingURL=shadowCatcher.frag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadowCatcher.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/shadowCatcher.frag.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,WAAW,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,eAAe,IAAI,cAAc,CAAC;IAChC,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,CAAC,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IACjE,OAAO,EAAE;QACP,OAAO,EAAE,CAAC;KACX;IACD,QAAQ,EAAE;QACR,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;KACjD;IACD,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;IACvE,IAAI,EAAE,IAAI,CAAA;EACV,MAAM;EACN,QAAQ;EACR,MAAM,CAAC,IAAI;;EAEX,aAAa;;EAEb,YAAY,CAAC,IAAI;EACjB,gBAAgB;;EAEhB,kBAAkB,CAAC,IAAI;EACvB,SAAS,CAAC,IAAI;EACd,MAAM,CAAC,IAAI;;EAEX,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkEb;CACD,CAAC,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport cameraRayGlsl from './chunks/cameraRay.glsl.js';\nimport common from './chunks/common.glsl.js';\nimport rayTraceCore from './chunks/rayTraceCore.glsl.js';\nimport textureLinear from './chunks/textureLinear.glsl.js';\nimport materialBufferGlsl from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport randGlsl from './chunks/rand.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport envMap from './chunks/envMap.glsl.js';\nimport sampleShadowCatcher from './chunks/sampleShadowCatcher.glsl.js';\nimport sampleLight from './chunks/sampleLight.glsl.js';\nimport { FragmentShader, glsl, Shader } from '../shader.js';\nimport samplingGlsl from './chunks/sampling.glsl.js';\nimport uvProjectionGlsl from './chunks/uvProjection.glsl.js';\n\nexport default new FragmentShader({\n name: 'shadowCatcher',\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n defines: {\n BOUNCES: 2\n },\n uniforms: {\n dispersionWavelengths: Shader.uniform('int', 3),\n wavelength: Shader.uniform('float', 0),\n viewportSize: Shader.uniform('vec2'),\n viewProjectionInv: Shader.uniform('mat4'),\n viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float', 0),\n cameraFocusDistance: Shader.uniform('float', 10)\n },\n includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],\n main: glsl`\n${common}\n${randGlsl}\n${random.main}\n\n${textureLinear}\n\n${rayTraceCore.main}\n${uvProjectionGlsl}\n\n${materialBufferGlsl.main}\n${intersect.main}\n${envMap.main}\n\n${samplingGlsl}\n${sampleLight}\n${sampleShadowCatcher}\n${cameraRayGlsl}\n\n// Path tracing integrator as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Path_Tracing.html#\nvec4 integrator(inout Ray ray, out vec4 background) {\n background = vec4(0.0);\n Path path;\n path.ray = ray;\n path.li = vec3(0);\n path.alpha = 1.0;\n path.beta = vec3(1.0);\n path.fromEye = true;\n path.scatteringPdf = 0.0;\n path.abort = false;\n\n SurfaceInteraction si;\n\n intersectScene(path.ray, si, false);\n if (!si.hit) {\n // Red stores catcher coverage. Keep it zero for pixels where the primary\n // ray did not hit the catcher so denoised shadows cannot bleed onto the\n // model silhouette during composition.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n OpenPbrResolvedMaterial mat;\n getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex);\n if (mat.materialType != SHADOW_CATCHER) {\n // The main path tracer already renders regular geometry. Only evaluate\n // shadow opacity when the primary ray actually hits the catcher.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n vec4 bg = sampleBackgroundFromRay(ray.o, ray.d);\n background = vec4(bg.rgb * bg.a, bg.a);\n if (!path.abort) {\n sampleShadowCatcher(si, 0, path);\n }\n return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, path.alpha);\n}\n\nvoid main() {\n initRandom();\n rng_initialize(v_Texcoord * viewportSize, int(uint(sampleCount) ^ sampleHash(uint(sequenceSeed))));\n // Match the beauty pass's random stream in hero-wavelength previews.\n if (dispersionWavelengths == 1 && wavelength > 0.0) { sample1D(CAMERA_WAVELENGTH); }\n Ray cam = primaryCameraRay();\n vec4 background;\n vec4 liAndAlpha = integrator(cam, background);\n\n if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {\n liAndAlpha = vec4(0, 0, 0, 1);\n }\n\n out_shadowCatcher = liAndAlpha;\n out_catcherBackground = background;\n // The composed catcher is the background darkened by the shadow (its\n // visibility in alpha). Over a transparent background the shadow is only\n // its opacity.\n float guideValue = liAndAlpha.a * (background.a >= 0.01\n ? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))\n : 1.0);\n out_catcherMoments = liAndAlpha.r > 0.0\n ? vec4(guideValue, guideValue * guideValue, 1.0, 0.0)\n : vec4(0.0);\n\n}`\n});\n"]}
@@ -0,0 +1,4 @@
1
+ import { FragmentShader } from '../shader.js';
2
+ export declare const brightFragment: FragmentShader<Record<string, import("../shader.js").ShaderDefineValue>, Record<string, import("../shader.js").ShaderUniform<unknown>>>;
3
+ export declare const composeFragment: FragmentShader<Record<string, import("../shader.js").ShaderDefineValue>, Record<string, import("../shader.js").ShaderUniform<unknown>>>;
4
+ export declare const outputFragment: FragmentShader<Record<string, import("../shader.js").ShaderDefineValue>, Record<string, import("../shader.js").ShaderUniform<unknown>>>;
@@ -0,0 +1,208 @@
1
+ import { FragmentShader, Shader, glsl } from '../shader.js';
2
+ export const brightFragment = new FragmentShader({
3
+ name: 'bloomBright',
4
+ uniforms: {
5
+ colorTex: Shader.uniform('sampler2D'),
6
+ threshold: Shader.uniform('float', 1),
7
+ scale: Shader.uniform('float', 1)
8
+ },
9
+ main: glsl `
10
+ const vec3 uC = vec3(0.2125, 0.7154, 0.0721);
11
+ vec4 sm(vec4 a, vec4 b, vec4 c) {
12
+ return a + b + c - min(min(a, b), c) - max(max(a, b), c);
13
+ }
14
+ void main() {
15
+ vec2 d = 1.0 / vec2(colorTexRegion());
16
+ vec4 iW = sample_colorTex(v_Texcoord);
17
+ vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));
18
+ vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));
19
+ vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));
20
+ vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));
21
+ iW = sm(sm(iW, s1, s2), s3, s4);
22
+ float lum = dot(iW.rgb, uC);
23
+ out_color = lum > threshold && iW.a > 0.0
24
+ ? vec4(iW.rgb * scale, iW.a)
25
+ : vec4(0.0, 0.0, 0.0, iW.a);
26
+ }`
27
+ });
28
+ export const composeFragment = new FragmentShader({
29
+ name: 'compose',
30
+ uniforms: {
31
+ colorTex: Shader.uniform('sampler2D'),
32
+ foregroundTex: Shader.uniform('sampler2D'),
33
+ catcherBackgroundTex: Shader.uniform('sampler2D'),
34
+ shadowCatcherTex: Shader.uniform('sampler2D'),
35
+ bloomTex: Shader.uniform('sampler2D'),
36
+ exposure: Shader.uniform('float', 1),
37
+ shadowCatcherColor: Shader.uniform('vec3', [0, 0, 0]),
38
+ shadowCatcherAlpha: Shader.uniform('float', 1),
39
+ shadowCatcherEnabled: Shader.uniform('float', 0),
40
+ bloomIntensity: Shader.uniform('float', 0),
41
+ toneMappingMode: Shader.uniform('int', 0),
42
+ contrast: Shader.uniform('float', 1),
43
+ saturation: Shader.uniform('float', 1),
44
+ temperature: Shader.uniform('float', 0),
45
+ tint: Shader.uniform('float', 0),
46
+ vignette: Shader.uniform('float', 0),
47
+ outputMode: Shader.uniform('int', 0),
48
+ sRGBOutput: Shader.uniform('bool', 1)
49
+ },
50
+ main: glsl `
51
+ vec3 jL(vec3 color) {
52
+ return clamp(color, 0.0, 1.0);
53
+ }
54
+ vec3 iJ(vec3 color) {
55
+ return clamp(color / (vec3(1.0) + color), 0.0, 1.0);
56
+ }
57
+ vec3 jC(vec3 color) {
58
+ color = max(vec3(0.0), color - 0.004);
59
+ return pow((color * (6.2 * color + 0.5)) /
60
+ (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));
61
+ }
62
+ vec3 ox(vec3 value) {
63
+ vec3 kC = value * (value + 0.0245786) - 0.000090537;
64
+ vec3 ap = value * (0.983729 * value + 0.4329510) + 0.238081;
65
+ return kC / ap;
66
+ }
67
+ vec3 lh(vec3 color) {
68
+ const mat3 pj = mat3(
69
+ vec3(0.59719, 0.07600, 0.02840),
70
+ vec3(0.35458, 0.90834, 0.13383),
71
+ vec3(0.04823, 0.01566, 0.83777)
72
+ );
73
+ const mat3 os = mat3(
74
+ vec3(1.60475, -0.10208, -0.00327),
75
+ vec3(-0.53108, 1.10813, -0.07276),
76
+ vec3(-0.07367, -0.00605, 1.07602)
77
+ );
78
+ color = pj * (color / 0.6);
79
+ return clamp(os * ox(color), 0.0, 1.0);
80
+ }
81
+ const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(
82
+ vec3(1.6605, -0.1246, -0.0182),
83
+ vec3(-0.5876, 1.1329, -0.1006),
84
+ vec3(-0.0728, -0.0083, 1.1187)
85
+ );
86
+ const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(
87
+ vec3(0.6274, 0.0691, 0.0164),
88
+ vec3(0.3293, 0.9195, 0.0880),
89
+ vec3(0.0433, 0.0113, 0.8956)
90
+ );
91
+ vec3 fP(vec3 value) {
92
+ vec3 mB = value * value;
93
+ vec3 qy = mB * mB;
94
+ return 15.5 * qy * mB - 40.14 * qy * value
95
+ + 31.96 * qy - 6.868 * mB * value
96
+ + 0.4298 * mB + 0.1191 * value - 0.00232;
97
+ }
98
+ vec3 lP(vec3 color) {
99
+ const mat3 pl = mat3(
100
+ vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),
101
+ vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),
102
+ vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)
103
+ );
104
+ const mat3 ot = mat3(
105
+ vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),
106
+ vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),
107
+ vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)
108
+ );
109
+ color = pl * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);
110
+ color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);
111
+ color = ot * fP(color);
112
+ color = pow(max(color, 0.0), vec3(2.2));
113
+ return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);
114
+ }
115
+ vec3 cH(vec3 color) {
116
+ if (toneMappingMode == 1) return lh(color);
117
+ if (toneMappingMode == 2) return jC(color);
118
+ if (toneMappingMode == 3) return iJ(color);
119
+ if (toneMappingMode == 4) return jL(color);
120
+ return lP(color);
121
+ }
122
+ vec3 gS(vec3 color) {
123
+ vec3 sW = vec3(
124
+ 1.0 + temperature * 0.16 + tint * 0.04,
125
+ 1.0 - tint * 0.12,
126
+ 1.0 - temperature * 0.16 + tint * 0.04
127
+ );
128
+ color = max(color * sW, 0.0);
129
+ color = max((color - 0.18) * contrast + 0.18, 0.0);
130
+ float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
131
+ return max(mix(vec3(luminance), color, saturation), 0.0);
132
+ }
133
+ void main() {
134
+ vec2 uv = v_Texcoord;
135
+ vec4 shadow = sample_shadowCatcherTex(uv);
136
+ if (outputMode == 1) {
137
+ out_color = vec4(vec3(shadow.a), 1.0);
138
+ return;
139
+ }
140
+
141
+ vec4 color = sample_colorTex(uv);
142
+ vec4 bloom = sample_bloomTex(uv) * bloomIntensity;
143
+ color.rgb += bloom.rgb;
144
+ color.rgb = gS(color.rgb * exposure);
145
+ if (sRGBOutput) {
146
+ float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
147
+ color.rgb *= 1.0 - vignette * edge;
148
+ color.rgb = cH(color.rgb);
149
+ color.rgb = pow(max(color.rgb, 0.0), vec3(1.0 / 2.2));
150
+ }
151
+ color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));
152
+
153
+ if (shadowCatcherEnabled > 0.5) {
154
+ float coverage = clamp(shadow.r, 0.0, 1.0);
155
+
156
+
157
+ float fO = clamp(
158
+ (1.0 - shadow.a) / max(coverage, 0.000001), 0.0, 1.0
159
+ );
160
+ fO = max(fO - (1.0 - shadowCatcherAlpha), 0.0);
161
+ if (coverage > 0.0) {
162
+ vec4 foreground = sample_foregroundTex(uv);
163
+ vec4 background = sample_catcherBackgroundTex(uv);
164
+ vec3 bK = gS((foreground.rgb + bloom.rgb) * exposure);
165
+ vec3 backgroundColor = gS((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);
166
+ if (sRGBOutput) {
167
+ float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
168
+ bK *= 1.0 - vignette * edge;
169
+ backgroundColor *= 1.0 - vignette * edge;
170
+ bK = pow(max(cH(bK), 0.0), vec3(1.0 / 2.2));
171
+ backgroundColor = pow(max(cH(backgroundColor), 0.0), vec3(1.0 / 2.2));
172
+ }
173
+
174
+ float opacity = fO;
175
+ fO *= coverage;
176
+ float lR = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
177
+ float hr = max(foreground.a, lR * (1.0 - coverage));
178
+ float hg = max(background.a, lR * coverage);
179
+ float alpha = hr + hg * (1.0 - opacity) + fO;
180
+ vec3 premultiplied = bK * hr
181
+ + backgroundColor * hg * (1.0 - opacity)
182
+ + shadowCatcherColor * fO;
183
+ color = vec4(premultiplied / max(alpha, 0.000001), alpha);
184
+ }
185
+ }
186
+ out_color = color;
187
+ }`
188
+ });
189
+ export const outputFragment = new FragmentShader({
190
+ name: 'output',
191
+ uniforms: {
192
+ colorTex: Shader.uniform('sampler2D'),
193
+ colorDenoisedTex: Shader.uniform('sampler2D'),
194
+ denoisedPercent: Shader.uniform('float', 0)
195
+ },
196
+ main: glsl `
197
+ void main() {
198
+ vec2 uv = v_Texcoord;
199
+ vec4 color = mix(
200
+ sample_colorTex(uv),
201
+ sample_colorDenoisedTex(uv),
202
+ denoisedPercent
203
+ );
204
+ color = vec4(color.rgb * color.a, color.a);
205
+ out_color = color;
206
+ }`
207
+ });
208
+ //# sourceMappingURL=webglPipeline.frag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webglPipeline.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/webglPipeline.frag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAClC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;EAiBV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,cAAc,CAAC;IAChD,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACjD,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KACtC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyIV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAC5C;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;EAUV;CACD,CAAC,CAAC","sourcesContent":["import { FragmentShader, Shader, glsl } from '../shader.js';\n\nexport const brightFragment = new FragmentShader({\n name: 'bloomBright',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n threshold: Shader.uniform('float', 1),\n scale: Shader.uniform('float', 1)\n },\n main: glsl`\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\nvec4 median(vec4 a, vec4 b, vec4 c) {\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main() {\n vec2 d = 1.0 / vec2(colorTexRegion());\n vec4 texel = sample_colorTex(v_Texcoord);\n vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));\n vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));\n vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));\n vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));\n texel = median(median(texel, s1, s2), s3, s4);\n float lum = dot(texel.rgb, lumWeight);\n out_color = lum > threshold && texel.a > 0.0\n ? vec4(texel.rgb * scale, texel.a)\n : vec4(0.0, 0.0, 0.0, texel.a);\n}`\n});\n\nexport const composeFragment = new FragmentShader({\n name: 'compose',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n foregroundTex: Shader.uniform('sampler2D'),\n catcherBackgroundTex: Shader.uniform('sampler2D'),\n shadowCatcherTex: Shader.uniform('sampler2D'),\n bloomTex: Shader.uniform('sampler2D'),\n exposure: Shader.uniform('float', 1),\n shadowCatcherColor: Shader.uniform('vec3', [0, 0, 0]),\n shadowCatcherAlpha: Shader.uniform('float', 1),\n shadowCatcherEnabled: Shader.uniform('float', 0),\n bloomIntensity: Shader.uniform('float', 0),\n toneMappingMode: Shader.uniform('int', 0),\n contrast: Shader.uniform('float', 1),\n saturation: Shader.uniform('float', 1),\n temperature: Shader.uniform('float', 0),\n tint: Shader.uniform('float', 0),\n vignette: Shader.uniform('float', 0),\n outputMode: Shader.uniform('int', 0),\n sRGBOutput: Shader.uniform('bool', 1)\n },\n main: glsl`\nvec3 linearToneMapping(vec3 color) {\n return clamp(color, 0.0, 1.0);\n}\nvec3 reinhardToneMapping(vec3 color) {\n return clamp(color / (vec3(1.0) + color), 0.0, 1.0);\n}\nvec3 cineonToneMapping(vec3 color) {\n color = max(vec3(0.0), color - 0.004);\n return pow((color * (6.2 * color + 0.5)) /\n (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));\n}\nvec3 rrtAndOdtFit(vec3 value) {\n vec3 numerator = value * (value + 0.0245786) - 0.000090537;\n vec3 denominator = value * (0.983729 * value + 0.4329510) + 0.238081;\n return numerator / denominator;\n}\nvec3 acesToneMapping(vec3 color) {\n const mat3 inputMatrix = mat3(\n vec3(0.59719, 0.07600, 0.02840),\n vec3(0.35458, 0.90834, 0.13383),\n vec3(0.04823, 0.01566, 0.83777)\n );\n const mat3 outputMatrix = mat3(\n vec3(1.60475, -0.10208, -0.00327),\n vec3(-0.53108, 1.10813, -0.07276),\n vec3(-0.07367, -0.00605, 1.07602)\n );\n color = inputMatrix * (color / 0.6);\n return clamp(outputMatrix * rrtAndOdtFit(color), 0.0, 1.0);\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3(1.6605, -0.1246, -0.0182),\n vec3(-0.5876, 1.1329, -0.1006),\n vec3(-0.0728, -0.0083, 1.1187)\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3(0.6274, 0.0691, 0.0164),\n vec3(0.3293, 0.9195, 0.0880),\n vec3(0.0433, 0.0113, 0.8956)\n);\nvec3 agxDefaultContrastApprox(vec3 value) {\n vec3 value2 = value * value;\n vec3 value4 = value2 * value2;\n return 15.5 * value4 * value2 - 40.14 * value4 * value\n + 31.96 * value4 - 6.868 * value2 * value\n + 0.4298 * value2 + 0.1191 * value - 0.00232;\n}\nvec3 agxToneMapping(vec3 color) {\n const mat3 insetMatrix = mat3(\n vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),\n vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),\n vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)\n );\n const mat3 outsetMatrix = mat3(\n vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),\n vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),\n vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)\n );\n color = insetMatrix * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);\n color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);\n color = outsetMatrix * agxDefaultContrastApprox(color);\n color = pow(max(color, 0.0), vec3(2.2));\n return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);\n}\nvec3 applyToneMapping(vec3 color) {\n if (toneMappingMode == 1) return acesToneMapping(color);\n if (toneMappingMode == 2) return cineonToneMapping(color);\n if (toneMappingMode == 3) return reinhardToneMapping(color);\n if (toneMappingMode == 4) return linearToneMapping(color);\n return agxToneMapping(color);\n}\nvec3 gradeColor(vec3 color) {\n vec3 balance = vec3(\n 1.0 + temperature * 0.16 + tint * 0.04,\n 1.0 - tint * 0.12,\n 1.0 - temperature * 0.16 + tint * 0.04\n );\n color = max(color * balance, 0.0);\n color = max((color - 0.18) * contrast + 0.18, 0.0);\n float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));\n return max(mix(vec3(luminance), color, saturation), 0.0);\n}\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 shadow = sample_shadowCatcherTex(uv);\n if (outputMode == 1) {\n out_color = vec4(vec3(shadow.a), 1.0);\n return;\n }\n\n vec4 color = sample_colorTex(uv);\n vec4 bloom = sample_bloomTex(uv) * bloomIntensity;\n color.rgb += bloom.rgb;\n color.rgb = gradeColor(color.rgb * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n color.rgb *= 1.0 - vignette * edge;\n color.rgb = applyToneMapping(color.rgb);\n color.rgb = pow(max(color.rgb, 0.0), vec3(1.0 / 2.2));\n }\n color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));\n\n if (shadowCatcherEnabled > 0.5) {\n float coverage = clamp(shadow.r, 0.0, 1.0);\n // Non-catcher samples contribute visibility 1. Undo primary coverage\n // before adjusting opacity, then apply the coverage exactly once.\n float shadowAlpha = clamp(\n (1.0 - shadow.a) / max(coverage, 0.000001), 0.0, 1.0\n );\n shadowAlpha = max(shadowAlpha - (1.0 - shadowCatcherAlpha), 0.0);\n if (coverage > 0.0) {\n vec4 foreground = sample_foregroundTex(uv);\n vec4 background = sample_catcherBackgroundTex(uv);\n vec3 foregroundColor = gradeColor((foreground.rgb + bloom.rgb) * exposure);\n vec3 backgroundColor = gradeColor((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n foregroundColor *= 1.0 - vignette * edge;\n backgroundColor *= 1.0 - vignette * edge;\n foregroundColor = pow(max(applyToneMapping(foregroundColor), 0.0), vec3(1.0 / 2.2));\n backgroundColor = pow(max(applyToneMapping(backgroundColor), 0.0), vec3(1.0 / 2.2));\n }\n // The primary samples belong to disjoint layers. Never shadow the model.\n float opacity = shadowAlpha;\n shadowAlpha *= coverage;\n float bloomAlpha = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);\n float foregroundAlpha = max(foreground.a, bloomAlpha * (1.0 - coverage));\n float backgroundAlpha = max(background.a, bloomAlpha * coverage);\n float alpha = foregroundAlpha + backgroundAlpha * (1.0 - opacity) + shadowAlpha;\n vec3 premultiplied = foregroundColor * foregroundAlpha\n + backgroundColor * backgroundAlpha * (1.0 - opacity)\n + shadowCatcherColor * shadowAlpha;\n color = vec4(premultiplied / max(alpha, 0.000001), alpha);\n }\n }\n out_color = color;\n}`\n});\n\nexport const outputFragment = new FragmentShader({\n name: 'output',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n colorDenoisedTex: Shader.uniform('sampler2D'),\n denoisedPercent: Shader.uniform('float', 0)\n },\n main: glsl`\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 color = mix(\n sample_colorTex(uv),\n sample_colorDenoisedTex(uv),\n denoisedPercent\n );\n color = vec4(color.rgb * color.a, color.a);\n out_color = color;\n}`\n});\n"]}
@@ -0,0 +1,2 @@
1
+ /** Payload bytes of the uncompressed render-target formats used by MuTracer. */
2
+ export declare function textureBytes(texture: GPUTexture | undefined): number;
@@ -0,0 +1,10 @@
1
+ /** Payload bytes of the uncompressed render-target formats used by MuTracer. */
2
+ export function textureBytes(texture) {
3
+ if (!texture)
4
+ return 0;
5
+ const bytes = texture.format === 'rgba32float' ? 16 :
6
+ texture.format === 'rgba16float' ? 8 :
7
+ texture.format === 'r32float' ? 4 : 4;
8
+ return texture.width * texture.height * texture.depthOrArrayLayers * bytes;
9
+ }
10
+ //# sourceMappingURL=gpuMemory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpuMemory.js","sourceRoot":"","sources":["../../src/renderer/gpuMemory.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,OAA+B;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AAC7E,CAAC","sourcesContent":["/** Payload bytes of the uncompressed render-target formats used by MuTracer. */\nexport function textureBytes(texture: GPUTexture | undefined): number {\n if (!texture) return 0;\n const bytes = texture.format === 'rgba32float' ? 16 :\n texture.format === 'rgba16float' ? 8 :\n texture.format === 'r32float' ? 4 : 4;\n return texture.width * texture.height * texture.depthOrArrayLayers * bytes;\n}\n"]}
@@ -0,0 +1 @@
1
+ export default function halton(index: number, base: number): number;
@@ -0,0 +1,15 @@
1
+ // Temporal Super Sample for static Scene
2
+ // Generate halton sequence
3
+ // https://en.wikipedia.org/wiki/Halton_sequence
4
+ export default function halton(index, base) {
5
+ var result = 0;
6
+ var f = 1 / base;
7
+ var i = index;
8
+ while (i > 0) {
9
+ result = result + f * (i % base);
10
+ i = Math.floor(i / base);
11
+ f = f / base;
12
+ }
13
+ return result;
14
+ }
15
+ //# sourceMappingURL=halton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"halton.js","sourceRoot":"","sources":["../../src/renderer/halton.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,2BAA2B;AAC3B,gDAAgD;AAEhD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAa,EAAE,IAAY;IACxD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACzB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["// Temporal Super Sample for static Scene\n\n// Generate halton sequence\n// https://en.wikipedia.org/wiki/Halton_sequence\n\nexport default function halton(index: number, base: number) {\n var result = 0;\n var f = 1 / base;\n var i = index;\n while (i > 0) {\n result = result + f * (i % base);\n i = Math.floor(i / base);\n f = f / base;\n }\n return result;\n}\n"]}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Joint non-local means (JNLM) denoiser, after Rousselle, Manzi and Zwicker,
3
+ * "Robust Denoising using Feature and Color Information" (Pacific Graphics
4
+ * 2013). Each pixel starts with a weighted mean of its neighborhood. The
5
+ * weight of a neighbor is the minimum of
6
+ *
7
+ * - a color weight: the NL-means distance between the two pixels' patches,
8
+ * normalized by their estimated variance, so differences explained by
9
+ * noise are ignored and real structure is kept;
10
+ * - a feature weight: the albedo, coverage and normal differences, which keep
11
+ * texture and geometric edges that the noisy color cannot resolve.
12
+ *
13
+ * A bounded, regularized local albedo regression corrects that mean to retain
14
+ * low-contrast texture while averaging lighting noise. Each RGB channel is
15
+ * fitted independently using the same JNLM weights.
16
+ *
17
+ * Weights are computed on a per-sample luminance guide whose moments are
18
+ * accumulated by the ray tracer, and applied to the complete composed image.
19
+ * The WebGPU (WGPUJNLMDenoiser) and WebGL 2 (WebGLJNLMDenoiser) passes
20
+ * implement the same filter with these parameters.
21
+ */
22
+ /** Neighborhood radius in pixels; the search window is 11 x 11. */
23
+ export declare const JNLM_SEARCH_RADIUS = 5;
24
+ /** Patch radius in pixels; patches are 3 x 3 to retain small color details. */
25
+ export declare const JNLM_PATCH_RADIUS = 1;
26
+ /** Filter passes; the second samples every other pixel. */
27
+ export declare const JNLM_ITERATIONS = 2;
28
+ /** Color sensitivity k_c of the paper. Larger values filter more. */
29
+ export declare const JNLM_DEFAULT_COLOR_SENSITIVITY = 0.6;
30
+ /** Relative RGB albedo bandwidth. */
31
+ export declare const JNLM_ALBEDO_BANDWIDTH = 0.4;
32
+ /** Absolute coverage bandwidth, independent of albedo brightness. */
33
+ export declare const JNLM_COVERAGE_BANDWIDTH = 0.1;
34
+ /** Minimum linear albedo used to normalize contrast near black. */
35
+ export declare const JNLM_ALBEDO_FLOOR = 0.02;
36
+ /** Squared relative contrast ridge for the local albedo regression (1%). */
37
+ export declare const JNLM_ALBEDO_REGULARIZATION = 0.0001;
38
+ /** Normal bandwidth, with normals encoded as n * 0.5 + 0.5. */
39
+ export declare const JNLM_NORMAL_BANDWIDTH = 0.05;
40
+ /** Maximum number of filter passes supported by both backends. */
41
+ export declare const JNLM_MAX_ITERATIONS = 4;
42
+ /** User-configurable options for the built-in JNLM denoiser. */
43
+ export interface JNLMOptions {
44
+ /** Positive filter strength multiplier; larger values smooth more. Default `1`. */
45
+ strength?: number;
46
+ /** Search radius in pixels, an integer from `1` to `16`. Default `5` (11 × 11). */
47
+ searchRadius?: number;
48
+ /** Color comparison patch radius, an integer from `0` to `3`. Default `1` (3 × 3). */
49
+ patchRadius?: number;
50
+ /** Relative RGB albedo tolerance, from `0.0001` to `10`. Larger values mix more texture. Default `0.4`. */
51
+ albedoBandwidth?: number;
52
+ /** Encoded normal tolerance, from `0.0001` to `10`. Larger values mix more geometric detail. Default `0.05`. */
53
+ normalBandwidth?: number;
54
+ /** Filter passes, an integer from `1` to `4`; each doubles the spacing. Default `2`. */
55
+ iterations?: number;
56
+ }
57
+ /** Default JNLM settings used when options are omitted. */
58
+ export declare const DEFAULT_JNLM_OPTIONS: Readonly<Required<JNLMOptions>>;
59
+ /** Filter shape; fixed by default, adjustable for evaluation. */
60
+ export interface JNLMFilterShape {
61
+ searchRadius: number;
62
+ patchRadius: number;
63
+ /** Relative RGB contrast. */
64
+ albedoBandwidth: number;
65
+ /** Absolute difference of normals encoded as n * 0.5 + 0.5. */
66
+ normalBandwidth: number;
67
+ /**
68
+ * Filter passes. Each pass filters the previous result with double the
69
+ * sample spacing (a-trous), which removes the blotches a single NL-means
70
+ * pass leaves at the scale of its window.
71
+ */
72
+ iterations: number;
73
+ }
74
+ export declare const JNLM_DEFAULT_SHAPE: JNLMFilterShape;
75
+ /** The built-in denoiser as attached to the pipeline. */
76
+ export interface JNLMDenoiser {
77
+ readonly type: 'jnlm';
78
+ /** Filter strength multiplier, applied to the color sensitivity. */
79
+ strength: number;
80
+ shape: JNLMFilterShape;
81
+ dispose(): void;
82
+ }
83
+ export declare function createJNLMDenoiser(options?: JNLMOptions): JNLMDenoiser;
84
+ /** Pixel spacing of filter pass `index` (from 0): 1, 2, 4, ... */
85
+ export declare function jnlmPassDilation(index: number): number;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Joint non-local means (JNLM) denoiser, after Rousselle, Manzi and Zwicker,
3
+ * "Robust Denoising using Feature and Color Information" (Pacific Graphics
4
+ * 2013). Each pixel starts with a weighted mean of its neighborhood. The
5
+ * weight of a neighbor is the minimum of
6
+ *
7
+ * - a color weight: the NL-means distance between the two pixels' patches,
8
+ * normalized by their estimated variance, so differences explained by
9
+ * noise are ignored and real structure is kept;
10
+ * - a feature weight: the albedo, coverage and normal differences, which keep
11
+ * texture and geometric edges that the noisy color cannot resolve.
12
+ *
13
+ * A bounded, regularized local albedo regression corrects that mean to retain
14
+ * low-contrast texture while averaging lighting noise. Each RGB channel is
15
+ * fitted independently using the same JNLM weights.
16
+ *
17
+ * Weights are computed on a per-sample luminance guide whose moments are
18
+ * accumulated by the ray tracer, and applied to the complete composed image.
19
+ * The WebGPU (WGPUJNLMDenoiser) and WebGL 2 (WebGLJNLMDenoiser) passes
20
+ * implement the same filter with these parameters.
21
+ */
22
+ /** Neighborhood radius in pixels; the search window is 11 x 11. */
23
+ export const JNLM_SEARCH_RADIUS = 5;
24
+ /** Patch radius in pixels; patches are 3 x 3 to retain small color details. */
25
+ export const JNLM_PATCH_RADIUS = 1;
26
+ /** Filter passes; the second samples every other pixel. */
27
+ export const JNLM_ITERATIONS = 2;
28
+ /** Color sensitivity k_c of the paper. Larger values filter more. */
29
+ export const JNLM_DEFAULT_COLOR_SENSITIVITY = 0.6;
30
+ /** Relative RGB albedo bandwidth. */
31
+ export const JNLM_ALBEDO_BANDWIDTH = 0.4;
32
+ /** Absolute coverage bandwidth, independent of albedo brightness. */
33
+ export const JNLM_COVERAGE_BANDWIDTH = 0.1;
34
+ /** Minimum linear albedo used to normalize contrast near black. */
35
+ export const JNLM_ALBEDO_FLOOR = 0.02;
36
+ /** Squared relative contrast ridge for the local albedo regression (1%). */
37
+ export const JNLM_ALBEDO_REGULARIZATION = 0.0001;
38
+ /** Normal bandwidth, with normals encoded as n * 0.5 + 0.5. */
39
+ export const JNLM_NORMAL_BANDWIDTH = 0.05;
40
+ /** Maximum number of filter passes supported by both backends. */
41
+ export const JNLM_MAX_ITERATIONS = 4;
42
+ /** Default JNLM settings used when options are omitted. */
43
+ export const DEFAULT_JNLM_OPTIONS = Object.freeze({
44
+ strength: 1,
45
+ searchRadius: JNLM_SEARCH_RADIUS,
46
+ patchRadius: JNLM_PATCH_RADIUS,
47
+ albedoBandwidth: JNLM_ALBEDO_BANDWIDTH,
48
+ normalBandwidth: JNLM_NORMAL_BANDWIDTH,
49
+ iterations: JNLM_ITERATIONS
50
+ });
51
+ export const JNLM_DEFAULT_SHAPE = {
52
+ searchRadius: JNLM_SEARCH_RADIUS,
53
+ patchRadius: JNLM_PATCH_RADIUS,
54
+ albedoBandwidth: JNLM_ALBEDO_BANDWIDTH,
55
+ normalBandwidth: JNLM_NORMAL_BANDWIDTH,
56
+ iterations: JNLM_ITERATIONS
57
+ };
58
+ export function createJNLMDenoiser(options = {}) {
59
+ const values = { ...DEFAULT_JNLM_OPTIONS };
60
+ for (const key of Object.keys(values)) {
61
+ const value = options[key];
62
+ if (value !== undefined)
63
+ values[key] = value;
64
+ }
65
+ if (!Number.isFinite(values.strength) || values.strength <= 0) {
66
+ throw new Error('strength must be finite and positive');
67
+ }
68
+ for (const [key, min, max] of [
69
+ ['searchRadius', 1, 16], ['patchRadius', 0, 3], ['iterations', 1, JNLM_MAX_ITERATIONS]
70
+ ]) {
71
+ if (!Number.isInteger(values[key]) || values[key] < min || values[key] > max) {
72
+ throw new Error(`${key} must be an integer from ${min} to ${max}`);
73
+ }
74
+ }
75
+ for (const key of ['albedoBandwidth', 'normalBandwidth']) {
76
+ if (!Number.isFinite(values[key]) || values[key] < 0.0001 || values[key] > 10) {
77
+ throw new Error(`${key} must be finite and from 0.0001 to 10`);
78
+ }
79
+ }
80
+ const { strength, ...shape } = values;
81
+ return { type: 'jnlm', strength, shape, dispose() { } };
82
+ }
83
+ /** Pixel spacing of filter pass `index` (from 0): 1, 2, 4, ... */
84
+ export function jnlmPassDilation(index) {
85
+ return 2 ** index;
86
+ }
87
+ //# sourceMappingURL=jnlm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jnlm.js","sourceRoot":"","sources":["../../src/renderer/jnlm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,qEAAqE;AACrE,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAClD,qCAAqC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,qEAAqE;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAkBrC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACjF,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,iBAAiB;IAC9B,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,UAAU,EAAE,eAAe;CAC5B,CAAC,CAAC;AAkBH,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,iBAAiB;IAC9B,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,UAAU,EAAE,eAAe;CAC5B,CAAC;AAWF,MAAM,UAAU,kBAAkB,CAAC,UAAuB,EAAE;IAC1D,MAAM,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAA0B,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI;QAC5B,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,mBAAmB,CAAC;KAC9E,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4BAA4B,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAU,EAAE,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,uCAAuC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,KAAI,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,CAAC,IAAI,KAAK,CAAC;AACpB,CAAC","sourcesContent":["/**\n * Joint non-local means (JNLM) denoiser, after Rousselle, Manzi and Zwicker,\n * \"Robust Denoising using Feature and Color Information\" (Pacific Graphics\n * 2013). Each pixel starts with a weighted mean of its neighborhood. The\n * weight of a neighbor is the minimum of\n *\n * - a color weight: the NL-means distance between the two pixels' patches,\n * normalized by their estimated variance, so differences explained by\n * noise are ignored and real structure is kept;\n * - a feature weight: the albedo, coverage and normal differences, which keep\n * texture and geometric edges that the noisy color cannot resolve.\n *\n * A bounded, regularized local albedo regression corrects that mean to retain\n * low-contrast texture while averaging lighting noise. Each RGB channel is\n * fitted independently using the same JNLM weights.\n *\n * Weights are computed on a per-sample luminance guide whose moments are\n * accumulated by the ray tracer, and applied to the complete composed image.\n * The WebGPU (WGPUJNLMDenoiser) and WebGL 2 (WebGLJNLMDenoiser) passes\n * implement the same filter with these parameters.\n */\n\n/** Neighborhood radius in pixels; the search window is 11 x 11. */\nexport const JNLM_SEARCH_RADIUS = 5;\n/** Patch radius in pixels; patches are 3 x 3 to retain small color details. */\nexport const JNLM_PATCH_RADIUS = 1;\n/** Filter passes; the second samples every other pixel. */\nexport const JNLM_ITERATIONS = 2;\n/** Color sensitivity k_c of the paper. Larger values filter more. */\nexport const JNLM_DEFAULT_COLOR_SENSITIVITY = 0.6;\n/** Relative RGB albedo bandwidth. */\nexport const JNLM_ALBEDO_BANDWIDTH = 0.4;\n/** Absolute coverage bandwidth, independent of albedo brightness. */\nexport const JNLM_COVERAGE_BANDWIDTH = 0.1;\n/** Minimum linear albedo used to normalize contrast near black. */\nexport const JNLM_ALBEDO_FLOOR = 0.02;\n/** Squared relative contrast ridge for the local albedo regression (1%). */\nexport const JNLM_ALBEDO_REGULARIZATION = 0.0001;\n/** Normal bandwidth, with normals encoded as n * 0.5 + 0.5. */\nexport const JNLM_NORMAL_BANDWIDTH = 0.05;\n/** Maximum number of filter passes supported by both backends. */\nexport const JNLM_MAX_ITERATIONS = 4;\n\n/** User-configurable options for the built-in JNLM denoiser. */\nexport interface JNLMOptions {\n /** Positive filter strength multiplier; larger values smooth more. Default `1`. */\n strength?: number;\n /** Search radius in pixels, an integer from `1` to `16`. Default `5` (11 × 11). */\n searchRadius?: number;\n /** Color comparison patch radius, an integer from `0` to `3`. Default `1` (3 × 3). */\n patchRadius?: number;\n /** Relative RGB albedo tolerance, from `0.0001` to `10`. Larger values mix more texture. Default `0.4`. */\n albedoBandwidth?: number;\n /** Encoded normal tolerance, from `0.0001` to `10`. Larger values mix more geometric detail. Default `0.05`. */\n normalBandwidth?: number;\n /** Filter passes, an integer from `1` to `4`; each doubles the spacing. Default `2`. */\n iterations?: number;\n}\n\n/** Default JNLM settings used when options are omitted. */\nexport const DEFAULT_JNLM_OPTIONS: Readonly<Required<JNLMOptions>> = Object.freeze({\n strength: 1,\n searchRadius: JNLM_SEARCH_RADIUS,\n patchRadius: JNLM_PATCH_RADIUS,\n albedoBandwidth: JNLM_ALBEDO_BANDWIDTH,\n normalBandwidth: JNLM_NORMAL_BANDWIDTH,\n iterations: JNLM_ITERATIONS\n});\n\n/** Filter shape; fixed by default, adjustable for evaluation. */\nexport interface JNLMFilterShape {\n searchRadius: number;\n patchRadius: number;\n /** Relative RGB contrast. */\n albedoBandwidth: number;\n /** Absolute difference of normals encoded as n * 0.5 + 0.5. */\n normalBandwidth: number;\n /**\n * Filter passes. Each pass filters the previous result with double the\n * sample spacing (a-trous), which removes the blotches a single NL-means\n * pass leaves at the scale of its window.\n */\n iterations: number;\n}\n\nexport const JNLM_DEFAULT_SHAPE: JNLMFilterShape = {\n searchRadius: JNLM_SEARCH_RADIUS,\n patchRadius: JNLM_PATCH_RADIUS,\n albedoBandwidth: JNLM_ALBEDO_BANDWIDTH,\n normalBandwidth: JNLM_NORMAL_BANDWIDTH,\n iterations: JNLM_ITERATIONS\n};\n\n/** The built-in denoiser as attached to the pipeline. */\nexport interface JNLMDenoiser {\n readonly type: 'jnlm';\n /** Filter strength multiplier, applied to the color sensitivity. */\n strength: number;\n shape: JNLMFilterShape;\n dispose(): void;\n}\n\nexport function createJNLMDenoiser(options: JNLMOptions = {}): JNLMDenoiser {\n const values = { ...DEFAULT_JNLM_OPTIONS };\n for (const key of Object.keys(values) as (keyof JNLMOptions)[]) {\n const value = options[key];\n if (value !== undefined) values[key] = value;\n }\n if (!Number.isFinite(values.strength) || values.strength <= 0) {\n throw new Error('strength must be finite and positive');\n }\n for (const [key, min, max] of [\n ['searchRadius', 1, 16], ['patchRadius', 0, 3], ['iterations', 1, JNLM_MAX_ITERATIONS]\n ] as const) {\n if (!Number.isInteger(values[key]) || values[key] < min || values[key] > max) {\n throw new Error(`${key} must be an integer from ${min} to ${max}`);\n }\n }\n for (const key of ['albedoBandwidth', 'normalBandwidth'] as const) {\n if (!Number.isFinite(values[key]) || values[key] < 0.0001 || values[key] > 10) {\n throw new Error(`${key} must be finite and from 0.0001 to 10`);\n }\n }\n const { strength, ...shape } = values;\n return { type: 'jnlm', strength, shape, dispose() {} };\n}\n\n/** Pixel spacing of filter pass `index` (from 0): 1, 2, 4, ... */\nexport function jnlmPassDilation(index: number) {\n return 2 ** index;\n}\n"]}