@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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
|
|
4
4
|
// See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.
|
|
5
5
|
export const bloomBrightDefine = /* wgsl */ `
|
|
6
|
-
fn
|
|
6
|
+
fn vE(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
|
|
7
7
|
return a + b + c - min(min(a, b), c) - max(max(a, b), c);
|
|
8
8
|
}
|
|
9
9
|
`;
|
|
@@ -11,26 +11,26 @@ export const bloomBrightMain = /* wgsl */ `
|
|
|
11
11
|
|
|
12
12
|
let d = vec3i(1, 1, 0);
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var texel = load_colorTex(uv, 0);
|
|
15
15
|
let s1 = load_colorTex(uv - d.xz, 0);
|
|
16
16
|
let s2 = load_colorTex(uv + d.xz, 0);
|
|
17
17
|
let s3 = load_colorTex(uv - d.zy, 0);
|
|
18
18
|
let s4 = load_colorTex(uv + d.zy, 0);
|
|
19
|
-
|
|
19
|
+
texel = vE(vE(texel, s1, s2), s3, s4);
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
let lum = dot(
|
|
22
|
+
let lum = dot(texel.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
23
23
|
var color: vec4f;
|
|
24
|
-
if (lum > threshold &&
|
|
25
|
-
color = vec4f(
|
|
24
|
+
if (lum > threshold && texel.a > 0.0) {
|
|
25
|
+
color = vec4f(texel.rgb * scale, texel.a);
|
|
26
26
|
} else {
|
|
27
27
|
|
|
28
|
-
color = vec4f(vec3(0.0),
|
|
28
|
+
color = vec4f(vec3(0.0), texel.a);
|
|
29
29
|
}
|
|
30
30
|
output.color = color;
|
|
31
31
|
`;
|
|
32
32
|
export const bloomDownDefine = /* wgsl */ `
|
|
33
|
-
fn
|
|
33
|
+
fn Am(c: vec3f) -> f32 {
|
|
34
34
|
return max(max(c.r, c.g), c.b);
|
|
35
35
|
}
|
|
36
36
|
`;
|
|
@@ -44,25 +44,25 @@ output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
|
|
|
44
44
|
+ sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
|
|
45
45
|
`;
|
|
46
46
|
export const bloomBlurDefine = /* wgsl */ `
|
|
47
|
-
const
|
|
47
|
+
const Au = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
|
|
48
48
|
`;
|
|
49
49
|
export const bloomBlurMain = /* wgsl */ `
|
|
50
|
-
let
|
|
51
|
-
let off = direction /
|
|
50
|
+
let Ae = vec2f(colorTexRegion());
|
|
51
|
+
let off = direction / Ae * size;
|
|
52
52
|
|
|
53
53
|
var sum = vec4f(0.0);
|
|
54
|
-
var
|
|
54
|
+
var wr = 0.0;
|
|
55
55
|
for (var i = 0; i < 9; i++) {
|
|
56
|
-
let w =
|
|
56
|
+
let w = Au[i];
|
|
57
57
|
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
58
|
-
|
|
58
|
+
wr += w;
|
|
59
59
|
}
|
|
60
|
-
output.color = sum / max(
|
|
60
|
+
output.color = sum / max(wr, 0.01);
|
|
61
61
|
`;
|
|
62
62
|
export const bloomBlendMain = /* wgsl */ `
|
|
63
|
-
let
|
|
64
|
-
let
|
|
65
|
-
output.color = mix(
|
|
63
|
+
let Ao = sample_colorTex1_linearSampler(uv2);
|
|
64
|
+
let Ap = sample_colorTex2_linearSampler(uv2);
|
|
65
|
+
output.color = mix(Ao, Ap, weight);
|
|
66
66
|
`;
|
|
67
67
|
export const BLOOM_LEVELS = 6;
|
|
68
68
|
export function bloomBlurSize(radius) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CAUSTIC_UNIFORM_BYTES = 112;
|
|
2
|
+
export declare const causticUnitRandomWgsl = "\n fn causticUnitRandom(value:f32)->f32 {\n return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);\n }\n";
|
|
3
|
+
export declare function causticLightCompute(constants: Record<string, boolean | number>, blasLayoutMask: number, hasDisplacement: boolean, mode?: 'lightTracing' | 'photonMapping', sceneIntersections?: string, fullEmissionRandom?: boolean, perInstanceBounds?: boolean, compactVertices?: boolean, independentTextures?: boolean): string;
|
|
4
|
+
export declare const causticAccumulateCompute = "\n @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;\n @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&accumulation)) {\n return;\n }\n let i=pixel*3u;\n accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);\n }\n";
|
|
5
|
+
/** Native buffer resolve has the same independent batch normalization as web. */
|
|
6
|
+
export declare const causticBufferCompositeCompute = "\n @group(0)@binding(0)var<storage,read>pt:array<vec4f>;\n @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;\n @group(0)@binding(2)var<storage,read>normal:array<vec4f>;\n @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;\n @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&output)) {\n return;\n }\n let c=caustics[pixel];\n let p=pt[pixel];\n output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);\n }\n";
|
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { PHOTON_GRID_SIZE, photonPackingWgsl } from './photonMap.compute.js';
|
|
2
|
+
import { SPECTRUM_PHOTON_DISTRIBUTION, SPECTRUM_WAVELENGTH_RANGE, spectrumWgsl } from '../spectrum.js';
|
|
3
|
+
import background from './chunks/background.wgsl.js';
|
|
4
|
+
import atomic from './chunks/causticAtomic.wgsl.js';
|
|
5
|
+
import adjoint from './chunks/causticAdjoint.wgsl.js';
|
|
6
|
+
import common from './chunks/common.wgsl.js';
|
|
7
|
+
import core from './chunks/rayTraceCore.wgsl.js';
|
|
8
|
+
import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
|
|
9
|
+
import intersect from './chunks/intersect.wgsl.js';
|
|
10
|
+
import rand from './chunks/rand.wgsl.js';
|
|
11
|
+
import random from './chunks/random.wgsl.js';
|
|
12
|
+
import env from './chunks/envMap.wgsl.js';
|
|
13
|
+
import sampling from './chunks/sampling.wgsl.js';
|
|
14
|
+
import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
|
|
15
|
+
import light from './chunks/sampleLight.wgsl.js';
|
|
16
|
+
import uv from './chunks/uvProjection.wgsl.js';
|
|
17
|
+
import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
|
|
18
|
+
import { wgpuShaderPreamble } from '../wgpuShaderSource.js';
|
|
19
|
+
import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
|
|
20
|
+
export const CAUSTIC_UNIFORM_BYTES = 112;
|
|
21
|
+
export const causticUnitRandomWgsl = /* wgsl */ `
|
|
22
|
+
fn causticUnitRandom(value:f32)->f32 {
|
|
23
|
+
return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
// Preserve the dormant R1 uniform slot and shader spelling for source parity.
|
|
27
|
+
// Production packs zero; only an explicitly registered research adapter sets it.
|
|
28
|
+
export function causticLightCompute(constants, blasLayoutMask, hasDisplacement, mode = 'lightTracing', sceneIntersections = '', fullEmissionRandom = true, perInstanceBounds = false, compactVertices = false, independentTextures = false) {
|
|
29
|
+
const frames = !!constants.USE_ANISOTROPY_DIRECTIONS || !!constants.USE_COAT_NORMAL_FRAMES, coat = !!constants.USE_COAT_NORMAL_FRAMES;
|
|
30
|
+
return ((independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, true) +
|
|
31
|
+
/* wgsl */ `
|
|
32
|
+
${Object.keys(WGPU_SCENE_FEATURE_BITS)
|
|
33
|
+
.map((name) => `const ${name} = ${!!constants[name]};`)
|
|
34
|
+
.join('\n')}
|
|
35
|
+
${common}
|
|
36
|
+
${core({ independentTextures, compactVertices, hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
|
|
37
|
+
${uv}
|
|
38
|
+
${createMaterialBufferWgsl({ independentTextures, hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
|
|
39
|
+
${intersect({
|
|
40
|
+
perInstanceBounds,
|
|
41
|
+
compactVertices,
|
|
42
|
+
hasDisplacement,
|
|
43
|
+
blasLayoutMask,
|
|
44
|
+
hasAnisotropyDirections: frames,
|
|
45
|
+
hasCoatNormals: coat,
|
|
46
|
+
sceneIntersections
|
|
47
|
+
})}
|
|
48
|
+
${rand}
|
|
49
|
+
${random}
|
|
50
|
+
${env}
|
|
51
|
+
${sampling}
|
|
52
|
+
${spectrumWgsl}
|
|
53
|
+
${createOpenPbrBsdfWgsl(frames, coat)}
|
|
54
|
+
${light}
|
|
55
|
+
${background.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${{ USE_BACKGROUND: 1, USE_BACKGROUND_MAP: 2, USE_GROUNDED_BACKGROUND: 4 }[name]}) != 0)`)}
|
|
56
|
+
${causticPartitionWGSL(false, false)}
|
|
57
|
+
${adjoint}
|
|
58
|
+
struct CausticLightUniform {
|
|
59
|
+
casterSphere: vec4f,
|
|
60
|
+
viewProjection: mat4x4f,
|
|
61
|
+
photonCount: u32,
|
|
62
|
+
batch: u32,
|
|
63
|
+
mnee: u32,
|
|
64
|
+
cameraScale: f32,
|
|
65
|
+
casterCount: u32,
|
|
66
|
+
choiceCount: u32,
|
|
67
|
+
orthographic: u32,
|
|
68
|
+
experiments: u32,
|
|
69
|
+
}
|
|
70
|
+
@group(3) @binding(0) var<uniform> caustic: CausticLightUniform;
|
|
71
|
+
${mode === 'lightTracing'
|
|
72
|
+
? '@group(3) @binding(1) var<storage,read_write> splats: array<atomic<u32>>;'
|
|
73
|
+
: `${photonPackingWgsl}
|
|
74
|
+
@group(3)@binding(1)var photons:texture_storage_2d<rgba32uint,write>;
|
|
75
|
+
@group(3)@binding(3)var photonDirections:texture_storage_2d<r32uint,write>;
|
|
76
|
+
fn photonStore(i:u32,value:vec4u) {
|
|
77
|
+
let width=textureDimensions(photons).x;
|
|
78
|
+
textureStore(photons,vec2i(vec2u(i%width,i/width)),value);
|
|
79
|
+
}
|
|
80
|
+
fn qX(i:u32,value:u32) {
|
|
81
|
+
let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
|
|
82
|
+
let index=8u+buckets*4u+caustic.photonCount*2u+i;
|
|
83
|
+
let width=textureDimensions(photonDirections).x;
|
|
84
|
+
textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(value));
|
|
85
|
+
}
|
|
86
|
+
`}
|
|
87
|
+
@group(3) @binding(2) var causticDistribution:texture_2d<f32>;
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
${causticUnitRandomWgsl}
|
|
91
|
+
fn fN(dim:u32)->f32{return ${fullEmissionRandom ? 'causticUnitRandom(sample1D(dim))' : 'sample1D(dim)'}
|
|
92
|
+
;
|
|
93
|
+
}
|
|
94
|
+
fn ie(dim:u32)->vec2f {
|
|
95
|
+
let value=sample2D(dim);
|
|
96
|
+
return
|
|
97
|
+
${fullEmissionRandom ? 'vec2f(causticUnitRandom(value.x),causticUnitRandom(value.y))' : 'value'}
|
|
98
|
+
;
|
|
99
|
+
}
|
|
100
|
+
fn oF(i:u32)->vec4f {
|
|
101
|
+
let width=textureDimensions(causticDistribution).x;
|
|
102
|
+
return textureLoad(causticDistribution,vec2i(vec2u(i%width,i/width)),0);
|
|
103
|
+
}
|
|
104
|
+
fn dz(i:u32)->vec4f {
|
|
105
|
+
return oF(i);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
var<private> lu:vec3f;
|
|
111
|
+
var<private> causticEmissionAreaPdf:f32;
|
|
112
|
+
fn lE(origin:vec3f,position:vec3f,normal:vec3f,emission:vec3f,area:f32,pmf:f32,result:ptr<function,LightSampleRec>) {
|
|
113
|
+
lu=position;
|
|
114
|
+
causticEmissionAreaPdf=pmf/max(area,1e-20);
|
|
115
|
+
let offset=position-origin;
|
|
116
|
+
(*result).dist=length(offset);
|
|
117
|
+
(*result).direction=offset/max((*result).dist,1e-20);
|
|
118
|
+
(*result).normal=normal;
|
|
119
|
+
(*result).emission=emission;
|
|
120
|
+
(*result).pdf=pmf;
|
|
121
|
+
}
|
|
122
|
+
fn sE(origin:vec3f,rnd:vec3f,result:ptr<function,LightSampleRec>) {
|
|
123
|
+
causticEmissionAreaPdf=0.0;
|
|
124
|
+
(*result).pdf=0.0;
|
|
125
|
+
(*result).sourceType=0u;
|
|
126
|
+
(*result).isDelta=false;
|
|
127
|
+
if(caustic.choiceCount==0u) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let scaled=rnd.z*f32(caustic.choiceCount);
|
|
131
|
+
let column=min(u32(scaled),caustic.choiceCount-1u);
|
|
132
|
+
let entry=oF(caustic.casterCount+column*2u);
|
|
133
|
+
let selected=select(bitcast<u32>(entry.y),column,fract(scaled)<entry.x);
|
|
134
|
+
let choice=bitcast<vec4u>(oF(caustic.casterCount+selected*2u));
|
|
135
|
+
let pmf=oF(caustic.casterCount+selected*2u+1u).x;
|
|
136
|
+
(*result).sourceIndex=choice.w;
|
|
137
|
+
if(choice.z==1u) {
|
|
138
|
+
(*result).sourceType=0u;
|
|
139
|
+
iM(rnd.xy,result);
|
|
140
|
+
(*result).pdf*=pmf;
|
|
141
|
+
}
|
|
142
|
+
else if(choice.z==2u) {
|
|
143
|
+
(*result).sourceType=2u;
|
|
144
|
+
var light=analyticLights[choice.w];
|
|
145
|
+
let kind=i32(light.litType);
|
|
146
|
+
if(kind==RECT_LIGHT) {
|
|
147
|
+
let position=light.position+light.u*(rnd.x-.5)+light.v*(rnd.y-.5);
|
|
148
|
+
lE(origin,position,normalize(cross(light.u,light.v)),light.emission,light.area,pmf,result);
|
|
149
|
+
(*result).isDelta=light.radiusOrSpread<=.001;
|
|
150
|
+
bD(light,position,light.position-.5*(light.u+light.v),result);
|
|
151
|
+
}
|
|
152
|
+
else if((kind==SPHERE_LIGHT||kind==SPOT_LIGHT)&&light.radiusOrSpread>0.0) {
|
|
153
|
+
let z=1.0-2.0*rnd.x;
|
|
154
|
+
let dw=sqrt(max(0.0,1.0-z*z));
|
|
155
|
+
let normal=vec3f(dw*cos(TWOPI*rnd.y),dw*sin(TWOPI*rnd.y),z);
|
|
156
|
+
lE(origin,light.position+light.radiusOrSpread*normal,normal,light.emission,light.area,pmf,result);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
light.selectionPmf=1.0;
|
|
160
|
+
sampleAnalyticLight(light,origin,rnd.xy,result);
|
|
161
|
+
(*result).pdf*=pmf;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
(*result).sourceType=1u;
|
|
166
|
+
let triangle=getEmissiveTriangle(i32(choice.w));
|
|
167
|
+
let u=sqrt(rnd.x);
|
|
168
|
+
let bary=vec3f(1.0-u,u*(1.0-rnd.y),u*rnd.y);
|
|
169
|
+
let position=bary.x*triangle.p0+bary.y*triangle.p1+bary.z*triangle.p2;
|
|
170
|
+
let normal=normalize(cross(triangle.p1-triangle.p0,triangle.p2-triangle.p0));
|
|
171
|
+
let uv=bary.x*triangle.uv0+bary.y*triangle.uv1+bary.z*triangle.uv2;
|
|
172
|
+
let uv1=bary.x*triangle.secondaryUv0+bary.y*triangle.secondaryUv1+bary.z*triangle.secondaryUv2;
|
|
173
|
+
lE(origin,position,normal,getMaterialEmission(i32(triangle.materialIndex),uv,uv1),triangle.area,pmf,result);
|
|
174
|
+
}
|
|
175
|
+
(*result).selectionPmf=pmf;
|
|
176
|
+
}
|
|
177
|
+
fn mf(s:vec4f,origin:vec3f)->f32 {
|
|
178
|
+
let bG=dot(s.xyz-origin,s.xyz-origin);
|
|
179
|
+
return select(-1.0,sqrt(max(0.0,1.0-s.w*s.w/bG)),bG>s.w*s.w);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
fn dS(s:vec4f)->f32 {
|
|
184
|
+
if((caustic.experiments&2u)==0u) { return 1.0; }
|
|
185
|
+
let vb=caustic.viewProjection*vec4f(s.xyz,1.0);
|
|
186
|
+
let m=caustic.viewProjection;
|
|
187
|
+
let extent=s.w*max(length(vec3f(m[0].x,m[1].x,m[2].x)),length(vec3f(m[0].y,m[1].y,m[2].y)));
|
|
188
|
+
if(vb.w<=0.0||abs(vb.x)>vb.w+extent||abs(vb.y)>vb.w+extent) { return .05; }
|
|
189
|
+
return .05+min(1.0,extent*extent/max(vb.w*vb.w,1e-20));
|
|
190
|
+
}
|
|
191
|
+
fn tV(origin:vec3f,rnd:vec3f,pdf:ptr<function,f32>,lh:ptr<function,f32>)->vec3f {
|
|
192
|
+
var total=0.0;
|
|
193
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
194
|
+
total+=(1.0-mf(dz(i),origin))*dS(dz(i));
|
|
195
|
+
}
|
|
196
|
+
var choice=rnd.z*total;
|
|
197
|
+
var selected=dz(0u);
|
|
198
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
199
|
+
let sphere=dz(i);
|
|
200
|
+
selected=sphere;
|
|
201
|
+
choice-=(1.0-mf(sphere,origin))*dS(sphere);
|
|
202
|
+
if(choice<=0.0) {
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
*lh=selected.w;
|
|
207
|
+
let offset=selected.xyz-origin;
|
|
208
|
+
let axis=normalize(select(vec3f(0.0,0.0,1.0),offset,dot(offset,offset)>1e-20));
|
|
209
|
+
let cosine=mix(1.0,mf(selected,origin),rnd.x);
|
|
210
|
+
let wk=sqrt(max(0.0,1.0-cosine*cosine));
|
|
211
|
+
var t:vec3f;
|
|
212
|
+
var b:vec3f;
|
|
213
|
+
sampling_orthonormal_basis(axis,&t,&b);
|
|
214
|
+
let direction=axis*cosine+(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y))*wk;
|
|
215
|
+
|
|
216
|
+
var overlaps=0.0;
|
|
217
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
218
|
+
let sphere=dz(i);
|
|
219
|
+
let c=mf(sphere,origin);
|
|
220
|
+
if(c<0.0||dot(normalize(sphere.xyz-origin),direction)>=c) {
|
|
221
|
+
overlaps+=dS(sphere);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
*pdf=overlaps/max(TWOPI*total,1e-20);
|
|
225
|
+
return direction;
|
|
226
|
+
}
|
|
227
|
+
${mode === 'lightTracing'
|
|
228
|
+
? /* wgsl */ `${atomic}
|
|
229
|
+
fn causticCameraConnect(si: SurfaceInteraction, material: OpenPbrResolvedMaterial, iA: Ray, flux: vec3f, extinction: vec3f) {
|
|
230
|
+
let eye=cameraUniform.viewInv[3].xyz;
|
|
231
|
+
let forward=-normalize(cameraUniform.viewInv[2].xyz);
|
|
232
|
+
let sQ=ie(causticDim(68u));
|
|
233
|
+
let radius=cameraUniform.apertureRadius*sqrt(sQ.x);
|
|
234
|
+
var wJ=eye+radius*(cos(TWOPI*sQ.y)*cameraUniform.viewInv[0].xyz+sin(TWOPI*sQ.y)*cameraUniform.viewInv[1].xyz);
|
|
235
|
+
if(caustic.orthographic!=0u) {
|
|
236
|
+
wJ=si.position-forward*dot(si.position-eye,forward);
|
|
237
|
+
}
|
|
238
|
+
let zJ=wJ-si.position;
|
|
239
|
+
let bG=dot(zJ,zJ);
|
|
240
|
+
let direction=normalize(zJ);
|
|
241
|
+
let ye=wJ+(si.position-wJ)*cameraUniform.focusDistance/max(dot(si.position-wJ,forward),1e-12);
|
|
242
|
+
let sc=select(ye,si.position,caustic.orthographic!=0u);
|
|
243
|
+
let vb=caustic.viewProjection*vec4f(sc,1.0);
|
|
244
|
+
if(vb.w<=0.0||dot(si.position-eye,forward)<=0.0) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
let yY=vb.xy/vb.w*0.5+0.5;
|
|
248
|
+
if(any(yY<vec2f(0.0))||any(yY>=vec2f(1.0))) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
var shadow:Ray;
|
|
252
|
+
initRay(&shadow,si.position+EPS*direction,direction);
|
|
253
|
+
if(intersectSceneShadow(shadow,sqrt(bG)-2.0*EPS,si.triangleIndex,si.instanceIndex)) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
var m=material;
|
|
257
|
+
let normal=select(-si.normal,si.normal,dot(si.normal,-iA.d)>=0.0);
|
|
258
|
+
m.inside=dot(si.faceNormal,-iA.d)<0.0;
|
|
259
|
+
m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
|
|
260
|
+
${frames
|
|
261
|
+
? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
|
|
262
|
+
: ''}
|
|
263
|
+
${coat
|
|
264
|
+
? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,-iA.d)>=0.0);`
|
|
265
|
+
: ''}
|
|
266
|
+
let prepared=bX(si.tangent,m,-iA.d,normal);
|
|
267
|
+
var pdf:f32;
|
|
268
|
+
let response=openpbr_eval_prepared(prepared,direction,&pdf);
|
|
269
|
+
let ne=dot(-direction,-normalize(cameraUniform.viewInv[2].xyz));
|
|
270
|
+
if(ne<=0.0) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
let yf=caustic.cameraScale*rtUniform.outputSize.x*rtUniform.outputSize.y /
|
|
274
|
+
select(max(bG*ne*ne*ne,1e-12),1.0,caustic.orthographic!=0u);
|
|
275
|
+
let transmittance=exp(-extinction*sqrt(bG));
|
|
276
|
+
let value=flux*transmittance*response*causticAdjoint(-iA.d,direction,normal,si.faceNormal)*yf/f32(caustic.photonCount);
|
|
277
|
+
let pixel=vec2u(yY*rtUniform.outputSize);
|
|
278
|
+
let index=(pixel.x+pixel.y*u32(rtUniform.outputSize.x))*3u;
|
|
279
|
+
lF(index,value.x);
|
|
280
|
+
lF(index+1u,value.y);
|
|
281
|
+
lF(index+2u,value.z);
|
|
282
|
+
}
|
|
283
|
+
`
|
|
284
|
+
: ''}
|
|
285
|
+
@compute @workgroup_size(64)
|
|
286
|
+
fn main(@builtin(global_invocation_id) id:vec3u) {
|
|
287
|
+
let photonIndex=id.x+id.y*4194240u;
|
|
288
|
+
if(photonIndex>=caustic.photonCount) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
${mode === 'photonMapping' ? 'photonStore(photonIndex,vec4u(0u));' : ''}
|
|
292
|
+
aJ=vec2u(photonIndex%u32(rtUniform.outputSize.x),photonIndex/u32(rtUniform.outputSize.x));
|
|
293
|
+
aC=caustic.batch;
|
|
294
|
+
samplingBounce=0u;
|
|
295
|
+
hashedCounter=0u;
|
|
296
|
+
fA(aJ,i32(ak(caustic.batch,rtUniform.sequenceSeed)));
|
|
297
|
+
var wavelength=0.0;
|
|
298
|
+
var wavelengthPdf=1.0;
|
|
299
|
+
if(SPECTRAL) {
|
|
300
|
+
wavelength=spectrumSample(${SPECTRUM_PHOTON_DISTRIBUTION}u,fN(causticDim(69u)),&wavelengthPdf);
|
|
301
|
+
}
|
|
302
|
+
var ls:LightSampleRec;
|
|
303
|
+
sE(caustic.casterSphere.xyz,vec3f(ie(causticDim(60u)),fN(causticDim(61u))),&ls);
|
|
304
|
+
if(ls.pdf<=0.0) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
var infinite=ls.sourceType==0u;
|
|
308
|
+
if(ls.sourceType==2u) {
|
|
309
|
+
infinite=i32(analyticLights[ls.sourceIndex].litType)==DIRECTIONAL_LIGHT;
|
|
310
|
+
}
|
|
311
|
+
var origin=caustic.casterSphere.xyz+ls.direction*ls.dist;
|
|
312
|
+
if(causticEmissionAreaPdf>0.0) { origin=lu; }
|
|
313
|
+
var direction:vec3f;
|
|
314
|
+
var flux:vec3f;
|
|
315
|
+
var lh=caustic.casterSphere.w;
|
|
316
|
+
if(infinite) {
|
|
317
|
+
direction=-ls.direction;
|
|
318
|
+
|
|
319
|
+
var area=0.0;
|
|
320
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
321
|
+
let s=dz(i);
|
|
322
|
+
area+=s.w*s.w*dS(s);
|
|
323
|
+
}
|
|
324
|
+
var choice=fN(causticDim(63u))*area;
|
|
325
|
+
var sphere=dz(0u);
|
|
326
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
327
|
+
sphere=dz(i);
|
|
328
|
+
choice-=sphere.w*sphere.w*dS(sphere);
|
|
329
|
+
if(choice<=0.0) {
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
lh=sphere.w;
|
|
334
|
+
var t:vec3f;
|
|
335
|
+
var b:vec3f;
|
|
336
|
+
sampling_orthonormal_basis(direction,&t,&b);
|
|
337
|
+
let rnd=ie(causticDim(62u));
|
|
338
|
+
origin=sphere.xyz-direction*dot(sphere.xyz-caustic.casterSphere.xyz,direction)-direction*caustic.casterSphere.w;
|
|
339
|
+
origin+=sphere.w*sqrt(rnd.x)*(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y));
|
|
340
|
+
var overlaps=0.0;
|
|
341
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
342
|
+
let s=dz(i);
|
|
343
|
+
let offset=origin-s.xyz;
|
|
344
|
+
let sc=offset-direction*dot(offset,direction);
|
|
345
|
+
if(dot(sc,sc)<=s.w*s.w) {
|
|
346
|
+
overlaps+=dS(s);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
let diskPdf=overlaps/max(PI*area,1e-20);
|
|
350
|
+
flux=ls.emission/(ls.pdf*diskPdf);
|
|
351
|
+
}
|
|
352
|
+
else if(ls.sourceType==2u&&i32(analyticLights[ls.sourceIndex].litType)==RECT_LIGHT&&ls.isDelta) {
|
|
353
|
+
|
|
354
|
+
direction=ls.normal;
|
|
355
|
+
flux=ls.emission/causticEmissionAreaPdf;
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
var areaPdf=ls.pdf*abs(dot(ls.normal,-ls.direction))/max(ls.dist*ls.dist,1e-20);
|
|
359
|
+
if(causticEmissionAreaPdf>0.0) { areaPdf=causticEmissionAreaPdf; }
|
|
360
|
+
if(ls.isDelta) {
|
|
361
|
+
areaPdf=ls.selectionPmf;
|
|
362
|
+
}
|
|
363
|
+
if(areaPdf<=0.0) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
var directionPdf:f32;
|
|
367
|
+
direction=tV(origin,vec3f(ie(causticDim(62u)),fN(causticDim(63u))),&directionPdf,&lh);
|
|
368
|
+
var emission=ls.emission;
|
|
369
|
+
var nN=max(0.0,dot(ls.normal,direction));
|
|
370
|
+
if(ls.sourceType==2u) {
|
|
371
|
+
let source=analyticLights[ls.sourceIndex];
|
|
372
|
+
emission=source.emission;
|
|
373
|
+
if(i32(source.litType)==SPOT_LIGHT) {
|
|
374
|
+
emission*=evaluateSpotEmissionMultiplier(source,direction);
|
|
375
|
+
}
|
|
376
|
+
if(ls.isDelta) {
|
|
377
|
+
nN=1.0;
|
|
378
|
+
}
|
|
379
|
+
if(i32(source.litType)==RECT_LIGHT&&nN<cos(0.5*PI*source.radiusOrSpread)) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if(i32(source.litType)==RECT_LIGHT) {
|
|
383
|
+
var vX:LightSampleRec;
|
|
384
|
+
vX.emission=emission;
|
|
385
|
+
bD(source,origin,source.position-0.5*(source.u+source.v),&vX);
|
|
386
|
+
emission=vX.emission;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
flux=emission*nN/(areaPdf*directionPdf);
|
|
390
|
+
}
|
|
391
|
+
if(SPECTRAL) {
|
|
392
|
+
flux*=spectrumRgb(wavelength)/(wavelengthPdf*${SPECTRUM_WAVELENGTH_RANGE}.0);
|
|
393
|
+
}
|
|
394
|
+
var ray:Ray;
|
|
395
|
+
initRay(&ray,origin+EPS*direction,direction);
|
|
396
|
+
var xk=0u;
|
|
397
|
+
var yN=false;
|
|
398
|
+
var extinction=vec3f(0.0);
|
|
399
|
+
var scattering=vec3f(0.0);
|
|
400
|
+
var si:SurfaceInteraction;
|
|
401
|
+
for(var depth=0;
|
|
402
|
+
${mode === 'photonMapping' ? 'depth<=max(rtUniform.bounces,0)' : 'depth<20'}
|
|
403
|
+
;
|
|
404
|
+
depth++) {
|
|
405
|
+
samplingBounce=u32(depth);
|
|
406
|
+
si.triangleIndex=-1;
|
|
407
|
+
intersectScene(ray,&si,0,true,depth>0);
|
|
408
|
+
if(!si.hit) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
var m:OpenPbrResolvedMaterial;
|
|
412
|
+
getMaterial(&m,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
|
|
413
|
+
if(m.alpha<1.0&&fN(causticDim(79u))>=m.alpha) {
|
|
414
|
+
initRay(&ray,si.position+EPS*ray.d,ray.d);
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
if(m.materialType==SHADOW_CATCHER) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
let segment=distance(ray.o,si.position);
|
|
421
|
+
let channel=min(u32(sample1D(aX(MEDIUM_CHANNEL))*3.0),2u);
|
|
422
|
+
if(extinction[channel]>0.0&&any(scattering>vec3f(0.0))) {
|
|
423
|
+
let sampled=-log(max(sample1D(aX(MEDIUM_DISTANCE)),1e-7))/extinction[channel];
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
if(sampled<segment) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
let transmittance=exp(-extinction*segment);
|
|
431
|
+
let oq=(transmittance.x+transmittance.y+transmittance.z)/3.0;
|
|
432
|
+
flux*=transmittance/select(1.0,max(oq,1e-20),any(scattering>vec3f(0.0)));
|
|
433
|
+
if(SPECTRAL) {
|
|
434
|
+
m.specularIor=sampling_cauchy_ior(spectrumIorWavelength(wavelength),m.specularIor,m.transmissionDispersionScale,m.dispersionAbbeNumber);
|
|
435
|
+
}
|
|
436
|
+
if(!isCausticSpecular(m)) {
|
|
437
|
+
let yi=ls.sourceType!=0u;
|
|
438
|
+
let r1=yi&&xk==1u&&yN&&m.baseWeight*(1.0-m.baseMetalness)*(1.0-m.transmissionWeight)>0.0&&m.subsurfaceWeight==0.0;
|
|
439
|
+
if(xk>0u
|
|
440
|
+
${mode === 'lightTracing' ? '&&!(caustic.mnee!=0u&&r1)' : ''}){${mode === 'lightTracing'
|
|
441
|
+
? 'causticCameraConnect(si,m,ray,flux,extinction);'
|
|
442
|
+
: /* wgsl */ `
|
|
443
|
+
let position=bitcast<vec3u>(si.position);
|
|
444
|
+
photonStore(photonIndex,vec4u(position,us(flux)));
|
|
445
|
+
if((caustic.experiments&1u)!=0u) {
|
|
446
|
+
var maximum=1e-8;
|
|
447
|
+
for(var i=0u;i<caustic.casterCount;i++) { maximum=max(maximum,dz(i).w); }
|
|
448
|
+
let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
|
|
449
|
+
let index=8u+buckets*4u+caustic.photonCount*3u+photonIndex;
|
|
450
|
+
let width=textureDimensions(photonDirections).x;
|
|
451
|
+
textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(bitcast<u32>(lh/maximum)));
|
|
452
|
+
}
|
|
453
|
+
let iA=vec2u(round(qR(-ray.d)*255.0));
|
|
454
|
+
let normal=vec2u(round(qR(si.faceNormal)*vec2f(255.0,127.0)));
|
|
455
|
+
qX(photonIndex,normal.x|(normal.y<<8u)|(select(0u,1u,r1)<<15u)|(iA.x<<16u)|(iA.y<<24u));
|
|
456
|
+
`}
|
|
457
|
+
}
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
let view=-ray.d;
|
|
461
|
+
let normal=select(-si.normal,si.normal,dot(si.normal,view)>=0.0);
|
|
462
|
+
m.inside=dot(si.faceNormal,view)<0.0;
|
|
463
|
+
m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
|
|
464
|
+
${frames
|
|
465
|
+
? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
|
|
466
|
+
: ''}
|
|
467
|
+
${coat
|
|
468
|
+
? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,view)>=0.0);`
|
|
469
|
+
: ''}
|
|
470
|
+
let prepared=bX(si.tangent,m,view,normal);
|
|
471
|
+
var next:vec3f;
|
|
472
|
+
var pdf:f32;
|
|
473
|
+
var transmission:bool;
|
|
474
|
+
var roughness:f32;
|
|
475
|
+
var specular:bool;
|
|
476
|
+
var diffuse:bool;
|
|
477
|
+
var lobe:u32;
|
|
478
|
+
var marginal:f32;
|
|
479
|
+
var full:vec3f;
|
|
480
|
+
let response=dr(prepared,vec3f(sample2D(aX(BSDF_DIRECTION)),sample1D(aX(BSDF_LOBE))),&next,&pdf,&transmission,&roughness,&specular,&diffuse,&lobe,&marginal,&full);
|
|
481
|
+
if(!(pdf>0.0)) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
if(xk==0u&&ls.sourceType==0u&&transmission) {
|
|
485
|
+
var reverse:Ray;
|
|
486
|
+
initRay(&reverse,si.position,-ray.d);
|
|
487
|
+
let bg=fI(reverse);
|
|
488
|
+
flux*=bg.rgb*bg.a/max(ls.emission,vec3f(1e-20));
|
|
489
|
+
}
|
|
490
|
+
flux*=response/pdf*causticAdjoint(view,next,normal,si.faceNormal);
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
if(transmission&&!m.thinWalled) {
|
|
494
|
+
flux/=m.relativeIor*m.relativeIor;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if(transmission&&!m.thinWalled&&m.mediumType>0) {
|
|
498
|
+
extinction=select(m.mediumExtinction,vec3f(0.0),m.inside);
|
|
499
|
+
scattering=select(m.mediumScattering,vec3f(0.0),m.inside);
|
|
500
|
+
}
|
|
501
|
+
xk++;
|
|
502
|
+
yN=xk==1u&&((isCausticT(m)&&transmission)||(isCausticR(m)&&!transmission));
|
|
503
|
+
initRay(&ray,si.position+EPS*next,next);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
`);
|
|
507
|
+
}
|
|
508
|
+
export const causticAccumulateCompute = /* wgsl */ `
|
|
509
|
+
@group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;
|
|
510
|
+
@group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;
|
|
511
|
+
@compute @workgroup_size(64)
|
|
512
|
+
fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {
|
|
513
|
+
|
|
514
|
+
let pixel=id.x+id.y*groups.x*64u;
|
|
515
|
+
if(pixel>=arrayLength(&accumulation)) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
let i=pixel*3u;
|
|
519
|
+
accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);
|
|
520
|
+
}
|
|
521
|
+
`;
|
|
522
|
+
/** Native buffer resolve has the same independent batch normalization as web. */
|
|
523
|
+
export const causticBufferCompositeCompute = /* wgsl */ `
|
|
524
|
+
@group(0)@binding(0)var<storage,read>pt:array<vec4f>;
|
|
525
|
+
@group(0)@binding(1)var<storage,read>caustics:array<vec4f>;
|
|
526
|
+
@group(0)@binding(2)var<storage,read>normal:array<vec4f>;
|
|
527
|
+
@group(0)@binding(3)var<storage,read_write>output:array<vec4f>;
|
|
528
|
+
@compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {
|
|
529
|
+
|
|
530
|
+
let pixel=id.x+id.y*groups.x*64u;
|
|
531
|
+
if(pixel>=arrayLength(&output)) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
let c=caustics[pixel];
|
|
535
|
+
let p=pt[pixel];
|
|
536
|
+
output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);
|
|
537
|
+
}
|
|
538
|
+
`;
|
|
539
|
+
//# sourceMappingURL=causticLight.compute.js.map
|