@meimu/mutracer 0.1.5 → 0.3.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/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +36 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +6 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +36 -3
- package/lib/settings/render.js +4 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +20 -7
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {DisplayPostProcess} from './DisplayPostProcess.js';\nimport {customDenoiseLayersMain, customDenoiseCoverageMain} from './wgsl/customDenoise.wgsl.js';\nimport { WGPUCanvasSurface } from './WGPUCanvasSurface.js';\nimport { WGPUScratchBuffer } from './WGPUScratchBuffer.js';\nimport { WGPUScratchTexture } from './WGPUScratchTexture.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport { textureBytes } from './gpuMemory.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport {\n composeMain,\n composeDefine,\n compositeDenoiseOutputMain,\n compositeDenoiseDisplayMain,\n linearToSrgbDefine\n} from './wgsl/compose.frag.wgsl.js';\nimport halton from './halton.js';\nimport { makeTileRender, makeTileRenderWithPredict } from './TileRender.js';\nimport { ToneMappingParams } from './RenderingPipeline.js';\nimport { DisplayChannel } from './RenderingPipeline.js';\nimport { ColorRGB } from '../types.js';\nimport { WGPURayTraceOutputPass } from './WGPURayTraceOutput.js';\nimport { vec3 } from '../math.js';\n\nimport WGPUBloomPass from './WGPUBloomPass.js';\nimport { WGPUComputePass } from './WGPUComputePass.js';\nimport WGPUHDRPeakMeter from './WGPUHDRPeakMeter.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport type { DenoiserHandle, OIDNWeb, OIDNWebGPUData, OIDNWebGPUOutputData } from './denoiser.js';\nimport { WGPUJNLMDenoisePass } from './WGPUJNLMDenoiser.js';\n\nexport const oidnAlbedoSrgbEncodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet raw = textureLoad(in_albedo, vec2u(globalId.xy), 0);\nlet linear = clamp(raw.rgb, vec3f(0.0), vec3f(1.0));\nlet encoded = select(\n 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055,\n 12.92 * linear,\n linear <= vec3f(0.0031308)\n);\nout_albedo[index] = vec4f(encoded, raw.a);\n`;\n\nexport const oidnAlbedoSrgbDecodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet filtered = in_albedo[index];\nlet encoded = clamp(filtered.rgb, vec3f(0.0), vec3f(1.0));\nlet linear = select(\n pow((encoded + 0.055) / 1.055, vec3f(2.4)),\n encoded / 12.92,\n encoded <= vec3f(0.04045)\n);\nvar result = linear;\nlet surfaceCoverage = textureLoad(in_rawAlbedo, vec2i(globalId.xy), 0).a;\nif (preserveSurfaceTexture != 0u) {\n // Primary albedo retains the accumulated surface texture. Do not ask the\n // auxiliary network to reconstruct its high-frequency texture.\n // Retain its filtered result across normal/coverage discontinuities.\n let pixel = vec2i(globalId.xy);\n let center = textureLoad(in_rawNormal, pixel, 0);\n let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));\n var discontinuity = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n let neighbor = textureLoad(in_rawNormal,\n clamp(pixel + vec2i(x, y), vec2i(0), imageSize - 1), 0);\n let nn = normalize(neighbor.rgb * 2.0 - 1.0 + vec3f(1e-8));\n discontinuity = max(discontinuity,\n max(1.0 - dot(n, nn), abs(center.a - neighbor.a)));\n }\n }\n let edgeWeight = smoothstep(0.02, 0.1, discontinuity);\n let raw = clamp(textureLoad(in_rawAlbedo, pixel, 0).rgb,\n vec3f(0.0), vec3f(1.0));\n result = mix(raw, linear, edgeWeight);\n}\nout_albedo[index] = vec4f(result, surfaceCoverage);\n`;\n\nexport const oidnNormalSanitizeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nout_normal[index] = vec4f(clamp(in_normal[index].rgb, vec3f(0.0), vec3f(1.0)), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 2\n });\n const resolveBuffer = device.createBuffer({\n size: querySet.count * 8,\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n });\n const resultBuffer = device.createBuffer({\n size: resolveBuffer.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n return {\n querySet,\n resolveBuffer,\n resultBuffer\n };\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nfunction makeWGPUAccumulationTarget(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n device: GPUDevice,\n rayTracePass: WGPURayTracePass,\n surface: WGPUCanvasSurface,\n scratch: ScratchPool,\n customJobs: Set<Promise<unknown>>\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let lastGpuTraceTiming:\n | {\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let diagnosticsReadbackPromise: Promise<void> = Promise.resolve();\n\n let isFirstFrame = true;\n let disposed = false;\n\n let needsUpdatePredicting = true;\n let isPredictingFrame = false;\n\n let renderWidth = 0;\n let renderHeight = 0;\n let screenWidth = 0;\n let screenHeight = 0;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let pendingFlatBackground = [0, 0, 0, 0];\n let resolvedFlatBackground = [0, 0, 0, 0];\n let presentationTexture: GPUTexture | undefined;\n let presentationDenoised = false;\n const displayPostProcess = new DisplayPostProcess(device);\n let denoiseValid = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let hdrOutputRequested = false;\n let hdrOutputActive = false;\n let output: DisplayChannel = 'final';\n let shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n\n let denoisedBuffer: GPUBuffer | undefined;\n let denoisedTexture: GPUTexture | undefined;\n let denoisedDisplayLinear = false;\n let denoisedHDR = false;\n let activeCustomController: AbortController | undefined;\n let jnlmPass: WGPUJNLMDenoisePass | undefined;\n let denoiseGeneration = 0;\n let preserveDenoisedOutput = false;\n\n let activeOidnPhase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n\n function cancelDenoise() {\n activeCustomController?.abort(); activeCustomController = undefined;\n denoiseGeneration++;\n const activePhase = activeOidnPhase;\n activeOidnPhase = undefined;\n if (activePhase) {\n try {\n activePhase.abort();\n } finally {\n activePhase.finish();\n }\n }\n }\n\n function runOIDNPhase(\n generation: number,\n execute: (\n finish: () => void,\n fail: (reason: unknown) => void\n ) => () => void\n ): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let phase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n const finish = () => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n resolve();\n };\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n reject(reason);\n };\n\n try {\n const abort = execute(finish, fail);\n phase = { abort, finish };\n if (settled) return;\n if (generation !== denoiseGeneration) {\n abort();\n finish();\n return;\n }\n activeOidnPhase = phase;\n } catch (error) {\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n settled = true;\n reject(error);\n }\n });\n }\n\n const ctx = surface.context;\n\n const timeQuery = device.features.has('timestamp-query')\n ? scratch.get('trace timing', () => {\n const query = createTimeQuery(device);\n return {\nquery, getMemoryBytes: () => query ? query.resolveBuffer.size + query.resultBuffer.size : 0,\n dispose() { query?.querySet.destroy(); query?.resolveBuffer.destroy(); query?.resultBuffer.destroy(); }\n};\n }).query\n : undefined;\n const tileRender = makeTileRender();\n const tileRenderWithPredict = timeQuery ? makeTileRenderWithPredict() : undefined;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n\n function invalidateTilePrediction() {\n tileTimingGeneration++;\n tileRenderWithPredict?.needsUpdatePredicting();\n lastGpuTraceTiming = undefined;\n // A changed render configuration needs fresh timing. Refresh\n // its estimator without submitting a hidden probe in that mode.\n needsUpdatePredicting = offlineSamplesPerBatch === 0;\n isPredictingFrame = false;\n }\n\n const zero = scratch.get('empty texture', () => {\n const texture = device.createTexture({ label: 'Shared empty image', size: { width: 1, height: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING });\n return { texture, getMemoryBytes: () => 4, dispose: () => texture.destroy() };\n }).texture;\n const rayTraceOutputPass = new WGPURayTraceOutputPass(device, zero);\n const getFrameInput = (label: 'color' | 'albedo' | 'normal' | 'shadowCatcher' | 'foreground' | 'catcherBackground') =>\n rayTraceOutputPass.getOutput(label);\n let bloomPass: WGPUBloomPass | undefined;\n\n // Primary misses on a flat colour background are blank: they add the\n // background radiance but no surface hit, and the normalized colour divides\n // by hits only. Raw readback restores the per-sample average, as on WebGL.\n // Fully blank pixels are already divided by the sample count.\n const rawOutputPass = scratch.get('rawOutputPass', () => new WGPUFullQuadPass('raw output', device, {\n textureWillBeRead: true,\n inputs: ['colorTex', 'coverageTex'],\n outputs: ['color'],\n uniforms: [{ label: 'flatBackgroundColor', type: 'vec4f', data: [0, 0, 0, 0] }],\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\nif (flatBackgroundColor.a > 0.5 && coverage > 0.0) {\n color = vec4f(color.rgb * coverage, color.a);\n}\noutput.color = color;\n`\n }));\n\n const readbackPass = scratch.get('readbackPass', () => new WGPUFullQuadPass('output readback', device, {\n textureWillBeRead: true, inputs: ['inputTex'], outputs: ['color'],\n fsMain: 'output.color = load_inputTex(uv, 0);'\n }));\n readbackPass.setOutputParams({ color: { format: 'rgba32float' } });\n\n let hdrPeakMeter: WGPUHDRPeakMeter | undefined;\n const composePass = scratch.get('composePass', () => new WGPUFullQuadPass('compose', device, {\n textureWillBeRead: true,\n fsMain: composeMain + compositeDenoiseOutputMain,\n fsDefine: composeDefine,\n uniforms: [\n {\n label: 'exposure',\n type: 'f32',\n data: exposure\n },\n {\n label: 'toneMappingParams',\n type: 'vec2f',\n data: [toneMappingMode, vignette]\n },\n {\n label: 'hdrOutputEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'colorGradingParams',\n type: 'vec4f',\n data: [contrast, saturation, temperature, tint]\n },\n {\n label: 'flatBackgroundColor',\n type: 'vec4f',\n data: [0, 0, 0, 0]\n },\n {\n label: 'shadowCatcherColor',\n type: 'vec3f',\n data: shadowCatcherColor\n },\n {\n label: 'shadowCatcherAlpha',\n type: 'f32',\n data: shadowCatcherAlpha\n },\n {\n label: 'shadowCatcherEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'bloomIntensity',\n type: 'f32',\n data: 0.25\n }\n ],\n outputs: ['color', 'denoiseColor', 'denoiseAlbedo'],\n inputs: [\n 'colorTex',\n 'foregroundTex',\n 'catcherBackgroundTex',\n 'flatBackgroundMaskTex',\n 'shadowCatcherTex',\n 'bloomTex'\n ]\n }));\n let composeColorFormat: GPUTextureFormat = 'rgba8unorm';\n composePass.setOutputParams({\n color: {\n format: composeColorFormat\n },\n denoiseColor: { format: 'rgba32float' },\n denoiseAlbedo: { format: 'rgba8unorm' }\n });\n const compositeDenoiseDisplayPass = scratch.get('compositeDenoiseDisplayPass', () => new WGPUFullQuadPass(\n 'OIDN composed display', device, {\n textureWillBeRead: true,\n fsMain: compositeDenoiseDisplayMain,\n fsDefine: linearToSrgbDefine,\n uniforms: [\n { label: 'hdrOutputEnabled', type: 'f32', data: 0 },\n { label: 'denoisedAlpha', type: 'f32', data: 0 }\n ],\n outputs: ['color'], inputs: ['colorTex', 'composedTex']\n }\n ));\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: 'rgba8unorm' } });\n const auxiliaryPassUniforms = [\n {\n label: 'imageSize',\n type: 'vec2i' as const,\n data: new Int32Array([1, 1])\n }\n ];\n const oidnAlbedoEncodePass = scratch.get('oidnAlbedoEncodePass', () => new WGPUComputePass<'albedo', 'albedo'>(\n 'OIDN albedo sRGB encode',\n device,\n {\n inputs: ['albedo'],\n outputs: ['albedo'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnAlbedoSrgbEncodeMain\n }\n ));\n const oidnAlbedoDecodePass = scratch.get('oidnAlbedoDecodePass', () => new WGPUComputePass<'albedo' | 'rawAlbedo' | 'rawNormal', 'albedo'>(\n 'OIDN albedo sRGB decode',\n device,\n {\n inputs: ['albedo', 'rawAlbedo', 'rawNormal'],\n outputs: ['albedo'],\n uniforms: [...auxiliaryPassUniforms, {\n label: 'preserveSurfaceTexture', type: 'u32', data: 0\n }],\n csMain: oidnAlbedoSrgbDecodeMain\n }\n ));\n const oidnNormalSanitizePass = scratch.get('oidnNormalSanitizePass', () => new WGPUComputePass<'normal', 'normal'>(\n 'OIDN normal sanitize',\n device,\n {\n inputs: ['normal'],\n outputs: ['normal'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnNormalSanitizeMain\n }\n ));\n oidnAlbedoEncodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnAlbedoDecodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnNormalSanitizePass.setOutputParams({ normal: { channels: 4 } });\n const outputPass = scratch.get('outputPass', () => new WGPUFullQuadPass('output', device, {\n fsMain: /* wgsl */ `\nlet colorUv = min(\n vec2i(uv2 * vec2f(colorTexRegion())),\n vec2i(colorTexRegion()) - vec2i(1)\n);\nvar color = load_colorTex(colorUv, 0);\ncolor = vec4(color.rgb * color.a, color.a);\noutput.color = color;\n`,\n outputs: ['color'],\n inputs: ['colorTex']\n }));\n outputPass.setOutputParams({\n color: {\n format: 'rgba8unorm'\n }\n });\n\n function _present(encoder: GPUCommandEncoder, texture: GPUTexture) {\n outputPass.setRenderToScreen(\n ctx.getCurrentTexture(),\n surface.format\n );\n outputPass.createPass(encoder, {\n colorTex: texture\n });\n }\n\n function _updateSeed(width: number, height: number) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n // Each ray includes a .5 pixel center, so its Halton jitter in [-.5,.5)\n // becomes a sub-pixel offset in [0,1).\n const jitterX = halton(sequenceSample, 2) - 0.5;\n const jitterY = halton(sequenceSample, 3) - 0.5;\n rayTracePass.setJitter(jitterX / width, jitterY / height);\n }\n\n function sample(clear: boolean, tiles: [number, number]) {\n const encoder = device.createCommandEncoder();\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n _updateSeed(renderWidth, renderHeight);\n const activeTimeQuery = timeQuery;\n const isUnmapped = activeTimeQuery?.resultBuffer.mapState === 'unmapped';\n rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n if (activeTimeQuery) {\n encoder.resolveQuerySet(\n activeTimeQuery.querySet,\n 0,\n activeTimeQuery.querySet.count,\n activeTimeQuery.resolveBuffer,\n 0\n );\n if (isUnmapped) {\n encoder.copyBufferToBuffer(\n activeTimeQuery.resolveBuffer,\n 0,\n activeTimeQuery.resultBuffer,\n 0,\n activeTimeQuery.resultBuffer.size\n );\n }\n }\n\n // TODO if encoder is not submitted. The uniform buffer will be replaced\n device.queue.submit([encoder.finish()]);\n\n const submittedTileRenderWithPredict = tileRenderWithPredict;\n const submittedTimingGeneration = tileTimingGeneration;\n if (activeTimeQuery && isUnmapped && submittedTileRenderWithPredict) {\n\n const submittedTileCount = tiles[0] * tiles[1];\n diagnosticsReadbackPromise = activeTimeQuery.resultBuffer\n .mapAsync(GPUMapMode.READ).then(() => {\n const mappedRange = activeTimeQuery.resultBuffer.getMappedRange();\n const times = new BigInt64Array(mappedRange, 0, 2);\n const traceTime = Math.max(Number(times[1] - times[0]) / 1_000_000, 0.1);\n // A readback may finish after scene preparation or a mode switch.\n // It must not overwrite throughput learned for the current scene.\n const timingIsCurrent =\n !disposed && submittedTimingGeneration === tileTimingGeneration &&\n !isFirstFrame;\n if (timingIsCurrent) {\n lastGpuTraceTiming = {\n tileTimeMs: traceTime,\n tileTimePerSampleMs: traceTime,\n estimatedFullFrameTimeMs: traceTime * submittedTileCount,\n tileCount: submittedTileCount\n };\n submittedTileRenderWithPredict.setLastTraceTime(traceTime);\n }\n activeTimeQuery.resultBuffer.unmap();\n\n }).catch(() => {\n if (activeTimeQuery.resultBuffer.mapState === 'mapped') {\n activeTimeQuery.resultBuffer.unmap();\n }\n });\n }\n }\n\n function clearDenoisedOutput() { denoiseValid = false; }\n\n function invalidateCompositeDenoise() {\n if (!denoisedDisplayLinear) return;\n cancelDenoise();\n denoiseValid = false;\n }\n\n function prepareDenoisedTexture(\n encoder: GPUCommandEncoder,\n buffer: GPUBuffer | undefined,\n texture: GPUTexture | undefined\n ) {\n if (!buffer) {\n return undefined;\n }\n const conversion = scratch.get('denoised conversion', () => new WGPUScratchTexture(device));\n texture = conversion.get(renderWidth, renderHeight); conversion.setRegion(renderWidth, renderHeight);\n encoder.copyBufferToTexture(\n { buffer: buffer!, bytesPerRow: 16 * renderWidth },\n {\n texture: texture\n },\n {\n width: renderWidth,\n height: renderHeight,\n depthOrArrayLayers: 1\n }\n );\n return texture;\n }\n\n function copyDenoisedOutput(\n encoder: GPUCommandEncoder,\n output: OIDNWebGPUOutputData,\n target: GPUBuffer | undefined\n ) {\n const byteLength = output.width * output.height * 16;\n if (!target || target.size !== byteLength) {\n target?.destroy();\n target = device.createBuffer({\n label: 'Persistent denoised output',\n size: byteLength,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n });\n }\n encoder.copyBufferToBuffer(output.data, 0, target, 0, byteLength);\n return target;\n }\n\n function prepareComposition() {\n composePass.setSize(renderWidth, renderHeight);\n composePass.setOutputParams({ color: { format: composeColorFormat }, denoiseColor: { format: 'rgba32float' }, denoiseAlbedo: { format: 'rgba8unorm' } });\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [contrast, saturation, temperature, tint]);\n composePass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n composePass.setUniform('shadowCatcherColor', shadowCatcherColor);\n composePass.setUniform('shadowCatcherAlpha', shadowCatcherAlpha);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', denoiseValid && denoisedDisplayLinear ? +rayTracePass.needsDenoiseAlpha() : 0);\n }\n function snapshotInput(encoder: GPUCommandEncoder, key: string, texture: GPUTexture, exact = false) {\n const buffer = scratch.get(key, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, exact);\n encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow: renderWidth * 16 }, { width: renderWidth, height: renderHeight });\n return buffer;\n }\n function copyGuide(key: string, input: GPUTexture, exact = false) {\n const pass = scratch.get(key, () => new WGPUComputePass(`${key} copy`, device, {\n inputs: ['guide'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: 'if (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) {return;} out_color[globalId.x + globalId.y * u32(imageSize.x)] = textureLoad(in_guide, vec2i(globalId.xy), 0);'\n }));\n pass.setOutputParams({ color: { channels: 4 } });\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n const output = exact ? scratch.get(`${key} buffer`, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, true) : undefined;\n const encoder = device.createCommandEncoder(); pass.createPass(encoder, { guide: { texture: input, channels: 4 } }, output ? {color: output} : undefined); device.queue.submit([encoder.finish()]);\n return output ?? pass.getOutput('color');\n }\n\n function drawPostProcess(\n encoder: GPUCommandEncoder,\n _forceNeedsDenoise?: boolean,\n resolve = false\n ) {\n displayPostProcess.reset();\n if (resolve) {\n resolvedSamples = sampleCount;\n resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();\n resolvedFlatBackground = pendingFlatBackground.slice();\n }\n composePass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n if (resolvedSamples < 1) return;\n prepareComposition();\n if (denoiseValid) denoisedTexture = prepareDenoisedTexture(\n encoder,\n denoisedBuffer,\n denoisedTexture\n );\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(encoder, rayTracePass.getOutputBuffer(), resolvedHasShadowCatcher);\n }\n\n composePass.setUniform(\n 'shadowCatcherEnabled',\n +resolvedHasShadowCatcher\n );\n\n let foregroundTexture = getFrameInput(\n resolvedHasShadowCatcher ? 'foreground' : 'color'\n );\n const colorTexture = denoiseValid && denoisedHDR && denoisedTexture ? denoisedTexture : getFrameInput('color');\n let catcherBackgroundTexture = getFrameInput('catcherBackground');\n if (denoiseValid && denoisedHDR && denoisedTexture && resolvedHasShadowCatcher) {\n const layers = scratch.get('custom HDR layers', () => new WGPUFullQuadPass('Custom HDR layers', device, {\n textureWillBeRead: true,\n inputs: ['originalTex', 'filteredTex', 'foregroundTex', 'backgroundTex'],\n outputs: ['foreground', 'background'], fsMain: customDenoiseLayersMain\n }));\n layers.setOutputParams({foreground: {format: 'rgba32float'}, background: {format: 'rgba32float'}});\n layers.setSize(renderWidth, renderHeight);\n layers.createPass(encoder, {originalTex: getFrameInput('color'), filteredTex: denoisedTexture,\n foregroundTex: foregroundTexture, backgroundTex: catcherBackgroundTexture});\n foregroundTexture = layers.getOutput('foreground');\n catcherBackgroundTexture = layers.getOutput('background');\n }\n const bloomEnabled = bloomIntensity > 0.0;\n // Progressive accumulation refreshes bloom every ten samples.\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}/${+(denoiseValid && denoisedHDR)}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let bloomIntensityToUpdate = bloomIntensity;\n if (needsUpdateBloom) {\n if (!bloomPass) {\n bloomPass = scratch.get('bloom', () => new WGPUBloomPass(device));\n bloomPass.setSize(renderWidth, renderHeight);\n }\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n composePass.createPass(encoder, {\n colorTex: colorTexture,\n foregroundTex: foregroundTexture,\n catcherBackgroundTex: catcherBackgroundTexture,\n flatBackgroundMaskTex: getFrameInput('albedo'),\n shadowCatcherTex: getFrameInput('shadowCatcher'),\n // Use color texture as placeholder\n bloomTex: bloomEnabled && bloomPass ? bloomPass.getOutput() : colorTexture\n });\n if (denoiseValid && !denoisedHDR && denoisedDisplayLinear && denoisedTexture) {\n compositeDenoiseDisplayPass.createPass(encoder, {\n colorTex: denoisedTexture,\n composedTex: composePass.getOutput('denoiseColor')\n });\n }\n let displayTexture =\n (denoiseValid && denoisedBuffer ? (denoisedHDR ? composePass.getOutput('color') : denoisedDisplayLinear\n ? compositeDenoiseDisplayPass.getOutput('color') : denoisedTexture) : undefined) ||\n composePass.getOutput('color');\n const activeHDRPeakMeter = hdrOutputActive\n ? (hdrPeakMeter ??= scratch.get('hdrPeak', () => new WGPUHDRPeakMeter(device)))\n : undefined;\n const hdrPeakReadbackSubmitted =\n activeHDRPeakMeter?.encode(\n encoder,\n displayTexture,\n renderWidth,\n renderHeight\n ) ?? false;\n\n if (output === 'normal' || output === 'albedo') {\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = getFrameInput('shadowCatcher');\n }\n\n if (displayTexture.width < renderWidth || displayTexture.height < renderHeight) {\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: displayTexture });\n displayTexture = readbackPass.getOutput('color');\n }\n // Keep the completed denoise visible until its replacement is ready.\n if (!(preserveDenoisedOutput && output === 'final' && !denoiseValid && presentationDenoised)) {\n const width = renderWidth, height = renderHeight;\n if (!presentationTexture || presentationTexture.width !== width || presentationTexture.height !== height || presentationTexture.format !== displayTexture.format) {\n const previous = presentationTexture;\n presentationTexture = device.createTexture({\nlabel: 'Render complete image', size: { width, height }, format: displayTexture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC\n});\n if (previous) void device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());\n }\n encoder.copyTextureToTexture({ texture: displayTexture }, { texture: presentationTexture }, { width, height });\n presentationDenoised = output === 'final' && denoiseValid;\n }\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n if (hdrPeakReadbackSubmitted) {\n void activeHDRPeakMeter?.resolve();\n }\n }\n\n function trace(camera: Camera, maxSamples: number) {\n // A call to draw means accumulation has been invalidated. Cancel OIDN\n // before checking shader compilation: pipeline-affecting parameter changes\n // otherwise leave the previous asynchronous denoise alive while resources\n // and bind groups are being replaced.\n cancelDenoise();\n\n if (rayTracePass.isCompilingShader()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\n }\n\n rayTracePass.updatePipeline();\n\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Keep the last completed denoise visible while a static while-converging batch\n // accumulates, including the incomplete first sample after a scene edit.\n if (!preserveDenoisedOutput || isFirstFrame) {\n clearDenoisedOutput();\n }\n if (isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n\n // Never enter a waiting prediction state while the shared timestamp\n // buffer is still being mapped. Render normally and retry the probe at an\n // accumulation restart; a delayed probe must not discard visible samples.\n // The probe itself is also non-blocking: if readback fails or\n // is superseded, the renderer keeps using the conservative tile seed.\n if (\n offlineSamplesPerBatch === 0 &&\n resetAccumulation &&\n tileRenderWithPredict &&\n needsUpdatePredicting &&\n timeQuery?.resultBuffer.mapState === 'unmapped'\n ) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = true;\n tileRenderWithPredict.needsUpdatePredicting();\n needsUpdatePredicting = false;\n }\n\n const frameSampleCount = sampleCount;\n _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + Math.max(offlineSamplesPerBatch, 1)\n );\n do {\n let {\n xIndex,\n yIndex,\n columns,\n rows,\n isFirstTile,\n isLastTile,\n samplesPerFrame\n } = (tileRenderWithPredict || tileRender).nextTile(elapsedTileTime);\n\n rayTraceOutputPass.setSampleTileGrid(columns, rows);\n\n if (offlineSamplesPerBatch > 0 && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!allowMultipleSamplesPerFrame) {\n samplesPerFrame = 1;\n }\n\n if (columns * rows === 1) {\n rayTracePass.setSampleTiles(1, 1, 0, 0);\n let samplesSubmitted = 0;\n while (\n samplesSubmitted < samplesPerFrame &&\n sampleCount < renderSampleTarget &&\n sampleCount < batchTarget\n ) {\n sample(sampleCount === 0, [1, 1]);\n sampleCount++;\n samplesSubmitted++;\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (isLastTile) sampleCount++;\n }\n } while (\n offlineSamplesPerBatch > 0 &&\n sampleCount < batchTarget &&\n sampleCount < renderSampleTarget\n );\n\n // Not displaying on screen for prediciting frame.\n if (isPredictingFrame) {\n // This hidden timing probe has not resolved the OIDN input textures.\n // Exclude it from progressive samples so a 1spp target cannot denoise\n // stale inputs, and clear its accumulation on the next visible sample.\n sampleCount = 0;\n return false;\n }\n\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\n\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n }\n\n return false;\n }\n\n function roundUp(a: number, b: number) {\n return Math.ceil(a / b) * b;\n }\n\n function _applyRenderResolution() {\n if (!screenWidth || !screenHeight) return;\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextRenderWidth = roundUp(\n Math.max(1, Math.round(screenWidth * scale)),\n 16\n );\n const nextRenderHeight = roundUp(\n Math.max(1, Math.round(screenHeight * scale)),\n 16\n );\n if (nextRenderWidth === renderWidth && nextRenderHeight === renderHeight) {\n rayTracePass.setSize(nextRenderWidth, nextRenderHeight, screenWidth / screenHeight);\n return;\n }\n\n // OIDN retains the ray-trace output textures supplied at the start of a\n // tile sequence. Stop every phase (including Promise-chained follow-ups)\n // before those textures are replaced below.\n cancelDenoise();\n // Completed OIDN buffers use the previous image dimensions. Scene edits\n // may preserve them, but a resize must not copy them with the new stride.\n // The target retains its complete presentation texture through the resize.\n clearDenoisedOutput();\n tileTimingGeneration++;\n renderWidth = nextRenderWidth;\n renderHeight = nextRenderHeight;\n (tileRenderWithPredict || tileRender).setSize(renderWidth, renderHeight);\n // Projection follows the displayed canvas, independent of preview/texture alignment.\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n\n resolvedSamples = 0;\n // Resizing starts a fresh accumulation while retaining the previous presentation.\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n }\n\n function setSize(width: number, height: number) {\n if (width === screenWidth && height === screenHeight) {\n return;\n }\n screenWidth = width;\n screenHeight = height;\n invalidateTilePrediction();\n _applyRenderResolution();\n outputPass.setSize(screenWidth, screenHeight);\n isFirstFrame = true;\n }\n\n function synchronizeBackground(background?: SceneBackground) {\n const flatColor = Array.isArray(background) && background[3] >= 0.99999\n ? background\n : undefined;\n const flatBackgroundColor = flatColor\n ? [flatColor[0], flatColor[1], flatColor[2], 1]\n : [0, 0, 0, 0];\n pendingFlatBackground = flatBackgroundColor;\n }\n\n function setToneMappingParams(params: ToneMappingParams) {\n const newExposure = params.exposure ?? 1;\n const newToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const newContrast = params.contrast ?? 1;\n const newSaturation = params.saturation ?? 1;\n const newTemperature = params.temperature ?? 0;\n const newTint = params.tint ?? 0;\n const newVignette = params.vignette ?? 0;\n if (\n newExposure === exposure &&\n newToneMappingMode === toneMappingMode &&\n newContrast === contrast &&\n newSaturation === saturation &&\n newTemperature === temperature &&\n newTint === tint &&\n newVignette === vignette\n ) return false;\n invalidateCompositeDenoise();\n exposure = newExposure;\n toneMappingMode = newToneMappingMode;\n contrast = newContrast;\n saturation = newSaturation;\n temperature = newTemperature;\n tint = newTint;\n vignette = newVignette;\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [\n contrast,\n saturation,\n temperature,\n tint\n ]);\n return true;\n }\n\n function setHDROutputEnabled(enabled: boolean) {\n if (enabled === hdrOutputRequested) return false;\n invalidateCompositeDenoise();\n hdrOutputRequested = enabled;\n const wasActive = hdrOutputActive;\n\n hdrOutputActive = enabled && surface.supportsHDR;\n\n const nextComposeColorFormat: GPUTextureFormat = hdrOutputActive\n ? 'rgba16float'\n : 'rgba8unorm';\n if (nextComposeColorFormat !== composeColorFormat) {\n composeColorFormat = nextComposeColorFormat;\n composePass.setOutputParams({\n color: { format: composeColorFormat },\n denoiseColor: { format: 'rgba32float' },\n denoiseAlbedo: { format: 'rgba8unorm' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n composePass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n return wasActive !== hdrOutputActive;\n }\n\n function _startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n const scheduleFrame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback: FrameRequestCallback) =>\n setTimeout(\n () => callback(performance.now()),\n 0\n ) as unknown as number;\n scheduleFrame(() => {\n // TODO use timestamp from requestAnimationFrame may have negative value.\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n // Without GPU timestamps, discard the draw that follows a scene\n // update instead of feeding its preparation/compilation time back.\n elapsedTileTime = collectTileTiming ? elapsedFrameTime : undefined;\n }\n });\n }\n function _onPageVisiblilityChange() {\n if (typeof document !== 'undefined' && document.hidden) {\n pageLeaveTime = performance.now();\n } else {\n pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n }\n\n /** Runs the built-in JNLM filter on the current composed image. */\n function performJNLMDenoise(\n denoiser: JNLMDenoiser\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n\n jnlmPass ??= scratch.get('jnlm', () => new WGPUJNLMDenoisePass(device));\n const rayBuffers = rayTracePass.getOutputBuffer();\n const encoder = device.createCommandEncoder({ label: 'JNLM denoise' });\n const output = jnlmPass.encode(encoder, {\n width: renderWidth,\n height: renderHeight,\n accumulation: rayBuffers.shadowCatcher,\n normalAccumulation: rayBuffers.normal,\n color: composePass.getOutput('denoiseColor'),\n albedo: getFrameInput('albedo'),\n normal: getFrameInput('normal'),\n shadowCatcher: getFrameInput('shadowCatcher'),\n strength: denoiser.strength,\n shape: denoiser.shape\n });\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n { data: output, width: renderWidth, height: renderHeight },\n denoisedBuffer\n );\n denoisedDisplayLinear = true;\n denoiseValid = true;\n // The filter also smooths coverage, which carries catcher shadows and\n // transmissive alpha.\n compositeDenoiseDisplayPass.setUniform(\n 'denoisedAlpha', +rayTracePass.needsDenoiseAlpha()\n );\n drawPostProcess(encoder, false);\n return device.queue.onSubmittedWorkDone().then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n\n function performCustomDenoise(\n denoiser: import('../Render.js').Denoiser,\n schedule: import('../Render.js').DenoiseSchedule,\n signal?: AbortSignal\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n const controller = activeCustomController = new AbortController();\n const abort = () => controller.abort();\n signal?.addEventListener('abort', abort, {once: true});\n if (signal?.aborted) abort();\n const task = (async () => {\n if (controller.signal.aborted) return false;\n const color = copyGuide('Custom HDR input', getFrameInput('color'), true);\n const width = renderWidth, height = renderHeight;\n const albedo = copyGuide('Custom albedo', getFrameInput('albedo'), true);\n const normal = copyGuide('Custom normal', getFrameInput('normal'), true);\n const output = scratch.get('Custom output', () => new WGPUScratchBuffer(device)).get(width * height * 16, true);\n await denoiser.denoise({device, width, height, color, albedo, normal, output}, {signal: controller.signal, schedule});\n if (controller.signal.aborted || disposed || generation !== denoiseGeneration) return false;\n const coverage = scratch.get('custom coverage', () => new WGPUComputePass('Custom coverage', device, {\n inputs: ['filtered', 'original'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: customDenoiseCoverageMain\n }));\n coverage.setOutputParams({color: {channels: 4}});\n coverage.setSize(width, height); coverage.setUniform('imageSize', [width, height]);\n const finish = device.createCommandEncoder({label: 'Custom HDR result'});\n coverage.createPass(finish, {filtered: {buffer: output, channels: 4}, original: {buffer: color, channels: 4}});\n denoisedBuffer = copyDenoisedOutput(finish, {data: coverage.getOutput('color'), width, height}, denoisedBuffer);\n denoisedHDR = true; denoisedDisplayLinear = false; denoiseValid = true;\n drawPostProcess(finish, false);\n await device.queue.onSubmittedWorkDone();\n return !controller.signal.aborted && !disposed && generation === denoiseGeneration;\n })();\n customJobs.add(task);\n void task.finally(() => {\n customJobs.delete(task); signal?.removeEventListener('abort', abort);\n if (activeCustomController === controller) activeCustomController = undefined;\n }).catch(() => {});\n return task;\n }\n\n function performDenoise(\n attachedDenoiser: DenoiserHandle,\n alphaDenoiser: OIDNWeb | undefined,\n denoiseSchedule: 'converged' | 'progressive' | 'every-sample' = 'converged',\n signal?: AbortSignal\n ): Promise<boolean> {\n cancelDenoise();\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal);\n denoisedHDR = false;\n if (attachedDenoiser.kind === 'jnlm') return performJNLMDenoise(attachedDenoiser.denoiser);\n const denoiser: OIDNWeb = attachedDenoiser.denoiser;\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', 0);\n const generation = denoiseGeneration;\n\n const size = { width: renderWidth, height: renderHeight };\n const snapshotEncoder = device.createCommandEncoder();\n const colorInput = snapshotInput(snapshotEncoder, 'OIDN color input', composePass.getOutput('denoiseColor'));\n device.queue.submit([snapshotEncoder.finish()]);\n for (const pass of [oidnAlbedoEncodePass, oidnAlbedoDecodePass, oidnNormalSanitizePass]) {\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n }\n const convergingTileOptions = {\n ...(denoiseSchedule !== 'converged' ? {\n tileOverlap: 80,\n // Low-resolution interaction must finish as one low-latency frame;\n // otherwise continuous camera updates outrun a multi-tile denoise.\n // The settled full-resolution image uses bounded dynamic tiles so\n // 4K inference cannot allocate a whole-image U-Net activation set.\n wholeImage: denoiseSchedule === 'every-sample'\n } : {}),\n // A preview frame is one whole-image pass. Settled images can take many\n // tiles; oidn-web 0.5 runs those back to back by default, which starves\n // the page at 4K, so pace them to display frames instead.\n scheduling: denoiseSchedule === 'every-sample' ? 'event-loop' as const : 'animation-frame' as const\n };\n type AuxiliaryGuides = {\n albedo: OIDNWebGPUData;\n normal: OIDNWebGPUData;\n };\n\n async function denoiseAuxiliaryGuides(): Promise<\n AuxiliaryGuides | undefined\n > {\n const auxiliaryDenoisers = denoiser.auxiliaryDenoisers;\n // Prefilter sampled texture/normal detail for clean-aux weights. The\n // accumulated guides alone are not antialiased at silhouettes and\n // subpixel texture boundaries.\n if (!auxiliaryDenoisers) {\n return {\n albedo: {\n data: copyGuide('OIDN raw albedo', composePass.getOutput('denoiseAlbedo')),\n ...size\n },\n normal: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n }\n };\n }\n if (generation !== denoiseGeneration) return undefined;\n\n const encodeEncoder = device.createCommandEncoder();\n oidnAlbedoEncodePass.createPass(encodeEncoder, {\n albedo: {\n texture: composePass.getOutput('denoiseAlbedo'),\n channels: 4\n }\n });\n device.queue.submit([encodeEncoder.finish()]);\n\n let albedoOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.albedo.tileExecute({\n ...convergingTileOptions,\n color: {\n data: oidnAlbedoEncodePass.getOutput('albedo'),\n ...size\n },\n done(output) {\n albedoOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !albedoOutput) return undefined;\n\n const decodeEncoder = device.createCommandEncoder();\n oidnAlbedoDecodePass.setUniform('preserveSurfaceTexture', +false);\n oidnAlbedoDecodePass.createPass(decodeEncoder, {\n albedo: { buffer: albedoOutput.data, channels: 4 },\n rawAlbedo: { texture: composePass.getOutput('denoiseAlbedo'), channels: 4 },\n rawNormal: { texture: getFrameInput('normal'), channels: 4 }\n });\n device.queue.submit([decodeEncoder.finish()]);\n\n let normalOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.normal.tileExecute({\n ...convergingTileOptions,\n color: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n },\n done(output) {\n normalOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !normalOutput) return undefined;\n\n const normalEncoder = device.createCommandEncoder();\n oidnNormalSanitizePass.createPass(normalEncoder, {\n normal: { buffer: normalOutput.data, channels: 4 }\n });\n device.queue.submit([normalEncoder.finish()]);\n\n return {\n albedo: {\n data: oidnAlbedoDecodePass.getOutput('albedo'),\n ...size\n },\n normal: {\n data: oidnNormalSanitizePass.getOutput('normal'),\n ...size\n }\n };\n }\n\n function denoiseComposite(guides: AuxiliaryGuides): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n // Snapshot the complete raw composition; never feed a previous denoise\n // back into the network during progressive updates.\n return runOIDNPhase(generation, (finish, fail) =>\n denoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: colorInput, ...size },\n albedo: guides.albedo,\n normal: guides.normal,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n // Denoise alpha channel\n function denoiseComposed(): Promise<void> {\n if (!alphaDenoiser || generation !== denoiseGeneration) {\n return Promise.resolve();\n }\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: denoisedDisplayLinear ? compositeDenoiseDisplayPass.getOutput('color') : composePass.getOutput('color') });\n const alphaInput = snapshotInput(encoder, 'OIDN alpha input', readbackPass.getOutput('color'));\n device.queue.submit([encoder.finish()]);\n return runOIDNPhase(generation, (finish, fail) =>\n alphaDenoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: alphaInput, ...size },\n denoiseAlpha: true,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n // While-converging denoising keeps the previous complete frame (or the\n // fallback) visible while tiled inference is\n // running. Publishing the shared output buffer before its final\n // tile would expose uninitialized regions as black rectangles.\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n output,\n denoisedBuffer\n );\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n return denoiseAuxiliaryGuides()\n .then(async (guides) => {\n if (guides && generation === denoiseGeneration) {\n await denoiseComposite(guides);\n }\n })\n .then(() => {\n if (\n generation === denoiseGeneration &&\n rayTracePass.needsDenoiseAlpha()\n ) {\n return denoiseComposed();\n }\n })\n .then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', _onPageVisiblilityChange);\n }\n function dispose() {\n if (disposed) return;\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n _onPageVisiblilityChange\n );\n }\n disposed = true;\n tileTimingGeneration++;\n cancelDenoise();\n // Target outputs and timestamp readbacks can still be referenced by the\n // queue. Cancel inference now; retire all GPU-owned target resources after\n // both submitted work and the pending timestamp mapping have completed.\n void Promise.all([\n device.queue.onSubmittedWorkDone().catch(() => undefined),\n diagnosticsReadbackPromise\n ]).then(() => {\n rayTracePass.releaseTarget(targetKey);\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n if (renderWidth && renderHeight) rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateTiming: invalidateTilePrediction,\n invalidateDenoisedOutput() { cancelDenoise(); denoiseValid = false; preserveDenoisedOutput = false; },\n configure(settings: TraceSettings) {\n const timingKeys = ['bounces', 'bevel', 'bevelSamples', 'directLightCandidates', 'dispersionWavelengths', 'alphaBlendStrategy', 'samplingPattern', 'clamping', 'transmissiveOutputAlphaMin'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setMaxTiles(settings.maxTiles);\n },\n synchronizeBackground,\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) {\n return (lastGpuTraceTiming?.estimatedFullFrameTimeMs ?? elapsedFrameTime) <= timeBudgetMs;\n },\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n surface.configure(hdrOutputActive);\n const encoder = device.createCommandEncoder();\n outputPass.setSize(canvas.width, canvas.height);\n _present(encoder, displayPostProcess.output ?? presentationTexture);\n device.queue.submit([encoder.finish()]);\n },\n getMemory() {\n return {\nwidth: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey) + rayTraceOutputPass.getMemoryBytes() + textureBytes(presentationTexture) + displayPostProcess.getMemoryBytes() + (denoisedBuffer?.size ?? 0)\n};\n },\n isFirstFrame() {\n return isFirstFrame;\n },\n\n restartSamples() {\n // Input edits reset accumulation, not learned throughput. Re-arming a\n // hidden probe here starves continuously changing scenes of visible samples.\n tileTimingGeneration++;\n cancelDenoise();\n preserveDenoisedOutput = false;\n denoiseValid = false;\n presentationDenoised = false;\n resolvedSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n if (resolvedSamples < 1) return;\n if (kind === 'hdr') return getFrameInput('color');\n return displayPostProcess.output ?? presentationTexture;\n },\n applyPostProcesses(passes, render) {\n if (presentationTexture) displayPostProcess.run(presentationTexture, passes, render);\n },\n trace,\n drawPostProcess() {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, true);\n },\n performDenoise,\n cancelDenoise,\n setSize,\n setHDROutputEnabled,\n setToneMappingParams,\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n const image = displayPostProcess.output ?? presentationTexture;\n const width = image.width, height = image.height;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({ size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(width, height);\n readbackPass.createPass(encoder, { inputTex: image });\n encoder.copyTextureToBuffer({ texture: readbackPass.getOutput('color') }, { buffer, bytesPerRow }, { width, height });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * bytesPerRow / 4, y * bytesPerRow / 4 + width * 4), y * width * 4);\n return { width, height, data };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n async readOutput(kind) {\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const width = renderWidth, height = renderHeight;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({\n size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n const encoder = device.createCommandEncoder();\n const denoised = kind === 'denoised' && denoiseValid ? denoisedBuffer : undefined;\n if (kind === 'denoised' && !denoised) kind = 'hdr';\n const pass = kind === 'hdr' ? rawOutputPass : readbackPass;\n pass.setOutputParams({ color: { format: 'rgba32float' } });\n pass.setSize(width, height);\n if (denoised) {\n encoder.copyBufferToBuffer(denoised, 0, buffer, 0, width * height * 16);\n } else if (kind === 'hdr') {\n rawOutputPass.createPass(encoder, { colorTex: getFrameInput('color'), coverageTex: getFrameInput('albedo') });\n } else {\n readbackPass.createPass(encoder, { inputTex: getFrameInput(kind as 'albedo' | 'normal') });\n }\n if (!denoised) encoder.copyTextureToBuffer({ texture: pass.getOutput('color') }, { buffer, bytesPerRow }, { width, height, depthOrArrayLayers: 1 });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n const stride = denoised ? width * 4 : bytesPerRow / 4;\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * stride, y * stride + width * 4), y * width * 4);\n return { data, width, height };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n setOfflineRenderOptions(options) {\n const wasOffline = offlineSamplesPerBatch > 0;\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n if (offlineSamplesPerBatch > 0 && isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n if (offlineSamplesPerBatch > 0) needsUpdatePredicting = false;\n else if (wasOffline) invalidateTilePrediction();\n },\n setVarianceMoments(enabled: boolean) {\n rayTracePass.setVarianceMoments(enabled);\n },\n setAdaptiveSamplingTargets(targets) {\n rayTracePass.setAdaptiveSamplingTargets(targets);\n },\n prepareOfflineAdaptiveSampling(options) {\n return rayTracePass.prepareOfflineAdaptiveSampling(options);\n },\n\n getTotalSamplesRendered() {\n return sampleCount;\n },\n\n getDiagnostics() {\n return {\n ...rayTracePass.getDiagnostics(),\n hdrPresentation: {\n requested: hdrOutputRequested,\n active: surface.hdr,\n peakDisplayValue: surface.hdr\n ? hdrPeakMeter?.getPeakDisplayValue()\n : undefined\n },\n gpuTraceTiming: lastGpuTraceTiming\n };\n },\n\n async flushDiagnostics() {\n await device.queue.onSubmittedWorkDone();\n await diagnosticsReadbackPromise;\n },\n\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n threshold !== bloomThreshold ||\n intensity !== bloomIntensity ||\n radius !== bloomRadius;\n if (changed) invalidateCompositeDenoise();\n bloomThreshold = threshold;\n bloomIntensity = intensity;\n bloomRadius = radius;\n return changed;\n },\n\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n\n return changed;\n },\n\n setOnSampleRendered(\n cb: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void\n ) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWGPURenderTargets(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, options: WGPURenderingPipelineOptions = {}): RenderPipeline {\n const rayTracePass = new WGPURayTracePass(device);\n const customJobs = new Set<Promise<unknown>>();\n const scratch = new ScratchPool(work => {\n // A cancelled custom filter can keep submitting GPU work until its promise settles.\n // A custom callback can dispose synchronously, before its promise is recorded.\n // Observe leases after that callback returns so its borrowed inputs stay alive.\n void Promise.resolve().then(() => Promise.allSettled([...customJobs]))\n .then(() => device.queue.onSubmittedWorkDone()).catch(() => {}).then(work);\n });\n const surface = scratch.get('canvas', () => new WGPUCanvasSurface(canvas, device, options.presentationFormat ?? navigator.gpu.getPreferredCanvasFormat()));\n return makeRenderPipeline(rayTracePass, () => {\n const target = makeWGPUAccumulationTarget(canvas, device, rayTracePass, surface, scratch, customJobs);\n return target;\n }, false, scratch);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {hdrResolveWGSL} from './wgsl/compose.frag.wgsl.js';\nimport {oidnAuxiliaryDefine} from './wgsl/oidnAuxiliary.wgsl.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WGPUAov} from './WGPUAov.js';\nimport {aovMask} from './aov.js';\nimport {DisplayPostProcess} from './DisplayPostProcess.js';\nimport {customDenoiseLayersMain, customDenoiseCoverageMain} from './wgsl/customDenoise.wgsl.js';\nimport { WGPUCanvasSurface } from './WGPUCanvasSurface.js';\nimport { WGPUScratchBuffer } from './WGPUScratchBuffer.js';\nimport { WGPUScratchTexture } from './WGPUScratchTexture.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { GPUTraceQueue } from './GPUTraceQueue.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport { textureBytes } from './gpuMemory.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport type { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport type {MaterialTextureSelection} from './wgpuBindless.js';\nimport {\n composeMain,\n composeDefine,\n compositeDenoiseOutputMain,\n compositeDenoiseDisplayMain,\n linearToSrgbDefine\n} from './wgsl/compose.frag.wgsl.js';\nimport halton from './halton.js';\nimport { makeTileRender, makeTileRenderWithPredict } from './TileRender.js';\nimport type { ToneMappingParams } from './RenderingPipeline.js';\nimport type { DisplayChannel } from './RenderingPipeline.js';\nimport type { ColorRGB } from '../types.js';\nimport { WGPURayTraceOutputPass } from './WGPURayTraceOutput.js';\nimport { vec3 } from '../math.js';\n\nimport WGPUBloomPass from './WGPUBloomPass.js';\nimport { WGPUComputePass } from './WGPUComputePass.js';\nimport WGPUHDRPeakMeter from './WGPUHDRPeakMeter.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport type { DenoiserHandle, OIDNWeb, OIDNWebGPUData, OIDNWebGPUOutputData } from './denoiser.js';\nimport { WGPUJNLMDenoisePass } from './WGPUJNLMDenoiser.js';\n\nexport const oidnAlbedoSrgbEncodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet raw = textureLoad(in_albedo, vec2u(globalId.xy), 0);\nlet encoded = oidnEncodeAlbedo(raw.rgb);\nout_albedo[index] = vec4f(encoded, raw.a);\n`;\n\nexport const oidnAlbedoSrgbDecodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet filtered = in_albedo[index];\nlet linear = oidnDecodeAlbedo(filtered.rgb);\nvar result = linear;\nlet surfaceCoverage = textureLoad(in_rawAlbedo, vec2i(globalId.xy), 0).a;\nif (preserveSurfaceTexture != 0u) {\n // Primary albedo retains the accumulated surface texture. Do not ask the\n // auxiliary network to reconstruct its high-frequency texture.\n // Retain its filtered result across normal/coverage discontinuities.\n let pixel = vec2i(globalId.xy);\n let center = textureLoad(in_rawNormal, pixel, 0);\n let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));\n var discontinuity = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n let neighbor = textureLoad(in_rawNormal,\n clamp(pixel + vec2i(x, y), vec2i(0), imageSize - 1), 0);\n let nn = normalize(neighbor.rgb * 2.0 - 1.0 + vec3f(1e-8));\n discontinuity = max(discontinuity,\n max(1.0 - dot(n, nn), abs(center.a - neighbor.a)));\n }\n }\n let edgeWeight = smoothstep(0.02, 0.1, discontinuity);\n let raw = clamp(textureLoad(in_rawAlbedo, pixel, 0).rgb,\n vec3f(0.0), vec3f(1.0));\n result = mix(raw, linear, edgeWeight);\n}\nout_albedo[index] = vec4f(result, surfaceCoverage);\n`;\n\nexport const oidnNormalSanitizeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nout_normal[index] = vec4f(oidnSanitizeNormal(in_normal[index].rgb), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n materialTextures?: MaterialTextureSelection;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 16\n });\n const resolveBuffer = device.createBuffer({\n size: querySet.count * 8,\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n });\n const resultBuffer = device.createBuffer({\n size: resolveBuffer.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n return {\n querySet,\n resolveBuffer,\n resultBuffer\n };\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nfunction makeWGPUAccumulationTarget(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n device: GPUDevice,\n rayTracePass: WGPURayTracePass,\n surface: WGPUCanvasSurface,\n scratch: ScratchPool,\n customJobs: Set<Promise<unknown>>,\n traceQueue: GPUTraceQueue\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let batchSamples = false;\n let realtimeBatchBudgetMs = Infinity;\n // Samples traced between display frames skip the resolve and composition;\n // the next presentation or read resolves them once.\n let realtimeDeferPostProcess = false;\n let postProcessPending = false;\n // Resolve uses the configuration that produced these buffers, even if another\n // target has since changed the shared trace pass's caustic settings.\n let sampledOutput: ReturnType<WGPURayTracePass['getOutputBuffer']> | undefined;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n const aov = new WGPUAov(device);\n let aovCamera: Camera | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let causticBatchTimeMs=0,photonBatchTimeMs=0;\n let lastGpuTraceTiming:\n | {\n causticTimeMs?:number;\n photonMappingTimeMs?:number;\n photonStagesMs?:number[];\n pathTracingTimeMs?:number;\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let displayTrace: string[] | undefined;\n let diagnosticsReadbackPromise: Promise<void> = Promise.resolve();\n\n let isFirstFrame = true;\n let disposed = false;\n\n let needsUpdatePredicting = true;\n let isPredictingFrame = false;\n\n let renderWidth = 0;\n let renderHeight = 0;\n let screenWidth = 0;\n let screenHeight = 0;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let pendingFlatBackground = [0, 0, 0, 0];\n let resolvedFlatBackground = [0, 0, 0, 0];\n let presentationTexture: GPUTexture | undefined;\n let presentationDenoised = false;\n const displayPostProcess = new DisplayPostProcess(device);\n let denoiseValid = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n // Sample count of this accumulation's last bloom refresh.\n let bloomSamples = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let hdrOutputRequested = false;\n let hdrOutputActive = false;\n let output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n\n let denoisedBuffer: GPUBuffer | undefined;\n let denoisedTexture: GPUTexture | undefined;\n let denoisedDisplayLinear = false;\n let denoisedHDR = false;\n let activeCustomController: AbortController | undefined;\n let jnlmPass: WGPUJNLMDenoisePass | undefined;\n let denoiseGeneration = 0;\n let preserveDenoisedOutput = false;\n\n let activeOidnPhase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n\n function cancelDenoise() {\n activeCustomController?.abort(); activeCustomController = undefined;\n denoiseGeneration++;\n const activePhase = activeOidnPhase;\n activeOidnPhase = undefined;\n if (activePhase) {\n try {\n activePhase.abort();\n } finally {\n activePhase.finish();\n }\n }\n }\n\n function runOIDNPhase(\n generation: number,\n execute: (\n finish: () => void,\n fail: (reason: unknown) => void\n ) => () => void\n ): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let phase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n const finish = () => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n resolve();\n };\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n reject(reason);\n };\n\n try {\n const abort = execute(finish, fail);\n phase = { abort, finish };\n if (settled) return;\n if (generation !== denoiseGeneration) {\n abort();\n finish();\n return;\n }\n activeOidnPhase = phase;\n } catch (error) {\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n settled = true;\n reject(error);\n }\n });\n }\n\n const ctx = surface.context;\n\n const timeQuery = device.features.has('timestamp-query')\n ? scratch.get('trace timing', () => {\n const query = createTimeQuery(device);\n return {\nquery, getMemoryBytes: () => query ? query.resolveBuffer.size + query.resultBuffer.size : 0,\n dispose() { query?.querySet.destroy(); query?.resolveBuffer.destroy(); query?.resultBuffer.destroy(); }\n};\n }).query\n : undefined;\n const tileRender = makeTileRender();\n const tileRenderWithPredict = timeQuery ? makeTileRenderWithPredict() : undefined;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n\n function invalidateTilePrediction() {\n tileTimingGeneration++;\n tileRenderWithPredict?.needsUpdatePredicting();\n lastGpuTraceTiming = undefined;causticBatchTimeMs=0;photonBatchTimeMs=0;\n // A changed render configuration needs fresh timing. Refresh\n // its estimator without submitting a hidden probe in that mode.\n needsUpdatePredicting = offlineSamplesPerBatch === 0;\n isPredictingFrame = false;\n }\n\n const zero = scratch.get('empty texture', () => {\n const texture = device.createTexture({ label: 'Shared empty image', size: { width: 1, height: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING });\n return { texture, getMemoryBytes: () => 4, dispose: () => texture.destroy() };\n }).texture;\n const rayTraceOutputPass = new WGPURayTraceOutputPass(device, zero);\n const getFrameInput = (label: 'color' | 'albedo' | 'normal' | 'shadowCatcher' | 'foreground' | 'catcherBackground') =>\n rayTraceOutputPass.getOutput(label);\n let bloomPass: WGPUBloomPass | undefined;\n\n // Primary misses on a flat colour background are blank: they add the\n // background radiance but no surface hit, and the normalized colour divides\n // by hits only. Raw readback restores the per-sample average, as on WebGL.\n // Fully blank pixels are already divided by the sample count.\n const rawOutputPass = scratch.get('rawOutputPass', () => new WGPUFullQuadPass('raw output', device, {\n textureWillBeRead: true,\n inputs: ['colorTex', 'coverageTex'],\n outputs: ['color'],\n uniforms: [{ label: 'flatBackgroundColor', type: 'vec4f', data: [0, 0, 0, 0] }],\n fsDefine: hdrResolveWGSL,\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\ncolor = vec4f(\n hdr_flat_component(color.r, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.g, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.b, coverage, flatBackgroundColor.a > 0.5, true), color.a);\noutput.color = color;\n`\n }));\n\n const readbackPass = scratch.get('readbackPass', () => new WGPUFullQuadPass('output readback', device, {\n textureWillBeRead: true, inputs: ['inputTex'], outputs: ['color'],\n fsMain: 'output.color = load_inputTex(uv, 0);'\n }));\n readbackPass.setOutputParams({ color: { format: 'rgba32float' } });\n\n let hdrPeakMeter: WGPUHDRPeakMeter | undefined;\n const composePass = scratch.get('composePass', () => new WGPUFullQuadPass('compose', device, {\n textureWillBeRead: true,\n fsMain: composeMain + compositeDenoiseOutputMain,\n fsDefine: composeDefine,\n uniforms: [\n {\n label: 'exposure',\n type: 'f32',\n data: exposure\n },\n {\n label: 'toneMappingParams',\n type: 'vec2f',\n data: [toneMappingMode, vignette]\n },\n {\n label: 'hdrOutputEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'colorGradingParams',\n type: 'vec4f',\n data: [contrast, saturation, temperature, tint]\n },\n {\n label: 'flatBackgroundColor',\n type: 'vec4f',\n data: [0, 0, 0, 0]\n },\n {\n label: 'shadowCatcherColor',\n type: 'vec3f',\n data: shadowCatcherColor\n },\n {\n label: 'shadowCatcherAlpha',\n type: 'f32',\n data: shadowCatcherAlpha\n },\n {\n label: 'shadowCatcherEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'bloomIntensity',\n type: 'f32',\n data: 0.25\n }\n ],\n outputs: ['color', 'denoiseColor', 'denoiseAlbedo'],\n inputs: [\n 'colorTex',\n 'foregroundTex',\n 'catcherBackgroundTex',\n 'flatBackgroundMaskTex',\n 'shadowCatcherTex',\n 'bloomTex'\n ]\n }));\n let composeColorFormat: GPUTextureFormat = 'rgba8unorm';\n composePass.setOutputParams({\n color: {\n format: composeColorFormat\n },\n denoiseColor: { format: 'rgba32float' },\n denoiseAlbedo: { format: 'rgba8unorm' }\n });\n const compositeDenoiseDisplayPass = scratch.get('compositeDenoiseDisplayPass', () => new WGPUFullQuadPass(\n 'OIDN composed display', device, {\n textureWillBeRead: true,\n fsMain: compositeDenoiseDisplayMain,\n fsDefine: linearToSrgbDefine,\n uniforms: [\n { label: 'denoisedAlpha', type: 'f32', data: 0 }\n ],\n outputs: ['color'], inputs: ['colorTex', 'composedTex']\n }\n ));\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: 'rgba8unorm' } });\n const auxiliaryPassUniforms = [\n {\n label: 'imageSize',\n type: 'vec2i' as const,\n data: new Int32Array([1, 1])\n }\n ];\n const oidnAlbedoEncodePass = scratch.get('oidnAlbedoEncodePass', () => new WGPUComputePass<'albedo', 'albedo'>(\n 'OIDN albedo sRGB encode',\n device,\n {\n inputs: ['albedo'],\n outputs: ['albedo'],\n uniforms: auxiliaryPassUniforms,\n csDefine: oidnAuxiliaryDefine,\n csMain: oidnAlbedoSrgbEncodeMain\n }\n ));\n const oidnAlbedoDecodePass = scratch.get('oidnAlbedoDecodePass', () => new WGPUComputePass<'albedo' | 'rawAlbedo' | 'rawNormal', 'albedo'>(\n 'OIDN albedo sRGB decode',\n device,\n {\n inputs: ['albedo', 'rawAlbedo', 'rawNormal'],\n outputs: ['albedo'],\n uniforms: [...auxiliaryPassUniforms, {\n label: 'preserveSurfaceTexture', type: 'u32', data: 0\n }],\n csDefine: oidnAuxiliaryDefine,\n csMain: oidnAlbedoSrgbDecodeMain\n }\n ));\n const oidnNormalSanitizePass = scratch.get('oidnNormalSanitizePass', () => new WGPUComputePass<'normal', 'normal'>(\n 'OIDN normal sanitize',\n device,\n {\n inputs: ['normal'],\n outputs: ['normal'],\n uniforms: auxiliaryPassUniforms,\n csDefine: oidnAuxiliaryDefine,\n csMain: oidnNormalSanitizeMain\n }\n ));\n oidnAlbedoEncodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnAlbedoDecodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnNormalSanitizePass.setOutputParams({ normal: { channels: 4 } });\n const outputPass = scratch.get('outputPass', () => new WGPUFullQuadPass('output', device, {\n fsMain: /* wgsl */ `\nlet colorUv = min(\n vec2i(uv2 * vec2f(colorTexRegion())),\n vec2i(colorTexRegion()) - vec2i(1)\n);\nvar color = load_colorTex(colorUv, 0);\ncolor = vec4(color.rgb * color.a, color.a);\noutput.color = color;\n`,\n outputs: ['color'],\n inputs: ['colorTex']\n }));\n outputPass.setOutputParams({\n color: {\n format: 'rgba8unorm'\n }\n });\n\n function _present(encoder: GPUCommandEncoder, texture: GPUTexture) {\n outputPass.setRenderToScreen(\n ctx.getCurrentTexture(),\n surface.format\n );\n outputPass.createPass(encoder, {\n colorTex: texture\n });\n }\n\n function _updateSeed(width: number, height: number) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n // Each ray includes a .5 pixel center, so its Halton jitter in [-.5,.5)\n // becomes a sub-pixel offset in [0,1).\n const jitterX = halton(sequenceSample, 2) - 0.5;\n const jitterY = halton(sequenceSample, 3) - 0.5;\n rayTracePass.setJitter(jitterX / width, jitterY / height);\n }\n\n function sample(clear: boolean, tiles: [number, number]) {\n const encoder = device.createCommandEncoder();\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n _updateSeed(renderWidth, renderHeight);\n const activeTimeQuery = timeQuery;\n const isUnmapped = activeTimeQuery?.resultBuffer.mapState === 'unmapped';\n const measuredCausticBatch=rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n sampledOutput = rayTracePass.getOutputBuffer();\n if (activeTimeQuery) {\n encoder.resolveQuerySet(\n activeTimeQuery.querySet,\n 0,\n activeTimeQuery.querySet.count,\n activeTimeQuery.resolveBuffer,\n 0\n );\n if (isUnmapped) {\n encoder.copyBufferToBuffer(\n activeTimeQuery.resolveBuffer,\n 0,\n activeTimeQuery.resultBuffer,\n 0,\n activeTimeQuery.resultBuffer.size\n );\n }\n }\n\n // TODO if encoder is not submitted. The uniform buffer will be replaced\n device.queue.submit([encoder.finish()]);\n\n const submittedTileRenderWithPredict = tileRenderWithPredict;\n const submittedTimingGeneration = tileTimingGeneration;\n if (activeTimeQuery && isUnmapped && submittedTileRenderWithPredict) {\n\n const submittedTileCount = tiles[0] * tiles[1];\n diagnosticsReadbackPromise = activeTimeQuery.resultBuffer\n .mapAsync(GPUMapMode.READ).then(() => {\n const mappedRange = activeTimeQuery.resultBuffer.getMappedRange();\n const times = new BigInt64Array(mappedRange, 0, 16);\n const causticTime=(measuredCausticBatch&1)?Math.max(Number(times[3]-times[2]+times[5]-times[4])/1_000_000,0):0;\n // Independent timestamp pairs avoid Metal's cross-pass counter bug.\n const photonTime=(measuredCausticBatch&2)?Math.max(Number(times[7]-times[6]+times[9]-times[8]+times[11]-times[10]+times[13]-times[12]+times[15]-times[14])/1_000_000,0):0;\n const ptTime=Math.max(Number(times[1]-times[0])/1_000_000,0);\n // A readback may finish after scene preparation or a mode switch.\n // It must not overwrite throughput learned for the current scene.\n const timingIsCurrent =\n !disposed && submittedTimingGeneration === tileTimingGeneration &&\n !isFirstFrame;\n if (timingIsCurrent) {\n if(measuredCausticBatch&1)causticBatchTimeMs=causticTime;\n if(measuredCausticBatch&2)photonBatchTimeMs=photonTime;\n const traceTime=Math.max(ptTime+(causticBatchTimeMs+photonBatchTimeMs)/submittedTileCount,.1);\n lastGpuTraceTiming = {\n causticTimeMs:causticBatchTimeMs,photonMappingTimeMs:photonBatchTimeMs,\n photonStagesMs:(measuredCausticBatch&2)?[6,8,10,12,14].map(i=>Math.max(Number(times[i+1]-times[i])/1_000_000,0)):undefined,\n pathTracingTimeMs:ptTime,\n tileTimeMs: traceTime,\n tileTimePerSampleMs: traceTime,\n estimatedFullFrameTimeMs: traceTime * submittedTileCount,\n tileCount: submittedTileCount\n };\n submittedTileRenderWithPredict.setLastTraceTime(traceTime);\n }\n activeTimeQuery.resultBuffer.unmap();\n\n }).catch(() => {\n if (activeTimeQuery.resultBuffer.mapState === 'mapped') {\n activeTimeQuery.resultBuffer.unmap();\n }\n });\n }\n }\n\n function clearDenoisedOutput() { denoiseValid = false; }\n\n function invalidateCompositeDenoise() {\n if (!denoisedDisplayLinear) return;\n cancelDenoise();\n denoiseValid = false;\n }\n\n function prepareDenoisedTexture(\n encoder: GPUCommandEncoder,\n buffer: GPUBuffer | undefined,\n texture: GPUTexture | undefined\n ) {\n if (!buffer) {\n return undefined;\n }\n const conversion = scratch.get('denoised conversion', () => new WGPUScratchTexture(device));\n texture = conversion.get(renderWidth, renderHeight); conversion.setRegion(renderWidth, renderHeight);\n encoder.copyBufferToTexture(\n { buffer: buffer!, bytesPerRow: 16 * renderWidth },\n {\n texture: texture\n },\n {\n width: renderWidth,\n height: renderHeight,\n depthOrArrayLayers: 1\n }\n );\n return texture;\n }\n\n function copyDenoisedOutput(\n encoder: GPUCommandEncoder,\n output: OIDNWebGPUOutputData,\n target: GPUBuffer | undefined\n ) {\n const byteLength = output.width * output.height * 16;\n if (!target || target.size !== byteLength) {\n target?.destroy();\n target = device.createBuffer({\n label: 'Persistent denoised output',\n size: byteLength,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n });\n }\n encoder.copyBufferToBuffer(output.data, 0, target, 0, byteLength);\n return target;\n }\n\n function prepareComposition() {\n composePass.setSize(renderWidth, renderHeight);\n composePass.setOutputParams({ color: { format: composeColorFormat }, denoiseColor: { format: 'rgba32float' }, denoiseAlbedo: { format: 'rgba8unorm' } });\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [contrast, saturation, temperature, tint]);\n composePass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n composePass.setUniform('shadowCatcherColor', shadowCatcherColor);\n composePass.setUniform('shadowCatcherAlpha', shadowCatcherAlpha);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', denoiseValid && denoisedDisplayLinear ? +rayTracePass.needsDenoiseAlpha() : 0);\n }\n function snapshotInput(encoder: GPUCommandEncoder, key: string, texture: GPUTexture, exact = false) {\n const buffer = scratch.get(key, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, exact);\n encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow: renderWidth * 16 }, { width: renderWidth, height: renderHeight });\n return buffer;\n }\n function copyGuide(key: string, input: GPUTexture, exact = false) {\n const pass = scratch.get(key, () => new WGPUComputePass(`${key} copy`, device, {\n inputs: ['guide'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: 'if (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) {return;} out_color[globalId.x + globalId.y * u32(imageSize.x)] = textureLoad(in_guide, vec2i(globalId.xy), 0);'\n }));\n pass.setOutputParams({ color: { channels: 4 } });\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n const output = exact ? scratch.get(`${key} buffer`, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, true) : undefined;\n const encoder = device.createCommandEncoder(); pass.createPass(encoder, { guide: { texture: input, channels: 4 } }, output ? {color: output} : undefined); device.queue.submit([encoder.finish()]);\n return output ?? pass.getOutput('color');\n }\n\n function drawPostProcess(\n encoder: GPUCommandEncoder,\n _forceNeedsDenoise?: boolean,\n resolve = false\n ) {\n displayPostProcess.reset();\n if (resolve) {\n resolvedSamples = sampleCount;\n resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();\n resolvedFlatBackground = pendingFlatBackground.slice();\n }\n composePass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n finishPresentation(encoder, aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive));\n return;\n }\n if (resolvedSamples < 1) return;\n prepareComposition();\n if (denoiseValid) denoisedTexture = prepareDenoisedTexture(\n encoder,\n denoisedBuffer,\n denoisedTexture\n );\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(encoder, sampledOutput ?? rayTracePass.getOutputBuffer(), resolvedHasShadowCatcher);\n }\n\n composePass.setUniform(\n 'shadowCatcherEnabled',\n +resolvedHasShadowCatcher\n );\n\n let foregroundTexture = getFrameInput(\n resolvedHasShadowCatcher ? 'foreground' : 'color'\n );\n const colorTexture = denoiseValid && denoisedHDR && denoisedTexture ? denoisedTexture : getFrameInput('color');\n let catcherBackgroundTexture = getFrameInput('catcherBackground');\n if (denoiseValid && denoisedHDR && denoisedTexture && resolvedHasShadowCatcher) {\n const layers = scratch.get('custom HDR layers', () => new WGPUFullQuadPass('Custom HDR layers', device, {\n textureWillBeRead: true,\n inputs: ['originalTex', 'filteredTex', 'foregroundTex', 'backgroundTex'],\n outputs: ['foreground', 'background'], fsMain: customDenoiseLayersMain\n }));\n layers.setOutputParams({foreground: {format: 'rgba32float'}, background: {format: 'rgba32float'}});\n layers.setSize(renderWidth, renderHeight);\n displayTrace?.push('CorrectLayers:SceneLinear');\n layers.createPass(encoder, {originalTex: getFrameInput('color'), filteredTex: denoisedTexture,\n foregroundTex: foregroundTexture, backgroundTex: catcherBackgroundTexture});\n foregroundTexture = layers.getOutput('foreground');\n catcherBackgroundTexture = layers.getOutput('background');\n }\n const bloomEnabled = bloomIntensity > 0.0;\n // Progressive accumulation refreshes bloom after every ten new samples,\n // including when several samples are resolved at once.\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}/${+(denoiseValid && denoisedHDR)}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (sampleCount - bloomSamples >= 10 || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let bloomIntensityToUpdate = bloomIntensity;\n if (needsUpdateBloom) {\n if (!bloomPass) {\n bloomPass = scratch.get('bloom', () => new WGPUBloomPass(device));\n bloomPass.setSize(renderWidth, renderHeight);\n }\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings; bloomSamples = sampleCount;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n displayTrace?.push('Compose:DisplayLinear+DisplayEncoded');\n composePass.createPass(encoder, {\n colorTex: colorTexture,\n foregroundTex: foregroundTexture,\n catcherBackgroundTex: catcherBackgroundTexture,\n flatBackgroundMaskTex: getFrameInput('albedo'),\n shadowCatcherTex: getFrameInput('shadowCatcher'),\n // Use color texture as placeholder\n bloomTex: bloomEnabled && bloomPass ? bloomPass.getOutput() : colorTexture\n });\n if (denoiseValid && !denoisedHDR && denoisedDisplayLinear && denoisedTexture) {\n displayTrace?.push('Encode:DisplayEncoded');\n compositeDenoiseDisplayPass.createPass(encoder, {\n colorTex: denoisedTexture,\n composedTex: composePass.getOutput('denoiseColor')\n });\n }\n let displayTexture =\n (denoiseValid && denoisedBuffer ? (denoisedHDR ? composePass.getOutput('color') : denoisedDisplayLinear\n ? compositeDenoiseDisplayPass.getOutput('color') : denoisedTexture) : undefined) ||\n composePass.getOutput('color');\n if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive);\n }\n finishPresentation(encoder, displayTexture);\n }\n\n function finishPresentation(encoder: GPUCommandEncoder, displayTexture: GPUTexture) {\n const activeHDRPeakMeter = hdrOutputActive\n ? (hdrPeakMeter ??= scratch.get('hdrPeak', () => new WGPUHDRPeakMeter(device)))\n : undefined;\n const hdrPeakReadbackSubmitted =\n activeHDRPeakMeter?.encode(\n encoder,\n displayTexture,\n renderWidth,\n renderHeight\n ) ?? false;\n\n if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = getFrameInput('shadowCatcher');\n }\n\n if (displayTexture.width < renderWidth || displayTexture.height < renderHeight) {\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: displayTexture });\n displayTexture = readbackPass.getOutput('color');\n }\n // Keep the completed denoise visible until its replacement is ready.\n if (!(preserveDenoisedOutput && output === 'final' && !denoiseValid && presentationDenoised)) {\n const width = renderWidth, height = renderHeight;\n if (!presentationTexture || presentationTexture.width !== width || presentationTexture.height !== height || presentationTexture.format !== displayTexture.format) {\n const previous = presentationTexture;\n presentationTexture = device.createTexture({\nlabel: 'Render complete image', size: { width, height }, format: displayTexture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC\n});\n if (previous) void device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());\n }\n encoder.copyTextureToTexture({ texture: displayTexture }, { texture: presentationTexture }, { width, height });\n presentationDenoised = output === 'final' && denoiseValid;\n }\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n if (hdrPeakReadbackSubmitted) {\n void activeHDRPeakMeter?.resolve();\n }\n }\n\n function flushPostProcess() {\n if (!postProcessPending) return;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), false, true);\n }\n\n function trace(camera: Camera, maxSamples: number) {\n applyTraceQuality();\n // A call to draw means accumulation has been invalidated. Cancel OIDN\n // before checking shader compilation: pipeline-affecting parameter changes\n // otherwise leave the previous asynchronous denoise alive while resources\n // and bind groups are being replaced.\n cancelDenoise();\n\n // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n aovCamera = camera;\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n\n // Waiting for a shader is not an input change: this render's samples and\n // complete image stay valid, and only Render's restart discards them.\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) return true;\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(execution.aovs)) return true;\n\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) aov.reset();\n if (resetAccumulation) {\n postProcessPending = false;\n bloomSamples = 0;\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\n }\n\n // Keep the last completed denoise visible while a static while-converging batch\n // accumulates, including the incomplete first sample after a scene edit.\n if (!preserveDenoisedOutput || isFirstFrame) {\n clearDenoisedOutput();\n }\n if (isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n\n // Never enter a waiting prediction state while the shared timestamp\n // buffer is still being mapped. Render normally and retry the probe at an\n // accumulation restart; a delayed probe must not discard visible samples.\n // The probe itself is also non-blocking: if readback fails or\n // is superseded, the renderer keeps using the conservative tile seed.\n if (\n offlineSamplesPerBatch === 0 &&\n resetAccumulation &&\n tileRenderWithPredict &&\n needsUpdatePredicting &&\n timeQuery?.resultBuffer.mapState === 'unmapped'\n ) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = true;\n tileRenderWithPredict.needsUpdatePredicting();\n needsUpdatePredicting = false;\n }\n\n const frameSampleCount = sampleCount;\n const sampleTimeMs = lastGpuTraceTiming?.estimatedFullFrameTimeMs;\n const realtime = offlineSamplesPerBatch === 0 && batchSamples;\n const realtimeBudget = Math.min(maxTimePerTile, realtimeBatchBudgetMs);\n if (realtime && !resetAccumulation && !isPredictingFrame && sampleTimeMs !== undefined &&\n traceQueue.available(realtimeBudget) < Math.min(sampleTimeMs, realtimeBudget)) return false;\n // Only batch a measured, unchanged full-frame workload. New cameras get\n // their first sample immediately; expensive samples retain tiled execution.\n const realtimeBatch = realtime && sampleCount > 0 &&\n !resetAccumulation && !isPredictingFrame && lastGpuTraceTiming?.tileCount === 1 && sampleTimeMs !== undefined &&\n sampleTimeMs <= realtimeBudget / 2;\n const realtimeSamples = realtimeBatch\n ? Math.min(64, Math.floor(traceQueue.available(realtimeBudget) / sampleTimeMs!)) : 1;\n if (realtimeBatch && realtimeSamples === 0) return false;\n const batchStarted = performance.now();\n _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + (offlineSamplesPerBatch > 0 ? offlineSamplesPerBatch : realtimeSamples)\n );\n do {\n let {\n xIndex,\n yIndex,\n columns,\n rows,\n isFirstTile,\n isLastTile,\n samplesPerFrame\n } = (tileRenderWithPredict || tileRender).nextTile(elapsedTileTime);\n\n rayTraceOutputPass.setSampleTileGrid(columns, rows);\n\n if ((offlineSamplesPerBatch > 0 || realtimeBatch) && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!batchSamples) {\n samplesPerFrame = 1;\n }\n\n if (columns * rows === 1) {\n rayTracePass.setSampleTiles(1, 1, 0, 0);\n let samplesSubmitted = 0;\n while (\n samplesSubmitted < samplesPerFrame &&\n sampleCount < renderSampleTarget &&\n sampleCount < batchTarget\n ) {\n sample(sampleCount === 0, [1, 1]);\n sampleCount++;\n samplesSubmitted++;\n if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs);\n if (realtimeBatch) {\n // Encoding many tiny samples must also leave the main thread free\n // to receive camera input. Yield before encoding another batch.\n if (performance.now() - batchStarted >= 4) break;\n }\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs / (columns * rows));\n if (isLastTile) sampleCount++;\n }\n } while (\n offlineSamplesPerBatch > 0 &&\n sampleCount < batchTarget &&\n sampleCount < renderSampleTarget\n );\n\n // Not displaying on screen for prediciting frame.\n if (isPredictingFrame) {\n // This hidden timing probe has not resolved the OIDN input textures.\n // Exclude it from progressive samples so a 1spp target cannot denoise\n // stale inputs, and clear its accumulation on the next visible sample.\n sampleCount = 0;\n return false;\n }\n\n if (sampleCount !== frameSampleCount && execution?.aovs?.length) {\n rayTracePass.renderAovs(aov, camera, sampleCount, execution.aovSamples ?? 16, execution.aovs);\n }\n if (sampleCount !== frameSampleCount && realtime && realtimeDeferPostProcess && sampleCount < renderSampleTarget) {\n postProcessPending = true;\n } else if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n postProcessPending = false;\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n }\n\n return false;\n }\n\n function roundUp(a: number, b: number) {\n return Math.ceil(a / b) * b;\n }\n\n function _applyRenderResolution() {\n if (!screenWidth || !screenHeight) return;\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextRenderWidth = roundUp(\n Math.max(1, Math.round(screenWidth * scale)),\n 16\n );\n const nextRenderHeight = roundUp(\n Math.max(1, Math.round(screenHeight * scale)),\n 16\n );\n if (nextRenderWidth === renderWidth && nextRenderHeight === renderHeight) {\n rayTracePass.setSize(nextRenderWidth, nextRenderHeight, screenWidth / screenHeight);\n return;\n }\n\n // OIDN retains the ray-trace output textures supplied at the start of a\n // tile sequence. Stop every phase (including Promise-chained follow-ups)\n // before those textures are replaced below.\n cancelDenoise();\n // Completed OIDN buffers use the previous image dimensions. Scene edits\n // may preserve them, but a resize must not copy them with the new stride.\n // The target retains its complete presentation texture through the resize.\n clearDenoisedOutput();\n tileTimingGeneration++;\n sampledOutput = undefined;\n renderWidth = nextRenderWidth;\n renderHeight = nextRenderHeight;\n (tileRenderWithPredict || tileRender).setSize(renderWidth, renderHeight);\n // Projection follows the displayed canvas, independent of preview/texture alignment.\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n\n resolvedSamples = 0;\n // Resizing starts a fresh accumulation while retaining the previous presentation.\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n }\n\n function setSize(width: number, height: number) {\n if (width === screenWidth && height === screenHeight) {\n return;\n }\n screenWidth = width;\n screenHeight = height;\n invalidateTilePrediction();\n _applyRenderResolution();\n outputPass.setSize(screenWidth, screenHeight);\n isFirstFrame = true;\n }\n\n function synchronizeBackground(background?: SceneBackground) {\n const flatColor = Array.isArray(background) && background[3] >= 0.99999\n ? background\n : undefined;\n const flatBackgroundColor = flatColor\n ? [flatColor[0], flatColor[1], flatColor[2], 1]\n : [0, 0, 0, 0];\n pendingFlatBackground = flatBackgroundColor;\n }\n\n function setToneMappingParams(params: ToneMappingParams) {\n const newExposure = params.exposure ?? 1;\n const newToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const newContrast = params.contrast ?? 1;\n const newSaturation = params.saturation ?? 1;\n const newTemperature = params.temperature ?? 0;\n const newTint = params.tint ?? 0;\n const newVignette = params.vignette ?? 0;\n if (\n newExposure === exposure &&\n newToneMappingMode === toneMappingMode &&\n newContrast === contrast &&\n newSaturation === saturation &&\n newTemperature === temperature &&\n newTint === tint &&\n newVignette === vignette\n ) return false;\n invalidateCompositeDenoise();\n exposure = newExposure;\n toneMappingMode = newToneMappingMode;\n contrast = newContrast;\n saturation = newSaturation;\n temperature = newTemperature;\n tint = newTint;\n vignette = newVignette;\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [\n contrast,\n saturation,\n temperature,\n tint\n ]);\n return true;\n }\n\n function setHDROutputEnabled(enabled: boolean) {\n if (enabled === hdrOutputRequested) return false;\n invalidateCompositeDenoise();\n hdrOutputRequested = enabled;\n const wasActive = hdrOutputActive;\n\n hdrOutputActive = enabled && surface.supportsHDR;\n\n const nextComposeColorFormat: GPUTextureFormat = hdrOutputActive\n ? 'rgba16float'\n : 'rgba8unorm';\n if (nextComposeColorFormat !== composeColorFormat) {\n composeColorFormat = nextComposeColorFormat;\n composePass.setOutputParams({\n color: { format: composeColorFormat },\n denoiseColor: { format: 'rgba32float' },\n denoiseAlbedo: { format: 'rgba8unorm' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n composePass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n return wasActive !== hdrOutputActive;\n }\n\n function _startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n const scheduleFrame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback: FrameRequestCallback) =>\n setTimeout(\n () => callback(performance.now()),\n 0\n ) as unknown as number;\n scheduleFrame(() => {\n // TODO use timestamp from requestAnimationFrame may have negative value.\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n // Without GPU timestamps, discard the draw that follows a scene\n // update instead of feeding its preparation/compilation time back.\n elapsedTileTime = collectTileTiming ? elapsedFrameTime : undefined;\n }\n });\n }\n function _onPageVisiblilityChange() {\n if (typeof document !== 'undefined' && document.hidden) {\n pageLeaveTime = performance.now();\n } else {\n pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n }\n\n /** Runs the built-in JNLM filter on the current composed image. */\n function performJNLMDenoise(\n denoiser: JNLMDenoiser\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n\n jnlmPass ??= scratch.get('jnlm', () => new WGPUJNLMDenoisePass(device));\n const rayBuffers = rayTracePass.getOutputBuffer();\n const encoder = device.createCommandEncoder({ label: 'JNLM denoise' });\n displayTrace?.push('Denoise:DisplayLinear');\n const output = jnlmPass.encode(encoder, {\n width: renderWidth,\n height: renderHeight,\n accumulation: rayBuffers.shadowCatcher,\n normalAccumulation: rayBuffers.normal,\n color: composePass.getOutput('denoiseColor'),\n albedo: getFrameInput('albedo'),\n normal: getFrameInput('normal'),\n shadowCatcher: getFrameInput('shadowCatcher'),\n strength: denoiser.strength,\n shape: denoiser.shape\n });\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n { data: output, width: renderWidth, height: renderHeight },\n denoisedBuffer\n );\n denoisedDisplayLinear = true;\n denoiseValid = true;\n // The filter also smooths coverage, which carries catcher shadows and\n // transmissive alpha.\n compositeDenoiseDisplayPass.setUniform(\n 'denoisedAlpha', +rayTracePass.needsDenoiseAlpha()\n );\n drawPostProcess(encoder, false);\n return device.queue.onSubmittedWorkDone().then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n\n function performCustomDenoise(\n denoiser: import('../Render.js').Denoiser,\n schedule: import('../Render.js').DenoiseSchedule,\n signal?: AbortSignal,\n requestedAovs: readonly import('./aov.js').AovKind[] = []\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n const controller = activeCustomController = new AbortController();\n const abort = () => controller.abort();\n signal?.addEventListener('abort', abort, {once: true});\n if (signal?.aborted) abort();\n const task = (async () => {\n if (controller.signal.aborted) return false;\n const color = copyGuide('Custom HDR input', getFrameInput('color'), true);\n const width = renderWidth, height = renderHeight;\n const albedo = copyGuide('Custom albedo', getFrameInput('albedo'), true);\n const normal = copyGuide('Custom normal', getFrameInput('normal'), true);\n const output = scratch.get('Custom output', () => new WGPUScratchBuffer(device)).get(width * height * 16, true);\n const aovs=requestedAovs.length?aov.snapshot(requestedAovs):undefined;\n displayTrace?.push('Denoise:SceneLinear');\n try {await denoiser.denoise({device, width, height, color, albedo, normal, output, aovs}, {signal: controller.signal, schedule});}\n finally {if(aovs)void device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>aov.releaseSnapshot(aovs));}\n if (controller.signal.aborted || disposed || generation !== denoiseGeneration) return false;\n const coverage = scratch.get('custom coverage', () => new WGPUComputePass('Custom coverage', device, {\n inputs: ['filtered', 'original'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: customDenoiseCoverageMain\n }));\n coverage.setOutputParams({color: {channels: 4}});\n coverage.setSize(width, height); coverage.setUniform('imageSize', [width, height]);\n const finish = device.createCommandEncoder({label: 'Custom HDR result'});\n coverage.createPass(finish, {filtered: {buffer: output, channels: 4}, original: {buffer: color, channels: 4}});\n denoisedBuffer = copyDenoisedOutput(finish, {data: coverage.getOutput('color'), width, height}, denoisedBuffer);\n denoisedHDR = true; denoisedDisplayLinear = false; denoiseValid = true;\n drawPostProcess(finish, false);\n await device.queue.onSubmittedWorkDone();\n return !controller.signal.aborted && !disposed && generation === denoiseGeneration;\n })();\n customJobs.add(task);\n void task.finally(() => {\n customJobs.delete(task); signal?.removeEventListener('abort', abort);\n if (activeCustomController === controller) activeCustomController = undefined;\n }).catch(() => {});\n return task;\n }\n\n function performDenoise(\n attachedDenoiser: DenoiserHandle,\n alphaDenoiser: OIDNWeb | undefined,\n denoiseSchedule: 'converged' | 'progressive' | 'every-sample' = 'converged',\n signal?: AbortSignal\n ): Promise<boolean> {\n cancelDenoise();\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n flushPostProcess();\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal, attachedDenoiser.aovs);\n denoisedHDR = false;\n if (attachedDenoiser.kind === 'jnlm') return performJNLMDenoise(attachedDenoiser.denoiser);\n const denoiser: OIDNWeb = attachedDenoiser.denoiser;\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', 0);\n const generation = denoiseGeneration;\n\n const size = { width: renderWidth, height: renderHeight };\n const snapshotEncoder = device.createCommandEncoder();\n const colorInput = snapshotInput(snapshotEncoder, 'OIDN color input', composePass.getOutput('denoiseColor'));\n device.queue.submit([snapshotEncoder.finish()]);\n for (const pass of [oidnAlbedoEncodePass, oidnAlbedoDecodePass, oidnNormalSanitizePass]) {\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n }\n const convergingTileOptions = {\n ...(denoiseSchedule !== 'converged' ? {\n tileOverlap: 80,\n // Low-resolution interaction must finish as one low-latency frame;\n // otherwise continuous camera updates outrun a multi-tile denoise.\n // The settled full-resolution image uses bounded dynamic tiles so\n // 4K inference cannot allocate a whole-image U-Net activation set.\n wholeImage: denoiseSchedule === 'every-sample'\n } : {}),\n // A preview frame is one whole-image pass. Settled images can take many\n // tiles; oidn-webgpu runs those back to back by default, which starves\n // the page at 4K, so pace them to display frames instead.\n scheduling: denoiseSchedule === 'every-sample' ? 'event-loop' as const : 'animation-frame' as const\n };\n type AuxiliaryGuides = {\n albedo: OIDNWebGPUData;\n normal: OIDNWebGPUData;\n };\n\n async function denoiseAuxiliaryGuides(): Promise<\n AuxiliaryGuides | undefined\n > {\n const auxiliaryDenoisers = denoiser.auxiliaryDenoisers;\n // Prefilter sampled texture/normal detail for clean-aux weights. The\n // accumulated guides alone are not antialiased at silhouettes and\n // subpixel texture boundaries.\n if (!auxiliaryDenoisers) {\n return {\n albedo: {\n data: copyGuide('OIDN raw albedo', composePass.getOutput('denoiseAlbedo')),\n ...size\n },\n normal: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n }\n };\n }\n if (generation !== denoiseGeneration) return undefined;\n\n const encodeEncoder = device.createCommandEncoder();\n oidnAlbedoEncodePass.createPass(encodeEncoder, {\n albedo: {\n texture: composePass.getOutput('denoiseAlbedo'),\n channels: 4\n }\n });\n device.queue.submit([encodeEncoder.finish()]);\n\n let albedoOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.albedo.tileExecute({\n ...convergingTileOptions,\n color: {\n data: oidnAlbedoEncodePass.getOutput('albedo'),\n ...size\n },\n done(output) {\n albedoOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !albedoOutput) return undefined;\n\n const decodeEncoder = device.createCommandEncoder();\n oidnAlbedoDecodePass.setUniform('preserveSurfaceTexture', +false);\n oidnAlbedoDecodePass.createPass(decodeEncoder, {\n albedo: { buffer: albedoOutput.data, channels: 4 },\n rawAlbedo: { texture: composePass.getOutput('denoiseAlbedo'), channels: 4 },\n rawNormal: { texture: getFrameInput('normal'), channels: 4 }\n });\n device.queue.submit([decodeEncoder.finish()]);\n\n let normalOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.normal.tileExecute({\n ...convergingTileOptions,\n color: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n },\n done(output) {\n normalOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !normalOutput) return undefined;\n\n const normalEncoder = device.createCommandEncoder();\n oidnNormalSanitizePass.createPass(normalEncoder, {\n normal: { buffer: normalOutput.data, channels: 4 }\n });\n device.queue.submit([normalEncoder.finish()]);\n\n return {\n albedo: {\n data: oidnAlbedoDecodePass.getOutput('albedo'),\n ...size\n },\n normal: {\n data: oidnNormalSanitizePass.getOutput('normal'),\n ...size\n }\n };\n }\n\n function denoiseComposite(guides: AuxiliaryGuides): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n // Snapshot the complete raw composition; never feed a previous denoise\n // back into the network during progressive updates.\n displayTrace?.push('Denoise:DisplayLinear');\n return runOIDNPhase(generation, (finish, fail) =>\n denoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: colorInput, ...size },\n albedo: guides.albedo,\n normal: guides.normal,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n // Denoise alpha channel\n function denoiseComposed(): Promise<void> {\n if (!alphaDenoiser || generation !== denoiseGeneration) {\n return Promise.resolve();\n }\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: denoisedDisplayLinear ? compositeDenoiseDisplayPass.getOutput('color') : composePass.getOutput('color') });\n const alphaInput = snapshotInput(encoder, 'OIDN alpha input', readbackPass.getOutput('color'));\n device.queue.submit([encoder.finish()]);\n return runOIDNPhase(generation, (finish, fail) =>\n alphaDenoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: alphaInput, ...size },\n denoiseAlpha: true,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n // While-converging denoising keeps the previous complete frame (or the\n // fallback) visible while tiled inference is\n // running. Publishing the shared output buffer before its final\n // tile would expose uninitialized regions as black rectangles.\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n output,\n denoisedBuffer\n );\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n return denoiseAuxiliaryGuides()\n .then(async (guides) => {\n if (guides && generation === denoiseGeneration) {\n await denoiseComposite(guides);\n }\n })\n .then(() => {\n if (\n generation === denoiseGeneration &&\n rayTracePass.needsDenoiseAlpha()\n ) {\n return denoiseComposed();\n }\n })\n .then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', _onPageVisiblilityChange);\n }\n function dispose() {\n if (disposed) return;\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n _onPageVisiblilityChange\n );\n }\n disposed = true;\n tileTimingGeneration++;\n cancelDenoise();\n // Target outputs and timestamp readbacks can still be referenced by the\n // queue. Cancel inference now; retire all GPU-owned target resources after\n // both submitted work and the pending timestamp mapping have completed.\n void Promise.all([\n device.queue.onSubmittedWorkDone().catch(() => undefined),\n diagnosticsReadbackPromise\n ]).then(() => {\n rayTracePass.releaseTarget(targetKey);\n aov.dispose();\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n // Keep tracing quality out of presentation: an old fallback must not\n // invalidate a new caustic pipeline while it is compiling.\n function applyTraceQuality() {\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n if (renderWidth && renderHeight) rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n }\n }\n\n return {\n invalidateTiming: invalidateTilePrediction,\n invalidateDenoisedOutput() { cancelDenoise(); denoiseValid = false; preserveDenoisedOutput = false; },\n configure(settings: TraceSettings) {\n const timingKeys = ['bounces', 'bevel', 'bevelSamples', 'directLightCandidates', 'dispersionWavelengths', 'alphaBlendStrategy', 'samplingPattern', 'clamping', 'transmissiveOutputAlphaMin', 'caustics'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // Presentation may still name the previous preview's AOV. Drop that\n // selection before tracing with a smaller set; Display validates and\n // reapplies the current channel when the new image is presented.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if (previousMask && !nextMask) { aov.dispose(); aov.history.clear(); aov.width = aov.height = 0; aov.reset(); }\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setMaxTiles(settings.maxTiles);\n },\n synchronizeBackground,\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) {\n return (lastGpuTraceTiming?.estimatedFullFrameTimeMs ?? elapsedFrameTime) <= timeBudgetMs;\n },\n setRealtimeBatchBudget(milliseconds) { realtimeBatchBudgetMs = milliseconds; },\n setRealtimeDeferPostProcess(defer) { realtimeDeferPostProcess = defer; },\n getRealtimeSampleTime() { return lastGpuTraceTiming?.estimatedFullFrameTimeMs; },\n getRealtimeTileTime() { return lastGpuTraceTiming?.tileTimePerSampleMs; },\n whenTraceAvailable() { return traceQueue.whenAvailable(); },\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n surface.configure(hdrOutputActive);\n const encoder = device.createCommandEncoder();\n outputPass.setSize(canvas.width, canvas.height);\n _present(encoder, displayPostProcess.output ?? presentationTexture);\n device.queue.submit([encoder.finish()]);\n },\n getMemory() {\n return {\nwidth: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey) + rayTraceOutputPass.getMemoryBytes() + textureBytes(presentationTexture) + displayPostProcess.getMemoryBytes() + (denoisedBuffer?.size ?? 0)\n};\n },\n isFirstFrame() {\n return isFirstFrame;\n },\n\n restartSamples() {\n aov.reset();\n // Input edits reset accumulation, not learned throughput. Re-arming a\n // hidden probe here starves continuously changing scenes of visible samples.\n tileTimingGeneration++;\n cancelDenoise();\n preserveDenoisedOutput = false;\n denoiseValid = false;\n presentationDenoised = false;\n resolvedSamples = 0; postProcessPending = false; bloomSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n flushPostProcess();\n if (kind === 'hdr') return resolvedSamples > 0 ? getFrameInput('color') : undefined;\n return displayPostProcess.output ?? presentationTexture;\n },\n applyPostProcesses(passes, render) {\n if (presentationTexture) displayPostProcess.run(presentationTexture, passes, render);\n },\n trace,\n drawPostProcess() {\n const resolve = postProcessPending;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), true, resolve);\n },\n performDenoise,\n cancelDenoise,\n setSize,\n setHDROutputEnabled,\n setToneMappingParams,\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n const image = displayPostProcess.output ?? presentationTexture;\n const width = image.width, height = image.height;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({ size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });\n const encoder = device.createCommandEncoder();\n const presentationReadback=hdrOutputActive && displayAovKind(output) ? scratch.get('AOV encoded readback',()=>new WGPUFullQuadPass('AOV encoded readback',device,{textureWillBeRead:true,inputs:['inputTex'],outputs:['color'],fsMain:`let c=load_inputTex(uv,0);let rgb=select(1.055*pow(max(c.rgb,vec3f(0.0)),vec3f(1.0/2.4))-0.055,12.92*c.rgb,c.rgb<=vec3f(0.0031308));output.color=vec4f(rgb,c.a);`})) : readbackPass;\n presentationReadback.setOutputParams({color:{format:'rgba32float'}});presentationReadback.setSize(width,height);\n presentationReadback.createPass(encoder,{inputTex:image});\n encoder.copyTextureToBuffer({texture:presentationReadback.getOutput('color')},{buffer,bytesPerRow},{width,height});\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * bytesPerRow / 4, y * bytesPerRow / 4 + width * 4), y * width * 4);\n return { width, height, data };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n applyTraceQuality();\n rayTracePass.setCamera(camera); aovCamera = camera;\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) return false;\n return rayTracePass.renderAovs(aov, camera, samples, execution.aovSamples ?? 16, execution.aovs);\n },\n async readAov(kind) {\n if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1)) throw new Error('AOV output is not ready');\n for (;;) {\n if (disposed) throw new Error('AOV compilation was interrupted');\n activate();\n applyTraceQuality();\n rayTracePass.setCamera(aovCamera);\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n if (!rayTracePass.isCompilingShader() && rayTracePass.isPipelineReady() &&\n rayTracePass.renderAovs(aov, aovCamera, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs)) break;\n // Display frames stop on a hidden page, but compilation still completes.\n await new Promise<void>(resolve => setTimeout(resolve, 16));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n flushPostProcess();\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const width = renderWidth, height = renderHeight;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({\n size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n const encoder = device.createCommandEncoder();\n const denoised = kind === 'denoised' && denoiseValid ? denoisedBuffer : undefined;\n if (kind === 'denoised' && !denoised) kind = 'hdr';\n const pass = kind === 'hdr' ? rawOutputPass : readbackPass;\n pass.setOutputParams({ color: { format: 'rgba32float' } });\n pass.setSize(width, height);\n if (denoised) {\n encoder.copyBufferToBuffer(denoised, 0, buffer, 0, width * height * 16);\n } else if (kind === 'hdr') {\n rawOutputPass.createPass(encoder, { colorTex: getFrameInput('color'), coverageTex: getFrameInput('albedo') });\n } else {\n readbackPass.createPass(encoder, { inputTex: getFrameInput(kind as 'albedo' | 'normal') });\n }\n if (!denoised) encoder.copyTextureToBuffer({ texture: pass.getOutput('color') }, { buffer, bytesPerRow }, { width, height, depthOrArrayLayers: 1 });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n const stride = denoised ? width * 4 : bytesPerRow / 4;\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * stride, y * stride + width * 4), y * width * 4);\n return { data, width, height };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n setOfflineRenderOptions(options) {\n const wasOffline = offlineSamplesPerBatch > 0;\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n if (offlineSamplesPerBatch > 0 && isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n if (offlineSamplesPerBatch > 0) needsUpdatePredicting = false;\n else if (wasOffline) invalidateTilePrediction();\n },\n setVarianceMoments(enabled: boolean) {\n rayTracePass.setVarianceMoments(enabled);\n },\n setAdaptiveSamplingTargets(targets) {\n rayTracePass.setAdaptiveSamplingTargets(targets);\n },\n prepareOfflineAdaptiveSampling(options) {\n return rayTracePass.prepareOfflineAdaptiveSampling(options);\n },\n\n getTotalSamplesRendered() {\n return sampleCount;\n },\n\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n cancelDenoise(); clearDenoisedOutput();\n setSize(input.width, input.height);\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n const buffers = sampledOutput = rayTracePass.getOutputBuffer();\n const shadow = new Float32Array(input.width * input.height * 12);\n for (let i = 0; i < input.width * input.height; i++) {\n shadow.set(input.shadow.subarray(i * 8, i * 8 + 8), i * 12);\n shadow.set(input.moments.subarray(i * 4, i * 4 + 4), i * 12 + 8);\n }\n for (const [buffer, data] of [[buffers.color, input.color], [buffers.albedo, input.albedo],\n [buffers.normal, input.normal], [buffers.shadowCatcher, shadow]] as const) device.queue.writeBuffer(buffer, 0, data);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher;\n isFirstFrame = false; postProcessPending = false; bloomSamples = 0;\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.setSampleTileGrid(1, 1);\n const encoder = device.createCommandEncoder();\n rayTraceOutputPass.createPass(encoder, buffers, resolvedHasShadowCatcher);\n device.queue.submit([encoder.finish()]);\n }\n };\n },\n\n getDiagnostics() {\n return {\n ...rayTracePass.getDiagnostics(),\n hdrPresentation: {\n requested: hdrOutputRequested,\n active: surface.hdr,\n peakDisplayValue: surface.hdr\n ? hdrPeakMeter?.getPeakDisplayValue()\n : undefined\n },\n gpuTraceTiming: lastGpuTraceTiming\n };\n },\n\n async flushDiagnostics() {\n await device.queue.onSubmittedWorkDone();\n await diagnosticsReadbackPromise;\n },\n\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n threshold !== bloomThreshold ||\n intensity !== bloomIntensity ||\n radius !== bloomRadius;\n if (changed) invalidateCompositeDenoise();\n bloomThreshold = threshold;\n bloomIntensity = intensity;\n bloomRadius = radius;\n return changed;\n },\n\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n\n return changed;\n },\n\n setOnSampleRendered(\n cb: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void\n ) {\n sampleRenderedCallback = cb;\n },\n\n setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWGPURenderTargets(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, options: WGPURenderingPipelineOptions = {}): RenderPipeline {\n const rayTracePass = new WGPURayTracePass(device, options.materialTextures);\n const traceQueue = new GPUTraceQueue(device.queue);\n const customJobs = new Set<Promise<unknown>>();\n const scratch = new ScratchPool(work => {\n // A cancelled custom filter can keep submitting GPU work until its promise settles.\n // A custom callback can dispose synchronously, before its promise is recorded.\n // Observe leases after that callback returns so its borrowed inputs stay alive.\n void Promise.resolve().then(() => Promise.allSettled([...customJobs]))\n .then(() => device.queue.onSubmittedWorkDone()).catch(() => {}).then(work);\n });\n const surface = scratch.get('canvas', () => new WGPUCanvasSurface(canvas, device, options.presentationFormat ?? navigator.gpu.getPreferredCanvasFormat()));\n return makeRenderPipeline(rayTracePass, () => {\n const target = makeWGPUAccumulationTarget(canvas, device, rayTracePass, surface, scratch, customJobs, traceQueue);\n return target;\n }, false, scratch);\n}\n"]}
|