@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,328 @@
|
|
|
1
|
+
import { FragmentShader, glsl, Shader } from './shader.js';
|
|
2
|
+
import { constants } from './webgl.js';
|
|
3
|
+
import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
|
|
4
|
+
import { JNLM_DEFAULT_COLOR_SENSITIVITY, JNLM_ALBEDO_FLOOR, JNLM_ALBEDO_REGULARIZATION, JNLM_DEFAULT_SHAPE, JNLM_COVERAGE_BANDWIDTH, JNLM_MAX_ITERATIONS, jnlmPassDilation } from './jnlm.js';
|
|
5
|
+
/**
|
|
6
|
+
* WebGL 2 passes of the JNLM denoiser described in `jnlm.ts`, matching
|
|
7
|
+
* WGPUJNLMDenoiser. Textures replace its storage buffers.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The guide mean and the variance of that mean. The main and catcher trace
|
|
11
|
+
* passes each accumulate (sum, sum of squares, count) for their own samples.
|
|
12
|
+
*/
|
|
13
|
+
const guideFragment = new FragmentShader({
|
|
14
|
+
name: 'jnlmGuide',
|
|
15
|
+
outputs: ['guide'],
|
|
16
|
+
uniforms: {
|
|
17
|
+
momentsTex: Shader.uniform('sampler2D'),
|
|
18
|
+
catcherMomentsTex: Shader.uniform('sampler2D')
|
|
19
|
+
},
|
|
20
|
+
main: glsl `
|
|
21
|
+
void main() {
|
|
22
|
+
ivec2 p = ivec2(gl_FragCoord.xy);
|
|
23
|
+
vec4 moments = load_momentsTex(p, 0) + load_catcherMomentsTex(p, 0);
|
|
24
|
+
float n = moments.z;
|
|
25
|
+
float mean = moments.x / max(n, 1.0);
|
|
26
|
+
|
|
27
|
+
float variance = n >= 2.0
|
|
28
|
+
? max(moments.y - n * mean * mean, 0.0) / (n * (n - 1.0))
|
|
29
|
+
: -1.0;
|
|
30
|
+
out_guide = vec4(mean, variance, 0.0, 1.0);
|
|
31
|
+
}`
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Smooths the noisy per-pixel variance over 3 x 3 pixels. Pixels with a
|
|
35
|
+
* single sample take the spatial variance of their neighborhood instead.
|
|
36
|
+
*/
|
|
37
|
+
const varianceFragment = new FragmentShader({
|
|
38
|
+
name: 'jnlmVariance',
|
|
39
|
+
outputs: ['guide'],
|
|
40
|
+
uniforms: {
|
|
41
|
+
rawGuideTex: Shader.uniform('sampler2D')
|
|
42
|
+
},
|
|
43
|
+
main: glsl `
|
|
44
|
+
void main() {
|
|
45
|
+
ivec2 p = ivec2(gl_FragCoord.xy);
|
|
46
|
+
ivec2 size = rawGuideTexRegion();
|
|
47
|
+
vec2 center = load_rawGuideTex(p, 0).xy;
|
|
48
|
+
float lg = 0.0;
|
|
49
|
+
float iX = 0.0;
|
|
50
|
+
float mL = 0.0;
|
|
51
|
+
float iR = 0.0;
|
|
52
|
+
for (int dy = -1; dy <= 1; dy++) {
|
|
53
|
+
for (int dx = -1; dx <= 1; dx++) {
|
|
54
|
+
vec2 value = load_rawGuideTex(clamp(p + ivec2(dx, dy), ivec2(0), size - 1), 0).xy;
|
|
55
|
+
mL += value.x;
|
|
56
|
+
iR += value.x * value.x;
|
|
57
|
+
if (value.y >= 0.0) {
|
|
58
|
+
lg += value.y;
|
|
59
|
+
iX += 1.0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
float variance;
|
|
64
|
+
if (center.y >= 0.0) {
|
|
65
|
+
variance = lg / iX;
|
|
66
|
+
} else {
|
|
67
|
+
float lf = mL / 9.0;
|
|
68
|
+
variance = max(iR / 9.0 - lf * lf, 0.0) * 9.0 / 8.0;
|
|
69
|
+
}
|
|
70
|
+
out_guide = vec4(center.x, variance, 0.0, 1.0);
|
|
71
|
+
}`
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* One joint NL-means pass; see createJNLMFilterWGSL. The first pass decodes
|
|
75
|
+
* the display-encoded composition to linear light, the last encodes it again.
|
|
76
|
+
*/
|
|
77
|
+
const filterFragment = new FragmentShader({
|
|
78
|
+
name: 'jnlmFilter',
|
|
79
|
+
outputs: ['color', 'guide'],
|
|
80
|
+
defines: {
|
|
81
|
+
SEARCH_RADIUS: JNLM_DEFAULT_SHAPE.searchRadius,
|
|
82
|
+
PATCH_RADIUS: JNLM_DEFAULT_SHAPE.patchRadius,
|
|
83
|
+
INV_ALBEDO_BANDWIDTH2: (1 / JNLM_DEFAULT_SHAPE.albedoBandwidth ** 2).toFixed(6),
|
|
84
|
+
INV_NORMAL_BANDWIDTH2: (1 / JNLM_DEFAULT_SHAPE.normalBandwidth ** 2).toFixed(6)
|
|
85
|
+
},
|
|
86
|
+
uniforms: {
|
|
87
|
+
guideTex: Shader.uniform('sampler2D'),
|
|
88
|
+
colorTex: Shader.uniform('sampler2D'),
|
|
89
|
+
albedoTex: Shader.uniform('sampler2D'),
|
|
90
|
+
normalTex: Shader.uniform('sampler2D'),
|
|
91
|
+
shadowCatcherTex: Shader.uniform('sampler2D'),
|
|
92
|
+
colorSensitivity: Shader.uniform('float', JNLM_DEFAULT_COLOR_SENSITIVITY),
|
|
93
|
+
dilation: Shader.uniform('int', 1),
|
|
94
|
+
decodeInput: Shader.uniform('bool', 0),
|
|
95
|
+
encodeOutput: Shader.uniform('bool', 0)
|
|
96
|
+
},
|
|
97
|
+
main: glsl `
|
|
98
|
+
#define PATCH_SIZE ((2 * PATCH_RADIUS + 1) * (2 * PATCH_RADIUS + 1))
|
|
99
|
+
|
|
100
|
+
#define VARIANCE_CANCELLATION 1.0
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
#define CENTER_WEIGHT_MIN 0.01
|
|
104
|
+
#define INV_COVERAGE_BANDWIDTH2 ${(1 / JNLM_COVERAGE_BANDWIDTH ** 2).toFixed(6)}
|
|
105
|
+
|
|
106
|
+
ivec2 imageSize;
|
|
107
|
+
|
|
108
|
+
vec2 nq(ivec2 p) {
|
|
109
|
+
return load_guideTex(clamp(p, ivec2(0), imageSize - 1), 0).xy;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
vec4 rv(ivec2 p) {
|
|
114
|
+
vec4 c = load_colorTex(p, 0);
|
|
115
|
+
if (decodeInput) c.rgb = pow(max(c.rgb, 0.0), vec3(2.2));
|
|
116
|
+
return vec4(c.rgb * c.a, c.a);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
float lk(ivec2 q, vec4 bs, vec3 gM) {
|
|
120
|
+
vec4 albedo = load_albedoTex(q, 0);
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
vec3 oS = max((albedo.rgb + bs.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
124
|
+
vec3 kR = (albedo.rgb - bs.rgb) / oS;
|
|
125
|
+
float iO = albedo.a - bs.a;
|
|
126
|
+
vec3 lb = load_normalTex(q, 0).rgb - gM;
|
|
127
|
+
return max(
|
|
128
|
+
dot(kR, kR) * INV_ALBEDO_BANDWIDTH2
|
|
129
|
+
+ iO * iO * INV_COVERAGE_BANDWIDTH2,
|
|
130
|
+
dot(lb, lb) * INV_NORMAL_BANDWIDTH2
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void main() {
|
|
135
|
+
imageSize = guideTexRegion();
|
|
136
|
+
ivec2 p = ivec2(gl_FragCoord.xy);
|
|
137
|
+
vec4 bs = load_albedoTex(p, 0);
|
|
138
|
+
vec4 fw = load_normalTex(p, 0);
|
|
139
|
+
vec3 gM = fw.rgb;
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
if (fw.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {
|
|
143
|
+
vec4 c = rv(p);
|
|
144
|
+
vec3 rgb = c.rgb / max(c.a, 1e-6);
|
|
145
|
+
if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
|
|
146
|
+
out_color = vec4(rgb, c.a);
|
|
147
|
+
out_guide = vec4(nq(p), 0.0, 1.0);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
vec2 kT[PATCH_SIZE];
|
|
152
|
+
int k = 0;
|
|
153
|
+
for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
|
|
154
|
+
for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
|
|
155
|
+
kT[k] = nq(p + ivec2(dx, dy) * dilation);
|
|
156
|
+
k++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
float k2 = colorSensitivity * colorSensitivity;
|
|
160
|
+
|
|
161
|
+
vec4 sum = vec4(0.0);
|
|
162
|
+
vec3 gP = max(bs.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
163
|
+
vec3 mb = vec3(0.0);
|
|
164
|
+
vec3 gs = vec3(0.0);
|
|
165
|
+
vec3 hn = vec3(0.0);
|
|
166
|
+
float pg = 0.0;
|
|
167
|
+
float gu = 0.0;
|
|
168
|
+
float nH = 0.0;
|
|
169
|
+
float kA = 0.0;
|
|
170
|
+
for (int sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {
|
|
171
|
+
for (int sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {
|
|
172
|
+
ivec2 q = p + ivec2(sx, sy) * dilation;
|
|
173
|
+
if (
|
|
174
|
+
(sx == 0 && sy == 0) ||
|
|
175
|
+
q.x < 0 || q.y < 0 || q.x >= imageSize.x || q.y >= imageSize.y
|
|
176
|
+
) continue;
|
|
177
|
+
float features = lk(q, bs, gM);
|
|
178
|
+
if (features > 16.0) continue;
|
|
179
|
+
|
|
180
|
+
float fT = 0.0;
|
|
181
|
+
k = 0;
|
|
182
|
+
for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
|
|
183
|
+
for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
|
|
184
|
+
vec2 a = kT[k];
|
|
185
|
+
vec2 b = nq(q + ivec2(dx, dy) * dilation);
|
|
186
|
+
float qH = a.x - b.x;
|
|
187
|
+
fT += (qH * qH
|
|
188
|
+
- VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))
|
|
189
|
+
/ (1e-10 + k2 * (a.y + b.y));
|
|
190
|
+
k++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
fT /= float(PATCH_SIZE);
|
|
194
|
+
|
|
195
|
+
float weight = exp(-max(max(fT, 0.0), features));
|
|
196
|
+
vec2 g = nq(q);
|
|
197
|
+
|
|
198
|
+
vec3 a = (load_albedoTex(q, 0).rgb - bs.rgb) / gP;
|
|
199
|
+
vec4 value = rv(q);
|
|
200
|
+
sum += value * weight;
|
|
201
|
+
mb += a * weight;
|
|
202
|
+
gs += a * a * weight;
|
|
203
|
+
hn += a * value.rgb * weight;
|
|
204
|
+
pg += g.x * weight;
|
|
205
|
+
gu += g.y * weight * weight;
|
|
206
|
+
nH += weight;
|
|
207
|
+
kA = max(kA, weight);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
vec4 center = rv(p);
|
|
214
|
+
vec2 kS = nq(p);
|
|
215
|
+
float dF = max(kA, CENTER_WEIGHT_MIN);
|
|
216
|
+
float totalWeight = nH + dF;
|
|
217
|
+
vec4 mean = (sum + center * dF) / totalWeight;
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
vec3 ez = mb / totalWeight;
|
|
221
|
+
vec3 ll = max(gs / totalWeight - ez * ez, vec3(0.0));
|
|
222
|
+
vec3 qi = hn / totalWeight - ez * mean.rgb;
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
vec3 qs = bs.rgb + ez * gP;
|
|
227
|
+
vec3 ol = mean.rgb * gP / max(qs, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
228
|
+
vec3 vk = clamp(qi / (ll + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), ol);
|
|
229
|
+
vec3 rn = mean.rgb - vk * ez;
|
|
230
|
+
vec4 filtered = vec4(max(rn, vec3(0.0)), max(mean.a, 0.0));
|
|
231
|
+
vec3 rgb = filtered.a > 1e-6
|
|
232
|
+
? filtered.rgb / max(filtered.a, 1e-6)
|
|
233
|
+
: center.rgb / max(center.a, 1e-6);
|
|
234
|
+
if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
|
|
235
|
+
out_color = vec4(rgb, filtered.a);
|
|
236
|
+
out_guide = vec4(
|
|
237
|
+
(pg + kS.x * dF) / totalWeight,
|
|
238
|
+
(gu + kS.y * dF * dF)
|
|
239
|
+
/ (totalWeight * totalWeight),
|
|
240
|
+
0.0,
|
|
241
|
+
1.0
|
|
242
|
+
);
|
|
243
|
+
}`
|
|
244
|
+
});
|
|
245
|
+
const floatOutput = {
|
|
246
|
+
type: constants.FLOAT,
|
|
247
|
+
minFilter: constants.NEAREST,
|
|
248
|
+
magFilter: constants.NEAREST
|
|
249
|
+
};
|
|
250
|
+
export class WebGLJNLMDenoisePass {
|
|
251
|
+
_renderer;
|
|
252
|
+
_guidePass;
|
|
253
|
+
_variancePass;
|
|
254
|
+
// Two instances so consecutive passes ping-pong between their outputs.
|
|
255
|
+
_filterPasses;
|
|
256
|
+
constructor(renderer) {
|
|
257
|
+
this._renderer = renderer;
|
|
258
|
+
this._guidePass = new WebGLFullQuadPass('jnlmGuide', renderer, {
|
|
259
|
+
shader: guideFragment,
|
|
260
|
+
outputParams: { guide: floatOutput }
|
|
261
|
+
});
|
|
262
|
+
this._variancePass = new WebGLFullQuadPass('jnlmVariance', renderer, {
|
|
263
|
+
shader: varianceFragment,
|
|
264
|
+
outputParams: { guide: floatOutput }
|
|
265
|
+
});
|
|
266
|
+
this._filterPasses = [0, 1].map(() => new WebGLFullQuadPass('jnlmFilter', renderer, {
|
|
267
|
+
shader: filterFragment,
|
|
268
|
+
outputParams: {
|
|
269
|
+
color: { type: constants.HALF_FLOAT },
|
|
270
|
+
guide: floatOutput
|
|
271
|
+
}
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
/** Runs the denoiser and returns the display-encoded result. */
|
|
275
|
+
render(inputs) {
|
|
276
|
+
const { width, height, shape } = inputs;
|
|
277
|
+
const passes = [this._guidePass, this._variancePass, ...this._filterPasses];
|
|
278
|
+
passes.forEach((pass) => pass.setSize(width, height));
|
|
279
|
+
this._guidePass.createPass({
|
|
280
|
+
momentsTex: inputs.moments,
|
|
281
|
+
catcherMomentsTex: inputs.catcherMoments ?? this._renderer.emptyTexture
|
|
282
|
+
});
|
|
283
|
+
this._variancePass.createPass({ rawGuideTex: this._guidePass.getOutput('guide') });
|
|
284
|
+
const sensitivity = JNLM_DEFAULT_COLOR_SENSITIVITY * Math.max(inputs.strength, 1e-3);
|
|
285
|
+
const iterations = Math.min(JNLM_MAX_ITERATIONS, Math.max(1, Math.round(shape.iterations)));
|
|
286
|
+
let guide = this._variancePass.getOutput('guide');
|
|
287
|
+
let color = inputs.color;
|
|
288
|
+
for (let i = 0; i < iterations; i++) {
|
|
289
|
+
const pass = this._filterPasses[i % 2];
|
|
290
|
+
pass.setDefines({
|
|
291
|
+
SEARCH_RADIUS: shape.searchRadius,
|
|
292
|
+
// Numeric zero removes a define in the WebGL shader builder.
|
|
293
|
+
PATCH_RADIUS: String(shape.patchRadius),
|
|
294
|
+
INV_ALBEDO_BANDWIDTH2: (1 / shape.albedoBandwidth ** 2).toFixed(6),
|
|
295
|
+
INV_NORMAL_BANDWIDTH2: (1 / shape.normalBandwidth ** 2).toFixed(6)
|
|
296
|
+
});
|
|
297
|
+
pass.setUniforms({
|
|
298
|
+
colorSensitivity: sensitivity,
|
|
299
|
+
dilation: jnlmPassDilation(i),
|
|
300
|
+
decodeInput: i === 0,
|
|
301
|
+
encodeOutput: i === iterations - 1
|
|
302
|
+
});
|
|
303
|
+
pass.createPass({
|
|
304
|
+
guideTex: guide,
|
|
305
|
+
colorTex: color,
|
|
306
|
+
albedoTex: inputs.albedo,
|
|
307
|
+
normalTex: inputs.normal,
|
|
308
|
+
shadowCatcherTex: inputs.shadowCatcher
|
|
309
|
+
});
|
|
310
|
+
guide = pass.getOutput('guide');
|
|
311
|
+
color = pass.getOutput('color');
|
|
312
|
+
}
|
|
313
|
+
return color;
|
|
314
|
+
}
|
|
315
|
+
reserveCapacity() {
|
|
316
|
+
[this._guidePass, this._variancePass, ...this._filterPasses].forEach(pass => pass.reserveCapacity());
|
|
317
|
+
}
|
|
318
|
+
retainOutput(texture) { this._filterPasses.forEach(pass => pass.retainOutput(texture)); }
|
|
319
|
+
releaseOutput(texture) { this._filterPasses.forEach(pass => pass.releaseOutput(texture)); }
|
|
320
|
+
getMemoryBytes() {
|
|
321
|
+
return [this._guidePass, this._variancePass, ...this._filterPasses]
|
|
322
|
+
.reduce((sum, pass) => sum + pass.getMemoryBytes(), 0);
|
|
323
|
+
}
|
|
324
|
+
dispose() {
|
|
325
|
+
[this._guidePass, this._variancePass, ...this._filterPasses].forEach((pass) => pass.dispose());
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=WebGLJNLMDenoiser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGLJNLMDenoiser.js","sourceRoot":"","sources":["../../src/renderer/WebGLJNLMDenoiser.ts"],"names":[],"mappings":"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","sourcesContent":["import { FragmentShader, glsl, Shader } from './shader.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport {\n JNLM_DEFAULT_COLOR_SENSITIVITY,\n JNLM_ALBEDO_FLOOR,\n JNLM_ALBEDO_REGULARIZATION,\n JNLM_DEFAULT_SHAPE,\n JNLM_COVERAGE_BANDWIDTH,\n JNLM_MAX_ITERATIONS,\n jnlmPassDilation,\n type JNLMFilterShape\n} from './jnlm.js';\n\n/**\n * WebGL 2 passes of the JNLM denoiser described in `jnlm.ts`, matching\n * WGPUJNLMDenoiser. Textures replace its storage buffers.\n */\n\n/**\n * The guide mean and the variance of that mean. The main and catcher trace\n * passes each accumulate (sum, sum of squares, count) for their own samples.\n */\nconst guideFragment = new FragmentShader({\n name: 'jnlmGuide',\n outputs: ['guide'],\n uniforms: {\n momentsTex: Shader.uniform('sampler2D'),\n catcherMomentsTex: Shader.uniform('sampler2D')\n },\n main: glsl`\nvoid main() {\n ivec2 p = ivec2(gl_FragCoord.xy);\n vec4 moments = load_momentsTex(p, 0) + load_catcherMomentsTex(p, 0);\n float n = moments.z;\n float mean = moments.x / max(n, 1.0);\n // Variance of the mean, or -1 when one sample cannot estimate it.\n float variance = n >= 2.0\n ? max(moments.y - n * mean * mean, 0.0) / (n * (n - 1.0))\n : -1.0;\n out_guide = vec4(mean, variance, 0.0, 1.0);\n}`\n});\n\n/**\n * Smooths the noisy per-pixel variance over 3 x 3 pixels. Pixels with a\n * single sample take the spatial variance of their neighborhood instead.\n */\nconst varianceFragment = new FragmentShader({\n name: 'jnlmVariance',\n outputs: ['guide'],\n uniforms: {\n rawGuideTex: Shader.uniform('sampler2D')\n },\n main: glsl`\nvoid main() {\n ivec2 p = ivec2(gl_FragCoord.xy);\n ivec2 size = rawGuideTexRegion();\n vec2 center = load_rawGuideTex(p, 0).xy;\n float varianceSum = 0.0;\n float varianceCount = 0.0;\n float meanSum = 0.0;\n float meanSquareSum = 0.0;\n for (int dy = -1; dy <= 1; dy++) {\n for (int dx = -1; dx <= 1; dx++) {\n vec2 value = load_rawGuideTex(clamp(p + ivec2(dx, dy), ivec2(0), size - 1), 0).xy;\n meanSum += value.x;\n meanSquareSum += value.x * value.x;\n if (value.y >= 0.0) {\n varianceSum += value.y;\n varianceCount += 1.0;\n }\n }\n }\n float variance;\n if (center.y >= 0.0) {\n variance = varianceSum / varianceCount;\n } else {\n float spatialMean = meanSum / 9.0;\n variance = max(meanSquareSum / 9.0 - spatialMean * spatialMean, 0.0) * 9.0 / 8.0;\n }\n out_guide = vec4(center.x, variance, 0.0, 1.0);\n}`\n});\n\n/**\n * One joint NL-means pass; see createJNLMFilterWGSL. The first pass decodes\n * the display-encoded composition to linear light, the last encodes it again.\n */\nconst filterFragment = new FragmentShader({\n name: 'jnlmFilter',\n outputs: ['color', 'guide'],\n defines: {\n SEARCH_RADIUS: JNLM_DEFAULT_SHAPE.searchRadius,\n PATCH_RADIUS: JNLM_DEFAULT_SHAPE.patchRadius,\n INV_ALBEDO_BANDWIDTH2: (1 / JNLM_DEFAULT_SHAPE.albedoBandwidth ** 2).toFixed(6),\n INV_NORMAL_BANDWIDTH2: (1 / JNLM_DEFAULT_SHAPE.normalBandwidth ** 2).toFixed(6)\n },\n uniforms: {\n guideTex: Shader.uniform('sampler2D'),\n colorTex: Shader.uniform('sampler2D'),\n albedoTex: Shader.uniform('sampler2D'),\n normalTex: Shader.uniform('sampler2D'),\n shadowCatcherTex: Shader.uniform('sampler2D'),\n colorSensitivity: Shader.uniform('float', JNLM_DEFAULT_COLOR_SENSITIVITY),\n dilation: Shader.uniform('int', 1),\n decodeInput: Shader.uniform('bool', 0),\n encodeOutput: Shader.uniform('bool', 0)\n },\n main: glsl`\n#define PATCH_SIZE ((2 * PATCH_RADIUS + 1) * (2 * PATCH_RADIUS + 1))\n// Variance cancellation strength alpha of the paper.\n#define VARIANCE_CANCELLATION 1.0\n// Lower bound of the center weight, so a pixel unlike all of its neighbors\n// (a thin highlight) is kept rather than replaced by them.\n#define CENTER_WEIGHT_MIN 0.01\n#define INV_COVERAGE_BANDWIDTH2 ${(1 / JNLM_COVERAGE_BANDWIDTH ** 2).toFixed(6)}\n\nivec2 imageSize;\n\nvec2 loadGuide(ivec2 p) {\n return load_guideTex(clamp(p, ivec2(0), imageSize - 1), 0).xy;\n}\n\n// Premultiplied linear color.\nvec4 loadColor(ivec2 p) {\n vec4 c = load_colorTex(p, 0);\n if (decodeInput) c.rgb = pow(max(c.rgb, 0.0), vec3(2.2));\n return vec4(c.rgb * c.a, c.a);\n}\n\nfloat featureDistance(ivec2 q, vec4 centerAlbedo, vec3 centerNormal) {\n vec4 albedo = load_albedoTex(q, 0);\n // Match WebGPU: protect relative RGB contrast, including dark textures,\n // while keeping coverage differences in absolute units.\n vec3 albedoScale = max((albedo.rgb + centerAlbedo.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));\n vec3 albedoDelta = (albedo.rgb - centerAlbedo.rgb) / albedoScale;\n float coverageDelta = albedo.a - centerAlbedo.a;\n vec3 normalDelta = load_normalTex(q, 0).rgb - centerNormal;\n return max(\n dot(albedoDelta, albedoDelta) * INV_ALBEDO_BANDWIDTH2\n + coverageDelta * coverageDelta * INV_COVERAGE_BANDWIDTH2,\n dot(normalDelta, normalDelta) * INV_NORMAL_BANDWIDTH2\n );\n}\n\nvoid main() {\n imageSize = guideTexRegion();\n ivec2 p = ivec2(gl_FragCoord.xy);\n vec4 centerAlbedo = load_albedoTex(p, 0);\n vec4 centerNormalTexel = load_normalTex(p, 0);\n vec3 centerNormal = centerNormalTexel.rgb;\n // Primary misses show the background directly. It has no features that\n // protect its detail and no noise beyond antialiasing, so keep it.\n if (centerNormalTexel.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {\n vec4 c = loadColor(p);\n vec3 rgb = c.rgb / max(c.a, 1e-6);\n if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));\n out_color = vec4(rgb, c.a);\n out_guide = vec4(loadGuide(p), 0.0, 1.0);\n return;\n }\n\n vec2 centerPatch[PATCH_SIZE];\n int k = 0;\n for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {\n for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {\n centerPatch[k] = loadGuide(p + ivec2(dx, dy) * dilation);\n k++;\n }\n }\n float k2 = colorSensitivity * colorSensitivity;\n\n vec4 sum = vec4(0.0);\n vec3 featureScale = max(centerAlbedo.rgb, vec3(${JNLM_ALBEDO_FLOOR}));\n vec3 featureSum = vec3(0.0);\n vec3 featureSquareSum = vec3(0.0);\n vec3 featureColorSum = vec3(0.0);\n float guideSum = 0.0;\n float guideVarianceSum = 0.0;\n float weightSum = 0.0;\n float maxWeight = 0.0;\n for (int sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {\n for (int sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {\n ivec2 q = p + ivec2(sx, sy) * dilation;\n if (\n (sx == 0 && sy == 0) ||\n q.x < 0 || q.y < 0 || q.x >= imageSize.x || q.y >= imageSize.y\n ) continue;\n float features = featureDistance(q, centerAlbedo, centerNormal);\n if (features > 16.0) continue;\n\n float colorDistance = 0.0;\n k = 0;\n for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {\n for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {\n vec2 a = centerPatch[k];\n vec2 b = loadGuide(q + ivec2(dx, dy) * dilation);\n float delta = a.x - b.x;\n colorDistance += (delta * delta\n - VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))\n / (1e-10 + k2 * (a.y + b.y));\n k++;\n }\n }\n colorDistance /= float(PATCH_SIZE);\n\n float weight = exp(-max(max(colorDistance, 0.0), features));\n vec2 g = loadGuide(q);\n // Filter premultiplied color so coverage and color stay consistent.\n vec3 a = (load_albedoTex(q, 0).rgb - centerAlbedo.rgb) / featureScale;\n vec4 value = loadColor(q);\n sum += value * weight;\n featureSum += a * weight;\n featureSquareSum += a * a * weight;\n featureColorSum += a * value.rgb * weight;\n guideSum += g.x * weight;\n guideVarianceSum += g.y * weight * weight;\n weightSum += weight;\n maxWeight = max(maxWeight, weight);\n }\n }\n\n // Weight the center like its most similar neighbor (Buades et al. 2005)\n // instead of 1, so isolated outliers are not kept unfiltered.\n vec4 center = loadColor(p);\n vec2 centerGuide = loadGuide(p);\n float centerWeight = max(maxWeight, CENTER_WEIGHT_MIN);\n float totalWeight = weightSum + centerWeight;\n vec4 mean = (sum + center * centerWeight) / totalWeight;\n // Fit each color channel against relative albedo with the same JNLM weights.\n // Centering at this pixel avoids cancellation when the feature is constant.\n vec3 meanFeature = featureSum / totalWeight;\n vec3 featureVariance = max(featureSquareSum / totalWeight - meanFeature * meanFeature, vec3(0.0));\n vec3 covariance = featureColorSum / totalWeight - meanFeature * mean.rgb;\n // A 1% contrast ridge stabilizes flat guides. Bound the response between no\n // texture dependence and multiplicative albedo modulation; specular color\n // with an unrelated albedo falls back to the weighted mean.\n vec3 meanAlbedo = centerAlbedo.rgb + meanFeature * featureScale;\n vec3 maximumSlope = mean.rgb * featureScale / max(meanAlbedo, vec3(${JNLM_ALBEDO_FLOOR}));\n vec3 slope = clamp(covariance / (featureVariance + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), maximumSlope);\n vec3 corrected = mean.rgb - slope * meanFeature;\n vec4 filtered = vec4(max(corrected, vec3(0.0)), max(mean.a, 0.0));\n vec3 rgb = filtered.a > 1e-6\n ? filtered.rgb / max(filtered.a, 1e-6)\n : center.rgb / max(center.a, 1e-6);\n if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));\n out_color = vec4(rgb, filtered.a);\n out_guide = vec4(\n (guideSum + centerGuide.x * centerWeight) / totalWeight,\n (guideVarianceSum + centerGuide.y * centerWeight * centerWeight)\n / (totalWeight * totalWeight),\n 0.0,\n 1.0\n );\n}`\n});\n\nexport interface WebGLJNLMInputs {\n width: number;\n height: number;\n /** Main trace pass moments: guide sum, sum of squares and count. */\n moments: Texture2D;\n /** Catcher trace pass moments, when the scene has a shadow catcher. */\n catcherMoments?: Texture2D;\n /** Display-encoded composition to filter. */\n color: Texture2D;\n albedo: Texture2D;\n normal: Texture2D;\n /** Normalized shadow-catcher mask; red is the catcher coverage. */\n shadowCatcher: Texture2D;\n strength: number;\n shape: JNLMFilterShape;\n}\n\nconst floatOutput = {\n type: constants.FLOAT,\n minFilter: constants.NEAREST,\n magFilter: constants.NEAREST\n};\n\nexport class WebGLJNLMDenoisePass {\n private _renderer: WebGLDevice;\n private _guidePass: WebGLFullQuadPass<'momentsTex' | 'catcherMomentsTex', 'guide'>;\n private _variancePass: WebGLFullQuadPass<'rawGuideTex', 'guide'>;\n // Two instances so consecutive passes ping-pong between their outputs.\n private _filterPasses: WebGLFullQuadPass<\n 'guideTex' | 'colorTex' | 'albedoTex' | 'normalTex' | 'shadowCatcherTex',\n 'color' | 'guide'\n >[];\n\n constructor(renderer: WebGLDevice) {\n this._renderer = renderer;\n this._guidePass = new WebGLFullQuadPass('jnlmGuide', renderer, {\n shader: guideFragment,\n outputParams: { guide: floatOutput }\n });\n this._variancePass = new WebGLFullQuadPass('jnlmVariance', renderer, {\n shader: varianceFragment,\n outputParams: { guide: floatOutput }\n });\n this._filterPasses = [0, 1].map(() =>\n new WebGLFullQuadPass('jnlmFilter', renderer, {\n shader: filterFragment,\n outputParams: {\n color: { type: constants.HALF_FLOAT },\n guide: floatOutput\n }\n })\n );\n }\n\n /** Runs the denoiser and returns the display-encoded result. */\n render(inputs: WebGLJNLMInputs): Texture2D {\n const { width, height, shape } = inputs;\n const passes = [this._guidePass, this._variancePass, ...this._filterPasses];\n passes.forEach((pass) => pass.setSize(width, height));\n this._guidePass.createPass({\n momentsTex: inputs.moments,\n catcherMomentsTex: inputs.catcherMoments ?? this._renderer.emptyTexture\n });\n this._variancePass.createPass({ rawGuideTex: this._guidePass.getOutput('guide') });\n\n const sensitivity = JNLM_DEFAULT_COLOR_SENSITIVITY * Math.max(inputs.strength, 1e-3);\n const iterations = Math.min(JNLM_MAX_ITERATIONS, Math.max(1, Math.round(shape.iterations)));\n let guide = this._variancePass.getOutput('guide');\n let color = inputs.color;\n for (let i = 0; i < iterations; i++) {\n const pass = this._filterPasses[i % 2];\n pass.setDefines({\n SEARCH_RADIUS: shape.searchRadius,\n // Numeric zero removes a define in the WebGL shader builder.\n PATCH_RADIUS: String(shape.patchRadius),\n INV_ALBEDO_BANDWIDTH2: (1 / shape.albedoBandwidth ** 2).toFixed(6),\n INV_NORMAL_BANDWIDTH2: (1 / shape.normalBandwidth ** 2).toFixed(6)\n });\n pass.setUniforms({\n colorSensitivity: sensitivity,\n dilation: jnlmPassDilation(i),\n decodeInput: i === 0,\n encodeOutput: i === iterations - 1\n });\n pass.createPass({\n guideTex: guide,\n colorTex: color,\n albedoTex: inputs.albedo,\n normalTex: inputs.normal,\n shadowCatcherTex: inputs.shadowCatcher\n });\n guide = pass.getOutput('guide');\n color = pass.getOutput('color');\n }\n return color;\n }\n\n reserveCapacity() {\n [this._guidePass, this._variancePass, ...this._filterPasses].forEach(pass => pass.reserveCapacity());\n }\n\n retainOutput(texture: Texture2D) { this._filterPasses.forEach(pass => pass.retainOutput(texture)); }\n releaseOutput(texture: Texture2D) { this._filterPasses.forEach(pass => pass.releaseOutput(texture)); }\n\n getMemoryBytes() {\n return [this._guidePass, this._variancePass, ...this._filterPasses]\n .reduce((sum, pass) => sum + pass.getMemoryBytes(), 0);\n }\n\n dispose() {\n [this._guidePass, this._variancePass, ...this._filterPasses].forEach((pass) =>\n pass.dispose()\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { WebGLDevice, Texture2D } from './webgl.js';
|
|
2
|
+
import WebGLRayTracePass from './WebGLRayTracePass.js';
|
|
3
|
+
type LayerOutput = 'foreground' | 'catcherBackground';
|
|
4
|
+
type RayTraceOutput = 'color' | 'albedo' | 'normal' | 'shadowCatcher';
|
|
5
|
+
/** Converts the additive ray tracing buffers into display/denoise textures. */
|
|
6
|
+
export declare class WebGLRayTraceOutputPass {
|
|
7
|
+
private readonly _renderer;
|
|
8
|
+
private readonly _pass;
|
|
9
|
+
private readonly _layersPass;
|
|
10
|
+
constructor(renderer: WebGLDevice);
|
|
11
|
+
setSize(width: number, height: number): void;
|
|
12
|
+
setSampleCount(sampleCount: number): void;
|
|
13
|
+
createPass(rayTracePass: WebGLRayTracePass): void;
|
|
14
|
+
getOutput(label: RayTraceOutput | LayerOutput): Texture2D;
|
|
15
|
+
retainOutput(texture: Texture2D): void;
|
|
16
|
+
releaseOutput(texture: Texture2D): void;
|
|
17
|
+
getMemoryBytes(): number;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { FragmentShader, Shader, glsl } from './shader.js';
|
|
2
|
+
import { constants } from './webgl.js';
|
|
3
|
+
import normalizeRayTraceOutput from './glsl/normalizeRayTraceOutput.frag.js';
|
|
4
|
+
import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
|
|
5
|
+
/** Converts the additive ray tracing buffers into display/denoise textures. */
|
|
6
|
+
export class WebGLRayTraceOutputPass {
|
|
7
|
+
_renderer;
|
|
8
|
+
_pass;
|
|
9
|
+
_layersPass;
|
|
10
|
+
constructor(renderer) {
|
|
11
|
+
this._renderer = renderer;
|
|
12
|
+
this._pass = new WebGLFullQuadPass('rayTraceOutput', renderer, {
|
|
13
|
+
shader: normalizeRayTraceOutput,
|
|
14
|
+
outputs: ['color', 'albedo', 'normal', 'shadowCatcher'],
|
|
15
|
+
outputParams: {
|
|
16
|
+
color: {
|
|
17
|
+
type: constants.HALF_FLOAT,
|
|
18
|
+
minFilter: constants.LINEAR,
|
|
19
|
+
magFilter: constants.LINEAR
|
|
20
|
+
},
|
|
21
|
+
albedo: { type: constants.UNSIGNED_BYTE },
|
|
22
|
+
normal: { type: constants.UNSIGNED_BYTE },
|
|
23
|
+
shadowCatcher: { type: constants.HALF_FLOAT }
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
this._layersPass = new WebGLFullQuadPass('rayTraceLayers', renderer, {
|
|
27
|
+
shader: new FragmentShader({
|
|
28
|
+
name: 'normalizeRayTraceLayers',
|
|
29
|
+
outputs: ['foreground', 'catcherBackground'],
|
|
30
|
+
uniforms: {
|
|
31
|
+
colorTex: Shader.uniform('sampler2D'),
|
|
32
|
+
albedoTex: Shader.uniform('sampler2D'),
|
|
33
|
+
normalTex: Shader.uniform('sampler2D'),
|
|
34
|
+
shadowCatcherTex: Shader.uniform('sampler2D'),
|
|
35
|
+
catcherBackgroundTex: Shader.uniform('sampler2D'),
|
|
36
|
+
sampleCount: Shader.uniform('float', 1)
|
|
37
|
+
},
|
|
38
|
+
main: glsl `
|
|
39
|
+
void main() {
|
|
40
|
+
vec4 light = sample_colorTex(v_Texcoord);
|
|
41
|
+
vec4 mask = sample_shadowCatcherTex(v_Texcoord);
|
|
42
|
+
vec4 background = sample_catcherBackgroundTex(v_Texcoord);
|
|
43
|
+
float hit = sample_albedoTex(v_Texcoord).a;
|
|
44
|
+
|
|
45
|
+
float pW = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;
|
|
46
|
+
float iP = max(hit - mask.b * pW, 0.0);
|
|
47
|
+
out_foreground = vec4(
|
|
48
|
+
(light.rgb - background.rgb * pW)
|
|
49
|
+
/ (iP > 0.0 ? iP : sampleCount),
|
|
50
|
+
clamp((light.a - background.a) / sampleCount, 0.0, 1.0)
|
|
51
|
+
);
|
|
52
|
+
out_catcherBackground = background / sampleCount;
|
|
53
|
+
}`
|
|
54
|
+
}),
|
|
55
|
+
outputs: ['foreground', 'catcherBackground'],
|
|
56
|
+
outputParams: {
|
|
57
|
+
foreground: { type: constants.HALF_FLOAT },
|
|
58
|
+
catcherBackground: { type: constants.HALF_FLOAT }
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
setSize(width, height) {
|
|
63
|
+
this._pass.setSize(width, height);
|
|
64
|
+
this._layersPass.setSize(width, height);
|
|
65
|
+
}
|
|
66
|
+
setSampleCount(sampleCount) {
|
|
67
|
+
this._pass.setUniform('sampleCount', Math.max(sampleCount, 1));
|
|
68
|
+
this._layersPass.setUniform('sampleCount', Math.max(sampleCount, 1));
|
|
69
|
+
}
|
|
70
|
+
createPass(rayTracePass) {
|
|
71
|
+
this._pass.setOutputs(rayTracePass.hasShadowCatcher() ? ['color', 'albedo', 'normal', 'shadowCatcher'] : ['color', 'albedo', 'normal']);
|
|
72
|
+
this._pass.createPass({
|
|
73
|
+
colorTex: rayTracePass.getOutput('color'),
|
|
74
|
+
albedoTex: rayTracePass.getOutput('albedo'),
|
|
75
|
+
normalTex: rayTracePass.getOutput('normal'),
|
|
76
|
+
shadowCatcherTex: rayTracePass.hasShadowCatcher()
|
|
77
|
+
? rayTracePass.getOutput('shadowCatcher')
|
|
78
|
+
: this._renderer.emptyTexture
|
|
79
|
+
}, undefined, { clear: true });
|
|
80
|
+
if (rayTracePass.hasShadowCatcher()) {
|
|
81
|
+
this._layersPass.setOutputs(['foreground', 'catcherBackground']);
|
|
82
|
+
this._layersPass.createPass({
|
|
83
|
+
colorTex: rayTracePass.getOutput('color'),
|
|
84
|
+
albedoTex: rayTracePass.getOutput('albedo'),
|
|
85
|
+
normalTex: rayTracePass.getOutput('normal'),
|
|
86
|
+
shadowCatcherTex: rayTracePass.getOutput('shadowCatcher'),
|
|
87
|
+
catcherBackgroundTex: rayTracePass.getOutput('catcherBackground')
|
|
88
|
+
}, undefined, { clear: true });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this._layersPass.setOutputs([]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getOutput(label) {
|
|
95
|
+
return label === 'foreground' || label === 'catcherBackground'
|
|
96
|
+
? this._layersPass.getOutput(label) ?? this._renderer.emptyTexture : this._pass.getOutput(label) ?? this._renderer.emptyTexture;
|
|
97
|
+
}
|
|
98
|
+
retainOutput(texture) { this._pass.retainOutput(texture); this._layersPass.retainOutput(texture); }
|
|
99
|
+
releaseOutput(texture) { this._pass.releaseOutput(texture); this._layersPass.releaseOutput(texture); }
|
|
100
|
+
getMemoryBytes() { return this._pass.getMemoryBytes() + this._layersPass.getMemoryBytes(); }
|
|
101
|
+
dispose() {
|
|
102
|
+
this._pass.dispose();
|
|
103
|
+
this._layersPass.dispose();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=WebGLRayTraceOutputPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGLRayTraceOutputPass.js","sourceRoot":"","sources":["../../src/renderer/WebGLRayTraceOutputPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { FragmentShader, Shader, glsl } from './shader.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport normalizeRayTraceOutput from './glsl/normalizeRayTraceOutput.frag.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\n\ntype RayTraceInput =\n | 'colorTex'\n | 'albedoTex'\n | 'normalTex'\n | 'shadowCatcherTex';\ntype LayerOutput = 'foreground' | 'catcherBackground';\ntype RayTraceOutput = 'color' | 'albedo' | 'normal' | 'shadowCatcher';\n\n/** Converts the additive ray tracing buffers into display/denoise textures. */\nexport class WebGLRayTraceOutputPass {\n private readonly _renderer: WebGLDevice;\n private readonly _pass: WebGLFullQuadPass<RayTraceInput, RayTraceOutput>;\n\n private readonly _layersPass: WebGLFullQuadPass<\n RayTraceInput | 'catcherBackgroundTex', LayerOutput\n >;\n\n constructor(renderer: WebGLDevice) {\n this._renderer = renderer;\n this._pass = new WebGLFullQuadPass('rayTraceOutput', renderer, {\n shader: normalizeRayTraceOutput,\n outputs: ['color', 'albedo', 'normal', 'shadowCatcher'],\n outputParams: {\n color: {\n type: constants.HALF_FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR\n },\n albedo: { type: constants.UNSIGNED_BYTE },\n normal: { type: constants.UNSIGNED_BYTE },\n shadowCatcher: { type: constants.HALF_FLOAT }\n }\n });\n this._layersPass = new WebGLFullQuadPass('rayTraceLayers', renderer, {\n shader: new FragmentShader({\n name: 'normalizeRayTraceLayers',\n outputs: ['foreground', 'catcherBackground'],\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n albedoTex: Shader.uniform('sampler2D'),\n normalTex: Shader.uniform('sampler2D'),\n shadowCatcherTex: Shader.uniform('sampler2D'),\n catcherBackgroundTex: Shader.uniform('sampler2D'),\n sampleCount: Shader.uniform('float', 1)\n },\n main: glsl`\nvoid main() {\n vec4 light = sample_colorTex(v_Texcoord);\n vec4 mask = sample_shadowCatcherTex(v_Texcoord);\n vec4 background = sample_catcherBackgroundTex(v_Texcoord);\n float hit = sample_albedoTex(v_Texcoord).a;\n // Full spectral beauty has three wavelength contributions per shadow sample.\n float contributions = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;\n float foregroundHit = max(hit - mask.b * contributions, 0.0);\n out_foreground = vec4(\n (light.rgb - background.rgb * contributions)\n / (foregroundHit > 0.0 ? foregroundHit : sampleCount),\n clamp((light.a - background.a) / sampleCount, 0.0, 1.0)\n );\n out_catcherBackground = background / sampleCount;\n}`\n }),\n outputs: ['foreground', 'catcherBackground'],\n outputParams: {\n foreground: { type: constants.HALF_FLOAT },\n catcherBackground: { type: constants.HALF_FLOAT }\n }\n });\n }\n\n setSize(width: number, height: number) {\n this._pass.setSize(width, height);\n this._layersPass.setSize(width, height);\n }\n\n setSampleCount(sampleCount: number) {\n this._pass.setUniform('sampleCount', Math.max(sampleCount, 1));\n this._layersPass.setUniform('sampleCount', Math.max(sampleCount, 1));\n }\n\n createPass(rayTracePass: WebGLRayTracePass) {\n this._pass.setOutputs(rayTracePass.hasShadowCatcher() ? ['color', 'albedo', 'normal', 'shadowCatcher'] : ['color', 'albedo', 'normal']);\n this._pass.createPass(\n {\n colorTex: rayTracePass.getOutput('color'),\n albedoTex: rayTracePass.getOutput('albedo'),\n normalTex: rayTracePass.getOutput('normal'),\n shadowCatcherTex: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('shadowCatcher')\n : this._renderer.emptyTexture\n },\n undefined,\n { clear: true }\n );\n if (rayTracePass.hasShadowCatcher()) {\n this._layersPass.setOutputs(['foreground', 'catcherBackground']);\n this._layersPass.createPass({\n colorTex: rayTracePass.getOutput('color'),\n albedoTex: rayTracePass.getOutput('albedo'),\n normalTex: rayTracePass.getOutput('normal'),\n shadowCatcherTex: rayTracePass.getOutput('shadowCatcher'),\n catcherBackgroundTex: rayTracePass.getOutput('catcherBackground')\n }, undefined, { clear: true });\n } else {\n this._layersPass.setOutputs([]);\n }\n }\n\n getOutput(label: RayTraceOutput | LayerOutput): Texture2D {\n return label === 'foreground' || label === 'catcherBackground'\n ? this._layersPass.getOutput(label) ?? this._renderer.emptyTexture : this._pass.getOutput(label) ?? this._renderer.emptyTexture;\n }\n\n retainOutput(texture: Texture2D) { this._pass.retainOutput(texture); this._layersPass.retainOutput(texture); }\n releaseOutput(texture: Texture2D) { this._pass.releaseOutput(texture); this._layersPass.releaseOutput(texture); }\n\n getMemoryBytes() { return this._pass.getMemoryBytes() + this._layersPass.getMemoryBytes(); }\n\n dispose() {\n this._pass.dispose();\n this._layersPass.dispose();\n }\n}\n\n"]}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { type SamplingPattern } from './sampling.js';
|
|
2
|
+
import { type DepthSampleArea } from './depthQuery.js';
|
|
3
|
+
import { WebGLDevice as WebGLRenderer, Texture2D as WebGLTexture2D } from './webgl.js';
|
|
4
|
+
import Mesh from '../scene/Mesh.js';
|
|
5
|
+
import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
|
|
6
|
+
import { SceneBackground, SceneLight } from '../scene/Scene.js';
|
|
7
|
+
import Camera from '../scene/Camera.js';
|
|
8
|
+
import Geometry from '../scene/Geometry.js';
|
|
9
|
+
declare class WebGLRayTracePass {
|
|
10
|
+
private readonly _renderer;
|
|
11
|
+
private _meshes;
|
|
12
|
+
private _sceneEnvironment;
|
|
13
|
+
private _rectLightTextures;
|
|
14
|
+
private _analyticLights;
|
|
15
|
+
private _analyticLightSelectionPmfs;
|
|
16
|
+
private _analyticLightSelectionCdfs;
|
|
17
|
+
private _envLightSelectionPmf;
|
|
18
|
+
private _materialData;
|
|
19
|
+
private _maxTextureArrayBytes;
|
|
20
|
+
private _preparedMeshData?;
|
|
21
|
+
private _membershipCache;
|
|
22
|
+
private _pendingMembershipData?;
|
|
23
|
+
private _materialChanges;
|
|
24
|
+
private _pendingMaterialUpdate?;
|
|
25
|
+
private _pendingGeometryUpdates;
|
|
26
|
+
private _needsUpdateMeshData;
|
|
27
|
+
private _needsUpdateMeshMembership;
|
|
28
|
+
private _needsRefitTLAS;
|
|
29
|
+
private _dirtyTransformMeshes;
|
|
30
|
+
private _dirtyColorMeshes;
|
|
31
|
+
private _tlas?;
|
|
32
|
+
private _bvhData?;
|
|
33
|
+
private _instancesData?;
|
|
34
|
+
private _materialIndexData?;
|
|
35
|
+
private _meshSnapshot;
|
|
36
|
+
private _snapshotByMesh;
|
|
37
|
+
private _needsUpdateAnalyticLightsBuffer;
|
|
38
|
+
private _debugBvhData?;
|
|
39
|
+
private _lightTex;
|
|
40
|
+
private _iesProfileTex;
|
|
41
|
+
private _iesProfileColumns;
|
|
42
|
+
private _iesProfileTexelOffsets;
|
|
43
|
+
private _openPbrEnergyLut;
|
|
44
|
+
private _envMap;
|
|
45
|
+
private _envMapDistribution;
|
|
46
|
+
private _envImageSource?;
|
|
47
|
+
private _backgroundTex;
|
|
48
|
+
private _hasEnvMap;
|
|
49
|
+
private _hasBackground;
|
|
50
|
+
private _groundedBackgroundParams;
|
|
51
|
+
private _groundedBackgroundCenter;
|
|
52
|
+
private _bounces;
|
|
53
|
+
private _bevelSamples;
|
|
54
|
+
private _clamping?;
|
|
55
|
+
private _samplingCode;
|
|
56
|
+
private _sequenceSeed;
|
|
57
|
+
private _zLogSPP;
|
|
58
|
+
private _positionBufferTex;
|
|
59
|
+
private _normalBufferTex;
|
|
60
|
+
private _colorBufferTex;
|
|
61
|
+
private _tangentBufferTex;
|
|
62
|
+
private _uvBufferTex;
|
|
63
|
+
private _uv1BufferTex;
|
|
64
|
+
private _bvhBufferTex;
|
|
65
|
+
private _instancesBufferTex;
|
|
66
|
+
private _matIndexBufferTex;
|
|
67
|
+
private _hasTransmission;
|
|
68
|
+
private _hasAlpha;
|
|
69
|
+
private _invalid;
|
|
70
|
+
private _transmissiveAlphaMin;
|
|
71
|
+
private _mainPass;
|
|
72
|
+
private _shadowCatcherPass;
|
|
73
|
+
private _viewProjInv;
|
|
74
|
+
private _apertureRadius;
|
|
75
|
+
private _focusDistance;
|
|
76
|
+
private _tracePasses;
|
|
77
|
+
private readonly _depthPass;
|
|
78
|
+
private readonly _depthAbort;
|
|
79
|
+
private _depthAspect;
|
|
80
|
+
private _hasShadowCatcher;
|
|
81
|
+
private _spectral;
|
|
82
|
+
constructor(renderer: WebGLRenderer);
|
|
83
|
+
createPass(clear: boolean, tile: {
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
width: number;
|
|
87
|
+
height: number;
|
|
88
|
+
}, disableShadowCatcher?: boolean): void;
|
|
89
|
+
getOutput(label: 'color' | 'albedo' | 'normal' | 'moments' | 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'): WebGLTexture2D;
|
|
90
|
+
setBounce(bounce: number): boolean;
|
|
91
|
+
setClamping(clamping?: number): boolean;
|
|
92
|
+
setBevelSamples(samples: number): boolean;
|
|
93
|
+
private _setEnvMap;
|
|
94
|
+
setBackground(background?: SceneBackground): void;
|
|
95
|
+
setTransmissiveOutputAlphaMin(transmissiveAlphaMin: number): boolean;
|
|
96
|
+
setMeshes(meshes: Mesh[], update?: {
|
|
97
|
+
transforms?: readonly Mesh[];
|
|
98
|
+
colors?: readonly Mesh[];
|
|
99
|
+
geometries?: readonly Geometry[];
|
|
100
|
+
materials?: readonly OpenPBRMaterial[];
|
|
101
|
+
}): boolean;
|
|
102
|
+
setTextureAtlasBudget(maxBytes: number): boolean;
|
|
103
|
+
getDebugBVHData(): {
|
|
104
|
+
buffer: ArrayBuffer;
|
|
105
|
+
};
|
|
106
|
+
getDiagnostics(): {
|
|
107
|
+
textureAtlas: import("./MaterialTable.js").TextureAtlasStats | undefined;
|
|
108
|
+
};
|
|
109
|
+
private _updateMeshData;
|
|
110
|
+
private _updateMaterialConstants;
|
|
111
|
+
private _updateMeshMembership;
|
|
112
|
+
private _updateGeometryData;
|
|
113
|
+
private _updateMeshColors;
|
|
114
|
+
private _refitMeshInstances;
|
|
115
|
+
private _updateMaterialData;
|
|
116
|
+
setLights(lights: SceneLight[]): void;
|
|
117
|
+
private _getViewProjInv;
|
|
118
|
+
setCamera(camera: Camera): void;
|
|
119
|
+
cameraChanged(camera: Camera): boolean;
|
|
120
|
+
setSize(width: number, height: number, targetAspect?: number): void;
|
|
121
|
+
setJitter(x: number, y: number): void;
|
|
122
|
+
releaseTarget(target: object): void;
|
|
123
|
+
getTargetMemoryBytes(target: object): number;
|
|
124
|
+
useTarget(target: object): void;
|
|
125
|
+
setQuality(options: {
|
|
126
|
+
bounces: number;
|
|
127
|
+
bevel: boolean;
|
|
128
|
+
dispersionWavelengths: 1 | 3;
|
|
129
|
+
directLightCandidates: number;
|
|
130
|
+
}): void;
|
|
131
|
+
setWavelength(wavelength: number): void;
|
|
132
|
+
setSampleCount(sampleCount: number): void;
|
|
133
|
+
isInvalid(): boolean;
|
|
134
|
+
hasShadowCatcher(): boolean;
|
|
135
|
+
hasDispersion(): boolean;
|
|
136
|
+
prepare(): void;
|
|
137
|
+
setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed?: number): boolean;
|
|
138
|
+
setSampleSequenceOffset(_offset: number): void;
|
|
139
|
+
readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined>;
|
|
140
|
+
dispose(): void;
|
|
141
|
+
}
|
|
142
|
+
export default WebGLRayTracePass;
|