@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,301 @@
1
+ # Denoising
2
+
3
+ MuTracer has two built-in denoisers. Both filter the complete composed image using
4
+ albedo and normal guides.
5
+
6
+ - **JNLM**: a built-in joint non-local means filter, on WebGPU and
7
+ WebGL 2. It needs no weight download.
8
+ - **OIDN**: [Intel Open Image Denoise](https://www.openimagedenoise.org/)
9
+ networks, run through [`oidn-web`](https://www.npmjs.com/package/oidn-web),
10
+ WebGPU only. They take longer and need weights, but are cleaner at one or
11
+ two samples per pixel, for example for denoising while the camera moves.
12
+
13
+ ```ts
14
+ const engine = new Engine({canvas});
15
+ const final = new Render(engine, {denoiser: {type: 'jnlm'}});
16
+ final.setDenoiser({type: 'oidn', model: 'standard'});
17
+ final.setDenoiser(null); // disable
18
+ ```
19
+
20
+ `type` is required: use `jnlm` or `oidn`. `render.denoiser` returns a frozen
21
+ copy of the configuration; call `setDenoiser` again to change it. Unknown types,
22
+ foreign fields and invalid JNLM settings throw synchronously, preserving the
23
+ active network and output. Equal implementation settings share the network;
24
+ changing only `schedule` preserves active inference, and passing an identical
25
+ configuration does nothing.
26
+ Each render has its own configuration and scheduling. Converge waits for its
27
+ configured filter; intermediate progressive inference reports converging and
28
+ final inference reports denoising. Engine caches equal network configurations
29
+ and weights, releasing the network after its last render lease is released.
30
+
31
+ `setDenoiser` returns a promise that resolves when the filter is ready, which
32
+ for OIDN means its weights have loaded, and rejects when loading fails. A
33
+ configuration replaced before it finishes loading resolves without an error;
34
+ an identical configuration returns the current promise. Await it when you need
35
+ the filter before rendering:
36
+
37
+ ```ts
38
+ try {
39
+ await final.setDenoiser({type: 'oidn', model: 'standard'});
40
+ } catch (error) {
41
+ final.setDenoiser({type: 'jnlm'}); // weights unavailable; fall back to JNLM
42
+ }
43
+ ```
44
+
45
+ OIDN is loaded lazily. On WebGL its configuration warns, leaves this render
46
+ unfiltered and resolves; JNLM works on both backends. Loading failures of a
47
+ `denoiser` constructor option, and of reloads after device recovery, report
48
+ through engine error events, as do inference failures. Replaced/disposed
49
+ network prewarm results are discarded.
50
+
51
+ ## Options
52
+
53
+ | `JNLMDenoiserOptions` | Description |
54
+ | --- | --- |
55
+ | `type` | Required: `'jnlm'` |
56
+ | `schedule` | `'converged'` (default), `'progressive'`, or `'every-sample'` |
57
+ | `strength` | JNLM filter strength. Default `1` |
58
+ | `searchRadius` | JNLM search radius, integer `1–16`. Default `5` (11 × 11 window) |
59
+ | `patchRadius` | JNLM color comparison patch radius, integer `0–3`. Default `1` (3 × 3 patch) |
60
+ | `albedoBandwidth` | JNLM relative albedo tolerance, `0.0001–10`. Default `0.4` |
61
+ | `normalBandwidth` | JNLM encoded normal tolerance, `0.0001–10`. Default `0.05` |
62
+ | `iterations` | JNLM filter passes, integer `1–4`. Default `2` |
63
+
64
+ | `OIDNDenoiserOptions` | Description |
65
+ | --- | --- |
66
+ | `type` | Required: `'oidn'` |
67
+ | `model` | OIDN network: `'standard'` (default), `'small'` or `'cleanAuxLarge'` |
68
+ | `weightsBaseUrl` | Directory containing the OIDN `.tza` files |
69
+ | `schedule` | `'converged'` (default), `'progressive'`, or `'every-sample'` |
70
+ | `maxTileSize` | Maximum OIDN tile size; chosen by oidn-web by default |
71
+ | `signal` | `AbortSignal` for the OIDN weight download; default undefined |
72
+ | `weightsUrl` | Explicit custom network; mutually exclusive with model/base directory |
73
+ | `aux`, `hdr`, `hdrTransfer` | Custom network metadata only; defaults true, true, `'pu'` |
74
+ | `auxiliaryModelUrls` | Both prefilter URLs; defaults to packaged cleanAuxLarge filters, otherwise none |
75
+ | `engine`, `precision`, `dynamicTile` | Defaults `'auto'`, `'auto'`, true; see custom networks below |
76
+
77
+ ## OIDN models
78
+
79
+ | `model` | Weights | Use |
80
+ | --- | --- | --- |
81
+ | `'standard'` (default) | `rt_hdr_alb_nrm.tza` (1.8 MB) | Balanced quality and speed; bundled with mutracer |
82
+ | `'small'` | `rt_hdr_alb_nrm_small.tza` (0.6 MB) | Fastest; previews while converging; bundled with mutracer |
83
+ | `'cleanAuxLarge'` | `rt_hdr_calb_cnrm_large.tza` + `rt_alb_large.tza` + `rt_nrm_large.tza` (22 MB) | Highest quality; prefilters guides; from oidn-weights@2.3.0-1 |
84
+
85
+ ## Hosting the weights
86
+
87
+ Standard and small load from your application's own build assets by default.
88
+ Vite and webpack 5 copy the package's static weight URLs into the output.
89
+ In Vite development add `optimizeDeps: { exclude: ['@meimu/mutracer'] }` to avoid
90
+ prebundling asset URLs; otherwise MuTracer warns once and falls back to
91
+ jsDelivr's copy for the installed MuTracer version. The standalone `dist/`
92
+ library bundles use that CDN copy directly.
93
+
94
+ The large beauty network and auxiliary prefilters default to
95
+ `https://cdn.jsdelivr.net/npm/oidn-weights@2.3.0-1/`. To self-host all networks,
96
+ install `oidn-weights@2.3.0-1` and copy `node_modules/oidn-weights/*.tza` to a
97
+ static directory. If you only use standard/small, copying the two files from
98
+ `node_modules/@meimu/mutracer/oidn/weights/` is sufficient:
99
+
100
+ ```ts
101
+ final.setDenoiser({type: 'oidn', weightsBaseUrl: '/assets/oidn/weights/'});
102
+ ```
103
+
104
+ Explicit URLs never fall back to the CDN. Every download is checked for the
105
+ TZA file signature. The weights use Apache-2.0 (`oidn/weights/LICENSE.txt`).
106
+
107
+ ## Scheduling
108
+
109
+ ```ts
110
+ final.setDenoiser({type: 'oidn', model: 'standard', schedule: 'progressive'});
111
+ preview.setDenoiser({type: 'oidn', model: 'small', schedule: 'every-sample'});
112
+ ```
113
+
114
+ Converged filters the final sample budget. Progressive filters sample 1,
115
+ then 4, 8, 16, … and the final budget, with a ten-second limit between
116
+ updates. Every-sample filters every complete sample of its render. Coalescing
117
+ continuous scene/camera edits is application loop policy; the engine accepts
118
+ edits only when update is called. See [progressive rendering](./progressive-rendering.md).
119
+
120
+ ## Tuning JNLM
121
+
122
+ `strength` (default `1`) scales the color tolerance. Higher values remove
123
+ more noise at low sample counts and more detail at high ones.
124
+
125
+ ```ts
126
+ final.setDenoiser({type: 'jnlm', strength: 1.5}); // filter more
127
+ ```
128
+
129
+ JNLM settings are available through `DenoiserOptions`. Omitted settings use
130
+ the exported `DEFAULT_JNLM_OPTIONS`; `JNLMOptions` is the corresponding type.
131
+ `setDenoiser` applies a fresh configuration to the existing sample
132
+ accumulation, so include the settings you want to retain on each call.
133
+
134
+ ```ts
135
+ import { DEFAULT_JNLM_OPTIONS } from '@meimu/mutracer';
136
+
137
+ final.setDenoiser({
138
+ type: 'jnlm',
139
+ ...DEFAULT_JNLM_OPTIONS,
140
+ strength: 1.2,
141
+ searchRadius: 7,
142
+ albedoBandwidth: 0.3
143
+ });
144
+ ```
145
+
146
+ Larger search windows cost more but find more matching neighbors. Smaller
147
+ patches preserve small color details. Lower albedo and normal tolerances
148
+ reject more neighbors, protecting detail while retaining more noise. Extra
149
+ passes remove broader noise patches and can soften detail. Invalid parameters
150
+ reject before replacing the active filter. These settings work on both WebGPU
151
+ and WebGL 2; OIDN rejects JNLM fields.
152
+
153
+ ## Custom OIDN networks
154
+
155
+ Load an explicit network file through the same built-in OIDN path:
156
+
157
+ ```ts
158
+ final.setDenoiser({
159
+ type: 'oidn', weightsUrl: '/assets/custom.tza',
160
+ aux: true, hdr: true, hdrTransfer: 'pu',
161
+ engine: 'wgsl', precision: 'auto', dynamicTile: true
162
+ });
163
+ ```
164
+
165
+ `weightsUrl` is mutually exclusive with `model` and `weightsBaseUrl`. The
166
+ custom network metadata defaults to `aux: true`, `hdr: true`,
167
+ `hdrTransfer: 'pu'`; those fields require `weightsUrl`. Explicit downloads
168
+ never fall back to a CDN. `auxiliaryModelUrls: {albedo, normal}` optionally
169
+ loads prefilters for either source; cleanAuxLarge supplies its packaged filters
170
+ by default. Override both auxiliary URLs together.
171
+
172
+ Execution settings are available for every OIDN configuration. `engine`
173
+ defaults to `'auto'`; `'wgsl'` selects native GPU inference and `'webnn'` the
174
+ experimental WebNN path. `precision` defaults to `'auto'` (FP16 when
175
+ shader-f16 is available), with `'fp32'` and `'fp16'` overrides. `dynamicTile`
176
+ defaults to `true`; use `false` for fixed tiles or an object with
177
+ `minTileSize` (256), `initialTileSize` (432), `targetTileTimeMs` (16) and
178
+ `adjustmentStep` (16). Tile sizes are clamped/aligned by oidn-web.
179
+
180
+ All implementation settings participate in the network cache key; `schedule`
181
+ and download `signal` do not. Renders with different signals share a pending
182
+ load; its initial request's signal controls that download. Loading failures
183
+ reject the returned promise and can be retried by calling `setDenoiser(null)`
184
+ and then the configuration again. Nested tile/URL settings are copied and frozen too.
185
+
186
+ `@meimu/mutracer/oidn` contains only weight constants and the
187
+ `resolveOIDNModelUrl` / `resolveOIDNAuxiliaryModelUrls` URL helpers. Loading
188
+ functions and network handles are internal; configure them through Render.
189
+ OIDN option types are exported from the main entry.
190
+
191
+ ## Custom denoisers
192
+
193
+ Provide a caller-owned `Denoiser` on WebGPU. Built-in JNLM and OIDN retain
194
+ their specialized paths. This identity filter illustrates the buffer contract:
195
+
196
+ ```ts
197
+ import type {Denoiser} from '@meimu/mutracer';
198
+
199
+ const copy: Denoiser = {
200
+ async denoise({device, width, height, color, output}, {signal}) {
201
+ if (signal.aborted) return;
202
+ const encoder = device.createCommandEncoder();
203
+ encoder.copyBufferToBuffer(color, 0, output, 0, width * height * 16);
204
+ device.queue.submit([encoder.finish()]);
205
+ }
206
+ };
207
+ final.setDenoiser({type: 'custom', denoiser: copy, schedule: 'converged'});
208
+ ```
209
+
210
+ The required `type` and `denoiser` choose this branch; `schedule` defaults to
211
+ `converged`. Optional `prepare({device, width, height})` runs before the first
212
+ inference and whenever the instance's last prepared device or dimensions
213
+ change. It can preallocate resources. A shared instance switching between
214
+ render sizes is prepared again. `DenoiseInput` contains these buffers:
215
+
216
+ | Buffer | Data |
217
+ | --- | --- |
218
+ | `color` | Native resolved linear HDR ray color; before exposure, grading, tone mapping, vignette, bloom and display background/catcher composition |
219
+ | `albedo` | Linear RGB albedo averaged over complete samples; alpha is primary-hit coverage |
220
+ | `normal` | Resolved world-space normal averaged and encoded as `normal*.5+.5`, without renormalization; alpha 1 for valid surface data, otherwise zero RGBA |
221
+ | `output` | Write all linear HDR RGB; output alpha is ignored and the input path coverage is preserved |
222
+
223
+ All four are tightly packed RGBA float32, top row first, exactly
224
+ `width * height * 16` bytes, with STORAGE, COPY_SRC and COPY_DST usages.
225
+ Dimensions describe the actual internal image (WebGPU rounds up to 16).
226
+ Input buffers are read-only. Buffers are borrowed until the promise settles;
227
+ do not retain or destroy them. Resolve after submitting every output write;
228
+ MuTracer copies the result, waits for GPU work, then releases its queue lease.
229
+ Custom `readPixels('denoised')` returns the filtered native HDR ray color,
230
+ with input path coverage. Display settings then follow the ordinary compose
231
+ path: flat backgrounds retain their display-space treatment and catcher
232
+ layers are combined after tone mapping. An identity filter preserves the
233
+ unfiltered display, including bloom and partially transparent catchers.
234
+
235
+ The resolved ray color uses native hit-count normalization; fully blank
236
+ pixels use sample-count normalization. Flat primary misses can contribute
237
+ background radiance, but this buffer has not yet undergone display background
238
+ or catcher composition. `readPixels('hdr')` separately restores a per-sample
239
+ average for mixed flat-background pixels, so do not assume it equals the
240
+ custom input at those edges.
241
+
242
+ Render and Engine never dispose the supplied instance. Its object identity
243
+ selects it; identical assignment and schedule-only edits preserve running
244
+ inference. One engine serializes preparation and denoising across all renders,
245
+ so an instance can share resources between them. Sharing across separate
246
+ engines needs caller-managed coordination.
247
+
248
+ The context signal aborts on committed input changes, restart, replacement,
249
+ Render/Engine disposal or cancellation of convergence. Results resolving after
250
+ abort are discarded. The queue still waits for that promise to settle before
251
+ lending shared buffers again, so respond promptly to abort. Current preparation
252
+ and inference failures report through `engine.on('error', ...)`; stale jobs do
253
+ not report obsolete failures. WebGL warns once per render and leaves it
254
+ unfiltered.
255
+
256
+ A recovered engine may provide a new `input.device`. Rebuild device-owned
257
+ resources when it changes; `prepare` is called again. Dispose caller-owned
258
+ resources yourself after outstanding work has settled.
259
+
260
+ ## Implementation notes
261
+
262
+ ### Custom HDR layers
263
+
264
+ Custom filters operate on the resolved beauty RGB. With a shadow catcher, the
265
+ filtered correction is carried over to the foreground and background layers;
266
+ coverage and shadow masks are not filtered.
267
+
268
+ ### How JNLM works
269
+
270
+ The weights follow Rousselle, Manzi and Zwicker, *Robust Denoising using
271
+ Feature and Color Information* (2013). Each pixel starts with a weighted mean of
272
+ its 11 × 11 neighborhood. A neighbor's weight is the smaller of:
273
+
274
+ - a color weight: the distance between the two pixels' 3 × 3 patches,
275
+ normalized by their estimated variance, so differences explained by noise
276
+ are ignored;
277
+ - a feature weight: the albedo, coverage and normal differences, which keep
278
+ texture and geometric edges.
279
+
280
+ Albedo differences are measured relative to each channel's local brightness,
281
+ with a small floor near black. This protects low-contrast dark textures as
282
+ well as brighter ones. Coverage and encoded normals use absolute differences.
283
+
284
+ The mean is corrected by a local linear fit between each RGB channel and its
285
+ albedo channel, using the same weights. This preserves subtle texture while
286
+ averaging lighting noise. A small regularizer stabilizes nearly constant
287
+ guides, and the fitted response is bounded between zero and multiplicative
288
+ albedo modulation. Constant albedo keeps the weighted mean; unrelated albedo
289
+ does not automatically get transferred into the image. Alpha and the
290
+ luminance matching guide retain their weighted-mean estimates.
291
+
292
+ A second pass filters the result again with every other pixel (à-trous),
293
+ which removes the blotches a single pass leaves at the scale of its window.
294
+
295
+ The variance comes from per-pixel luminance moments that the path tracer
296
+ accumulates alongside the color. Weights are computed in linear radiance and
297
+ applied to the composed image, including its alpha, so shadow catchers and
298
+ transparent backgrounds are filtered too. Pixels that show the background
299
+ directly are left as rendered.
300
+
301
+ While-converging intermediate denoise batches report `'converging'`. Only denoising the final image at `maxSamples` reports `'denoising'`; `'finished'` means that final image is ready.
@@ -0,0 +1,308 @@
1
+ # Getting started
2
+
3
+ ## Concepts
4
+
5
+ MuTracer renders a plain **scene description** with a **camera**:
6
+
7
+ ```ts
8
+ interface Scene {
9
+ meshes: Mesh[]; // geometry + one OpenPBRMaterial per group
10
+ lights: SceneLight[]; // analytic lights, environment and ambient light
11
+ background?: ColorRGBA | Texture | GroundedSkyboxBackground;
12
+ }
13
+ ```
14
+
15
+ - `Mesh(geometry, material)` places a `Geometry` in the world with
16
+ `mesh.transform` (a column-major `mat4`, compatible with `gl-matrix`).
17
+ - `Geometry` holds indexed or non-indexed triangle attributes. Use the helpers
18
+ `createPlaneGeometry`, `createCubeGeometry`, `createSphereGeometry` or build
19
+ one from arrays (see below).
20
+ - Materials are `OpenPBRMaterial` instances. See [materials](./materials.md).
21
+ - Units are arbitrary but consistent; light intensities are in radiometric
22
+ units relative to them.
23
+
24
+ `Engine` commits scene and camera changes, `Render` accumulates samples, and
25
+ `Display` presents an image. See [independent render results](./progressive-rendering.md).
26
+
27
+ ## A minimal render loop
28
+
29
+ ```ts
30
+ import * as THREE from 'three';
31
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
32
+ import { Engine, RenderLoop, THREESync } from '@meimu/mutracer';
33
+ const engine = new Engine({canvas});
34
+ engine.scene = scene;
35
+ const camera = new THREE.PerspectiveCamera(40, 1, .1, 100);
36
+ camera.position.set(0, 2, 6);
37
+ const controls = new OrbitControls(camera, canvas);
38
+ controls.target.set(0, 1, 0);
39
+ const sync = new THREESync(engine, {camera, controls});
40
+ const loop = new RenderLoop(engine, {sync, final: {maxSamples: 1024, bounces: 5}});
41
+ function resize() {
42
+ const ratio = Math.min(devicePixelRatio, 2);
43
+ engine.display.setSize(canvas.clientWidth * ratio, canvas.clientHeight * ratio);
44
+ camera.aspect = canvas.clientWidth / canvas.clientHeight;
45
+ camera.updateProjectionMatrix();
46
+ }
47
+ window.addEventListener('resize', resize);
48
+ resize(); loop.start();
49
+ ```
50
+
51
+ RenderLoop synchronizes sources, commits changes and presents preview or final.
52
+ Subscribe to `loop.on('status', ...)` for UI and `engine.on('progress', ...)`
53
+ for preparation progress. Engine chooses WebGPU with WebGL 2 fallback.
54
+ Preparation is automatic; see [BVH](./bvh.md) for optional CPU preparation.
55
+
56
+ For custom frame control, use `loop.tick()` in your own animation frame instead
57
+ of `start()`. For explicit rendering without the built-in policy, use
58
+ [Engine / Render / Display directly](./progressive-rendering.md#explicit-frame-control).
59
+
60
+ ## Geometry from arrays
61
+
62
+ ```ts
63
+ import { Geometry, GeometryAttribute } from '@meimu/mutracer';
64
+
65
+ const geometry = new Geometry({
66
+ position: new GeometryAttribute(new Float32Array(positions), 3),
67
+ indices: new GeometryAttribute(new Uint32Array(indices), 1),
68
+ uv: new GeometryAttribute(new Float32Array(uvs), 2) // optional
69
+ });
70
+ ```
71
+
72
+ Only `position` is required. Omitting `indices` generates sequential indices; omitting `normal` generates smooth area-weighted normals. Read `geometry.vertexCount` and `geometry.triangleCount` for counts.
73
+
74
+ For several materials on one geometry, pass an array of materials to `Mesh`
75
+ and set `geometry.materialIndex` to an `Int32Array` attribute with `itemSize: 1` and one raw index
76
+ into `mesh.materials` per vertex.
77
+
78
+ Place nodes by assigning `node.position = [x, y, z]` and calling `node.lookAt(target, up?)`. `position` reads a copy; assign it back to move the node.
79
+
80
+ ## Cameras
81
+
82
+ ```ts
83
+ const camera = new Camera({ projection: 'perspective', fov: 45, near: 0.1, far: 100 });
84
+ camera.position = [0, 2, 6]; camera.lookAt([0, 0, 0]);
85
+ ```
86
+
87
+ `camera.aspect` defaults to undefined, so rendering uses the canvas width/height.
88
+ Explicitly set it to lock a perspective aspect ratio. `copy(source)` and `clone()`
89
+ copy camera settings; `getProjectionMatrix(targetAspect = 1)` includes zoom.
90
+
91
+ For orbit/pan/zoom, use Three.js OrbitControls with THREESync as above.
92
+ `fromTHREECamera` remains available for one-shot camera conversion.
93
+
94
+ ### Depth of field
95
+
96
+ Depth of field uses a thin lens described in photographic terms:
97
+
98
+ ```ts
99
+ camera.fStop = 2.8; // f-number; 0 (default) disables depth of field
100
+ camera.focusDistance = 6; // lens to focus plane, along the view direction
101
+ camera.sensorHeight = 24; // mm; with fov it sets the focal length
102
+ camera.metersPerUnit = 1; // scene unit length in metres (glTF: 1)
103
+ ```
104
+
105
+ The focal length is `0.5 * sensorHeight * zoom / tan(fov / 2)` in millimetres
106
+ (convert `fov` from degrees to radians). The aperture radius is
107
+ `focalLength / (2 * fStop)` in millimetres, then divided by
108
+ `1000 * metersPerUnit` to obtain scene units. A narrower field of view or a
109
+ lower f-number blurs more, as on a real camera.
110
+
111
+ `metersPerUnit` converts the lens size to scene units. When a scene is modelled
112
+ in centimetres set it to `0.01`. For a miniature look, treat the scene as
113
+ smaller than it is (`0.1` turns a 2 m object into a 20 cm one). Orthographic
114
+ cameras have no depth of field.
115
+
116
+ ## Lights
117
+
118
+ | Class | Constructor | Notes |
119
+ | --- | --- | --- |
120
+ | `RectLight` | `{ size?, color?, intensity?, texture?, spread? }` | One-sided, emits along local -Z |
121
+ | `SphereLight` | `{ radius?, color?, intensity? }` | Spherical emitter; radius 0 is a point |
122
+ | `SpotLight` | `{ color?, intensity?, radius?, innerAngle?, outerAngle?, iesProfile? }` | Cone, optional IES emission |
123
+ | `DirectionalLight` | `{ color?, intensity? }` | Emits along local -Z |
124
+ | `AmbientLight` | `{ color?, intensity? }` | Uniform environment radiance |
125
+ | `EnvironmentLight` | `{ map }` | Equirectangular HDR illumination |
126
+
127
+ Place analytic lights with `light.position = [x, y, z]` and `light.lookAt(target)`.
128
+ Their transform scale is ignored; `size` and `radius` set emitter dimensions.
129
+ Local +X is the IES azimuth reference; rotate the transform around local Z to
130
+ orient a profile. Invalid mutable values are clamped and reported once without
131
+ failing the render (through `error` events when attached).
132
+
133
+ Load `.hdr` environments with `await loadRGBE(url)`, which resolves to a
134
+ float `Texture`. Emissive materials (`emissionLuminance > 0`) also act as
135
+ lights.
136
+
137
+ ## Backgrounds
138
+
139
+ - omitted: camera rays show the environment light;
140
+ - `[r, g, b, a]`: a linear color. `[0, 0, 0, 0]` gives a transparent canvas;
141
+ combine with `shadowCatcher` materials to composite over a web page;
142
+ - a `Texture`: an equirectangular background independent of the lighting;
143
+ - `{ type: 'GroundedSkybox', map, height, radius }`: projects the environment
144
+ onto a ground plane.
145
+
146
+ ## Updating the scene
147
+
148
+ Keep the same scene and edit it in place. `engine.update()` detects property
149
+ assignments, scene membership, transforms, materials, lights and backgrounds.
150
+ In-place edits to array or image contents need a notification:
151
+
152
+ ```ts
153
+ texture.markUpdated(); // texture pixels or UV-array elements
154
+
155
+ geometry.markVerticesUpdated(); // vertex attributes only
156
+ geometry.markUpdated(); // indices, materialIndex or other geometry data
157
+ instancedMesh.markTransformsUpdated(); // instance matrix elements
158
+ instancedMesh.markColorsUpdated(); // instance color elements
159
+ instancedMesh.markUpdated(); // both instance matrices and colors
160
+ ```
161
+
162
+ See [scene updates](./updates.md) for vertex animation and update costs. RenderLoop calls its syncs automatically. With explicit frame control, call `sync.update()` before engine.update;
163
+ see [Three.js](./threejs.md).
164
+
165
+ ## Exporting an image
166
+
167
+ For a final-quality still, use a render's deterministic convergence:
168
+
169
+ ```ts
170
+ await loop.converge({samples: 1024, sampleSequenceOffset: 0});
171
+ const blob = await engine.display.toBlob(loop.final);
172
+ const hdr = await loop.final.readPixels('hdr');
173
+ ```
174
+
175
+ Readback returns RGBA Float32Array values, top row first. A separate fixed-size
176
+ Render can export another resolution or a copied camera override without
177
+ changing the canvas. See [exporting](./progressive-rendering.md#reading-and-exporting).
178
+
179
+ Call `loop.dispose()`, `sync.dispose()`, `controls.dispose()` and `engine.dispose()`
180
+ when finished. See [ownership](./progressive-rendering.md#options-and-ownership).
181
+
182
+ ## Using your own GPUDevice
183
+
184
+ ```ts
185
+ import { Engine, getRecommendedDeviceDescriptor } from '@meimu/mutracer';
186
+ const adapter = await navigator.gpu.requestAdapter();
187
+ if (!adapter) throw new Error('WebGPU unavailable');
188
+ const device = await adapter.requestDevice(getRecommendedDeviceDescriptor(adapter));
189
+ const engine = new Engine({ canvas, device });
190
+ await engine.init();
191
+ ```
192
+
193
+ The caller owns the device and releases it after all engines using it have been
194
+ disposed. Supplying a device selects WebGPU; `backend: 'webgl'` is rejected.
195
+ See [device requirements](./api.md#device-requirements) for limits and OIDN.
196
+
197
+ ## Running in a worker
198
+
199
+ Transfer the display canvas once from the main thread:
200
+
201
+ ```ts
202
+ const worker = new Worker(new URL('./render.worker.ts', import.meta.url), {type: 'module'});
203
+ const offscreen = canvas.transferControlToOffscreen();
204
+ worker.postMessage({canvas: offscreen, width: 800, height: 600}, [offscreen]);
205
+ ```
206
+
207
+ In `render.worker.ts`, construct the scene and camera in the worker:
208
+
209
+ ```ts
210
+ import {Engine, RenderLoop, Camera, Mesh, OpenPBRMaterial,
211
+ AmbientLight, createSphereGeometry} from '@meimu/mutracer';
212
+ self.onmessage = ({data}) => {
213
+ const engine = new Engine({canvas: data.canvas});
214
+ engine.display.setSize(data.width, data.height);
215
+ engine.scene = {
216
+ meshes: [new Mesh(createSphereGeometry(), new OpenPBRMaterial())],
217
+ lights: [new AmbientLight({intensity: 1})],
218
+ };
219
+ engine.camera = new Camera({projection: 'perspective'});
220
+ engine.camera.position = [0, 0, 4]; engine.camera.lookAt([0, 0, 0]);
221
+ const loop = new RenderLoop(engine);
222
+ loop.start();
223
+ self.onmessage = ({data}) => {
224
+ if (data.type === 'stop') loop.stop();
225
+ if (data.type === 'start') loop.start();
226
+ if (data.type === 'resize') engine.display.setSize(data.width, data.height);
227
+ if (data.type === 'dispose') {loop.dispose(); engine.dispose();}
228
+ };
229
+ };
230
+ ```
231
+
232
+ Engine accepts HTMLCanvasElement or OffscreenCanvas. Without `document`, the
233
+ omitted canvas defaults to a new OffscreenCanvas. Texture accepts ImageBitmap
234
+ and OffscreenCanvas as well as HTML images/canvases and raw pixels. Export with
235
+ `await engine.display.toBlob(render)` as on the main thread; offscreen displays
236
+ use `convertToBlob`. Worker-created caller-owned GPUDevice instances use the
237
+ same [host integration](#using-your-own-gpudevice) options.
238
+
239
+ Workers have no page visibility event, so the loop keeps running until stopped.
240
+ Forward visibility decisions from the main thread using stop/start messages.
241
+ Without requestAnimationFrame, the loop uses a 16 ms timer. THREESync can
242
+ synchronize a Three.js scene and camera in the worker; DOM-based controls
243
+ remain on the main thread and their interaction/camera changes must be forwarded.
244
+
245
+ BVH preparation creates nested workers when Worker is available. If startup or
246
+ transport fails, it falls back to building in the calling thread (the render
247
+ worker here). Asset URLs stay relative to the library/module, as on the main
248
+ thread. Browser support for OffscreenCanvas and each GPU backend is required.
249
+
250
+ ## Loading and deployment
251
+
252
+ With npm, import the public API as usual:
253
+
254
+ ```ts
255
+ import { Engine, Render } from '@meimu/mutracer';
256
+
257
+ const engine = new Engine({canvas});
258
+ const render = new Render(engine);
259
+ render.setDenoiser({type: 'oidn'});
260
+ ```
261
+
262
+ MuTracer initializes OIDN and loads its model weights automatically when a
263
+ render first prepares its OIDN denoiser on WebGPU. With code splitting enabled,
264
+ its runtime code is also fetched only at that point; importing the package,
265
+ initializing an engine, or using JNLM does not fetch it. Selecting
266
+ `engine.bvhBuilder = 'tinybvh'` loads its WASM when a BVH is first built; the
267
+ calling thread and BVH workers use the same asset URL. No separate runtime
268
+ imports or asset-loading calls are needed. See [denoising](./denoising.md#hosting-the-weights)
269
+ for model hosting.
270
+
271
+ For the standalone UMD build, copy the entire `dist/` directory to your hosting
272
+ location, keeping this layout:
273
+
274
+ ```text
275
+ mutracer.umd.js
276
+ assets/
277
+ bvh.worker.js
278
+ ```
279
+
280
+ For example, after copying it to `/vendor/mutracer/`, load
281
+ `/vendor/mutracer/mutracer.umd.js` in a script tag to use the `MuTracer` global.
282
+ The BVH worker URL resolves relative to the library script.
283
+
284
+ Standalone asset names are stable. Deploy the script and assets together; use
285
+ a versioned directory or package-version URL when caching them for a long time.
286
+ Application bundlers may give their own output assets hashed names.
287
+
288
+ ## Bundler notes
289
+
290
+ The npm ESM entry preserves the dynamic import of the OIDN module. Vite and
291
+ webpack builds with code splitting enabled emit it and its dependencies as an
292
+ async chunk, fetched on first use. Configuring a single-file build or inlining
293
+ dynamic imports can include that code in the main bundle instead; initialization
294
+ is still deferred, but its download is no longer deferred.
295
+
296
+ Vite development prebundles dependencies and can relocate asset URLs. Exclude
297
+ MuTracer so the bundled OIDN standard/small weights and the optional TinyBVH
298
+ wasm load from the package:
299
+
300
+ ```ts
301
+ export default defineConfig({
302
+ optimizeDeps: { exclude: ['@meimu/mutracer'] }
303
+ });
304
+ ```
305
+
306
+ Vite production builds and webpack 5 copy these assets without extra
307
+ configuration. With bundlers that do not support asset URLs, self-host the
308
+ OIDN weights with `weightsBaseUrl` (see [denoising](./denoising.md#hosting-the-weights)).