@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,7 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spectralPrefixWgsl, prefixCheckpoint, prefixSave, prefixRestore, prefixRandomBindings } from './chunks/spectralPrefix.wgsl.js';
|
|
2
|
+
import { photonQuerySource } from './photonMap.compute.js';
|
|
3
|
+
import backgroundWgsl from './chunks/background.wgsl.js';
|
|
4
|
+
import { researchTransport } from '../researchTransport.js';
|
|
5
|
+
import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
|
|
6
|
+
import { MAX_PATH_EVENTS_WEBGL } from '../pathLimits.js';
|
|
2
7
|
import shadowCatcherAccumulationWGSL from './chunks/shadowCatcherAccumulation.wgsl.js';
|
|
3
8
|
import reflectanceWGSL from './aovReflectance.wgsl.js';
|
|
4
9
|
import aovTraceWGSL from './aovTrace.wgsl.js';
|
|
10
|
+
import aovTraceDisplayWGSL from './aovTraceDisplay.wgsl.js';
|
|
5
11
|
import depthQueryWGSL from './depthQuery.wgsl.js';
|
|
6
12
|
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
7
13
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
@@ -18,15 +24,35 @@ import { createSampleMaterialWgsl } from './chunks/sampleMaterial.wgsl.js';
|
|
|
18
24
|
import sampleLightWgsl from './chunks/sampleLight.wgsl.js';
|
|
19
25
|
import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
|
|
20
26
|
import samplingWgsl from './chunks/sampling.wgsl.js';
|
|
27
|
+
import { spectrumWgsl } from '../spectrum.js';
|
|
21
28
|
import sampleShadowCatcherWgsl from './chunks/sampleShadowCatcher.wgsl.js';
|
|
22
29
|
import envMapWgsl from './chunks/envMap.wgsl.js';
|
|
23
30
|
import uvProjectionWgsl from './chunks/uvProjection.wgsl.js';
|
|
24
31
|
export const WORKGROUP_SIZE = 8;
|
|
25
32
|
/** Generates the WebGPU megakernel path tracing compute shader. */
|
|
26
|
-
export default function rayTraceCompute(
|
|
33
|
+
export default function rayTraceCompute(options, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
|
|
34
|
+
const maxPathEvents = options.maxPathEvents ?? MAX_PATH_EVENTS_WEBGL;
|
|
35
|
+
const research = researchTransport()?.compute(options);
|
|
36
|
+
const enabled = research?.enabled ?? false;
|
|
37
|
+
const partitionDepth = research?.maxDepth ?? 20;
|
|
38
|
+
const debugGroup = research?.debugGroup ?? options.debugGroup ?? -1;
|
|
39
|
+
let { compactVertices = false, hasDisplacement, workgroupSize = WORKGROUP_SIZE, lightTracing = false, photonMapping = false, photonMaxDepth = 20, hasAnisotropyDirections = false, hasCoatNormals = false, hasAlpha = true, hasSceneAlpha = true, blasLayoutMask = 1, spectral, sceneCapabilities, dynamicEnvironment = false, materialCapabilities = ALL_MATERIAL_SHADER_CAPABILITIES, lightCapabilities } = options;
|
|
27
40
|
hasAnisotropyDirections ||= hasCoatNormals;
|
|
28
41
|
const deterministicPrimaryAlpha = hasAlpha;
|
|
29
42
|
const hasShadowCatcher = sceneCapabilities === undefined || (sceneCapabilities & WGPU_SCENE_FEATURE_BITS.HAS_SHADOW_CATCHER) !== 0;
|
|
43
|
+
// MNEE can refract a wavelength-dependent connection at an ordinary receiver,
|
|
44
|
+
// before the camera path reaches any Cauchy boundary. Preserve its independent
|
|
45
|
+
// wavelength paths until a connection-solver checkpoint is available.
|
|
46
|
+
const sharePrefix = options.shareSpectralPrefix ?? false;
|
|
47
|
+
const surfacePrefix = {
|
|
48
|
+
path: ['Path', 'path'], si: ['SurfaceInteraction', '*si'], ma: ['OpenPbrResolvedMaterial', '*ma'],
|
|
49
|
+
aux: ['RayTraceAuxiliary', '*outAux'], depth: ['i32', 'depth'], event: ['i32', 'event'],
|
|
50
|
+
ignored: ['bool', 'sampleIgnored'], opaque: ['bool', 'isNotTransparent'], ...prefixRandomBindings
|
|
51
|
+
};
|
|
52
|
+
const flatPrefix = {
|
|
53
|
+
...surfacePrefix, si: ['SurfaceInteraction', 'si'], ma: ['OpenPbrResolvedMaterial', 'ma'],
|
|
54
|
+
aux: ['RayTraceAuxiliary', 'wavelengthAux']
|
|
55
|
+
};
|
|
30
56
|
const primaryVariables = /* wgsl */ `
|
|
31
57
|
var si: SurfaceInteraction;
|
|
32
58
|
var ma: OpenPbrResolvedMaterial;
|
|
@@ -44,10 +70,10 @@ si.barycentrics = vec2f(0.0);
|
|
|
44
70
|
|
|
45
71
|
(*outAux).albedo = vec3f(1.0);
|
|
46
72
|
(*outAux).normal = select(si.normal, -si.normal, dot(si.normal, ray.d) > 0.0);
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
(*outAux).shadowCounts = sampleShadowCatcher(si, 0, &
|
|
73
|
+
var path: Path;
|
|
74
|
+
path.ray = ray;
|
|
75
|
+
path.fromEye = true;
|
|
76
|
+
(*outAux).shadowCounts = sampleShadowCatcher(si, 0, &path);
|
|
51
77
|
|
|
52
78
|
|
|
53
79
|
return vec4f(1.0);
|
|
@@ -55,7 +81,7 @@ return vec4f(1.0);
|
|
|
55
81
|
else {
|
|
56
82
|
if (HAS_BEVEL && rtUniform.bevel != 0) {
|
|
57
83
|
if (ma.bevel > 0.0) {
|
|
58
|
-
si.normal =
|
|
84
|
+
si.normal = kB(si, ma.bevel);
|
|
59
85
|
}
|
|
60
86
|
}
|
|
61
87
|
|
|
@@ -83,71 +109,77 @@ si.albedoSampled = ma.transmissionWeight > 0.5;
|
|
|
83
109
|
|
|
84
110
|
${commonWgsl}
|
|
85
111
|
|
|
86
|
-
${rayTraceCoreWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals, lightCapabilities })}
|
|
112
|
+
${rayTraceCoreWgsl({ independentTextures: options.independentTextures, compactVertices, cameraProjectionInverse: options.cameraProjectionInverse, hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals, lightCapabilities, caustics: enabled || lightTracing || photonMapping })}
|
|
87
113
|
|
|
88
114
|
${uvProjectionWgsl}
|
|
89
115
|
|
|
90
|
-
${createMaterialBufferWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals,
|
|
116
|
+
${createMaterialBufferWgsl({ independentTextures: options.independentTextures, hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals,
|
|
117
|
+
caustics: enabled || lightTracing || photonMapping,
|
|
91
118
|
hasTransmission: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.transmission) !== 0,
|
|
92
119
|
hasMetalness: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.metal) !== 0 })}
|
|
93
120
|
|
|
94
|
-
${createIntersectionWgsl({ hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals, sceneIntersections })}
|
|
121
|
+
${createIntersectionWgsl({ compactVertices, perInstanceBounds: options.perInstanceBounds, hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals, sceneIntersections })}
|
|
95
122
|
${randWgsl}
|
|
96
123
|
${randomWgsl}
|
|
97
124
|
${envMapWgsl}
|
|
98
125
|
|
|
99
126
|
${samplingWgsl}
|
|
127
|
+
${spectrumWgsl}
|
|
100
128
|
${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
|
|
101
129
|
${sampleLightWgsl}${inputHooks?.declarations ?? ''}
|
|
102
130
|
|
|
103
131
|
|
|
104
|
-
var<private>
|
|
132
|
+
var<private> bounceIndex: u32 = 0u;
|
|
105
133
|
|
|
106
134
|
|
|
107
135
|
|
|
108
|
-
fn
|
|
136
|
+
fn kL() -> u32 {
|
|
109
137
|
return u32(max(rtUniform.directLightCandidates, 1));
|
|
110
138
|
}
|
|
111
139
|
|
|
112
140
|
|
|
113
141
|
|
|
114
142
|
|
|
115
|
-
fn
|
|
143
|
+
fn rA(AT: u32) -> f32 {
|
|
116
144
|
|
|
117
145
|
|
|
118
146
|
|
|
119
147
|
|
|
120
148
|
if (SAMPLING_PATTERN == 2) { _ = rand(); }
|
|
121
|
-
let
|
|
122
|
-
let key =
|
|
123
|
-
let dimension =
|
|
124
|
-
return f32(
|
|
149
|
+
let kT = aJ.x + aJ.y * u32(rtUniform.outputSize.x);
|
|
150
|
+
let key = ak(ak(kT, aC), rtUniform.sequenceSeed);
|
|
151
|
+
let dimension = ak(samplingBounce, AT) ^ 0xa511e9b3u;
|
|
152
|
+
return f32(cD(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
|
|
125
153
|
}
|
|
126
154
|
|
|
127
155
|
|
|
128
156
|
|
|
129
|
-
fn
|
|
130
|
-
let candidateCount =
|
|
157
|
+
fn wM(lightPdf: f32, scatteringPdf: f32) -> f32 {
|
|
158
|
+
let candidateCount = kL();
|
|
131
159
|
if (candidateCount <= 1u) {
|
|
132
|
-
return
|
|
160
|
+
return aG(lightPdf, scatteringPdf);
|
|
133
161
|
}
|
|
134
|
-
let
|
|
135
|
-
return
|
|
136
|
-
max(
|
|
162
|
+
let weightedLightPdf = f32(candidateCount) * lightPdf;
|
|
163
|
+
return weightedLightPdf /
|
|
164
|
+
max(weightedLightPdf + scatteringPdf, 1e-20);
|
|
137
165
|
}
|
|
138
166
|
|
|
139
167
|
|
|
140
|
-
fn
|
|
141
|
-
let candidateCount =
|
|
168
|
+
fn gm(scatteringPdf: f32, lightPdf: f32) -> f32 {
|
|
169
|
+
let candidateCount = kL();
|
|
142
170
|
if (candidateCount <= 1u) {
|
|
143
|
-
return
|
|
171
|
+
return aG(scatteringPdf, lightPdf);
|
|
144
172
|
}
|
|
145
|
-
let
|
|
173
|
+
let weightedLightPdf = f32(candidateCount) * lightPdf;
|
|
146
174
|
return scatteringPdf /
|
|
147
|
-
max(scatteringPdf +
|
|
175
|
+
max(scatteringPdf + weightedLightPdf, 1e-20);
|
|
148
176
|
}
|
|
149
177
|
|
|
150
|
-
${
|
|
178
|
+
${enabled || lightTracing || photonMapping ? causticPartitionWGSL(enabled, lightTracing, photonMapping, partitionDepth, debugGroup >= 30, photonMaxDepth) : ''}${research?.declarations ?? ''}${photonMapping ? `const CAUSTIC_LIGHT_TRACING=${lightTracing};
|
|
179
|
+
const CAUSTIC_MNEE=${enabled};
|
|
180
|
+
const CAUSTIC_MNEE_MAX_DEPTH=${partitionDepth}u;
|
|
181
|
+
const CAUSTIC_PHOTON_MAX_DEPTH=${photonMaxDepth}u;
|
|
182
|
+
` + photonQuerySource(debugGroup, !lightTracing && (options.photonDirectSubset ?? true)) : ''}${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals, enabled || lightTracing || photonMapping, research?.contribution, photonMapping, options.channelIndependentRis)}
|
|
151
183
|
${sampleShadowCatcherWgsl}
|
|
152
184
|
|
|
153
185
|
|
|
@@ -159,24 +191,24 @@ ${shadowCatcherAccumulationWGSL}
|
|
|
159
191
|
@group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
|
|
160
192
|
|
|
161
193
|
|
|
162
|
-
fn
|
|
163
|
-
|
|
194
|
+
fn ij(
|
|
195
|
+
gx: u32,
|
|
164
196
|
radiance: vec3f,
|
|
165
197
|
normal: vec3f
|
|
166
198
|
) {
|
|
167
199
|
if (rtUniform.varianceMoments != 0) {
|
|
168
200
|
let value = dot(radiance, luminance);
|
|
169
|
-
outNormal[
|
|
201
|
+
outNormal[gx] += vec4f(value * value, 0.0, 0.0, 1.0);
|
|
170
202
|
}
|
|
171
203
|
else {
|
|
172
|
-
outNormal[
|
|
204
|
+
outNormal[gx] += vec4f(normal, 1.0);
|
|
173
205
|
}
|
|
174
206
|
}
|
|
175
207
|
|
|
176
208
|
|
|
177
209
|
|
|
178
|
-
fn
|
|
179
|
-
outShadowCatcher[
|
|
210
|
+
fn ju(gx: u32, value: f32) {
|
|
211
|
+
outShadowCatcher[gx].moments += vec4f(value, value * value, 0.0, 0.0);
|
|
180
212
|
}
|
|
181
213
|
|
|
182
214
|
|
|
@@ -190,123 +222,23 @@ isBlank: bool,
|
|
|
190
222
|
shadowCounts: vec2f,
|
|
191
223
|
}
|
|
192
224
|
|
|
193
|
-
fn
|
|
194
|
-
let
|
|
195
|
-
if (ge < 0.00001) {
|
|
196
|
-
return -radius;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
let iX = radius * point.y / ge;
|
|
200
|
-
let iL = -1.5 * height;
|
|
201
|
-
var eH: f32;
|
|
202
|
-
if (iX >= 0.0) {
|
|
203
|
-
eH = radius;
|
|
204
|
-
}
|
|
205
|
-
else if (iX < iL) {
|
|
206
|
-
eH = -height * ge / point.y;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
let cL = 1.0
|
|
210
|
-
- iX * iX / (3.0 * iL * iL);
|
|
211
|
-
eH = radius * cL;
|
|
212
|
-
}
|
|
213
|
-
return ge - eH;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
fn fd(origin: vec3f, direction: vec3f) -> vec3f {
|
|
217
|
-
if (!USE_GROUNDED_BACKGROUND) {
|
|
218
|
-
return direction;
|
|
219
|
-
}
|
|
220
|
-
let params = rtUniform.groundedBackgroundParams;
|
|
221
|
-
let cf = normalize(direction);
|
|
222
|
-
let center = vec3f(
|
|
223
|
-
rtUniform.groundedBackgroundCenter.x,
|
|
224
|
-
params.z + params.x,
|
|
225
|
-
rtUniform.groundedBackgroundCenter.y
|
|
226
|
-
);
|
|
227
|
-
let bI = origin - center;
|
|
228
|
-
let eT = dot(bI, cf);
|
|
229
|
-
let br = eT * eT
|
|
230
|
-
- dot(bI, bI) + params.y * params.y;
|
|
231
|
-
if (
|
|
232
|
-
br <= 0.0
|
|
233
|
-
|| dK(bI, params.x, params.y) > 0.0
|
|
234
|
-
) {
|
|
235
|
-
return direction;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
var cM = -eT + sqrt(br);
|
|
239
|
-
if (cM <= 0.0) {
|
|
240
|
-
return direction;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
let oK = bI + cf * cM;
|
|
244
|
-
if (oK.y >= 0.0) {
|
|
245
|
-
return normalize(oK);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (cf.y < -0.00001 && params.y > 1.5 * params.x) {
|
|
249
|
-
let ir = (-params.x - bI.y) / cf.y;
|
|
250
|
-
let oB = bI + cf * ir;
|
|
251
|
-
let pe = (2.0 / 3.0)
|
|
252
|
-
* sqrt(params.y * params.y - 2.25 * params.x * params.x);
|
|
253
|
-
if (ir > 0.0 && length(oB.xz) <= pe) {
|
|
254
|
-
return normalize(oB);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
var cV = 0.0;
|
|
259
|
-
for (var i = 0; i < 14; i++) {
|
|
260
|
-
let fB = (cV + cM) * 0.5;
|
|
261
|
-
let qy = bI + cf * fB;
|
|
262
|
-
if (dK(qy, params.x, params.y) > 0.0) {
|
|
263
|
-
cM = fB;
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
cV = fB;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
let hit = bI + cf * ((cV + cM) * 0.5);
|
|
270
|
-
return normalize(hit);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
fn hX(ray: Ray) -> vec4f {
|
|
274
|
-
var bg = vec4f(0.0);
|
|
275
|
-
if (USE_BACKGROUND_MAP) {
|
|
276
|
-
let d = fd(ray.o, ray.d);
|
|
277
|
-
let t = rtUniform.backgroundMapTransform;
|
|
278
|
-
let qZ = vec3f(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
|
|
279
|
-
let rotation = rtUniform.backgroundMapRotation;
|
|
280
|
-
let hn = transpose(mat3x3f(rotation[0].xyz, rotation[1].xyz, rotation[2].xyz)) * qZ;
|
|
281
|
-
let bc = textureLinear(backgroundMap, eV(hn));
|
|
282
|
-
bg = vec4f(bc.rgb * t.z, bc.a);
|
|
283
|
-
}
|
|
284
|
-
else if (USE_BACKGROUND) {
|
|
285
|
-
bg = rtUniform.backgroundColor;
|
|
286
|
-
}
|
|
287
|
-
else if (USE_ENVMAP) {
|
|
288
|
-
bg = textureLinear(envMap, dm(ray.d));
|
|
289
|
-
}
|
|
290
|
-
return bg;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
fn di(ray: Ray, wavelength: f32) -> vec4f {
|
|
294
|
-
let bg = hX(ray);
|
|
225
|
+
${backgroundWgsl}fn cS(ray: Ray, channel: i32) -> vec4f {
|
|
226
|
+
let bg = fI(ray);
|
|
295
227
|
if (SPECTRAL) {
|
|
296
|
-
return vec4f(
|
|
228
|
+
return vec4f(sampling_spectral_rgb_filter(bg.rgb, channel), bg.a);
|
|
297
229
|
}
|
|
298
230
|
return bg;
|
|
299
231
|
}
|
|
300
232
|
|
|
301
233
|
|
|
302
234
|
|
|
303
|
-
fn
|
|
304
|
-
*
|
|
305
|
-
|
|
235
|
+
fn mD(uv: vec2f, path: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, fg: ptr<function, bool>) {
|
|
236
|
+
*fg = false;
|
|
237
|
+
samplingBounce = u32(max(*depth, 0));
|
|
306
238
|
let matType = (*ma).materialType;
|
|
307
239
|
let isShadowCatcher = ${hasShadowCatcher ? /* wgsl */ `matType == SHADOW_CATCHER` : /* wgsl */ `false`};
|
|
308
240
|
if (isShadowCatcher) {
|
|
309
|
-
if ((*
|
|
241
|
+
if ((*path).fromEye) {
|
|
310
242
|
(*si).hit = false;
|
|
311
243
|
}
|
|
312
244
|
else {
|
|
@@ -314,37 +246,37 @@ else {
|
|
|
314
246
|
|
|
315
247
|
|
|
316
248
|
if (USE_ENVMAP) {
|
|
317
|
-
if ((*
|
|
249
|
+
if ((*path).isNextRefraction) {
|
|
318
250
|
|
|
319
251
|
|
|
320
|
-
let bg =
|
|
321
|
-
(*
|
|
322
|
-
(*si).
|
|
252
|
+
let bg = cS(
|
|
253
|
+
(*path).ray,
|
|
254
|
+
(*si).spectralChannel
|
|
323
255
|
);
|
|
324
|
-
let
|
|
325
|
-
|
|
326
|
-
1.0, (*
|
|
327
|
-
(*
|
|
328
|
-
(*
|
|
256
|
+
let cP = select(gm((*path).scatteringPdf,
|
|
257
|
+
envMapPdf(cU((*path).ray.d)) * rtUniform.envLightPmf),
|
|
258
|
+
1.0, (*path).scatteringIsDelta);
|
|
259
|
+
(*path).li += cP * (*path).beta * bg.rgb * bg.a;
|
|
260
|
+
(*path).alpha = max((*path).alpha, bg.a);
|
|
329
261
|
}
|
|
330
262
|
else {
|
|
331
|
-
let
|
|
332
|
-
var emission = textureLinear(envMap,
|
|
263
|
+
let xp = cU((*path).ray.d);
|
|
264
|
+
var emission = textureLinear(envMap, xp).rgb;
|
|
333
265
|
if (SPECTRAL) {
|
|
334
|
-
emission =
|
|
266
|
+
emission = sampling_spectral_rgb_filter(emission, (*si).spectralChannel);
|
|
335
267
|
}
|
|
336
|
-
(*
|
|
337
|
-
|
|
268
|
+
(*path).li += (*path).beta * emission *
|
|
269
|
+
gm((*path).scatteringPdf, envMapPdf(xp));
|
|
338
270
|
}
|
|
339
271
|
}
|
|
340
272
|
else {
|
|
341
|
-
let bg =
|
|
342
|
-
(*
|
|
343
|
-
(*si).
|
|
273
|
+
let bg = cS(
|
|
274
|
+
(*path).ray,
|
|
275
|
+
(*si).spectralChannel
|
|
344
276
|
);
|
|
345
|
-
(*
|
|
277
|
+
(*path).li += (*path).beta * bg.rgb * bg.a;
|
|
346
278
|
}
|
|
347
|
-
(*
|
|
279
|
+
(*path).abort = true;
|
|
348
280
|
return;
|
|
349
281
|
}
|
|
350
282
|
}
|
|
@@ -352,40 +284,40 @@ if (!(*si).hit) {
|
|
|
352
284
|
|
|
353
285
|
|
|
354
286
|
|
|
355
|
-
let bg =
|
|
356
|
-
(*
|
|
357
|
-
(*si).
|
|
287
|
+
let bg = cS(
|
|
288
|
+
(*path).ray,
|
|
289
|
+
(*si).spectralChannel
|
|
358
290
|
);
|
|
359
|
-
if ((*
|
|
291
|
+
if ((*path).fromEye) {
|
|
360
292
|
|
|
361
|
-
(*
|
|
362
|
-
(*
|
|
293
|
+
(*path).li = (*path).beta * bg.rgb * bg.a;
|
|
294
|
+
(*path).alpha = bg.a;
|
|
363
295
|
|
|
364
296
|
(*outAux).isBlank = bg.a < 0.001 ||
|
|
365
297
|
(USE_BACKGROUND && !USE_BACKGROUND_MAP);
|
|
366
298
|
}
|
|
367
299
|
else {
|
|
368
|
-
let cam =
|
|
369
|
-
let
|
|
300
|
+
let cam = cV(uv);
|
|
301
|
+
let ou = dot(cam.d, (*path).ray.d) > 0.0;
|
|
370
302
|
if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
371
|
-
if (
|
|
372
|
-
(*
|
|
303
|
+
if (ou) {
|
|
304
|
+
(*path).alpha = max((*path).alpha, bg.a);
|
|
373
305
|
} else {
|
|
374
|
-
(*
|
|
306
|
+
(*path).alpha = 1.0;
|
|
375
307
|
}
|
|
376
308
|
}
|
|
377
309
|
if (!USE_ENVMAP) {
|
|
378
310
|
|
|
379
311
|
|
|
380
|
-
if (
|
|
312
|
+
if (ou) {
|
|
381
313
|
|
|
382
314
|
|
|
383
|
-
(*
|
|
384
|
-
|
|
315
|
+
(*path).li += (*path).beta *
|
|
316
|
+
gm((*path).scatteringPdf, 1.0) * bg.rgb;
|
|
385
317
|
}
|
|
386
318
|
}
|
|
387
319
|
}
|
|
388
|
-
(*
|
|
320
|
+
(*path).abort = true;
|
|
389
321
|
return;
|
|
390
322
|
}
|
|
391
323
|
|
|
@@ -396,28 +328,28 @@ let alpha = clamp((*ma).alpha, 0.0, 1.0);
|
|
|
396
328
|
if (alpha < 1.0) {
|
|
397
329
|
|
|
398
330
|
|
|
399
|
-
if (alpha <= 0.0 ||
|
|
400
|
-
(*
|
|
331
|
+
if (alpha <= 0.0 || cm(3u) > alpha) {
|
|
332
|
+
(*fg) = true;
|
|
401
333
|
}
|
|
402
334
|
}
|
|
403
|
-
if (!(*
|
|
335
|
+
if (!(*fg) && rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
404
336
|
|
|
405
337
|
|
|
406
338
|
let outputAlpha = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
|
|
407
|
-
(*
|
|
339
|
+
(*path).alpha = max(outputAlpha, (*path).alpha);
|
|
408
340
|
}
|
|
409
|
-
if (!(*
|
|
410
|
-
|
|
411
|
-
|
|
341
|
+
if (!(*fg)) {
|
|
342
|
+
bounceIndex = u32(max(*depth, 0));
|
|
343
|
+
nB(si, ma, path);
|
|
412
344
|
}
|
|
413
345
|
else {
|
|
414
346
|
|
|
415
347
|
|
|
416
|
-
(*
|
|
348
|
+
(*path).ray.o = (*si).position + (*path).ray.d * EPS;
|
|
417
349
|
}
|
|
418
350
|
}
|
|
419
351
|
|
|
420
|
-
if (!(*si).albedoSampled && !(*
|
|
352
|
+
if (!(*si).albedoSampled && !(*fg)) {
|
|
421
353
|
|
|
422
354
|
if ((matType == STANDARD || matType == UNLIT)) {
|
|
423
355
|
if (!((*ma).transmissionWeight > 0.5 ||
|
|
@@ -442,34 +374,34 @@ if (*depth > 4) {
|
|
|
442
374
|
|
|
443
375
|
|
|
444
376
|
if (USE_RR) {
|
|
445
|
-
if (*depth >= RR_MAX && !(*
|
|
446
|
-
let
|
|
377
|
+
if (*depth >= select(2, RR_MAX, (*path).scatteringMediumEntered) && !(*fg)) {
|
|
378
|
+
let qv = (*path).beta;
|
|
447
379
|
|
|
448
|
-
let
|
|
449
|
-
let q: f32 = max(0.0, 1.0 -
|
|
450
|
-
if (
|
|
380
|
+
let ql = max(max(qv.x, qv.y), qv.z);
|
|
381
|
+
let q: f32 = max(0.0, 1.0 - ql);
|
|
382
|
+
if (sample1D(aX(RUSSIAN_ROULETTE)) < q) {
|
|
451
383
|
|
|
452
384
|
|
|
453
|
-
(*
|
|
454
|
-
(*
|
|
385
|
+
(*path).alpha = 1.0;
|
|
386
|
+
(*path).abort = true;
|
|
455
387
|
}
|
|
456
388
|
else {
|
|
457
|
-
(*
|
|
389
|
+
(*path).beta /= 1.0 - q;
|
|
458
390
|
}
|
|
459
391
|
}
|
|
460
392
|
}
|
|
461
|
-
if ((*
|
|
393
|
+
if ((*path).abort) {
|
|
462
394
|
return;
|
|
463
395
|
}
|
|
464
396
|
|
|
465
397
|
|
|
466
398
|
}
|
|
467
399
|
|
|
468
|
-
fn
|
|
400
|
+
fn gN(path: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, sampleIgnored: bool) {
|
|
469
401
|
if (SPECTRAL) {
|
|
470
402
|
|
|
471
403
|
if ((*ma).transmissionWeight > 0.001) {
|
|
472
|
-
(*ma).specularIor =
|
|
404
|
+
(*ma).specularIor = sampling_cauchy_ior(
|
|
473
405
|
(*si).wavelength,
|
|
474
406
|
(*ma).specularIor,
|
|
475
407
|
(*ma).transmissionDispersionScale,
|
|
@@ -478,304 +410,329 @@ if ((*ma).transmissionWeight > 0.001) {
|
|
|
478
410
|
}
|
|
479
411
|
}
|
|
480
412
|
|
|
481
|
-
if (
|
|
413
|
+
if (sampleIgnored) {
|
|
482
414
|
return;
|
|
483
415
|
}
|
|
484
416
|
|
|
485
417
|
|
|
486
418
|
var lightSample: LightSampleRec;
|
|
487
|
-
let
|
|
419
|
+
let hN = cm(3u) < (*ma).alpha;
|
|
488
420
|
for (var i = 0; i < rtUniform.lightsCount; i++) {
|
|
489
421
|
|
|
490
422
|
let light: Light = analyticLights[i];
|
|
491
|
-
let d =
|
|
423
|
+
let d = iB((*path).ray, light, &lightSample);
|
|
492
424
|
lightSample.pdf *= light.selectionPmf;
|
|
493
|
-
let
|
|
494
|
-
if (d != INF && !(
|
|
495
|
-
let
|
|
425
|
+
let mz = (*si).hit && d > distance((*si).position, (*path).ray.o);
|
|
426
|
+
if (d != INF && !(mz && hN)) {
|
|
427
|
+
let misWeight = gm((*path).scatteringPdf, lightSample.pdf);
|
|
496
428
|
if (SPECTRAL) {
|
|
497
|
-
lightSample.emission =
|
|
429
|
+
lightSample.emission = sampling_spectral_rgb_filter(lightSample.emission, (*si).spectralChannel);
|
|
498
430
|
}
|
|
499
|
-
(*
|
|
500
|
-
(*
|
|
501
|
-
(*
|
|
431
|
+
${enabled || lightTracing || photonMapping ? 'if (!causticHitOwned(*path, true, true)) { causticHotRecord(*path,misWeight*lightSample.emission,2u); ' : ''}(*path).li += misWeight * (*path).beta * lightSample.emission;${enabled || lightTracing || photonMapping ? ' }' : ''}
|
|
432
|
+
(*path).alpha = 1.0;
|
|
433
|
+
(*path).abort = true;
|
|
502
434
|
}
|
|
503
435
|
}
|
|
504
436
|
|
|
505
437
|
if (USE_ENVMAP) {
|
|
506
|
-
if (!((*si).hit &&
|
|
507
|
-
if
|
|
438
|
+
if (!((*si).hit && hN)) {${lightTracing || photonMapping ? /* wgsl */ `
|
|
439
|
+
if(causticHitOwned(*path,false,true)){(*path).abort=true;return;}` : ''}
|
|
440
|
+
if ((*path).isNextRefraction) {
|
|
508
441
|
|
|
509
442
|
|
|
510
443
|
|
|
511
|
-
let bg =
|
|
512
|
-
(*
|
|
513
|
-
(*si).
|
|
444
|
+
let bg = cS(
|
|
445
|
+
(*path).ray,
|
|
446
|
+
(*si).spectralChannel
|
|
514
447
|
);
|
|
515
|
-
let
|
|
516
|
-
|
|
517
|
-
1.0, (*
|
|
518
|
-
(*
|
|
519
|
-
(*
|
|
520
|
-
(*
|
|
448
|
+
let cP = select(gm((*path).scatteringPdf,
|
|
449
|
+
envMapPdf(cU((*path).ray.d)) * rtUniform.envLightPmf),
|
|
450
|
+
1.0, (*path).scatteringIsDelta);
|
|
451
|
+
(*path).li += cP * (*path).beta * bg.rgb * bg.a;
|
|
452
|
+
(*path).alpha = max((*path).alpha, bg.a);
|
|
453
|
+
(*path).abort = true;
|
|
521
454
|
return;
|
|
522
455
|
}
|
|
523
|
-
let _uv =
|
|
456
|
+
let _uv = cU((*path).ray.d);
|
|
524
457
|
var emission = textureLinear(envMap, _uv).rgb;
|
|
525
|
-
let
|
|
526
|
-
(*
|
|
527
|
-
|
|
458
|
+
let misWeight = gm(
|
|
459
|
+
(*path).scatteringPdf,
|
|
460
|
+
envMapPdf(_uv) * rtUniform.envLightPmf
|
|
528
461
|
);
|
|
529
462
|
if (SPECTRAL) {
|
|
530
|
-
emission =
|
|
463
|
+
emission = sampling_spectral_rgb_filter(emission, (*si).spectralChannel);
|
|
531
464
|
}
|
|
532
465
|
|
|
533
466
|
if (!USE_BACKGROUND) {
|
|
534
|
-
(*
|
|
467
|
+
(*path).alpha = 1.0;
|
|
535
468
|
}
|
|
536
|
-
(*
|
|
537
|
-
(*
|
|
469
|
+
(*path).li += (*path).beta * emission * misWeight;
|
|
470
|
+
(*path).abort = true;
|
|
538
471
|
}
|
|
539
472
|
}
|
|
540
473
|
|
|
541
474
|
*depth = *depth + 1;
|
|
542
475
|
}
|
|
543
476
|
|
|
544
|
-
|
|
477
|
+
${options.cameraProjectionInverse ? /* wgsl */ `
|
|
478
|
+
fn cV(coord: vec2f) -> Ray {
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
let origin = cameraUniform.projectionInv * vec4f(coord * 2.0 - 1.0, -1.0, 1.0);
|
|
482
|
+
let center = cameraUniform.projectionInv * vec4f(coord * 2.0 - 1.0, 1.0, 1.0);
|
|
483
|
+
let direction = center.xyz * origin.w - origin.xyz * center.w;
|
|
484
|
+
var cam: Ray;
|
|
485
|
+
initRay(&cam, (cameraUniform.viewInv * vec4f(origin.xyz / origin.w, 1.0)).xyz,
|
|
486
|
+
normalize((cameraUniform.viewInv * vec4f(direction, 0.0)).xyz));
|
|
487
|
+
return cam;
|
|
488
|
+
}
|
|
489
|
+
` : /* wgsl */ `fn cV(coord: vec2f) -> Ray {
|
|
545
490
|
let origin = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, -1.0, 1.0);
|
|
546
491
|
let center = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, 1.0, 1.0);
|
|
547
492
|
var cam: Ray;
|
|
548
|
-
|
|
493
|
+
initRay(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
|
|
549
494
|
|
|
550
495
|
return cam;
|
|
551
|
-
}
|
|
496
|
+
}`}
|
|
552
497
|
|
|
553
498
|
|
|
554
|
-
fn
|
|
499
|
+
fn lD(radius: f32, xi: f32) -> vec2f {
|
|
555
500
|
var x = 0.25;
|
|
556
|
-
for (var
|
|
501
|
+
for (var iteration = 0; iteration < 10; iteration++) {
|
|
557
502
|
let x2 = x * x;
|
|
558
503
|
let x3 = x2 * x;
|
|
559
|
-
let
|
|
504
|
+
let lU = 1.0 - x;
|
|
560
505
|
let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
561
506
|
4.0 * x2 * x3 - xi;
|
|
562
|
-
let
|
|
563
|
-
if (abs(value) < 1e-6 ||
|
|
564
|
-
x = clamp(x - value /
|
|
507
|
+
let nL = 20.0 * x * lU * lU * lU;
|
|
508
|
+
if (abs(value) < 1e-6 || nL == 0.0) { break; }
|
|
509
|
+
x = clamp(x - value / nL, 0.0, 1.0);
|
|
565
510
|
}
|
|
566
|
-
let
|
|
567
|
-
return vec2f(
|
|
511
|
+
let jW = x * radius;
|
|
512
|
+
return vec2f(jW, sqrt(max(radius * radius - jW * jW, 0.0)));
|
|
568
513
|
}
|
|
569
514
|
|
|
570
|
-
fn
|
|
571
|
-
if (
|
|
572
|
-
let
|
|
573
|
-
return
|
|
515
|
+
fn bevelCubicPdf(radius: f32, gO: f32) -> f32 {
|
|
516
|
+
if (gO >= radius) { return 0.0; }
|
|
517
|
+
let falloff = radius - gO;
|
|
518
|
+
return falloff * falloff * falloff;
|
|
574
519
|
}
|
|
575
520
|
|
|
576
521
|
|
|
577
|
-
fn
|
|
522
|
+
fn kB(source: SurfaceInteraction, radius: f32) -> vec3f {
|
|
578
523
|
var geometricNormal = source.faceNormal;
|
|
579
524
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) {
|
|
580
525
|
geometricNormal = -geometricNormal;
|
|
581
526
|
}
|
|
582
527
|
var tangent: vec3f;
|
|
583
528
|
var bitangent: vec3f;
|
|
584
|
-
|
|
585
|
-
var
|
|
586
|
-
|
|
587
|
-
for (var
|
|
588
|
-
let
|
|
589
|
-
var
|
|
590
|
-
let
|
|
591
|
-
var
|
|
592
|
-
var
|
|
593
|
-
var
|
|
594
|
-
var
|
|
595
|
-
var
|
|
596
|
-
var
|
|
597
|
-
if (
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
else if (
|
|
601
|
-
let
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
529
|
+
sampling_orthonormal_basis(geometricNormal, &tangent, &bitangent);
|
|
530
|
+
var jd = vec3f(0.0);
|
|
531
|
+
|
|
532
|
+
for (var iN = 0; iN < BEVEL_SAMPLES; iN++) {
|
|
533
|
+
let rh = sample2D(CAMERA_BEVEL_BASE + u32(iN));
|
|
534
|
+
var cu = rh.x;
|
|
535
|
+
let qt = rh.y;
|
|
536
|
+
var dc = geometricNormal;
|
|
537
|
+
var fU = tangent;
|
|
538
|
+
var eo = bitangent;
|
|
539
|
+
var gw = 0.5;
|
|
540
|
+
var iH = 0.25;
|
|
541
|
+
var gV = 0.25;
|
|
542
|
+
if (cu < 0.5) {
|
|
543
|
+
cu *= 2.0;
|
|
544
|
+
}
|
|
545
|
+
else if (cu < 0.75) {
|
|
546
|
+
let os = dc;
|
|
547
|
+
dc = fU;
|
|
548
|
+
fU = os;
|
|
549
|
+
gw = 0.25;
|
|
550
|
+
iH = 0.5;
|
|
551
|
+
cu = (cu - 0.5) * 4.0;
|
|
607
552
|
}
|
|
608
553
|
else {
|
|
609
|
-
let
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
let
|
|
618
|
-
let phi = TWOPI *
|
|
619
|
-
let
|
|
620
|
-
(cos(phi) *
|
|
554
|
+
let os = dc;
|
|
555
|
+
dc = eo;
|
|
556
|
+
eo = os;
|
|
557
|
+
gw = 0.25;
|
|
558
|
+
gV = 0.5;
|
|
559
|
+
cu = (cu - 0.75) * 4.0;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
let hm = lD(radius, qt);
|
|
563
|
+
let phi = TWOPI * cu;
|
|
564
|
+
let sI = hm.x *
|
|
565
|
+
(cos(phi) * fU + sin(phi) * eo);
|
|
621
566
|
var ray: Ray;
|
|
622
|
-
|
|
567
|
+
initRay(
|
|
623
568
|
&ray,
|
|
624
|
-
source.position +
|
|
625
|
-
-
|
|
569
|
+
source.position + dc * hm.y + sI,
|
|
570
|
+
-dc
|
|
626
571
|
);
|
|
627
572
|
var hit: SurfaceInteraction;
|
|
628
573
|
intersectSceneBevel(
|
|
629
574
|
ray,
|
|
630
575
|
&hit,
|
|
631
576
|
source.instanceIndex,
|
|
632
|
-
max(2.0 *
|
|
577
|
+
max(2.0 * hm.y, EPS)
|
|
633
578
|
);
|
|
634
579
|
if (!hit.hit) { continue; }
|
|
635
580
|
|
|
636
|
-
let
|
|
637
|
-
let
|
|
638
|
-
let
|
|
639
|
-
var weight =
|
|
640
|
-
|
|
641
|
-
|
|
581
|
+
let lV = gw * abs(dot(dc, hit.faceNormal));
|
|
582
|
+
let oi = iH * abs(dot(fU, hit.faceNormal));
|
|
583
|
+
let kR = gV * abs(dot(eo, hit.faceNormal));
|
|
584
|
+
var weight = lV / max(
|
|
585
|
+
lV * lV + oi * oi +
|
|
586
|
+
kR * kR,
|
|
642
587
|
1e-8
|
|
643
588
|
);
|
|
644
|
-
weight *=
|
|
645
|
-
max(
|
|
646
|
-
|
|
589
|
+
weight *= bevelCubicPdf(radius, distance(hit.position, source.position)) /
|
|
590
|
+
max(bevelCubicPdf(radius, hm.x), 1e-8);
|
|
591
|
+
jd += weight * hit.vertexNormal;
|
|
647
592
|
}
|
|
648
593
|
|
|
649
|
-
if (dot(
|
|
650
|
-
let
|
|
651
|
-
let result = source.normal +
|
|
594
|
+
if (dot(jd, jd) <= 1e-12) { return source.normal; }
|
|
595
|
+
let kt = normalize(jd);
|
|
596
|
+
let result = source.normal + kt - source.vertexNormal;
|
|
652
597
|
if (dot(result, result) > 1e-12) { return normalize(result); }
|
|
653
598
|
return source.normal;
|
|
654
599
|
}
|
|
655
600
|
|
|
656
|
-
fn
|
|
657
|
-
var
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
601
|
+
${sharePrefix ? spectralPrefixWgsl(!enabled) + prefixCheckpoint('spSurface', surfacePrefix) + prefixCheckpoint('spFlat', flatPrefix) : ''}fn cJ(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, initialQuery: bool) -> vec4f {
|
|
602
|
+
var path: Path;
|
|
603
|
+
path.ray = ray;
|
|
604
|
+
path.li = vec3f(0.0);
|
|
605
|
+
path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
|
|
606
|
+
path.beta = vec3f(1.0);
|
|
607
|
+
path.fromEye = true;
|
|
608
|
+
path.scatteringPdf = 0.0;
|
|
609
|
+
path.scatteringIsDelta = false;
|
|
610
|
+
path.isNextRefraction = false;
|
|
611
|
+
path.abort = false;
|
|
667
612
|
|
|
668
613
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
669
|
-
let
|
|
614
|
+
let fj = min(bounceLimit * 3, ${maxPathEvents});
|
|
670
615
|
var depth = 0;
|
|
671
|
-
var
|
|
672
|
-
var
|
|
673
|
-
|
|
616
|
+
var sampleIgnored = false;
|
|
617
|
+
var isNotTransparent = false;
|
|
618
|
+
${sharePrefix ? /* wgsl */ ` let spSlot = qz; qz++;
|
|
619
|
+
if (spActive && spChannel > 1 && eB[spSlot].ready) { return rN(spSlot, outAux); }
|
|
620
|
+
var spEvent = 0; var spResume = false;
|
|
621
|
+
if (spActive && spChannel > 1 && fC == spSlot) {
|
|
622
|
+
var event = 0;
|
|
623
|
+
${prefixRestore('spSurface', surfacePrefix)}
|
|
624
|
+
spEvent = event; spResume = true; qA(&path, si);
|
|
625
|
+
} else if (sd) { (*si).spectralChannel = select(spChannel, 0, spActive); (*si).wavelength = lg; }
|
|
626
|
+
` : ''}
|
|
674
627
|
|
|
675
628
|
|
|
676
629
|
|
|
677
|
-
for (var event = 0; event <=
|
|
678
|
-
if ((event != 0) |
|
|
679
|
-
intersectScene(
|
|
680
|
-
|
|
630
|
+
for (var event = ${sharePrefix ? 'spEvent' : '0'}; event <= fj; event++) {
|
|
631
|
+
if (${sharePrefix ? '!spResume && ((event != 0) | initialQuery)' : '(event != 0) | initialQuery'}) {
|
|
632
|
+
intersectScene(path.ray, si, depth, event != 0, path.isNextRefraction);
|
|
633
|
+
getMaterial(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
|
|
681
634
|
}
|
|
682
635
|
if (event == 0) {
|
|
683
|
-
if (
|
|
636
|
+
if (initialQuery & (*si).hit & ((*ma).materialType == STANDARD)) {
|
|
684
637
|
(*outAux).albedo = select((*ma).baseColor, vec3f(1.0), (*ma).transmissionWeight > 0.5);
|
|
685
638
|
(*outAux).normal = select((*si).normal, -(*si).normal,
|
|
686
639
|
dot((*si).normal, (*si).position - cameraUniform.viewInv[3].xyz) > 0.0);
|
|
687
640
|
(*si).albedoSampled = (*ma).transmissionWeight > 0.5;
|
|
688
641
|
}
|
|
689
|
-
|
|
690
|
-
} else {
|
|
691
|
-
|
|
642
|
+
isNotTransparent = ((*ma).transmissionWeight < 0.001) & ((*ma).subsurfaceWeight < 0.001) & ((*ma).alpha > 0.99);
|
|
643
|
+
} else {${sharePrefix ? /* wgsl */ `
|
|
644
|
+
if (spActive && (*ma).transmissionWeight > 0.001 && gf(*ma)) {
|
|
645
|
+
${prefixSave('spSurface', surfacePrefix)}
|
|
646
|
+
fC = spSlot; qA(&path, si);
|
|
647
|
+
}` : ''}
|
|
648
|
+
gN(&path, &depth, si, ma, sampleIgnored);
|
|
692
649
|
}
|
|
693
|
-
if (
|
|
694
|
-
if (
|
|
695
|
-
|
|
696
|
-
if (
|
|
650
|
+
${sharePrefix ? ' spResume = false;\n' : ''} if (isNotTransparent & (event > bounceLimit)) { path.abort = true; }
|
|
651
|
+
if (path.abort | (event >= fj)) { break; }
|
|
652
|
+
mD(uv, &path, &depth, si, ma, outAux, &sampleIgnored);
|
|
653
|
+
if (path.abort) { break; }
|
|
697
654
|
}
|
|
698
655
|
|
|
699
|
-
return vec4f(
|
|
656
|
+
return ${sharePrefix ? 'spFinish(spSlot, vec4f(path.li, path.alpha), *outAux)' : 'vec4f(path.li, path.alpha)'};
|
|
700
657
|
}
|
|
701
658
|
|
|
702
|
-
fn
|
|
659
|
+
fn jb(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
703
660
|
${deterministicPrimaryAlpha ? /* wgsl */ `let coverage = clamp((*ma).alpha, 0.0, 1.0);
|
|
704
661
|
|
|
705
662
|
|
|
706
663
|
|
|
707
664
|
|
|
708
665
|
let split = (*si).hit & (((*ma).materialType == STANDARD) | ((*ma).materialType == UNLIT)) & (coverage < 1.0);
|
|
709
|
-
var
|
|
710
|
-
var
|
|
711
|
-
var
|
|
712
|
-
var
|
|
666
|
+
var tT = ray;
|
|
667
|
+
var uW = *si;
|
|
668
|
+
var uV = *ma;
|
|
669
|
+
var iX = *outAux;
|
|
713
670
|
if (split) {
|
|
714
|
-
|
|
715
|
-
|
|
671
|
+
tT.o = (*si).position + ray.d * (EPS * 0.02);
|
|
672
|
+
uW.albedoSampled = false;
|
|
716
673
|
}
|
|
717
674
|
var back: vec4f;
|
|
718
|
-
var
|
|
675
|
+
var backAux: RayTraceAuxiliary;
|
|
719
676
|
|
|
720
677
|
|
|
721
|
-
let
|
|
722
|
-
for (var
|
|
723
|
-
let result =
|
|
724
|
-
if (!split | (coverage <= 0.0)) { *outAux =
|
|
725
|
-
if (
|
|
726
|
-
back = result;
|
|
727
|
-
|
|
728
|
-
|
|
678
|
+
let xh = select(1u, rtUniform.loopUnrollGuard >> 1u, split & (coverage > 0.0));
|
|
679
|
+
for (var wv = 0u; wv < xh; wv++) {
|
|
680
|
+
let result = cJ(uv, &uW, tT, &uV, &iX, split & (wv == 0u));
|
|
681
|
+
if (!split | (coverage <= 0.0)) { *outAux = iX; return result; }
|
|
682
|
+
if (wv == 0u) {
|
|
683
|
+
back = result; backAux = iX;
|
|
684
|
+
uW = *si; uV = *ma; uV.alpha = 1.0;
|
|
685
|
+
tT = ray; iX = *outAux;
|
|
729
686
|
} else {
|
|
730
|
-
(*outAux).albedo = mix(
|
|
731
|
-
let
|
|
732
|
-
(*outAux).normal = select(vec3f(0.0), normalize(
|
|
733
|
-
(*outAux).isBlank =
|
|
734
|
-
(*outAux).isShadowCatcher =
|
|
735
|
-
(*outAux).shadowCounts = mix(
|
|
687
|
+
(*outAux).albedo = mix(backAux.albedo, iX.albedo, coverage);
|
|
688
|
+
let aS = mix(backAux.normal, iX.normal, coverage);
|
|
689
|
+
(*outAux).normal = select(vec3f(0.0), normalize(aS), dot(aS, aS) > 1e-12);
|
|
690
|
+
(*outAux).isBlank = backAux.isBlank & iX.isBlank;
|
|
691
|
+
(*outAux).isShadowCatcher = backAux.isShadowCatcher & iX.isShadowCatcher;
|
|
692
|
+
(*outAux).shadowCounts = mix(backAux.shadowCounts, iX.shadowCounts, coverage);
|
|
736
693
|
return mix(back, result, coverage);
|
|
737
694
|
}
|
|
738
695
|
}
|
|
739
|
-
return vec4f(0.0);` : /* wgsl */ `return
|
|
696
|
+
return vec4f(0.0);` : /* wgsl */ `return cJ(uv, si, ray, ma, outAux, false);`}
|
|
740
697
|
}
|
|
741
698
|
|
|
742
699
|
|
|
743
700
|
|
|
744
|
-
${spectral === false && deterministicPrimaryAlpha ? /* wgsl */ `fn
|
|
701
|
+
${spectral === false && deterministicPrimaryAlpha ? /* wgsl */ `fn hq(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
745
702
|
${primaryVariables}
|
|
746
|
-
var
|
|
747
|
-
var
|
|
748
|
-
var
|
|
749
|
-
var
|
|
703
|
+
var primarySi: SurfaceInteraction;
|
|
704
|
+
var primaryMa: OpenPbrResolvedMaterial;
|
|
705
|
+
var vR: RayTraceAuxiliary;
|
|
706
|
+
var jg = false;
|
|
750
707
|
var query = true;
|
|
751
708
|
var split = false;
|
|
752
709
|
var coverage = 1.0;
|
|
753
710
|
var front = false;
|
|
754
711
|
var back: vec4f;
|
|
755
|
-
var
|
|
756
|
-
var
|
|
757
|
-
|
|
758
|
-
|
|
712
|
+
var backAux: RayTraceAuxiliary;
|
|
713
|
+
var path: Path; path.ray = ray;
|
|
714
|
+
path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
|
|
715
|
+
path.beta = vec3f(1.0); path.fromEye = true;
|
|
759
716
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
760
|
-
let
|
|
761
|
-
var event = 0; var depth = 0; var
|
|
762
|
-
var
|
|
717
|
+
let fj = min(bounceLimit * 3, ${maxPathEvents});
|
|
718
|
+
var event = 0; var depth = 0; var sampleIgnored = false;
|
|
719
|
+
var isNotTransparent = false;
|
|
763
720
|
|
|
764
721
|
|
|
765
|
-
for (var step = 0; step < (${
|
|
722
|
+
for (var step = 0; step < (${maxPathEvents} + 1) * 2 + 2; step++) {
|
|
766
723
|
if (query) {
|
|
767
|
-
intersectScene(
|
|
768
|
-
|
|
724
|
+
intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
|
|
725
|
+
getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
769
726
|
}
|
|
770
727
|
query = true;
|
|
771
|
-
if (!
|
|
728
|
+
if (!jg) {
|
|
772
729
|
${primaryGuides}
|
|
773
|
-
|
|
774
|
-
|
|
730
|
+
primarySi = si; primaryMa = ma; vR = *outAux;
|
|
731
|
+
jg = true;
|
|
775
732
|
coverage = clamp(ma.alpha, 0.0, 1.0);
|
|
776
733
|
split = si.hit & ((ma.materialType == STANDARD) | (ma.materialType == UNLIT)) & (coverage < 1.0);
|
|
777
734
|
if (split) {
|
|
778
|
-
|
|
735
|
+
path.ray.o = si.position + ray.d * (EPS * 0.02);
|
|
779
736
|
si.albedoSampled = false;
|
|
780
737
|
continue;
|
|
781
738
|
}
|
|
@@ -788,146 +745,170 @@ si.albedoSampled = ma.transmissionWeight > 0.5;
|
|
|
788
745
|
}
|
|
789
746
|
}
|
|
790
747
|
if (event == 0) {
|
|
791
|
-
|
|
748
|
+
isNotTransparent = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
|
|
792
749
|
} else {
|
|
793
|
-
|
|
750
|
+
gN(&path, &depth, &si, &ma, sampleIgnored);
|
|
794
751
|
}
|
|
795
|
-
if (
|
|
796
|
-
if (!
|
|
797
|
-
|
|
752
|
+
if (isNotTransparent & (event > bounceLimit)) { path.abort = true; }
|
|
753
|
+
if (!path.abort & (event < fj)) {
|
|
754
|
+
mD(uv, &path, &depth, &si, &ma, outAux, &sampleIgnored);
|
|
798
755
|
}
|
|
799
|
-
if (
|
|
800
|
-
let result = vec4f(
|
|
756
|
+
if (path.abort | (event >= fj)) {
|
|
757
|
+
let result = vec4f(path.li, path.alpha);
|
|
801
758
|
if (!split | (coverage <= 0.0)) { return result; }
|
|
802
759
|
if (front) {
|
|
803
|
-
(*outAux).albedo = mix(
|
|
804
|
-
let
|
|
805
|
-
(*outAux).normal = select(vec3f(0.0), normalize(
|
|
806
|
-
(*outAux).isBlank =
|
|
807
|
-
(*outAux).isShadowCatcher =
|
|
808
|
-
(*outAux).shadowCounts = mix(
|
|
760
|
+
(*outAux).albedo = mix(backAux.albedo, (*outAux).albedo, coverage);
|
|
761
|
+
let aS = mix(backAux.normal, (*outAux).normal, coverage);
|
|
762
|
+
(*outAux).normal = select(vec3f(0.0), normalize(aS), dot(aS, aS) > 1e-12);
|
|
763
|
+
(*outAux).isBlank = backAux.isBlank & (*outAux).isBlank;
|
|
764
|
+
(*outAux).isShadowCatcher = backAux.isShadowCatcher & (*outAux).isShadowCatcher;
|
|
765
|
+
(*outAux).shadowCounts = mix(backAux.shadowCounts, (*outAux).shadowCounts, coverage);
|
|
809
766
|
return mix(back, result, coverage);
|
|
810
767
|
}
|
|
811
|
-
back = result;
|
|
812
|
-
front = true; query = false; event = 0; depth = 0;
|
|
813
|
-
si =
|
|
814
|
-
|
|
815
|
-
|
|
768
|
+
back = result; backAux = *outAux;
|
|
769
|
+
front = true; query = false; event = 0; depth = 0; sampleIgnored = false;
|
|
770
|
+
si = primarySi; ma = primaryMa; ma.alpha = 1.0; *outAux = vR;
|
|
771
|
+
path = Path(); path.ray = ray; path.beta = vec3f(1.0); path.fromEye = true;
|
|
772
|
+
path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
|
|
816
773
|
} else { event++; }
|
|
817
774
|
}
|
|
818
775
|
return vec4f(0.0);
|
|
819
776
|
}
|
|
820
|
-
` : spectral === false && !deterministicPrimaryAlpha ? /* wgsl */ `fn
|
|
777
|
+
` : spectral === false && !deterministicPrimaryAlpha ? /* wgsl */ `fn hq(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
821
778
|
${primaryVariables}
|
|
822
|
-
var
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
779
|
+
var path: Path;
|
|
780
|
+
path.ray = ray;
|
|
781
|
+
path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
|
|
782
|
+
path.beta = vec3f(1.0);
|
|
783
|
+
path.fromEye = true;
|
|
827
784
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
828
|
-
let
|
|
829
|
-
var
|
|
785
|
+
let fj = min(bounceLimit * 3, ${maxPathEvents});
|
|
786
|
+
var isNotTransparent = false;
|
|
830
787
|
var depth = 0;
|
|
831
|
-
var
|
|
788
|
+
var sampleIgnored = false;
|
|
832
789
|
|
|
833
790
|
|
|
834
791
|
|
|
835
|
-
for (var event = 0; event <=
|
|
836
|
-
intersectScene(
|
|
837
|
-
|
|
792
|
+
for (var event = 0; event <= fj; event++) {
|
|
793
|
+
intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
|
|
794
|
+
getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
838
795
|
if (event == 0) {
|
|
839
796
|
${primaryGuides}
|
|
840
|
-
|
|
797
|
+
isNotTransparent = ma.transmissionWeight < 0.001 && ma.subsurfaceWeight < 0.001 && ma.alpha > 0.99;
|
|
841
798
|
} else {
|
|
842
|
-
|
|
799
|
+
gN(&path, &depth, &si, &ma, sampleIgnored);
|
|
843
800
|
}
|
|
844
|
-
if (
|
|
845
|
-
if (
|
|
846
|
-
|
|
847
|
-
if (
|
|
801
|
+
if (isNotTransparent && event > bounceLimit) { path.abort = true; }
|
|
802
|
+
if (path.abort || event >= fj) { break; }
|
|
803
|
+
mD(uv, &path, &depth, &si, &ma, outAux, &sampleIgnored);
|
|
804
|
+
if (path.abort) { break; }
|
|
848
805
|
}
|
|
849
|
-
return vec4f(
|
|
806
|
+
return vec4f(path.li, path.alpha);
|
|
850
807
|
}
|
|
851
808
|
` : spectral === true && !deterministicPrimaryAlpha ? /* wgsl */ `
|
|
852
|
-
fn
|
|
809
|
+
fn hq(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
853
810
|
${primaryVariables}
|
|
854
|
-
var
|
|
855
|
-
var
|
|
856
|
-
var
|
|
857
|
-
var
|
|
811
|
+
var primarySi: SurfaceInteraction;
|
|
812
|
+
var primaryMa: OpenPbrResolvedMaterial;
|
|
813
|
+
var jg = false;
|
|
814
|
+
var path: Path; path.ray = ray;
|
|
858
815
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
859
|
-
let
|
|
860
|
-
var depth = 0; var event = 0; var
|
|
861
|
-
var
|
|
862
|
-
var
|
|
863
|
-
let
|
|
864
|
-
var
|
|
865
|
-
var
|
|
866
|
-
var
|
|
867
|
-
var
|
|
868
|
-
var
|
|
869
|
-
|
|
816
|
+
let fj = min(bounceLimit * 3, ${maxPathEvents});
|
|
817
|
+
var depth = 0; var event = 0; var sampleIgnored = false;
|
|
818
|
+
var isNotTransparent = false;
|
|
819
|
+
var jR = 0;
|
|
820
|
+
let bj = rtUniform.dispersionWavelengths == 1;
|
|
821
|
+
var eG = false;
|
|
822
|
+
var eQ = 0;
|
|
823
|
+
var aE = 0.0;
|
|
824
|
+
var wavelengthRngState: vec4u;
|
|
825
|
+
var eH = 0u;
|
|
826
|
+
var wavelengthAux: RayTraceAuxiliary;
|
|
870
827
|
var color = vec3f(0.0); var alpha = 0.0;
|
|
871
|
-
var
|
|
872
|
-
var
|
|
873
|
-
var
|
|
828
|
+
var dD = vec3f(0.0);
|
|
829
|
+
var dE = vec3f(0.0);
|
|
830
|
+
var ik = true;
|
|
874
831
|
|
|
875
832
|
|
|
876
833
|
|
|
877
|
-
let
|
|
878
|
-
for (var step = 0; step <
|
|
879
|
-
if (!
|
|
880
|
-
intersectScene(
|
|
881
|
-
|
|
834
|
+
let zh = min((${maxPathEvents} + 1) * 3, i32(rtUniform.loopUnrollGuard * ${Math.ceil((maxPathEvents + 1) * 3 / 4)}u));
|
|
835
|
+
for (var step = 0; step < zh; step++) {
|
|
836
|
+
if (!jg | ((event != 0) & !path.abort)) {
|
|
837
|
+
intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
|
|
838
|
+
getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
882
839
|
}
|
|
883
840
|
if (event == 0) {
|
|
884
|
-
if (!
|
|
841
|
+
if (!jg) {
|
|
885
842
|
${primaryGuides}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
if (
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
si.wavelength =
|
|
901
|
-
|
|
843
|
+
primarySi = si; primaryMa = ma; jg = true;
|
|
844
|
+
eG = si.hit & (ma.transmissionWeight > 0.001) & (ma.transmissionDispersionScale > 0.001);
|
|
845
|
+
aE = sample1D(CAMERA_WAVELENGTH);
|
|
846
|
+
if (bj) {
|
|
847
|
+
eQ = min(i32(floor(aE * 3.0)), 2);
|
|
848
|
+
aE = fract(aE * 3.0);
|
|
849
|
+
}
|
|
850
|
+
wavelengthRngState = s0; eH = hashedCounter;
|
|
851
|
+
}
|
|
852
|
+
si = primarySi; ma = primaryMa; wavelengthAux = *outAux;
|
|
853
|
+
if (!bj) {
|
|
854
|
+
s0 = wavelengthRngState; hashedCounter = eH; samplingBounce = 0u;
|
|
855
|
+
wavelengthAux.isBlank = false; wavelengthAux.isShadowCatcher = false;
|
|
856
|
+
}
|
|
857
|
+
si.wavelength = 0.0; si.spectralChannel = 0;
|
|
858
|
+
if (!bj | eG) {
|
|
859
|
+
let channel = select(jR, eQ, bj);
|
|
860
|
+
si.spectralChannel = channel + 1;
|
|
861
|
+
si.wavelength = ce(u32(channel), aE);
|
|
862
|
+
${sharePrefix ? /* wgsl */ ` wY(channel + 1, si.wavelength, gf(ma));
|
|
863
|
+
if (spActive) { si.spectralChannel = 0; }
|
|
864
|
+
` : ''} ma.specularIor = sampling_cauchy_ior(si.wavelength, ma.specularIor,
|
|
902
865
|
ma.transmissionDispersionScale, ma.dispersionAbbeNumber);
|
|
903
866
|
}
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
depth = 0;
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
867
|
+
path = Path(); path.ray = ray; path.beta = vec3f(1.0); path.fromEye = true;
|
|
868
|
+
path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
|
|
869
|
+
depth = 0; sampleIgnored = false;
|
|
870
|
+
isNotTransparent = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
|
|
871
|
+
${sharePrefix ? /* wgsl */ ` if (spActive && jR > 0 && fC == 0) {
|
|
872
|
+
${prefixRestore('spFlat', flatPrefix)}
|
|
873
|
+
qA(&path, &si);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
if (event > 0 && !path.abort) {
|
|
877
|
+
if (spActive && ma.transmissionWeight > 0.001 && gf(ma)) {
|
|
878
|
+
${prefixSave('spFlat', flatPrefix)}
|
|
879
|
+
fC = 0; qA(&path, &si);
|
|
880
|
+
}
|
|
881
|
+
gN(&path, &depth, &si, &ma, sampleIgnored);
|
|
882
|
+
}` : /* wgsl */ ` } else if (!path.abort) {
|
|
883
|
+
gN(&path, &depth, &si, &ma, sampleIgnored);
|
|
884
|
+
}`}
|
|
885
|
+
if (isNotTransparent & (event > bounceLimit)) { path.abort = true; }
|
|
886
|
+
if (!path.abort & (event < fj)) {
|
|
887
|
+
mD(uv, &path, &depth, &si, &ma, &wavelengthAux, &sampleIgnored);
|
|
888
|
+
}
|
|
889
|
+
if (path.abort | (event >= fj)) {
|
|
890
|
+
let result = vec4f(path.li, path.alpha);
|
|
891
|
+
if (bj) {
|
|
892
|
+
*outAux = wavelengthAux;
|
|
893
|
+
let scale = select(1.0, 3.0, eG);
|
|
920
894
|
return vec4f(result.rgb * scale, result.a);
|
|
921
895
|
}
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
896
|
+
${sharePrefix ? /* wgsl */ ` if (spActive) {
|
|
897
|
+
(*outAux).isBlank = wavelengthAux.isBlank;
|
|
898
|
+
|
|
899
|
+
(*outAux).albedo = (wavelengthAux.albedo + wavelengthAux.albedo + wavelengthAux.albedo) / 3.0;
|
|
900
|
+
(*outAux).normal = (wavelengthAux.normal + wavelengthAux.normal + wavelengthAux.normal) / 3.0;
|
|
901
|
+
return result;
|
|
902
|
+
}
|
|
903
|
+
` : ''} color += result.rgb; alpha = max(alpha, result.a);
|
|
904
|
+
dD += wavelengthAux.albedo;
|
|
905
|
+
dE += wavelengthAux.normal;
|
|
906
|
+
ik = ik & wavelengthAux.isBlank;
|
|
907
|
+
jR++;
|
|
908
|
+
if (jR >= 3) {
|
|
909
|
+
(*outAux).albedo = dD / 3.0;
|
|
910
|
+
(*outAux).normal = dE / 3.0;
|
|
911
|
+
(*outAux).isBlank = ik;
|
|
931
912
|
return vec4f(color, alpha);
|
|
932
913
|
}
|
|
933
914
|
event = 0;
|
|
@@ -935,91 +916,97 @@ event = 0;
|
|
|
935
916
|
}
|
|
936
917
|
return vec4f(0.0);
|
|
937
918
|
}
|
|
938
|
-
` : /* wgsl */ `fn
|
|
919
|
+
` : /* wgsl */ `fn hq(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
939
920
|
${primaryVariables}
|
|
940
921
|
intersectScene(ray, &si, 0, false, false);
|
|
941
|
-
|
|
922
|
+
getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
942
923
|
${primaryGuides}
|
|
943
924
|
if (SPECTRAL) {
|
|
944
925
|
|
|
945
926
|
|
|
946
927
|
|
|
947
928
|
|
|
948
|
-
|
|
949
|
-
var vl = vec3f(0.0);
|
|
929
|
+
var xl = vec3f(0.0);
|
|
950
930
|
var alpha = 0.0;
|
|
951
|
-
var
|
|
952
|
-
var
|
|
953
|
-
var
|
|
931
|
+
var dD = vec3f(0.0);
|
|
932
|
+
var dE = vec3f(0.0);
|
|
933
|
+
var ik = true;
|
|
954
934
|
var si2 = si;
|
|
955
935
|
var ma2 = ma;
|
|
956
|
-
|
|
957
|
-
let
|
|
958
|
-
let
|
|
959
|
-
let
|
|
936
|
+
var aE = sample1D(CAMERA_WAVELENGTH);
|
|
937
|
+
let wavelengthRngState = s0;
|
|
938
|
+
let eH = hashedCounter;
|
|
939
|
+
let bj = rtUniform.dispersionWavelengths == 1;
|
|
940
|
+
let eG = si.hit &&
|
|
960
941
|
ma.transmissionWeight > 0.001 &&
|
|
961
942
|
ma.transmissionDispersionScale > 0.001;
|
|
962
|
-
let
|
|
963
|
-
var
|
|
964
|
-
if (
|
|
943
|
+
let uR = select(3, 1, bj);
|
|
944
|
+
var eQ = 0;
|
|
945
|
+
if (bj) {
|
|
965
946
|
|
|
966
947
|
|
|
967
|
-
|
|
948
|
+
eQ = min(i32(floor(aE * 3.0)), 2);
|
|
949
|
+
aE = fract(aE * 3.0);
|
|
968
950
|
}
|
|
969
|
-
for (var i = 0; i <
|
|
951
|
+
for (var i = 0; i < uR; i++) {
|
|
970
952
|
|
|
971
953
|
|
|
972
954
|
|
|
973
|
-
if (!
|
|
974
|
-
s0 =
|
|
975
|
-
|
|
976
|
-
|
|
955
|
+
if (!bj) {
|
|
956
|
+
s0 = wavelengthRngState;
|
|
957
|
+
hashedCounter = eH;
|
|
958
|
+
samplingBounce = 0u;
|
|
977
959
|
}
|
|
978
960
|
si.wavelength = 0.0;
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
961
|
+
si.spectralChannel = 0;
|
|
962
|
+
if (!bj || eG) {
|
|
963
|
+
let channel = select(i, eQ, bj);
|
|
964
|
+
si.spectralChannel = channel + 1;
|
|
965
|
+
si.wavelength = ce(u32(channel), aE);
|
|
966
|
+
${sharePrefix ? /* wgsl */ ` wY(channel + 1, si.wavelength, gf(ma));
|
|
967
|
+
if (spActive) { si.spectralChannel = 0; }
|
|
968
|
+
` : ''} ma.specularIor = sampling_cauchy_ior(
|
|
982
969
|
si.wavelength,
|
|
983
970
|
ma.specularIor,
|
|
984
971
|
ma.transmissionDispersionScale,
|
|
985
972
|
ma.dispersionAbbeNumber
|
|
986
973
|
);
|
|
987
974
|
}
|
|
988
|
-
var
|
|
989
|
-
if (
|
|
990
|
-
|
|
975
|
+
var wavelengthAux: RayTraceAuxiliary;
|
|
976
|
+
if (bj) {
|
|
977
|
+
wavelengthAux = *outAux;
|
|
991
978
|
} else {
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
}
|
|
997
|
-
let res =
|
|
998
|
-
if (
|
|
999
|
-
*outAux =
|
|
1000
|
-
let scale = select(1.0, 3.0,
|
|
979
|
+
wavelengthAux.albedo = (*outAux).albedo;
|
|
980
|
+
wavelengthAux.normal = (*outAux).normal;
|
|
981
|
+
wavelengthAux.isBlank = false;
|
|
982
|
+
wavelengthAux.isShadowCatcher = false;
|
|
983
|
+
}
|
|
984
|
+
let res = jb(uv, &si, ray, &ma, &wavelengthAux);
|
|
985
|
+
if (bj) {
|
|
986
|
+
*outAux = wavelengthAux;
|
|
987
|
+
let scale = select(1.0, 3.0, eG);
|
|
1001
988
|
return vec4f(res.rgb * scale, res.a);
|
|
1002
989
|
}
|
|
1003
|
-
|
|
990
|
+
xl += res.rgb;
|
|
1004
991
|
alpha = max(alpha, res.a);
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
992
|
+
dD += wavelengthAux.albedo;
|
|
993
|
+
dE += wavelengthAux.normal;
|
|
994
|
+
ik = ik && wavelengthAux.isBlank;
|
|
1008
995
|
si = si2;
|
|
1009
996
|
ma = ma2;
|
|
1010
997
|
}
|
|
1011
|
-
(*outAux).albedo =
|
|
1012
|
-
(*outAux).normal =
|
|
1013
|
-
(*outAux).isBlank =
|
|
1014
|
-
return vec4f(
|
|
998
|
+
(*outAux).albedo = dD / 3.0;
|
|
999
|
+
(*outAux).normal = dE / 3.0;
|
|
1000
|
+
(*outAux).isBlank = ik;
|
|
1001
|
+
return vec4f(xl, alpha);
|
|
1015
1002
|
}
|
|
1016
1003
|
else {
|
|
1017
|
-
return
|
|
1004
|
+
return jb(uv, &si, ray, &ma, outAux);
|
|
1018
1005
|
}
|
|
1019
1006
|
}
|
|
1020
1007
|
`}
|
|
1021
1008
|
|
|
1022
|
-
fn
|
|
1009
|
+
fn kX(ip: vec2f) -> vec2f {
|
|
1023
1010
|
let p = 2.0 * ip - 1.0;
|
|
1024
1011
|
let greater = abs(p.x) > abs(p.y);
|
|
1025
1012
|
let r = select(p.y, p.x, greater);
|
|
@@ -1028,7 +1015,7 @@ return r * vec2f(cos(theta), sin(theta));
|
|
|
1028
1015
|
}
|
|
1029
1016
|
|
|
1030
1017
|
|
|
1031
|
-
@compute @workgroup_size(${
|
|
1018
|
+
@compute @workgroup_size(${workgroupSize}, ${workgroupSize}, 1)
|
|
1032
1019
|
fn main(@builtin(global_invocation_id) globalId: vec3u) {
|
|
1033
1020
|
let outputSize = rtUniform.outputSize;
|
|
1034
1021
|
let scaleOffset = rtUniform.scaleOffset;
|
|
@@ -1058,24 +1045,24 @@ return;
|
|
|
1058
1045
|
|
|
1059
1046
|
let uv = (vec2<f32>(f32(coord.x), f32(coord.y)) + vec2f(0.5)) / outputSize;
|
|
1060
1047
|
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1048
|
+
aJ = coord;
|
|
1049
|
+
aC = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
|
|
1050
|
+
samplingBounce = 0u; hashedCounter = 0u;
|
|
1064
1051
|
if (${inputHooks?.uniformJitter ? 'false' : 'SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1'}) {
|
|
1065
|
-
jitter = (
|
|
1052
|
+
jitter = (sample2D(CAMERA_PIXEL) - 0.5) / outputSize;
|
|
1066
1053
|
}
|
|
1067
|
-
|
|
1068
|
-
var cam =
|
|
1054
|
+
fA(coord, i32(aC ^ cD(rtUniform.sequenceSeed)));
|
|
1055
|
+
var cam = cV(uv + jitter);
|
|
1069
1056
|
|
|
1070
1057
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
1071
1058
|
|
|
1072
1059
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
1073
1060
|
let forward = -normalize(cameraUniform.viewInv[2].xyz);
|
|
1074
|
-
let
|
|
1075
|
-
let
|
|
1076
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
1077
|
-
let dir = normalize(
|
|
1078
|
-
|
|
1061
|
+
let jY = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, forward));
|
|
1062
|
+
let uh = cameraUniform.apertureRadius * kX(sample2D(CAMERA_LENS));
|
|
1063
|
+
let origin = (cameraUniform.viewInv * vec4f(uh, 0.0, 1.0)).xyz;
|
|
1064
|
+
let dir = normalize(jY - origin);
|
|
1065
|
+
initRay(&cam, origin, dir);
|
|
1079
1066
|
}
|
|
1080
1067
|
|
|
1081
1068
|
var outAux: RayTraceAuxiliary;
|
|
@@ -1083,39 +1070,40 @@ outAux.albedo = vec3f(0.0);
|
|
|
1083
1070
|
outAux.normal = vec3f(0.0);
|
|
1084
1071
|
outAux.isBlank = false;
|
|
1085
1072
|
outAux.isShadowCatcher = false;
|
|
1086
|
-
${pathDiagnostic ? ' mtPathBegin(coord);\n' : ''}${inputHooks?.begin ?? ''} var
|
|
1073
|
+
${pathDiagnostic ? ' mtPathBegin(coord);\n' : ''}${inputHooks?.begin ?? ''} var liAndAlpha = hq(uv + jitter, cam, &outAux);
|
|
1087
1074
|
${inputHooks?.unclampedColor ?? ''}
|
|
1088
|
-
|
|
1075
|
+
${(enabled || lightTracing || photonMapping) && debugGroup >= 0 ? /* wgsl */ ` liAndAlpha=${debugGroup >= 50 ? `vec4f(photonQueryStats,1.0)` : debugGroup >= 30 ? `vec4f(causticHot[${debugGroup - 30}],1.0)` : research?.debugOutput ?? 'liAndAlpha'};
|
|
1076
|
+
` : ''}
|
|
1089
1077
|
|
|
1090
1078
|
if (rtUniform.clamping > 0.0) {
|
|
1091
1079
|
let clamping = rtUniform.clamping;
|
|
1092
|
-
|
|
1080
|
+
liAndAlpha = vec4(clamp(liAndAlpha.rgb, -vec3f(clamping), vec3f(clamping)), liAndAlpha.a);
|
|
1093
1081
|
}
|
|
1094
|
-
if (!(
|
|
1095
|
-
|
|
1082
|
+
if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {
|
|
1083
|
+
liAndAlpha = vec4f(0.0, 0.0, 0.0, 1.0);
|
|
1096
1084
|
}
|
|
1097
1085
|
|
|
1098
1086
|
if (outAux.isShadowCatcher) {
|
|
1099
1087
|
|
|
1100
1088
|
|
|
1101
|
-
let
|
|
1102
|
-
let
|
|
1103
|
-
let
|
|
1089
|
+
let aW = fI(cam);
|
|
1090
|
+
let sn = select(0.0, 1.0, aW.a >= 0.01);
|
|
1091
|
+
let kg = vec4f(aW.rgb * aW.a, aW.a);
|
|
1104
1092
|
|
|
1105
1093
|
|
|
1106
1094
|
|
|
1107
|
-
outShadowCatcher[idx].mask += vec4f(1.0,
|
|
1095
|
+
outShadowCatcher[idx].mask += vec4f(1.0, aW.a, sn, 0.0);
|
|
1108
1096
|
outShadowCatcher[idx].moments += vec4f(0.0, 0.0, outAux.shadowCounts);
|
|
1109
|
-
outShadowCatcher[idx].background +=
|
|
1110
|
-
outColor[idx] +=
|
|
1111
|
-
outAlbedo[idx] += vec4f(outAux.albedo,
|
|
1112
|
-
|
|
1097
|
+
outShadowCatcher[idx].background += kg;
|
|
1098
|
+
outColor[idx] += kg;
|
|
1099
|
+
outAlbedo[idx] += vec4f(outAux.albedo, sn);
|
|
1100
|
+
ij(idx, aW.rgb, outAux.normal);
|
|
1113
1101
|
|
|
1114
1102
|
|
|
1115
1103
|
let counts = outAux.shadowCounts;
|
|
1116
1104
|
let visibility = 1.0 - select(0.0, counts.x / counts.y, counts.y > 0.0);
|
|
1117
|
-
|
|
1118
|
-
1.0, dot(
|
|
1105
|
+
ju(idx, visibility * select(
|
|
1106
|
+
1.0, dot(aW.rgb, luminance), aW.a >= 0.01
|
|
1119
1107
|
));
|
|
1120
1108
|
}
|
|
1121
1109
|
else {
|
|
@@ -1125,13 +1113,13 @@ if (HAS_SHADOW_CATCHER && outAux.isBlank && USE_BACKGROUND && !USE_BACKGROUND_MA
|
|
|
1125
1113
|
|
|
1126
1114
|
|
|
1127
1115
|
|
|
1128
|
-
outShadowCatcher[idx].background +=
|
|
1129
|
-
outShadowCatcher[idx].mask.g +=
|
|
1116
|
+
outShadowCatcher[idx].background += liAndAlpha;
|
|
1117
|
+
outShadowCatcher[idx].mask.g += liAndAlpha.a;
|
|
1130
1118
|
}
|
|
1131
|
-
outColor[idx] +=
|
|
1119
|
+
outColor[idx] += liAndAlpha;
|
|
1132
1120
|
outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
|
|
1133
|
-
|
|
1134
|
-
|
|
1121
|
+
ij(idx, liAndAlpha.rgb, outAux.normal);
|
|
1122
|
+
ju(idx, dot(liAndAlpha.rgb, luminance));
|
|
1135
1123
|
}
|
|
1136
1124
|
${pathDiagnostic ? ' mtPathEnd(outAux.normal, outAux.albedo);\n' : ''}${inputHooks?.end ?? ''}}
|
|
1137
1125
|
`;
|
|
@@ -1139,7 +1127,7 @@ ${pathDiagnostic ? ' mtPathEnd(outAux.normal, outAux.albedo);\n' : ''}${inputHo
|
|
|
1139
1127
|
// It has no effect on the beauty entry point or its bindings.
|
|
1140
1128
|
// Gate optional material layers on scene-level feature flags so drivers can
|
|
1141
1129
|
// skip the unused BSDF lobes.
|
|
1142
|
-
let specializedSource = source + depthQueryWGSL + reflectanceWGSL + aovTraceWGSL;
|
|
1130
|
+
let specializedSource = source + depthQueryWGSL + reflectanceWGSL + (options.displayAovStorage ? aovTraceDisplayWGSL : aovTraceWGSL);
|
|
1143
1131
|
const backgroundBits = {
|
|
1144
1132
|
USE_BACKGROUND: 1,
|
|
1145
1133
|
USE_BACKGROUND_MAP: 2,
|