@meimu/mutracer 0.0.0-stage → 0.1.0
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.
- package/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
- package/LICENSES/GlMatrix-MIT.txt +19 -0
- package/LICENSES/KinoBloom-MIT.txt +21 -0
- package/LICENSES/OIDNWeb-MIT.txt +21 -0
- package/LICENSES/Octicons-MIT.txt +21 -0
- package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
- package/LICENSES/TinyBVH-MIT.txt +21 -0
- package/LICENSES/WebGPUUtils-MIT.txt +21 -0
- package/LICENSES/ZetaRay-MIT.txt +21 -0
- package/README.md +195 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14352 -0
- package/docs/api.md +394 -0
- package/docs/bvh.md +141 -0
- package/docs/denoising.md +301 -0
- package/docs/getting-started.md +308 -0
- package/docs/materials.md +281 -0
- package/docs/performance.md +85 -0
- package/docs/post-processing.md +87 -0
- package/docs/progressive-rendering.md +144 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +273 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +121 -0
- package/lib/Display.js.map +1 -0
- package/lib/Engine.d.ts +161 -0
- package/lib/Engine.js +681 -0
- package/lib/Engine.js.map +1 -0
- package/lib/Render.d.ts +256 -0
- package/lib/Render.js +671 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +76 -0
- package/lib/RenderLoop.js +204 -0
- package/lib/RenderLoop.js.map +1 -0
- package/lib/Sync.d.ts +19 -0
- package/lib/Sync.js +19 -0
- package/lib/Sync.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +3 -0
- package/lib/constants.js.map +1 -0
- package/lib/main.d.ts +56 -0
- package/lib/main.js +43 -0
- package/lib/main.js.map +1 -0
- package/lib/math.d.ts +23 -0
- package/lib/math.js +56 -0
- package/lib/math.js.map +1 -0
- package/lib/oidn.d.ts +45 -0
- package/lib/oidn.js +42 -0
- package/lib/oidn.js.map +1 -0
- package/lib/oidnBundledWeights.cdn.d.ts +2 -0
- package/lib/oidnBundledWeights.cdn.js +5 -0
- package/lib/oidnBundledWeights.cdn.js.map +1 -0
- package/lib/oidnBundledWeights.d.ts +2 -0
- package/lib/oidnBundledWeights.js +4 -0
- package/lib/oidnBundledWeights.js.map +1 -0
- package/lib/renderer/DisplayPostProcess.d.ts +14 -0
- package/lib/renderer/DisplayPostProcess.js +41 -0
- package/lib/renderer/DisplayPostProcess.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +119 -0
- package/lib/renderer/MaterialTable.js +550 -0
- package/lib/renderer/MaterialTable.js.map +1 -0
- package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
- package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
- package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
- package/lib/renderer/RenderingPipeline.d.ts +232 -0
- package/lib/renderer/RenderingPipeline.js +18 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -0
- package/lib/renderer/ScratchPool.d.ts +13 -0
- package/lib/renderer/ScratchPool.js +21 -0
- package/lib/renderer/ScratchPool.js.map +1 -0
- package/lib/renderer/TileRender.d.ts +44 -0
- package/lib/renderer/TileRender.js +283 -0
- package/lib/renderer/TileRender.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.d.ts +17 -0
- package/lib/renderer/WGPUBloomPass.js +243 -0
- package/lib/renderer/WGPUBloomPass.js.map +1 -0
- package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
- package/lib/renderer/WGPUCanvasSurface.js +48 -0
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +73 -0
- package/lib/renderer/WGPUComputePass.js +317 -0
- package/lib/renderer/WGPUComputePass.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
- package/lib/renderer/WGPUFullQuadPass.js +389 -0
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
- package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
- package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
- package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
- package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
- package/lib/renderer/WGPURayTraceOutput.js +368 -0
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
- package/lib/renderer/WGPURayTracePass.d.ts +284 -0
- package/lib/renderer/WGPURayTracePass.js +2323 -0
- package/lib/renderer/WGPURayTracePass.js.map +1 -0
- package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
- package/lib/renderer/WGPURenderingPipeline.js +1446 -0
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
- package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
- package/lib/renderer/WGPUSceneFeatures.js +20 -0
- package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
- package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
- package/lib/renderer/WGPUScratchBuffer.js +21 -0
- package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
- package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
- package/lib/renderer/WGPUScratchTexture.js +27 -0
- package/lib/renderer/WGPUScratchTexture.js.map +1 -0
- package/lib/renderer/WGPUShaderCache.d.ts +26 -0
- package/lib/renderer/WGPUShaderCache.js +103 -0
- package/lib/renderer/WGPUShaderCache.js.map +1 -0
- package/lib/renderer/WebGLBloomPass.d.ts +18 -0
- package/lib/renderer/WebGLBloomPass.js +113 -0
- package/lib/renderer/WebGLBloomPass.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
- package/lib/renderer/WebGLFullQuadPass.js +208 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
- package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
- package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
- package/lib/renderer/WebGLRayTracePass.js +845 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -0
- package/lib/renderer/WebGLReadback.d.ts +4 -0
- package/lib/renderer/WebGLReadback.js +75 -0
- package/lib/renderer/WebGLReadback.js.map +1 -0
- package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
- package/lib/renderer/WebGLRenderingPipeline.js +510 -0
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
- package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
- package/lib/renderer/WebGLScratchCopy.js +27 -0
- package/lib/renderer/WebGLScratchCopy.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +26 -0
- package/lib/renderer/accumulationTarget.js +2 -0
- package/lib/renderer/accumulationTarget.js.map +1 -0
- package/lib/renderer/binnedSahBvh.d.ts +31 -0
- package/lib/renderer/binnedSahBvh.js +263 -0
- package/lib/renderer/binnedSahBvh.js.map +1 -0
- package/lib/renderer/bvh.worker.d.ts +1 -0
- package/lib/renderer/bvh.worker.js +16 -0
- package/lib/renderer/bvh.worker.js.map +1 -0
- package/lib/renderer/bvhAccel.d.ts +81 -0
- package/lib/renderer/bvhAccel.js +621 -0
- package/lib/renderer/bvhAccel.js.map +1 -0
- package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
- package/lib/renderer/bvhWorkerBuild.js +17 -0
- package/lib/renderer/bvhWorkerBuild.js.map +1 -0
- package/lib/renderer/bvhWorkerClient.d.ts +57 -0
- package/lib/renderer/bvhWorkerClient.js +166 -0
- package/lib/renderer/bvhWorkerClient.js.map +1 -0
- package/lib/renderer/cameraLens.d.ts +5 -0
- package/lib/renderer/cameraLens.js +15 -0
- package/lib/renderer/cameraLens.js.map +1 -0
- package/lib/renderer/cameraSnapshot.d.ts +3 -0
- package/lib/renderer/cameraSnapshot.js +7 -0
- package/lib/renderer/cameraSnapshot.js.map +1 -0
- package/lib/renderer/committedScene.d.ts +13 -0
- package/lib/renderer/committedScene.js +121 -0
- package/lib/renderer/committedScene.js.map +1 -0
- package/lib/renderer/dataTextureUtil.d.ts +32 -0
- package/lib/renderer/dataTextureUtil.js +46 -0
- package/lib/renderer/dataTextureUtil.js.map +1 -0
- package/lib/renderer/denoiser.d.ts +65 -0
- package/lib/renderer/denoiser.js +2 -0
- package/lib/renderer/denoiser.js.map +1 -0
- package/lib/renderer/depthQuery.d.ts +14 -0
- package/lib/renderer/depthQuery.js +14 -0
- package/lib/renderer/depthQuery.js.map +1 -0
- package/lib/renderer/deviceRequirements.d.ts +23 -0
- package/lib/renderer/deviceRequirements.js +50 -0
- package/lib/renderer/deviceRequirements.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +10 -0
- package/lib/renderer/envMapCreation.js +96 -0
- package/lib/renderer/envMapCreation.js.map +1 -0
- package/lib/renderer/envMapDistribution.d.ts +9 -0
- package/lib/renderer/envMapDistribution.js +107 -0
- package/lib/renderer/envMapDistribution.js.map +1 -0
- package/lib/renderer/float16.d.ts +1 -0
- package/lib/renderer/float16.js +19 -0
- package/lib/renderer/float16.js.map +1 -0
- package/lib/renderer/geometryBvh.d.ts +11 -0
- package/lib/renderer/geometryBvh.js +24 -0
- package/lib/renderer/geometryBvh.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +28 -0
- package/lib/renderer/geometryUpdates.js +131 -0
- package/lib/renderer/geometryUpdates.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
- package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
- package/lib/renderer/glsl/depthQuery.frag.js +55 -0
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
- package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/rayTrace.frag.js +619 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
- package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
- package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
- package/lib/renderer/gpuMemory.d.ts +2 -0
- package/lib/renderer/gpuMemory.js +10 -0
- package/lib/renderer/gpuMemory.js.map +1 -0
- package/lib/renderer/halton.d.ts +1 -0
- package/lib/renderer/halton.js +15 -0
- package/lib/renderer/halton.js.map +1 -0
- package/lib/renderer/jnlm.d.ts +85 -0
- package/lib/renderer/jnlm.js +87 -0
- package/lib/renderer/jnlm.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +75 -0
- package/lib/renderer/lightSampling.js +305 -0
- package/lib/renderer/lightSampling.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +26 -0
- package/lib/renderer/lightsUtil.js +154 -0
- package/lib/renderer/lightsUtil.js.map +1 -0
- package/lib/renderer/materialChanges.d.ts +13 -0
- package/lib/renderer/materialChanges.js +59 -0
- package/lib/renderer/materialChanges.js.map +1 -0
- package/lib/renderer/materialComparison.generated.d.ts +5 -0
- package/lib/renderer/materialComparison.generated.js +655 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +6 -0
- package/lib/renderer/materialConstants.js +3 -0
- package/lib/renderer/materialConstants.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +9 -0
- package/lib/renderer/materialEmission.js +21 -0
- package/lib/renderer/materialEmission.js.map +1 -0
- package/lib/renderer/materialIndices.d.ts +7 -0
- package/lib/renderer/materialIndices.js +34 -0
- package/lib/renderer/materialIndices.js.map +1 -0
- package/lib/renderer/materialLayout.d.ts +102 -0
- package/lib/renderer/materialLayout.js +189 -0
- package/lib/renderer/materialLayout.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +537 -0
- package/lib/renderer/materialTextureSlots.js +219 -0
- package/lib/renderer/materialTextureSlots.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
- package/lib/renderer/mergeMeshesToGeometry.js +236 -0
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
- package/lib/renderer/meshInstances.d.ts +23 -0
- package/lib/renderer/meshInstances.js +66 -0
- package/lib/renderer/meshInstances.js.map +1 -0
- package/lib/renderer/meshMembership.d.ts +10 -0
- package/lib/renderer/meshMembership.js +72 -0
- package/lib/renderer/meshMembership.js.map +1 -0
- package/lib/renderer/oidnNetwork.d.ts +20 -0
- package/lib/renderer/oidnNetwork.js +123 -0
- package/lib/renderer/oidnNetwork.js.map +1 -0
- package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
- package/lib/renderer/openPbrEnergyLut.js +965 -0
- package/lib/renderer/openPbrEnergyLut.js.map +1 -0
- package/lib/renderer/pathLimits.d.ts +4 -0
- package/lib/renderer/pathLimits.js +7 -0
- package/lib/renderer/pathLimits.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +110 -0
- package/lib/renderer/prepareMeshBVH.js +857 -0
- package/lib/renderer/prepareMeshBVH.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +11 -0
- package/lib/renderer/progressiveScheduler.js +19 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -0
- package/lib/renderer/renderPipeline.d.ts +57 -0
- package/lib/renderer/renderPipeline.js +49 -0
- package/lib/renderer/renderPipeline.js.map +1 -0
- package/lib/renderer/sampling.d.ts +10 -0
- package/lib/renderer/sampling.js +28 -0
- package/lib/renderer/sampling.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +29 -0
- package/lib/renderer/sceneChangeDetector.js +232 -0
- package/lib/renderer/sceneChangeDetector.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +14 -0
- package/lib/renderer/sceneLightChanges.js +34 -0
- package/lib/renderer/sceneLightChanges.js.map +1 -0
- package/lib/renderer/scratchSampling.d.ts +3 -0
- package/lib/renderer/scratchSampling.js +39 -0
- package/lib/renderer/scratchSampling.js.map +1 -0
- package/lib/renderer/shader.d.ts +37 -0
- package/lib/renderer/shader.js +41 -0
- package/lib/renderer/shader.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +24 -0
- package/lib/renderer/staticBvhPreparation.js +116 -0
- package/lib/renderer/staticBvhPreparation.js.map +1 -0
- package/lib/renderer/textureRegion.d.ts +8 -0
- package/lib/renderer/textureRegion.js +9 -0
- package/lib/renderer/textureRegion.js.map +1 -0
- package/lib/renderer/texturesFromMaterials.d.ts +6 -0
- package/lib/renderer/texturesFromMaterials.js +37 -0
- package/lib/renderer/texturesFromMaterials.js.map +1 -0
- package/lib/renderer/util.d.ts +17 -0
- package/lib/renderer/util.js +56 -0
- package/lib/renderer/util.js.map +1 -0
- package/lib/renderer/webgl.d.ts +131 -0
- package/lib/renderer/webgl.js +586 -0
- package/lib/renderer/webgl.js.map +1 -0
- package/lib/renderer/webglShaders.d.ts +4 -0
- package/lib/renderer/webglShaders.js +41 -0
- package/lib/renderer/webglShaders.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
- package/lib/scene/AmbientLight.d.ts +17 -0
- package/lib/scene/AmbientLight.js +15 -0
- package/lib/scene/AmbientLight.js.map +1 -0
- package/lib/scene/Camera.d.ts +78 -0
- package/lib/scene/Camera.js +111 -0
- package/lib/scene/Camera.js.map +1 -0
- package/lib/scene/DirectionalLight.d.ts +18 -0
- package/lib/scene/DirectionalLight.js +17 -0
- package/lib/scene/DirectionalLight.js.map +1 -0
- package/lib/scene/EnvironmentLight.d.ts +14 -0
- package/lib/scene/EnvironmentLight.js +14 -0
- package/lib/scene/EnvironmentLight.js.map +1 -0
- package/lib/scene/Geometry.d.ts +87 -0
- package/lib/scene/Geometry.js +108 -0
- package/lib/scene/Geometry.js.map +1 -0
- package/lib/scene/IESProfile.d.ts +19 -0
- package/lib/scene/IESProfile.js +165 -0
- package/lib/scene/IESProfile.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +43 -0
- package/lib/scene/InstancedMesh.js +79 -0
- package/lib/scene/InstancedMesh.js.map +1 -0
- package/lib/scene/Mesh.d.ts +14 -0
- package/lib/scene/Mesh.js +17 -0
- package/lib/scene/Mesh.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +224 -0
- package/lib/scene/OpenPBRMaterial.js +240 -0
- package/lib/scene/OpenPBRMaterial.js.map +1 -0
- package/lib/scene/RectLight.d.ts +31 -0
- package/lib/scene/RectLight.js +26 -0
- package/lib/scene/RectLight.js.map +1 -0
- package/lib/scene/Scene.d.ts +55 -0
- package/lib/scene/Scene.js +2 -0
- package/lib/scene/Scene.js.map +1 -0
- package/lib/scene/SceneNode.d.ts +16 -0
- package/lib/scene/SceneNode.js +33 -0
- package/lib/scene/SceneNode.js.map +1 -0
- package/lib/scene/SphereLight.d.ts +22 -0
- package/lib/scene/SphereLight.js +20 -0
- package/lib/scene/SphereLight.js.map +1 -0
- package/lib/scene/SpotLight.d.ts +35 -0
- package/lib/scene/SpotLight.js +29 -0
- package/lib/scene/SpotLight.js.map +1 -0
- package/lib/scene/Texture.d.ts +38 -0
- package/lib/scene/Texture.js +37 -0
- package/lib/scene/Texture.js.map +1 -0
- package/lib/scene/anisotropyParameters.d.ts +1 -0
- package/lib/scene/anisotropyParameters.js +13 -0
- package/lib/scene/anisotropyParameters.js.map +1 -0
- package/lib/scene/geometryChanges.d.ts +5 -0
- package/lib/scene/geometryChanges.js +18 -0
- package/lib/scene/geometryChanges.js.map +1 -0
- package/lib/scene/materialTextureNames.d.ts +2 -0
- package/lib/scene/materialTextureNames.js +9 -0
- package/lib/scene/materialTextureNames.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +400 -0
- package/lib/scene/openPbrSchema.js +149 -0
- package/lib/scene/openPbrSchema.js.map +1 -0
- package/lib/scene/thinFilmParameters.d.ts +4 -0
- package/lib/scene/thinFilmParameters.js +12 -0
- package/lib/scene/thinFilmParameters.js.map +1 -0
- package/lib/settings/display.d.ts +118 -0
- package/lib/settings/display.js +34 -0
- package/lib/settings/display.js.map +1 -0
- package/lib/settings/engine.d.ts +37 -0
- package/lib/settings/engine.js +26 -0
- package/lib/settings/engine.js.map +1 -0
- package/lib/settings/render.d.ts +178 -0
- package/lib/settings/render.js +36 -0
- package/lib/settings/render.js.map +1 -0
- package/lib/tinybvh/LICENSE +21 -0
- package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
- package/lib/tinybvh/TinyBvhBuilder.js +211 -0
- package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util/canvas.d.ts +2 -0
- package/lib/util/canvas.js +13 -0
- package/lib/util/canvas.js.map +1 -0
- package/lib/util/commonGeometry.d.ts +15 -0
- package/lib/util/commonGeometry.js +240 -0
- package/lib/util/commonGeometry.js.map +1 -0
- package/lib/util/events.d.ts +7 -0
- package/lib/util/events.js +23 -0
- package/lib/util/events.js.map +1 -0
- package/lib/util/frame.d.ts +2 -0
- package/lib/util/frame.js +10 -0
- package/lib/util/frame.js.map +1 -0
- package/lib/util/fromTHREE.d.ts +100 -0
- package/lib/util/fromTHREE.js +1063 -0
- package/lib/util/fromTHREE.js.map +1 -0
- package/lib/util/geometry.d.ts +13 -0
- package/lib/util/geometry.js +292 -0
- package/lib/util/geometry.js.map +1 -0
- package/lib/util/loadRGBE.d.ts +7 -0
- package/lib/util/loadRGBE.js +168 -0
- package/lib/util/loadRGBE.js.map +1 -0
- package/lib/util/math.d.ts +8 -0
- package/lib/util/math.js +64 -0
- package/lib/util/math.js.map +1 -0
- package/lib/util/mesh.d.ts +7 -0
- package/lib/util/mesh.js +20 -0
- package/lib/util/mesh.js.map +1 -0
- package/lib/util/threeDeformation.d.ts +20 -0
- package/lib/util/threeDeformation.js +218 -0
- package/lib/util/threeDeformation.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +3 -0
- package/lib/version.js.map +1 -0
- package/llms.txt +62 -0
- package/oidn/weights/LICENSE.txt +202 -0
- package/oidn/weights/README.md +43 -0
- package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
- package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
- 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)).
|