@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,3 +1,6 @@
|
|
|
1
|
+
import { displayAovKind, DEFAULT_AOV_DISPLAY } from './aovDisplay.js';
|
|
2
|
+
import { WebGLAov } from './WebGLAov.js';
|
|
3
|
+
import { aovMask } from './aov.js';
|
|
1
4
|
import { scheduleFrame } from '../util/frame.js';
|
|
2
5
|
import { WebGLScratchCopy } from './WebGLScratchCopy.js';
|
|
3
6
|
import { ScratchPool } from './ScratchPool.js';
|
|
@@ -6,14 +9,13 @@ import { readRgbaPixels } from './WebGLReadback.js';
|
|
|
6
9
|
import { vec3 } from '../math.js';
|
|
7
10
|
import halton from './halton.js';
|
|
8
11
|
import { makeTileRender } from './TileRender.js';
|
|
9
|
-
import { constants } from './webgl.js';
|
|
12
|
+
import { constants, Texture2D } from './webgl.js';
|
|
10
13
|
import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
|
|
11
14
|
import WebGLRayTracePass from './WebGLRayTracePass.js';
|
|
12
15
|
import { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';
|
|
13
16
|
import WebGLBloomPass from './WebGLBloomPass.js';
|
|
14
17
|
import { composeFragment, outputFragment } from './glsl/webglPipeline.frag.js';
|
|
15
18
|
import { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';
|
|
16
|
-
const wavelengths = [650, 510, 475];
|
|
17
19
|
/**
|
|
18
20
|
* WebGL 2.0 counterpart of WGPURenderingPipeline.
|
|
19
21
|
*
|
|
@@ -22,10 +24,13 @@ const wavelengths = [650, 510, 475];
|
|
|
22
24
|
*/
|
|
23
25
|
function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
24
26
|
let sampleRenderedCallback = (_sampleCount, _isFirstFrame, _frameTime) => { };
|
|
25
|
-
let
|
|
27
|
+
let batchSamples = false;
|
|
26
28
|
let offlineSamplesPerBatch = 0;
|
|
27
29
|
let deferPostProcess = false;
|
|
28
30
|
let sampleSequenceOffset = 0;
|
|
31
|
+
const aov = new WebGLAov(renderer);
|
|
32
|
+
let aovCamera;
|
|
33
|
+
let displayTrace;
|
|
29
34
|
let sampleCount = 0;
|
|
30
35
|
let elapsedFrameTime = 32;
|
|
31
36
|
let elapsedTileTime;
|
|
@@ -55,6 +60,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
55
60
|
let tint = 0;
|
|
56
61
|
let vignette = 0;
|
|
57
62
|
let output = 'final';
|
|
63
|
+
let aovDisplayOptions = DEFAULT_AOV_DISPLAY;
|
|
58
64
|
let pageLeaveTime = performance.now();
|
|
59
65
|
let pageInvisibleTime = 0;
|
|
60
66
|
const shadowCatcherColor = vec3.create();
|
|
@@ -111,20 +117,20 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
111
117
|
updateSeed(true);
|
|
112
118
|
if (rayTracePass.hasDispersion()) {
|
|
113
119
|
if (execution?.dispersionWavelengths === 1) {
|
|
114
|
-
// A positive
|
|
115
|
-
//
|
|
116
|
-
rayTracePass.
|
|
120
|
+
// A positive channel enables stochastic hero-wavelength sampling in
|
|
121
|
+
// the shader. Preview traces one random RGB channel per pixel.
|
|
122
|
+
rayTracePass.setSpectralChannel(1);
|
|
117
123
|
rayTracePass.createPass(clear, tile);
|
|
118
124
|
}
|
|
119
125
|
else {
|
|
120
|
-
|
|
121
|
-
rayTracePass.
|
|
122
|
-
rayTracePass.createPass(clear &&
|
|
123
|
-
}
|
|
126
|
+
for (let channel = 1; channel <= 3; channel++) {
|
|
127
|
+
rayTracePass.setSpectralChannel(channel);
|
|
128
|
+
rayTracePass.createPass(clear && channel === 1, tile, channel > 1);
|
|
129
|
+
}
|
|
124
130
|
}
|
|
125
131
|
}
|
|
126
132
|
else {
|
|
127
|
-
rayTracePass.
|
|
133
|
+
rayTracePass.setSpectralChannel(0);
|
|
128
134
|
rayTracePass.createPass(clear, tile);
|
|
129
135
|
}
|
|
130
136
|
}
|
|
@@ -133,6 +139,16 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
133
139
|
resolvedSamples = sampleCount;
|
|
134
140
|
resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();
|
|
135
141
|
}
|
|
142
|
+
const aovKind = displayAovKind(output);
|
|
143
|
+
if (aovKind && sampleCount === 0) {
|
|
144
|
+
if (!execution?.aovs?.includes(aovKind))
|
|
145
|
+
throw new Error(`AOV ${aovKind} is not enabled`);
|
|
146
|
+
if (!aov.samples)
|
|
147
|
+
return;
|
|
148
|
+
presentationTexture = copy.copy(aov.visualize(aovKind, aovDisplayOptions), renderWidth, renderHeight, presentationTexture);
|
|
149
|
+
presentationDenoised = false;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
136
152
|
if (resolvedSamples === 0)
|
|
137
153
|
return;
|
|
138
154
|
if (resolve) {
|
|
@@ -155,6 +171,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
155
171
|
bloomState.settings = bloomSettings;
|
|
156
172
|
bloomPass.setBrightThreshold(bloomThreshold);
|
|
157
173
|
bloomPass.setRadius(bloomRadius);
|
|
174
|
+
displayTrace?.push('Bloom:SceneLinear');
|
|
158
175
|
bloomPass.createPass(colorTexture);
|
|
159
176
|
}
|
|
160
177
|
else if (bloomEnabled && sampleCount < 10) {
|
|
@@ -165,6 +182,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
165
182
|
shadowCatcherEnabled: +resolvedHasShadowCatcher,
|
|
166
183
|
outputMode: output === 'shadow' ? 1 : 0
|
|
167
184
|
});
|
|
185
|
+
displayTrace?.push('Compose:DisplayEncoded');
|
|
168
186
|
composePass.createPass({
|
|
169
187
|
colorTex: colorTexture,
|
|
170
188
|
foregroundTex: rayTraceOutputPass.getOutput('foreground'),
|
|
@@ -189,16 +207,23 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
189
207
|
shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),
|
|
190
208
|
strength: pendingDenoiser.strength,
|
|
191
209
|
shape: pendingDenoiser.shape
|
|
192
|
-
});
|
|
210
|
+
}, displayTrace);
|
|
193
211
|
denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture);
|
|
194
212
|
denoiseValid = true;
|
|
195
213
|
pendingDenoiser = undefined;
|
|
196
214
|
}
|
|
197
215
|
let displayTexture = (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');
|
|
198
|
-
if (
|
|
216
|
+
if (aovKind) {
|
|
217
|
+
if (!execution?.aovs?.includes(aovKind))
|
|
218
|
+
throw new Error(`AOV ${aovKind} is not enabled`);
|
|
219
|
+
displayTexture = aov.visualize(aovKind, aovDisplayOptions);
|
|
220
|
+
}
|
|
221
|
+
else if (output === 'normal' || output === 'albedo') {
|
|
222
|
+
displayTrace?.push('AOV:Raw');
|
|
199
223
|
displayTexture = rayTraceOutputPass.getOutput(output);
|
|
200
224
|
}
|
|
201
225
|
else if (output === 'shadowCatcher') {
|
|
226
|
+
displayTrace?.push('AOV:Raw');
|
|
202
227
|
displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');
|
|
203
228
|
}
|
|
204
229
|
presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);
|
|
@@ -221,14 +246,18 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
221
246
|
function trace(camera, maxSamples) {
|
|
222
247
|
if (rayTracePass.isInvalid() || renderFailed)
|
|
223
248
|
return false;
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
sampleCount = 0;
|
|
227
|
-
tileRender.reset();
|
|
249
|
+
// Waiting for a shader is not an input change; see the WebGPU pipeline.
|
|
250
|
+
if (!renderer.isAllProgramCompiled())
|
|
228
251
|
return true;
|
|
229
|
-
}
|
|
230
252
|
rayTracePass.setCamera(camera);
|
|
253
|
+
aovCamera = camera;
|
|
254
|
+
if (!rayTracePass.preparePrograms())
|
|
255
|
+
return true;
|
|
231
256
|
const resetAccumulation = isFirstFrame;
|
|
257
|
+
if (resetAccumulation)
|
|
258
|
+
aov.reset();
|
|
259
|
+
if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov, camera, renderWidth, renderHeight, execution.aovs))
|
|
260
|
+
return true;
|
|
232
261
|
if (resetAccumulation) {
|
|
233
262
|
tileTimingGeneration++;
|
|
234
263
|
elapsedTileTime = undefined;
|
|
@@ -252,7 +281,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
252
281
|
if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {
|
|
253
282
|
tile.samplesPerFrame = offlineSamplesPerBatch;
|
|
254
283
|
}
|
|
255
|
-
else if (!
|
|
284
|
+
else if (!batchSamples ||
|
|
256
285
|
!(tile.isFirstTile && tile.isLastTile)) {
|
|
257
286
|
tile.samplesPerFrame = 1;
|
|
258
287
|
}
|
|
@@ -267,6 +296,10 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
267
296
|
if (tile.isLastTile)
|
|
268
297
|
sampleCount++;
|
|
269
298
|
}
|
|
299
|
+
if (sampleCount !== frameSampleCount) {
|
|
300
|
+
if (execution?.aovs?.length)
|
|
301
|
+
rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
|
|
302
|
+
}
|
|
270
303
|
if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {
|
|
271
304
|
drawPostProcess(sampleCount >= maxSamples, true);
|
|
272
305
|
}
|
|
@@ -334,9 +367,25 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
334
367
|
invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },
|
|
335
368
|
synchronizeBackground() { },
|
|
336
369
|
configure(settings) {
|
|
337
|
-
|
|
370
|
+
if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1))
|
|
371
|
+
throw new RangeError('aovSamples must be a positive integer');
|
|
372
|
+
const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);
|
|
373
|
+
if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples)
|
|
374
|
+
aov.samples = 0;
|
|
375
|
+
execution = { ...settings, aovs: [...(settings.aovs ?? [])] };
|
|
376
|
+
// A reduced preview set can retire the previously displayed AOV before
|
|
377
|
+
// Display applies its next channel after tracing.
|
|
378
|
+
const displayedAov = displayAovKind(output);
|
|
379
|
+
if (displayedAov && !settings.aovs?.includes(displayedAov))
|
|
380
|
+
output = 'final';
|
|
381
|
+
if (previousMask && !nextMask) {
|
|
382
|
+
aov.dispose();
|
|
383
|
+
aov.history.clear();
|
|
384
|
+
aov.width = aov.height = 0;
|
|
385
|
+
aov.reset();
|
|
386
|
+
}
|
|
338
387
|
maxTimePerTile = Math.max(1, settings.timeBudgetMs);
|
|
339
|
-
|
|
388
|
+
batchSamples = settings.batchSamples;
|
|
340
389
|
tileRender.setDesiredMsPerTile(maxTimePerTile);
|
|
341
390
|
tileRender.setMaxTiles(settings.maxTiles);
|
|
342
391
|
},
|
|
@@ -358,12 +407,13 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
358
407
|
getMemory() {
|
|
359
408
|
return {
|
|
360
409
|
width: renderWidth, height: renderHeight,
|
|
361
|
-
bytes: rayTracePass.getTargetMemoryBytes(targetKey)
|
|
410
|
+
bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)
|
|
362
411
|
+ rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)
|
|
363
412
|
};
|
|
364
413
|
},
|
|
365
414
|
isFirstFrame: () => isFirstFrame,
|
|
366
415
|
restartSamples(_preserveTemporalHistory = false) {
|
|
416
|
+
aov.reset();
|
|
367
417
|
tileRender.reset();
|
|
368
418
|
isFirstFrame = true;
|
|
369
419
|
sampleCount = 0;
|
|
@@ -377,6 +427,8 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
377
427
|
}
|
|
378
428
|
if (isFirstFrame || sampleCount < 1)
|
|
379
429
|
return Promise.resolve(false);
|
|
430
|
+
if (output !== 'final' && output !== 'shadow')
|
|
431
|
+
return Promise.resolve(true);
|
|
380
432
|
pendingDenoiser = filter.denoiser;
|
|
381
433
|
drawPostProcess(true);
|
|
382
434
|
return Promise.resolve(true);
|
|
@@ -441,6 +493,35 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
441
493
|
return undefined;
|
|
442
494
|
},
|
|
443
495
|
getTotalSamplesRendered: () => sampleCount,
|
|
496
|
+
/** @internal */
|
|
497
|
+
_displayParity() {
|
|
498
|
+
return {
|
|
499
|
+
record(trace) { displayTrace = trace; },
|
|
500
|
+
load(input) {
|
|
501
|
+
setSize(input.width, input.height);
|
|
502
|
+
denoiseValid = false;
|
|
503
|
+
pendingDenoiser = undefined;
|
|
504
|
+
const texture = (data) => {
|
|
505
|
+
const t = new Texture2D({ width: input.width, height: input.height,
|
|
506
|
+
source: { data, width: input.width, height: input.height }, type: constants.FLOAT,
|
|
507
|
+
minFilter: constants.NEAREST, magFilter: constants.NEAREST });
|
|
508
|
+
return t;
|
|
509
|
+
};
|
|
510
|
+
const shadow = Float32Array.from({ length: input.width * input.height * 4 }, (_, i) => i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);
|
|
511
|
+
const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);
|
|
512
|
+
const inputs = { color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),
|
|
513
|
+
moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),
|
|
514
|
+
shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments) };
|
|
515
|
+
rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);
|
|
516
|
+
sampleCount = resolvedSamples = input.samples;
|
|
517
|
+
resolvedHasShadowCatcher = input.catcher;
|
|
518
|
+
isFirstFrame = false;
|
|
519
|
+
rayTraceOutputPass.setSize(renderWidth, renderHeight);
|
|
520
|
+
rayTraceOutputPass.setSampleCount(sampleCount);
|
|
521
|
+
rayTraceOutputPass.createPass(rayTracePass);
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
},
|
|
444
525
|
getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),
|
|
445
526
|
flushDiagnostics: async () => { },
|
|
446
527
|
setShadowCatcherParams(color, alpha) {
|
|
@@ -468,6 +549,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
468
549
|
setOnSampleRendered(cb) {
|
|
469
550
|
sampleRenderedCallback = cb;
|
|
470
551
|
},
|
|
552
|
+
setAovDisplayOptions(options) { aovDisplayOptions = { ...options, depthRange: [...options.depthRange] }; },
|
|
471
553
|
setOutput(nextOutput) {
|
|
472
554
|
if (output === nextOutput)
|
|
473
555
|
return false;
|
|
@@ -481,6 +563,27 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
481
563
|
const width = presentationTexture.width, height = presentationTexture.height;
|
|
482
564
|
return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };
|
|
483
565
|
},
|
|
566
|
+
aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },
|
|
567
|
+
getAovSamples() { return aov.samples; },
|
|
568
|
+
restartAovs() { aov.reset(); },
|
|
569
|
+
refineAovs(camera, samples = sampleCount) {
|
|
570
|
+
if (samples < 1 || !execution?.aovs?.length)
|
|
571
|
+
return true;
|
|
572
|
+
rayTracePass.setCamera(camera);
|
|
573
|
+
aovCamera = camera;
|
|
574
|
+
return rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, samples, execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
|
|
575
|
+
},
|
|
576
|
+
async readAov(kind) {
|
|
577
|
+
if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1))
|
|
578
|
+
throw new Error('AOV output is not ready');
|
|
579
|
+
rayTracePass.setCamera(aovCamera);
|
|
580
|
+
while (!rayTracePass.renderAovs(aov, aovCamera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset)) {
|
|
581
|
+
if (disposed || renderer.gl.isContextLost())
|
|
582
|
+
throw new Error('AOV compilation was interrupted');
|
|
583
|
+
await new Promise(resolve => scheduleFrame(() => resolve()));
|
|
584
|
+
}
|
|
585
|
+
return aov.read(kind);
|
|
586
|
+
},
|
|
484
587
|
async readOutput(kind) {
|
|
485
588
|
if (kind === 'denoised' && (!denoisedTexture || !denoiseValid))
|
|
486
589
|
kind = 'hdr';
|
|
@@ -494,6 +597,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
|
|
|
494
597
|
disposed = true;
|
|
495
598
|
if (typeof document !== 'undefined')
|
|
496
599
|
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
600
|
+
aov.dispose();
|
|
497
601
|
rayTracePass.releaseTarget(targetKey);
|
|
498
602
|
rayTraceOutputPass.dispose();
|
|
499
603
|
presentationTexture?.dispose(renderer.gl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.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 Camera from '../scene/Camera.js';\nimport { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\nconst wavelengths = [650, 510, 475];\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\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 output: DisplayChannel = 'final';\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive wavelength enables stochastic hero-wavelength sampling\n // in the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setWavelength(wavelengths[0]);\n rayTracePass.createPass(clear, tile);\n } else {\n wavelengths.forEach((wavelength, index) => {\n rayTracePass.setWavelength(wavelength);\n rayTracePass.createPass(clear && index === 0, tile, index > 0);\n });\n }\n } else {\n rayTracePass.setWavelength(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\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}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n });\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (output === 'normal' || output === 'albedo') {\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n if (!renderer.isAllProgramCompiled()) {\n isFirstFrame = true;\n sampleCount = 0;\n tileRender.reset();\n return true;\n }\n\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !allowMultipleSamplesPerFrame ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n 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.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\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 },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\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 if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WebGLAov} from './WebGLAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.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 Camera from '../scene/Camera.js';\nimport type { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport type {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let batchSamples = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n const aov=new WebGLAov(renderer);\n let aovCamera: Camera | undefined;\n let displayTrace: string[] | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\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 output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive channel enables stochastic hero-wavelength sampling in\n // the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setSpectralChannel(1);\n rayTracePass.createPass(clear, tile);\n } else {\n for (let channel = 1; channel <= 3; channel++) {\n rayTracePass.setSpectralChannel(channel);\n rayTracePass.createPass(clear && channel === 1, tile, channel > 1);\n }\n }\n } else {\n rayTracePass.setSpectralChannel(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\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 presentationTexture = copy.copy(aov.visualize(aovKind,aovDisplayOptions), renderWidth, renderHeight, presentationTexture);\n presentationDenoised = false;\n return;\n }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\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}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n displayTrace?.push('Compose:DisplayEncoded');\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n }, displayTrace);\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || 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);\n } else if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n // Waiting for a shader is not an input change; see the WebGPU pipeline.\n if (!renderer.isAllProgramCompiled()) return true;\n\n rayTracePass.setCamera(camera);\n aovCamera=camera;\n if (!rayTracePass.preparePrograms()) return true;\n const resetAccumulation = isFirstFrame;\n if(resetAccumulation) aov.reset();\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov,camera,renderWidth,renderHeight,execution.aovs)) return true;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !batchSamples ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if(sampleCount!==frameSampleCount){\n if(execution?.aovs?.length) rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n 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.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\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 // A reduced preview set can retire the previously displayed AOV before\n // Display applies its next channel after tracing.\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 },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n aov.reset();\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\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 },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n setSize(input.width, input.height);\n denoiseValid = false; pendingDenoiser = undefined;\n const texture = (data: Float32Array) => {\n const t = new Texture2D({width: input.width, height: input.height,\n source: {data, width: input.width, height: input.height}, type: constants.FLOAT,\n minFilter: constants.NEAREST, magFilter: constants.NEAREST});\n return t;\n };\n const shadow = Float32Array.from({length: input.width * input.height * 4}, (_, i) =>\n i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);\n const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);\n const inputs = {color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),\n moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),\n shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments)};\n rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher; isFirstFrame = false;\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n };\n },\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\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 if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\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 async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\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 rayTracePass.setCamera(camera); aovCamera = camera;\n return rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,samples,execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\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 rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov,aovCamera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset)) {\n if (disposed || renderer.gl.isContextLost()) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n aov.dispose();\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Physically based clear sky for the viewer's default environment, baked on
|
|
3
|
+
* the GPU into an equirectangular radiance map.
|
|
4
|
+
*
|
|
5
|
+
* Integrates single scattering through a spherical Rayleigh, Mie and ozone
|
|
6
|
+
* atmosphere and adds multiple scattering with the isotropic approximation
|
|
7
|
+
* of Hillaire, "A Scalable and Production Ready Sky and Atmosphere Rendering
|
|
8
|
+
* Technique" (EGSR 2020). Coefficients are the Earth defaults from Bruneton,
|
|
9
|
+
* "Precomputed Atmospheric Scattering" (2008/2017). Formulas only; no code is
|
|
10
|
+
* taken from either reference.
|
|
11
|
+
*
|
|
12
|
+
* WebGL 2 passes: transmittance table, multiple scattering by altitude, a
|
|
13
|
+
* sky-view table by elevation and azimuth relative to the sun, irradiance and
|
|
14
|
+
* exposure, then the map itself with an anti-aliased, limb-darkened sun disk.
|
|
15
|
+
* Distances are in kilometers so float32 keeps the horizon precise.
|
|
16
|
+
*/
|
|
17
|
+
export interface SkyData {
|
|
18
|
+
data: Float32Array;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
22
|
+
/** Bakes skies with its own WebGL 2 context; requires float render targets. */
|
|
23
|
+
export declare class WebGLSkyBaker {
|
|
24
|
+
private readonly gl;
|
|
25
|
+
private readonly programs;
|
|
26
|
+
private readonly targets;
|
|
27
|
+
private map?;
|
|
28
|
+
constructor();
|
|
29
|
+
/** Clear sky at a local solar time, in hours. */
|
|
30
|
+
bake(hours: number, width?: number, height?: number): SkyData;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
private program;
|
|
33
|
+
private target;
|
|
34
|
+
private release;
|
|
35
|
+
private uniform;
|
|
36
|
+
private bind;
|
|
37
|
+
private draw;
|
|
38
|
+
private read;
|
|
39
|
+
}
|