@meimu/mutracer 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/README.md +3 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +9328 -7614
- package/docs/api.md +83 -35
- package/docs/caustics.md +80 -0
- package/docs/materials.md +9 -6
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +53 -9
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +122 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +18 -6
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -1
- package/lib/Engine.js +77 -14
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +81 -24
- package/lib/Render.js +201 -26
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +4 -2
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +11 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.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/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- 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 +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +65 -21
- package/lib/renderer/WGPURayTracePass.js +730 -409
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +110 -68
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +10 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
- package/lib/renderer/WebGLRayTracePass.js +157 -116
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +17 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- 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/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +45 -37
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- 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 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
- 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 +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- 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 +70 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
- 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 +160 -118
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
- 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/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +13 -7
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +338 -252
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +5 -4
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +5 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- 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 +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
- package/lib/renderer/sceneLayoutSchema.js +3 -3
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- 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/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- 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/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +3 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +539 -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.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
- 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 +142 -138
- 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 +228 -189
- 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 +11 -11
- 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 +88 -92
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
- 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.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- 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.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +22 -0
- package/lib/settings/render.js +2 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +23 -16
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +2 -1
- package/package.json +7 -4
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SurfaceHit } from './surfaceHit.js';
|
|
1
2
|
import { WebGLAov } from './WebGLAov.js';
|
|
2
3
|
import { type AovKind } from './aov.js';
|
|
3
4
|
import { type SamplingPattern } from './sampling.js';
|
|
@@ -12,6 +13,10 @@ declare class WebGLRayTracePass {
|
|
|
12
13
|
private _aovPrimitiveCache;
|
|
13
14
|
private readonly _renderer;
|
|
14
15
|
private _meshes;
|
|
16
|
+
private _emissiveActive;
|
|
17
|
+
private _directLightLegacy?;
|
|
18
|
+
private _emissiveCache;
|
|
19
|
+
private _emissiveTex;
|
|
15
20
|
private _sceneEnvironment;
|
|
16
21
|
private _rectLightTextures;
|
|
17
22
|
private _analyticLights;
|
|
@@ -33,8 +38,9 @@ declare class WebGLRayTracePass {
|
|
|
33
38
|
private _dirtyColorMeshes;
|
|
34
39
|
private _tlas?;
|
|
35
40
|
private _bvhData?;
|
|
36
|
-
private
|
|
37
|
-
private
|
|
41
|
+
private _instancesOffset;
|
|
42
|
+
private _vertexAttributeData?;
|
|
43
|
+
private _vertexAttributeLayout?;
|
|
38
44
|
private _meshSnapshot;
|
|
39
45
|
private _snapshotByMesh;
|
|
40
46
|
private _needsUpdateAnalyticLightsBuffer;
|
|
@@ -62,14 +68,8 @@ declare class WebGLRayTracePass {
|
|
|
62
68
|
private _sequenceSeed;
|
|
63
69
|
private _zLogSPP;
|
|
64
70
|
private _positionBufferTex;
|
|
65
|
-
private
|
|
66
|
-
private _colorBufferTex;
|
|
67
|
-
private _tangentBufferTex;
|
|
68
|
-
private _uvBufferTex;
|
|
69
|
-
private _uv1BufferTex;
|
|
71
|
+
private _vertexAttributeTex;
|
|
70
72
|
private _bvhBufferTex;
|
|
71
|
-
private _instancesBufferTex;
|
|
72
|
-
private _matIndexBufferTex;
|
|
73
73
|
private _hasTransmission;
|
|
74
74
|
private _hasAlpha;
|
|
75
75
|
private _invalid;
|
|
@@ -77,6 +77,7 @@ declare class WebGLRayTracePass {
|
|
|
77
77
|
private _mainPass;
|
|
78
78
|
private _shadowCatcherPass;
|
|
79
79
|
private _viewProjInv;
|
|
80
|
+
private _projectionInv;
|
|
80
81
|
private _apertureRadius;
|
|
81
82
|
private _focusDistance;
|
|
82
83
|
private _aovPass;
|
|
@@ -87,6 +88,8 @@ declare class WebGLRayTracePass {
|
|
|
87
88
|
private _depthAspect;
|
|
88
89
|
private _hasShadowCatcher;
|
|
89
90
|
private _spectral;
|
|
91
|
+
private _shareSpectralPrefix;
|
|
92
|
+
private _independentSpectralPaths;
|
|
90
93
|
constructor(renderer: WebGLRenderer);
|
|
91
94
|
preparePrograms(): boolean;
|
|
92
95
|
createPass(clear: boolean, tile: {
|
|
@@ -116,6 +119,8 @@ declare class WebGLRayTracePass {
|
|
|
116
119
|
textureAtlas: import("./textureAtlas.js").TextureAtlasStats | undefined;
|
|
117
120
|
};
|
|
118
121
|
private _updateMeshData;
|
|
122
|
+
private _uploadBVH;
|
|
123
|
+
private _uploadInstanceRanges;
|
|
119
124
|
private _updateMaterialConstants;
|
|
120
125
|
private _updateMeshMembership;
|
|
121
126
|
private _updateGeometryData;
|
|
@@ -136,18 +141,22 @@ declare class WebGLRayTracePass {
|
|
|
136
141
|
bevel: boolean;
|
|
137
142
|
dispersionWavelengths: 1 | 3;
|
|
138
143
|
directLightCandidates: number;
|
|
144
|
+
caustics?: import('../Render.js').CausticSettings;
|
|
139
145
|
}): void;
|
|
140
|
-
|
|
146
|
+
setSpectralChannel(channel: number): void;
|
|
141
147
|
setSampleCount(sampleCount: number): void;
|
|
142
148
|
isInvalid(): boolean;
|
|
143
149
|
hasShadowCatcher(): boolean;
|
|
144
150
|
hasDispersion(): boolean;
|
|
151
|
+
hasSharedSpectralPrefix(): boolean;
|
|
145
152
|
prepare(): void;
|
|
146
153
|
setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed?: number): boolean;
|
|
147
154
|
setSampleSequenceOffset(_offset: number): void;
|
|
148
155
|
prepareAovs(state: WebGLAov, camera: Camera, width: number, height: number, kinds: readonly AovKind[]): boolean;
|
|
149
156
|
renderAovs(state: WebGLAov, camera: Camera, width: number, height: number, samples: number, cap: number, kinds: readonly AovKind[], sequenceOffset?: number): boolean;
|
|
150
|
-
|
|
157
|
+
pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
|
|
158
|
+
readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
|
|
159
|
+
private _readDepthSamples;
|
|
151
160
|
dispose(): void;
|
|
152
161
|
}
|
|
153
162
|
export default WebGLRayTracePass;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { materialNeedsVertexTangents } from './tangentRequirements.js';
|
|
2
|
+
import { resolveSurfaceHit } from './surfaceHit.js';
|
|
3
|
+
import { researchTransport } from './researchTransport.js';
|
|
4
|
+
import { EmissiveTriangleCache } from './lightSampling.js';
|
|
5
|
+
import { prepareWebGLLightSampling } from './webglLightSampling.js';
|
|
1
6
|
import { AovPrimitiveCache } from './AovPrimitiveCache.js';
|
|
2
7
|
import { aovTraceFragment } from './glsl/aovTrace.frag.js';
|
|
3
8
|
import { packAovScene } from './aovScene.js';
|
|
4
|
-
import { aovMask } from './aov.js';
|
|
9
|
+
import { aovMask, AOV_ACCUMULATED_MASK, AOV_REFLECTANCE_MASK } from './aov.js';
|
|
5
10
|
import { WebGLSkySource } from './WebGLSkySource.js';
|
|
6
|
-
import { normalizeBounces } from './pathLimits.js';
|
|
11
|
+
import { normalizeBounces, MAX_PATH_EVENTS_WEBGL } from './pathLimits.js';
|
|
7
12
|
import { updateMeshInstanceColors } from './prepareMeshBVH.js';
|
|
8
13
|
import { updateTLASInstanceColors } from './bvhAccel.js';
|
|
9
14
|
import { getMaterialHashKey } from '../scene/openPbrSchema.js';
|
|
@@ -22,7 +27,7 @@ import { MaterialChangeTracker, materialIsEmissive } from './materialChanges.js'
|
|
|
22
27
|
import { constants, Texture2D as WebGLTexture2D } from './webgl.js';
|
|
23
28
|
import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
|
|
24
29
|
import { mat4 } from '../math.js';
|
|
25
|
-
import { buildBLAS,
|
|
30
|
+
import { buildBLAS, buildWebTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
|
|
26
31
|
import { generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform, backgroundMapRotation } from './envMapCreation.js';
|
|
27
32
|
import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
|
|
28
33
|
import createRayTraceFragmentShader from './glsl/rayTrace.frag.js';
|
|
@@ -37,6 +42,7 @@ import { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged
|
|
|
37
42
|
import { Attribute } from '../scene/Geometry.js';
|
|
38
43
|
import { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';
|
|
39
44
|
import { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';
|
|
45
|
+
import { packVertexAttributes, vertexAttributeDefines, vertexAttributeLayout } from './webglVertexAttributes.js';
|
|
40
46
|
import { DEFAULT_BEVEL_SAMPLES, normalizeBevelSamples } from './RenderingPipeline.js';
|
|
41
47
|
import { getOpenPbrEnergyLutData, OPENPBR_ENERGY_LUT_HEIGHT, OPENPBR_ENERGY_LUT_WIDTH } from './openPbrEnergyLut.js';
|
|
42
48
|
// A defensive mixture keeps weak-but-wide lights from being starved by an
|
|
@@ -64,6 +70,10 @@ class WebGLRayTracePass {
|
|
|
64
70
|
_aovPrimitiveCache = new AovPrimitiveCache();
|
|
65
71
|
_renderer;
|
|
66
72
|
_meshes = [];
|
|
73
|
+
_emissiveActive = false;
|
|
74
|
+
_directLightLegacy;
|
|
75
|
+
_emissiveCache = new EmissiveTriangleCache();
|
|
76
|
+
_emissiveTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
67
77
|
_sceneEnvironment = new SceneEnvironmentCache();
|
|
68
78
|
_rectLightTextures = new RectLightTextureTracker();
|
|
69
79
|
_analyticLights = [];
|
|
@@ -85,8 +95,9 @@ class WebGLRayTracePass {
|
|
|
85
95
|
_dirtyColorMeshes = new Set();
|
|
86
96
|
_tlas;
|
|
87
97
|
_bvhData;
|
|
88
|
-
|
|
89
|
-
|
|
98
|
+
_instancesOffset = 0;
|
|
99
|
+
_vertexAttributeData;
|
|
100
|
+
_vertexAttributeLayout;
|
|
90
101
|
_meshSnapshot = [];
|
|
91
102
|
_snapshotByMesh = new WeakMap();
|
|
92
103
|
_needsUpdateAnalyticLightsBuffer = true;
|
|
@@ -122,17 +133,8 @@ class WebGLRayTracePass {
|
|
|
122
133
|
_sequenceSeed = 0;
|
|
123
134
|
_zLogSPP = 0;
|
|
124
135
|
_positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
125
|
-
|
|
126
|
-
_colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
127
|
-
_tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
128
|
-
_uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
129
|
-
_uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
136
|
+
_vertexAttributeTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
130
137
|
_bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
131
|
-
_instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
132
|
-
_matIndexBufferTex = new WebGLTexture2D({
|
|
133
|
-
...commonNearestFloatProps
|
|
134
|
-
// type: constants.INT
|
|
135
|
-
});
|
|
136
138
|
_hasTransmission = false;
|
|
137
139
|
_hasAlpha = false;
|
|
138
140
|
_invalid = false;
|
|
@@ -140,6 +142,7 @@ class WebGLRayTracePass {
|
|
|
140
142
|
_mainPass;
|
|
141
143
|
_shadowCatcherPass;
|
|
142
144
|
_viewProjInv = mat4.create();
|
|
145
|
+
_projectionInv = mat4.create();
|
|
143
146
|
_apertureRadius = 0;
|
|
144
147
|
_focusDistance = 10;
|
|
145
148
|
_aovPass;
|
|
@@ -150,6 +153,8 @@ class WebGLRayTracePass {
|
|
|
150
153
|
_depthAspect = 1;
|
|
151
154
|
_hasShadowCatcher = false;
|
|
152
155
|
_spectral = false;
|
|
156
|
+
_shareSpectralPrefix = true;
|
|
157
|
+
_independentSpectralPaths = false;
|
|
153
158
|
constructor(renderer) {
|
|
154
159
|
this._renderer = renderer;
|
|
155
160
|
const accumulationOutput = {
|
|
@@ -222,7 +227,7 @@ class WebGLRayTracePass {
|
|
|
222
227
|
: this._mainPass.getOutput(label);
|
|
223
228
|
}
|
|
224
229
|
setBounce(bounce) {
|
|
225
|
-
const next = normalizeBounces(bounce);
|
|
230
|
+
const next = normalizeBounces(bounce, MAX_PATH_EVENTS_WEBGL);
|
|
226
231
|
const changed = this._bounces !== next;
|
|
227
232
|
this._bounces = next;
|
|
228
233
|
return changed;
|
|
@@ -433,34 +438,14 @@ class WebGLRayTracePass {
|
|
|
433
438
|
this._needsUpdateMeshMembership = false;
|
|
434
439
|
const mergedGeometry = res.geometry;
|
|
435
440
|
const materials = res.materials;
|
|
436
|
-
|
|
437
|
-
this.
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));
|
|
441
|
-
const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);
|
|
442
|
-
const blasOffset = tlasBuffer.length / 4;
|
|
443
|
-
bvhBuffer.set(tlasBuffer);
|
|
444
|
-
bvhBuffer.set(blasBuffer, blasOffset * 4);
|
|
441
|
+
this._tlas = buildWebTLAS(res.instances, res.blases);
|
|
442
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
443
|
+
const layout = this._vertexAttributeLayout = vertexAttributeLayout(mergedGeometry);
|
|
444
|
+
let vertexAttributeColumns = 0;
|
|
445
445
|
if (mergedGeometry.position.array.length > 0) {
|
|
446
446
|
setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);
|
|
450
|
-
mergedGeometry.tangent &&
|
|
451
|
-
setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);
|
|
452
|
-
mergedGeometry.uv &&
|
|
453
|
-
setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);
|
|
454
|
-
mergedGeometry.uv1 &&
|
|
455
|
-
setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);
|
|
456
|
-
mergedGeometry.materialIndex &&
|
|
457
|
-
setDataTexture(this._matIndexBufferTex,
|
|
458
|
-
// TODO currently int texture doesn't work
|
|
459
|
-
this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array), 4);
|
|
460
|
-
}
|
|
461
|
-
if (bvhBuffer.length > 0) {
|
|
462
|
-
setDataTexture(this._bvhBufferTex, bvhBuffer, 4);
|
|
463
|
-
setDataTexture(this._instancesBufferTex, instancesBuffer, 4);
|
|
447
|
+
this._vertexAttributeData = packVertexAttributes(mergedGeometry, layout, new Float32Array(mergedGeometry.vertexCount * layout.stride * 4));
|
|
448
|
+
vertexAttributeColumns = setDataTexture(this._vertexAttributeTex, this._vertexAttributeData, 4).columnsLog;
|
|
464
449
|
}
|
|
465
450
|
this._materialData?.dispose(this._renderer.gl);
|
|
466
451
|
const materialData = new MaterialTable(materials, this._analyticLights, {
|
|
@@ -472,26 +457,41 @@ class WebGLRayTracePass {
|
|
|
472
457
|
this._tracePasses.forEach((pass) => {
|
|
473
458
|
pass.setUniforms({
|
|
474
459
|
bvhBuffer: this._bvhBufferTex,
|
|
475
|
-
instancesBuffer: this._instancesBufferTex,
|
|
476
460
|
positionBuffer: this._positionBufferTex,
|
|
477
|
-
|
|
478
|
-
tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,
|
|
479
|
-
colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,
|
|
480
|
-
uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,
|
|
481
|
-
uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,
|
|
482
|
-
materialIndexBuffer: this._matIndexBufferTex,
|
|
483
|
-
bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,
|
|
461
|
+
vertexAttributes: this._vertexAttributeTex,
|
|
484
462
|
vertexColumns: textureDimensionsFromArray(Attribute.getCount(mergedGeometry.position)).columnsLog,
|
|
485
|
-
|
|
486
|
-
.columnsLog,
|
|
487
|
-
blasOffset,
|
|
463
|
+
vertexAttributeColumns,
|
|
488
464
|
isEmptyScene: +(res.instances.length === 0)
|
|
489
465
|
});
|
|
490
466
|
});
|
|
491
467
|
this._updateMaterialConstants(materials, materialData, mergedGeometry);
|
|
492
468
|
this._materialChanges.capture(materials);
|
|
493
469
|
this._pendingMaterialUpdate = undefined;
|
|
494
|
-
|
|
470
|
+
}
|
|
471
|
+
// One texture holds the TLAS, the BLASes and then the instance records.
|
|
472
|
+
_uploadBVH(blas) {
|
|
473
|
+
const tlas = this._tlas, instances = new Float32Array(tlas.instancesBuffer);
|
|
474
|
+
const tlasLength = tlas.buffer.byteLength / 4, instancesOffset = tlasLength + blas.length;
|
|
475
|
+
const data = this._bvhData = new Float32Array(instancesOffset + instances.length);
|
|
476
|
+
data.set(new Float32Array(tlas.buffer));
|
|
477
|
+
data.set(blas, tlasLength);
|
|
478
|
+
data.set(instances, instancesOffset);
|
|
479
|
+
this._instancesOffset = instancesOffset / 4;
|
|
480
|
+
if (data.length > 0)
|
|
481
|
+
setDataTexture(this._bvhBufferTex, data, 4);
|
|
482
|
+
this._tracePasses.forEach(pass => pass.setUniforms({
|
|
483
|
+
bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
|
|
484
|
+
blasOffset: tlasLength / 4,
|
|
485
|
+
instancesOffset: this._instancesOffset
|
|
486
|
+
}));
|
|
487
|
+
}
|
|
488
|
+
_uploadInstanceRanges(ranges) {
|
|
489
|
+
const instances = new Uint8Array(this._tlas.instancesBuffer), data = this._bvhData;
|
|
490
|
+
const base = this._instancesOffset * 16;
|
|
491
|
+
for (const { offset, size } of ranges) {
|
|
492
|
+
new Uint8Array(data.buffer).set(instances.subarray(offset, offset + size), base + offset);
|
|
493
|
+
this._bvhBufferTex.updateDataRange(this._renderer.gl, data, base + offset, size);
|
|
494
|
+
}
|
|
495
495
|
}
|
|
496
496
|
_updateMaterialConstants(materials, materialData, mergedGeometry) {
|
|
497
497
|
// Avoid too much shader compilation
|
|
@@ -503,13 +503,24 @@ class WebGLRayTracePass {
|
|
|
503
503
|
this._hasTransmission = materials.some((m) => m.transmissionWeight > 0 ||
|
|
504
504
|
m.mapAlphaUsage === "transmission");
|
|
505
505
|
this._hasAlpha = materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque');
|
|
506
|
-
|
|
506
|
+
const spectral = materials.some((m) => m.transmissionDispersionScale > 0);
|
|
507
|
+
if (spectral !== !!this._spectral) {
|
|
508
|
+
this._spectral = spectral;
|
|
509
|
+
const shader = createRayTraceFragmentShader({
|
|
510
|
+
channelIndependentLight: spectral, shareSpectralPrefix: spectral && this._shareSpectralPrefix
|
|
511
|
+
});
|
|
512
|
+
if (!researchTransport()?.configure(this, 'webgl')?.enabled) {
|
|
513
|
+
shader.parallelCompile = true;
|
|
514
|
+
this._mainPass.setShader(shader);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
507
517
|
this._tracePasses.forEach(pass => {
|
|
508
518
|
pass.setDefines({
|
|
509
519
|
OES_texture_float_linear: true,
|
|
510
520
|
STACK_SIZE,
|
|
511
521
|
USE_VERTEX_COLOR: mergedGeometry.color != null,
|
|
512
|
-
USE_TANGENT: mergedGeometry.tangent != null,
|
|
522
|
+
USE_TANGENT: mergedGeometry.tangent != null && materials.some(materialNeedsVertexTangents),
|
|
523
|
+
...vertexAttributeDefines(vertexAttributeLayout(mergedGeometry)),
|
|
513
524
|
USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),
|
|
514
525
|
HAS_TRANSMISSION: this._hasTransmission,
|
|
515
526
|
HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
|
|
@@ -524,7 +535,7 @@ class WebGLRayTracePass {
|
|
|
524
535
|
// Multiple-scattering SSS paths need enough collisions to return to
|
|
525
536
|
// the boundary before roulette; terminating at depth five produces
|
|
526
537
|
// dark materials and a handful of very large surviving samples.
|
|
527
|
-
RR_MAX:
|
|
538
|
+
RR_MAX: 12,
|
|
528
539
|
...materialData.defines
|
|
529
540
|
});
|
|
530
541
|
materialData.setToPass(pass);
|
|
@@ -533,20 +544,9 @@ class WebGLRayTracePass {
|
|
|
533
544
|
_updateMeshMembership() {
|
|
534
545
|
const res = this._pendingMembershipData;
|
|
535
546
|
this._preparedMeshData = res;
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
data.set(new Float32Array(tlas.buffer));
|
|
540
|
-
data.set(blas, tlas.buffer.byteLength / 4);
|
|
541
|
-
this._instancesData = new Float32Array(tlas.instancesBuffer);
|
|
542
|
-
setDataTexture(this._bvhBufferTex, data, 4);
|
|
543
|
-
setDataTexture(this._instancesBufferTex, this._instancesData, 4);
|
|
544
|
-
this._tracePasses.forEach(pass => pass.setUniforms({
|
|
545
|
-
bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
|
|
546
|
-
instancesColumns: textureDimensionsFromArray(this._instancesData.length / 4).columnsLog,
|
|
547
|
-
blasOffset: tlas.buffer.byteLength / 16,
|
|
548
|
-
isEmptyScene: +(res.instances.length === 0)
|
|
549
|
-
}));
|
|
547
|
+
this._tlas = buildWebTLAS(res.instances, res.blases);
|
|
548
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
549
|
+
this._tracePasses.forEach(pass => pass.setUniform('isEmptyScene', +(res.instances.length === 0)));
|
|
550
550
|
this._pendingMembershipData = undefined;
|
|
551
551
|
this._needsUpdateMeshMembership = false;
|
|
552
552
|
this._debugBvhData = undefined;
|
|
@@ -554,20 +554,12 @@ class WebGLRayTracePass {
|
|
|
554
554
|
_updateGeometryData() {
|
|
555
555
|
const res = this._preparedMeshData, tlas = this._tlas;
|
|
556
556
|
const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent))
|
|
564
|
-
texture.updateDataRange(this._renderer.gl, attribute.array, first * attribute.itemSize * 4, count * attribute.itemSize * 4);
|
|
565
|
-
if (!topologyChanged)
|
|
566
|
-
continue;
|
|
567
|
-
const material = this._materialIndexData;
|
|
568
|
-
for (let i = first * 4; i < (first + count) * 4; i++)
|
|
569
|
-
material[i] = res.geometry.materialIndex.array[i];
|
|
570
|
-
this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);
|
|
557
|
+
const layout = this._vertexAttributeLayout, attributes = this._vertexAttributeData;
|
|
558
|
+
for (const { first, count } of update.vertices) {
|
|
559
|
+
const position = res.geometry.position;
|
|
560
|
+
this._positionBufferTex.updateDataRange(this._renderer.gl, position.array, first * position.itemSize * 4, count * position.itemSize * 4);
|
|
561
|
+
packVertexAttributes(res.geometry, layout, attributes, first, count);
|
|
562
|
+
this._vertexAttributeTex.updateDataRange(this._renderer.gl, attributes, first * layout.stride * 16, count * layout.stride * 16);
|
|
571
563
|
}
|
|
572
564
|
for (const mesh of update.meshes)
|
|
573
565
|
this._dirtyTransformMeshes.add(mesh);
|
|
@@ -577,12 +569,7 @@ class WebGLRayTracePass {
|
|
|
577
569
|
if (update.resized) {
|
|
578
570
|
res.instances = updateMeshInstanceTransforms(res.instanceBindings);
|
|
579
571
|
refitTLAS(tlas, res.instances, res.blases);
|
|
580
|
-
|
|
581
|
-
this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
|
|
582
|
-
this._bvhData.set(new Float32Array(tlas.buffer));
|
|
583
|
-
this._bvhData.set(blas, tlas.buffer.byteLength / 4);
|
|
584
|
-
setDataTexture(this._bvhBufferTex, this._bvhData, 4);
|
|
585
|
-
this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData.length / 4).columnsLog));
|
|
572
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
586
573
|
}
|
|
587
574
|
else {
|
|
588
575
|
const ranges = [];
|
|
@@ -603,8 +590,7 @@ class WebGLRayTracePass {
|
|
|
603
590
|
if (res && tlas) {
|
|
604
591
|
const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);
|
|
605
592
|
const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);
|
|
606
|
-
|
|
607
|
-
this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
|
|
593
|
+
this._uploadInstanceRanges(ranges);
|
|
608
594
|
}
|
|
609
595
|
this._dirtyColorMeshes.clear();
|
|
610
596
|
}
|
|
@@ -624,8 +610,7 @@ class WebGLRayTracePass {
|
|
|
624
610
|
this._bvhData.set(new Float32Array(tlas.buffer));
|
|
625
611
|
for (const { offset, size } of ranges.tlasRanges)
|
|
626
612
|
this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
|
|
627
|
-
|
|
628
|
-
this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
|
|
613
|
+
this._uploadInstanceRanges(ranges.instanceRanges);
|
|
629
614
|
this._dirtyTransformMeshes.clear();
|
|
630
615
|
this._needsRefitTLAS = false;
|
|
631
616
|
this._debugBvhData = undefined;
|
|
@@ -679,6 +664,7 @@ class WebGLRayTracePass {
|
|
|
679
664
|
? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +
|
|
680
665
|
POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)
|
|
681
666
|
: fallbackPmf);
|
|
667
|
+
this._directLightLegacy = { env: this._envLightSelectionPmf, pmfs: this._analyticLightSelectionPmfs };
|
|
682
668
|
let cumulativePmf = this._envLightSelectionPmf;
|
|
683
669
|
this._analyticLightSelectionCdfs = Float32Array.from(this._analyticLightSelectionPmfs, (pmf) => {
|
|
684
670
|
cumulativePmf += pmf;
|
|
@@ -714,9 +700,11 @@ class WebGLRayTracePass {
|
|
|
714
700
|
const viewProjectionInv = this._viewProjInv;
|
|
715
701
|
this._apertureRadius = cameraApertureRadius(camera);
|
|
716
702
|
this._focusDistance = camera.focusDistance;
|
|
717
|
-
this.
|
|
703
|
+
mat4.invert(this._projectionInv, camera.getProjectionMatrix(this._depthAspect));
|
|
704
|
+
mat4.mul(viewProjectionInv, camera.transform, this._projectionInv);
|
|
718
705
|
this._tracePasses.forEach((pass) => {
|
|
719
706
|
pass.setUniform('viewProjectionInv', viewProjectionInv);
|
|
707
|
+
pass.setUniform('projectionInv', this._projectionInv);
|
|
720
708
|
pass.setUniform('viewInv', camera.transform);
|
|
721
709
|
// Zero for orthographic cameras, which have no depth of field.
|
|
722
710
|
pass.setUniform('cameraApertureRadius', this._apertureRadius);
|
|
@@ -751,15 +739,27 @@ class WebGLRayTracePass {
|
|
|
751
739
|
this._shadowCatcherPass.useTarget(target);
|
|
752
740
|
}
|
|
753
741
|
setQuality(options) {
|
|
742
|
+
const wasIndependent = this._independentSpectralPaths;
|
|
743
|
+
const research = researchTransport()?.configure(this, 'webgl');
|
|
744
|
+
this._independentSpectralPaths = !!research?.enabled;
|
|
745
|
+
const share = options.dispersionWavelengths !== 1;
|
|
746
|
+
if (this._spectral && (share !== this._shareSpectralPrefix || wasIndependent) && !research?.enabled) {
|
|
747
|
+
const shader = createRayTraceFragmentShader({
|
|
748
|
+
channelIndependentLight: true, shareSpectralPrefix: share
|
|
749
|
+
});
|
|
750
|
+
shader.parallelCompile = true;
|
|
751
|
+
this._mainPass.setShader(shader);
|
|
752
|
+
}
|
|
753
|
+
this._shareSpectralPrefix = share;
|
|
754
754
|
this._tracePasses.forEach(pass => {
|
|
755
|
-
pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
|
|
755
|
+
pass.setUniform('bounceLimit', normalizeBounces(options.bounces, MAX_PATH_EVENTS_WEBGL));
|
|
756
756
|
pass.setUniform('bevelEnabled', options.bevel);
|
|
757
757
|
pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
|
|
758
758
|
});
|
|
759
759
|
}
|
|
760
|
-
|
|
760
|
+
setSpectralChannel(channel) {
|
|
761
761
|
this._tracePasses.forEach((pass) => {
|
|
762
|
-
pass.setUniform('
|
|
762
|
+
pass.setUniform('spectralChannel', channel);
|
|
763
763
|
});
|
|
764
764
|
}
|
|
765
765
|
setSampleCount(sampleCount) {
|
|
@@ -776,6 +776,10 @@ class WebGLRayTracePass {
|
|
|
776
776
|
hasDispersion() {
|
|
777
777
|
return this._spectral;
|
|
778
778
|
}
|
|
779
|
+
hasSharedSpectralPrefix() {
|
|
780
|
+
// Research connections can disperse before the camera reaches a boundary.
|
|
781
|
+
return this._shareSpectralPrefix && !this._independentSpectralPaths;
|
|
782
|
+
}
|
|
779
783
|
prepare() {
|
|
780
784
|
if (this._needsUpdateMeshData) {
|
|
781
785
|
this._updateMeshData();
|
|
@@ -791,6 +795,29 @@ class WebGLRayTracePass {
|
|
|
791
795
|
this._updateMeshColors();
|
|
792
796
|
if (this._pendingMaterialUpdate)
|
|
793
797
|
this._updateMaterialData();
|
|
798
|
+
researchTransport()?.prepare(this, 'webgl');
|
|
799
|
+
const res = this._preparedMeshData;
|
|
800
|
+
if (res) {
|
|
801
|
+
const triangles = this._emissiveCache.collect(res.emissiveBindings, res.materials);
|
|
802
|
+
this._mainPass.setDefines({ HAS_EMISSIVE_LIGHTS: triangles.length > 0 });
|
|
803
|
+
if (!triangles.length && this._emissiveActive && this._directLightLegacy) {
|
|
804
|
+
this._envLightSelectionPmf = this._directLightLegacy.env;
|
|
805
|
+
this._analyticLightSelectionPmfs = Float32Array.from(this._directLightLegacy.pmfs);
|
|
806
|
+
this._tracePasses.forEach(pass => pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf));
|
|
807
|
+
this._needsUpdateAnalyticLightsBuffer = true;
|
|
808
|
+
}
|
|
809
|
+
this._emissiveActive = triangles.length > 0;
|
|
810
|
+
if (triangles.length) {
|
|
811
|
+
const lighting = prepareWebGLLightSampling(this._analyticLights, triangles, estimateEnvironmentPower(this._envImageSource));
|
|
812
|
+
this._envLightSelectionPmf = lighting.environmentPmf;
|
|
813
|
+
this._analyticLightSelectionPmfs = Float32Array.from(lighting.analyticPmfs);
|
|
814
|
+
const columns = setDataTexture(this._emissiveTex, lighting.data, 4).columnsLog;
|
|
815
|
+
this._mainPass.setUniforms({ emissiveLightData: this._emissiveTex, emissiveLightColumns: columns,
|
|
816
|
+
emissiveChoiceOffset: lighting.emissiveTexels, emissiveChoiceCount: lighting.choiceCount,
|
|
817
|
+
emissivePmfOffset: lighting.pmfOffset, emissiveWeightTotal: lighting.totalWeight, envLightSelectionPmf: lighting.environmentPmf });
|
|
818
|
+
this._needsUpdateAnalyticLightsBuffer = true;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
794
821
|
if (this._needsUpdateAnalyticLightsBuffer) {
|
|
795
822
|
const analyticLights = this._analyticLights;
|
|
796
823
|
analyticLights.length > 0 &&
|
|
@@ -843,14 +870,17 @@ class WebGLRayTracePass {
|
|
|
843
870
|
// WebGL has uniform per-pixel counts; setSampleCount already includes offset.
|
|
844
871
|
setSampleSequenceOffset(_offset) { }
|
|
845
872
|
prepareAovs(state, camera, width, height, kinds) {
|
|
846
|
-
if (!kinds.length
|
|
873
|
+
if (!kinds.length)
|
|
874
|
+
return true;
|
|
875
|
+
// An AOV channel may be the first thing to render a new scene.
|
|
876
|
+
this.prepare();
|
|
877
|
+
if (!this._preparedMeshData || !this._tlas)
|
|
847
878
|
return true;
|
|
848
879
|
const gl = this._renderer.gl;
|
|
849
880
|
if (!gl.getExtension('EXT_color_buffer_float'))
|
|
850
881
|
throw new Error('AOV requires EXT_color_buffer_float');
|
|
851
|
-
this.prepare();
|
|
852
882
|
state.resize(width, height);
|
|
853
|
-
this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) &
|
|
883
|
+
this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & AOV_REFLECTANCE_MASK) !== 0 });
|
|
854
884
|
if (!state.frame) {
|
|
855
885
|
const packed = packAovScene(this._preparedMeshData, this._tlas, camera, width, height, state.history, this._aovPrimitiveCache.get(this._preparedMeshData, this._tlas));
|
|
856
886
|
state.frame = packed.frame;
|
|
@@ -868,17 +898,17 @@ class WebGLRayTracePass {
|
|
|
868
898
|
return center && accumulation;
|
|
869
899
|
}
|
|
870
900
|
renderAovs(state, camera, width, height, samples, cap, kinds, sequenceOffset = 0) {
|
|
871
|
-
if (!kinds.length || !this._preparedMeshData || !this._tlas)
|
|
872
|
-
return true;
|
|
873
901
|
if (!this.prepareAovs(state, camera, width, height, kinds))
|
|
874
902
|
return false;
|
|
903
|
+
if (!kinds.length || !this._preparedMeshData || !this._tlas)
|
|
904
|
+
return true;
|
|
875
905
|
if (!state.centerReady) {
|
|
876
906
|
this._aovCenter.createPass({}, state.center);
|
|
877
907
|
state.centerReady = true;
|
|
878
908
|
state.history.accept(state.frame);
|
|
879
909
|
}
|
|
880
910
|
const target = Math.min(samples, cap);
|
|
881
|
-
if ((aovMask(kinds) &
|
|
911
|
+
if ((aovMask(kinds) & AOV_ACCUMULATED_MASK) === 0)
|
|
882
912
|
state.samples = target;
|
|
883
913
|
while (state.samples < target) {
|
|
884
914
|
const output = state.accumulation[state.samples % 2], previous = state.accumulation[(state.samples + 1) % 2];
|
|
@@ -890,17 +920,33 @@ class WebGLRayTracePass {
|
|
|
890
920
|
}
|
|
891
921
|
return true;
|
|
892
922
|
}
|
|
893
|
-
async
|
|
923
|
+
async pickSurface(x, y, aspect) {
|
|
924
|
+
const source = this._preparedMeshData, tlas = this._tlas;
|
|
925
|
+
if (!source || !tlas)
|
|
926
|
+
return;
|
|
927
|
+
const values = await this._readDepthSamples({ x, y, size: 0 }, aspect, true);
|
|
928
|
+
if (!values || source !== this._preparedMeshData || tlas !== this._tlas)
|
|
929
|
+
return;
|
|
930
|
+
return resolveSurfaceHit(source, tlas, values);
|
|
931
|
+
}
|
|
932
|
+
readDepthSamples(area, aspect) {
|
|
933
|
+
return this._readDepthSamples(area, aspect);
|
|
934
|
+
}
|
|
935
|
+
async _readDepthSamples(area, aspect, picking = false) {
|
|
894
936
|
if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||
|
|
895
937
|
!this._renderer.isAllProgramCompiled())
|
|
896
938
|
return;
|
|
897
939
|
this.prepare();
|
|
898
|
-
|
|
940
|
+
const packed = packDepthSampleArea(area, aspect ?? this._depthAspect);
|
|
941
|
+
if (picking)
|
|
942
|
+
packed.set([-1, -1], 2);
|
|
943
|
+
this._depthPass.setUniform('depthArea', packed);
|
|
899
944
|
this._depthPass.createPass({});
|
|
900
945
|
const rgba = await readFloatPixelsAsync(this._renderer.gl, DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);
|
|
901
|
-
return unpackDepthSamples(rgba);
|
|
946
|
+
return picking ? rgba.slice(0, 4) : unpackDepthSamples(rgba);
|
|
902
947
|
}
|
|
903
948
|
dispose() {
|
|
949
|
+
researchTransport()?.dispose(this, 'webgl');
|
|
904
950
|
this._skySource.dispose();
|
|
905
951
|
this._depthAbort.abort();
|
|
906
952
|
this._materialData?.dispose(this._renderer.gl);
|
|
@@ -909,19 +955,14 @@ class WebGLRayTracePass {
|
|
|
909
955
|
const gl = this._renderer.gl;
|
|
910
956
|
[
|
|
911
957
|
this._lightTex,
|
|
958
|
+
this._emissiveTex,
|
|
912
959
|
this._openPbrEnergyLut,
|
|
913
960
|
this._envMap,
|
|
914
961
|
this._envMapDistribution,
|
|
915
962
|
this._backgroundTex,
|
|
916
963
|
this._positionBufferTex,
|
|
917
|
-
this.
|
|
918
|
-
this.
|
|
919
|
-
this._tangentBufferTex,
|
|
920
|
-
this._uvBufferTex,
|
|
921
|
-
this._uv1BufferTex,
|
|
922
|
-
this._bvhBufferTex,
|
|
923
|
-
this._instancesBufferTex,
|
|
924
|
-
this._matIndexBufferTex
|
|
964
|
+
this._vertexAttributeTex,
|
|
965
|
+
this._bvhBufferTex
|
|
925
966
|
].forEach((texture) => texture.dispose(gl));
|
|
926
967
|
}
|
|
927
968
|
}
|