@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,6 +1,28 @@
|
|
|
1
1
|
import { type RayTraceInputHooks } from './wgsl/rayTrace.compute.js';
|
|
2
2
|
export interface WGPUShaderFeatures {
|
|
3
|
+
/** Native wgpu binding arrays. Default false. */
|
|
4
|
+
independentTextures?: boolean;
|
|
5
|
+
/** Internal host budget. Default 20 preserves native shader generation. */
|
|
6
|
+
maxPathEvents?: number;
|
|
7
|
+
/** Web TLAS leaf boxes. Default false retains the native layout. */
|
|
8
|
+
perInstanceBounds?: boolean;
|
|
9
|
+
/** Full RGB reservoir targets for browser spectral paths. Default false. */
|
|
10
|
+
channelIndependentRis?: boolean;
|
|
11
|
+
/** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */
|
|
12
|
+
shareSpectralPrefix?: boolean;
|
|
13
|
+
/** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */
|
|
14
|
+
displayAovStorage?: boolean;
|
|
3
15
|
hasDisplacement: boolean;
|
|
16
|
+
/** Browser camera extension; false preserves the native uniform layout. */
|
|
17
|
+
cameraProjectionInverse?: boolean;
|
|
18
|
+
compactVertices?: boolean;
|
|
19
|
+
debugGroup?: number;
|
|
20
|
+
/** Invocation block edge; the native host matches dispatch to this value. Default 8. */
|
|
21
|
+
workgroupSize?: number;
|
|
22
|
+
lightTracing?: boolean;
|
|
23
|
+
photonMapping?: boolean;
|
|
24
|
+
photonMaxDepth?: number;
|
|
25
|
+
photonDirectSubset?: boolean;
|
|
4
26
|
hasAlpha: boolean;
|
|
5
27
|
hasSceneAlpha: boolean;
|
|
6
28
|
hasAnisotropyDirections: boolean;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { researchTransport } from './researchTransport.js';
|
|
1
2
|
import rayTraceCompute from './wgsl/rayTrace.compute.js';
|
|
2
3
|
import { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';
|
|
3
4
|
import { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';
|
|
@@ -20,7 +21,8 @@ export function wgpuShaderPreamble(constants, bake = false) {
|
|
|
20
21
|
return `\n${defineCode}\n${constantsCode}\n`;
|
|
21
22
|
}
|
|
22
23
|
export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
|
|
23
|
-
|
|
24
|
+
constants = researchTransport()?.constants(constants, features) ?? constants;
|
|
25
|
+
return (features.independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({
|
|
24
26
|
...features,
|
|
25
27
|
spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
|
|
26
28
|
sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"AAAA,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAkCrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAChH,MAAM,gBAAgB,GAAG;IACvB,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,EAAE,oBAAoB;IAC/E,yBAAyB,EAAE,GAAG,wBAAwB,EAAE,2BAA2B;IACnF,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB;CAC9D,CAAC;AACF,MAAM,UAAU,wBAAwB,CAAC,SAA2C;IAClF,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChI,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,SAA2C,EAAE,IAAI,GAAG,KAAK;IAC1F,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,MAAM,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;IAClI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,KAAK,UAAU,KAAK,aAAa,IAAI,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,SAA2C,EAAE,QAA4B,EAAE,IAAI,GAAG,KAAK,EAAE,kBAAkB,GAAG,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,UAA+B;IACxM,SAAS,GAAG,iBAAiB,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC;QAClI,GAAG,QAAQ;QACX,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACxH,oBAAoB,EAAE,IAAI,IAAI,SAAS,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;QACjI,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;KACzH,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n /** Native wgpu binding arrays. Default false. */\n independentTextures?: boolean;\n /** Internal host budget. Default 20 preserves native shader generation. */\n maxPathEvents?: number;\n /** Web TLAS leaf boxes. Default false retains the native layout. */\n perInstanceBounds?: boolean;\n /** Full RGB reservoir targets for browser spectral paths. Default false. */\n channelIndependentRis?: boolean;\n /** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */\n shareSpectralPrefix?: boolean;\n /** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */\n displayAovStorage?: boolean;\n hasDisplacement: boolean;\n /** Browser camera extension; false preserves the native uniform layout. */\n cameraProjectionInverse?: boolean;\n compactVertices?: boolean;\n debugGroup?: number;\n /** Invocation block edge; the native host matches dispatch to this value. Default 8. */\n workgroupSize?:number;\n lightTracing?: boolean;\n photonMapping?:boolean;\n photonMaxDepth?:number;\n photonDirectSubset?:boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n constants = researchTransport()?.constants(constants, features) ?? constants;\n return (features.independentTextures ? 'enable wgpu_binding_array;\\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const aovCompactStorage = "\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n";
|
|
2
|
+
export declare function compactAovReadShader(code: string, declaration: string, type: string): string;
|
|
3
|
+
/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
|
|
4
|
+
export declare function compactAovResolveCode(code: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Display-resolution reflectance/depth uses 24 B/px: float depth/hit count
|
|
2
|
+
// and two half-packed vec4 reflectances. The default layout stays 64 B/px.
|
|
3
|
+
export const aovCompactStorage = /* wgsl */ `
|
|
4
|
+
override AOV_COMPACT: bool = false;
|
|
5
|
+
fn rY(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}
|
|
6
|
+
fn yD(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}
|
|
7
|
+
`;
|
|
8
|
+
export function compactAovReadShader(code, declaration, type) {
|
|
9
|
+
return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;
|
|
10
|
+
fn yI(source: u32) -> ${type} {
|
|
11
|
+
if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),
|
|
12
|
+
vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),rY(vec2u(accumulation[o+2u],accumulation[o+3u])),rY(vec2u(accumulation[o+4u],accumulation[o+5u])));}
|
|
13
|
+
let o=source*16u;
|
|
14
|
+
return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),
|
|
15
|
+
bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),
|
|
16
|
+
bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),
|
|
17
|
+
bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));
|
|
18
|
+
}`).split(`let pixel=accumulation[source];`).join(`let pixel=yI(source);`).replace(`let pixel = accumulation[index];`, `let pixel = yI(index);`);
|
|
19
|
+
}
|
|
20
|
+
/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
|
|
21
|
+
export function compactAovResolveCode(code) {
|
|
22
|
+
return code.includes(`struct DisplayAovAccum`)
|
|
23
|
+
? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)
|
|
24
|
+
: compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=aovCompact.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aovCompact.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovCompact.wgsl.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;CAI3C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,WAAmB,EAAE,IAAY;IAClF,OAAO,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC1B,IAAI;yCACU,IAAI;;;SAGpC,IAAI;;;;EAIb,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,uBAA4B,CAAC,CAAC,OAAO,CAAC,kCAAkC,EAAE,wBAA6B,CAAC,CAAC;AAC3J,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC5C,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,gFAAgF,EAAE,iBAAiB,CAAC;QACjI,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,uFAAuF,EAAE,yBAAyB,CAAC,CAAC;AACrJ,CAAC","sourcesContent":["// Display-resolution reflectance/depth uses 24 B/px: float depth/hit count\n// and two half-packed vec4 reflectances. The default layout stays 64 B/px.\nexport const aovCompactStorage = /* wgsl */ `\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n`;\n\nexport function compactAovReadShader(code: string, declaration: string, type: string): string {\n return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;\nfn loadAov(source: u32) -> ${type} {\n if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),\n vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),aovUnpack(vec2u(accumulation[o+2u],accumulation[o+3u])),aovUnpack(vec2u(accumulation[o+4u],accumulation[o+5u])));}\n let o=source*16u;\n return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),\n bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),\n bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),\n bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));\n}`).split(`let pixel=accumulation[source];`).join(`let pixel=loadAov(source);`).replace(`let pixel = accumulation[index];`, `let pixel = loadAov(index);`);\n}\n\n/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */\nexport function compactAovResolveCode(code: string): string {\n return code.includes(`struct DisplayAovAccum`)\n ? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)\n : compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);\n}\n"]}
|
|
@@ -9,17 +9,17 @@ struct DisplayAovParams { sizeKind: vec4u, mapping: vec4f, flags: vec4u, }
|
|
|
9
9
|
@group(0) @binding(2) var image: texture_storage_2d<${format}, write>;
|
|
10
10
|
@group(0) @binding(3) var<uniform> params: DisplayAovParams;
|
|
11
11
|
|
|
12
|
-
fn
|
|
12
|
+
fn vj(input: u32) -> u32 {
|
|
13
13
|
var v = input;
|
|
14
14
|
v = (v ^ (v >> 16u)) * 0x7feb352du;
|
|
15
15
|
v = (v ^ (v >> 15u)) * 0x846ca68bu;
|
|
16
16
|
return v ^ (v >> 16u);
|
|
17
17
|
}
|
|
18
|
-
fn
|
|
18
|
+
fn vk(rgb: vec3f) -> vec3f {
|
|
19
19
|
return select(1.055 * pow(max(rgb, vec3f(0.0)), vec3f(1.0 / 2.4)) - 0.055,
|
|
20
20
|
12.92 * rgb, rgb <= vec3f(0.0031308));
|
|
21
21
|
}
|
|
22
|
-
fn
|
|
22
|
+
fn tZ(rgb: vec3f) -> vec3f {
|
|
23
23
|
return select(pow((rgb + 0.055) / 1.055, vec3f(2.4)), rgb / 12.92,
|
|
24
24
|
rgb <= vec3f(0.04045));
|
|
25
25
|
}
|
|
@@ -45,24 +45,24 @@ color = clamp(pixel.geometry.yzw * inv, vec3f(0.0), vec3f(1.0));
|
|
|
45
45
|
} else if (kind == 3u || kind == 4u) {
|
|
46
46
|
let r = select(pixel.diffuse, pixel.specular, kind == 4u);
|
|
47
47
|
alpha = r.w / f32(max(params.sizeKind.z, 1u));
|
|
48
|
-
color =
|
|
48
|
+
color = vk(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));
|
|
49
49
|
} else if (kind == 5u) {
|
|
50
50
|
let identity = center[index].identity;
|
|
51
51
|
alpha = select(1.0, 0.0, identity.x == 0xffffffffu);
|
|
52
|
-
let hash =
|
|
52
|
+
let hash = vj(identity[params.flags.x]);
|
|
53
53
|
color = 0.2 + 0.8 * vec3f(f32(hash & 255u), f32((hash >> 8u) & 255u),
|
|
54
54
|
f32((hash >> 16u) & 255u)) / 255.0;
|
|
55
55
|
} else {
|
|
56
56
|
let m = center[index].motion;
|
|
57
57
|
alpha = select(0.0, 1.0, m.w == 3.0);
|
|
58
|
-
let
|
|
58
|
+
let gT = length(m.xy);
|
|
59
59
|
var hue = 0.0;
|
|
60
|
-
if (
|
|
60
|
+
if (gT > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }
|
|
61
61
|
let p = abs(fract(vec3f(hue) + vec3f(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);
|
|
62
|
-
color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(
|
|
62
|
+
color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(gT / params.mapping.w, 0.0, 1.0);
|
|
63
63
|
}
|
|
64
64
|
if (alpha <= 0.0) { color = vec3f(0.0); }
|
|
65
|
-
if (params.flags.y != 0u) { color =
|
|
65
|
+
if (params.flags.y != 0u) { color = tZ(color); }
|
|
66
66
|
textureStore(image, vec2i(id.xy), vec4f(color, clamp(alpha, 0.0, 1.0)));
|
|
67
67
|
}
|
|
68
68
|
`;
|
|
@@ -4,95 +4,95 @@ import proposals from './aovReflectanceSamples.wgsl.js';
|
|
|
4
4
|
// evaluate diffuse and reflection together without traversing the full layered
|
|
5
5
|
// BSDF twice. Callers reject coat, fuzz, anisotropy, SSS and thin film first.
|
|
6
6
|
export default proposals + /* wgsl */ `
|
|
7
|
-
struct
|
|
7
|
+
struct oP {
|
|
8
8
|
diffuse: vec3f,
|
|
9
9
|
specular: vec3f,
|
|
10
10
|
}
|
|
11
|
-
fn
|
|
12
|
-
var result =
|
|
11
|
+
fn hO(prepared: OpenPbrPreparedBsdf, rV: bool, lp: bool) -> oP {
|
|
12
|
+
var result = oP();
|
|
13
13
|
let view = prepared.viewLocal;
|
|
14
14
|
if (view.z <= 1e-6) { return result; }
|
|
15
15
|
let material = prepared.material;
|
|
16
16
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
17
|
-
let
|
|
18
|
-
let
|
|
19
|
-
let
|
|
17
|
+
let mG = aD(view, alpha);
|
|
18
|
+
let jw = prepared.weights[OPENPBR_LOBE_DIFFUSE];
|
|
19
|
+
let fZ = prepared.weights[OPENPBR_LOBE_METAL];
|
|
20
20
|
let specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];
|
|
21
|
-
var
|
|
22
|
-
if (
|
|
23
|
-
|
|
21
|
+
var dY = 1.0;
|
|
22
|
+
if (lp && prepared.dielectricMsProbability > 0.0) {
|
|
23
|
+
dY = max(aZ(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
|
|
24
24
|
}
|
|
25
|
-
let
|
|
26
|
-
let
|
|
27
|
-
let
|
|
25
|
+
let cf = normalize(vec3f(alpha, 1.0) * view);
|
|
26
|
+
let rU = min(cf.z, 1.0);
|
|
27
|
+
let ku = 1.0 + rU;
|
|
28
28
|
let count = 256u * min(rtUniform.loopUnrollGuard, 4u) / 4u;
|
|
29
29
|
for (var i = 0u; i < count; i++) {
|
|
30
|
-
let
|
|
31
|
-
let u = vec2f((f32(
|
|
32
|
-
fract(f32(reverseBits(
|
|
33
|
-
let
|
|
30
|
+
let pair = i / 2u;
|
|
31
|
+
let u = vec2f((f32(pair) + 0.5) / f32(count / 2u),
|
|
32
|
+
fract(f32(reverseBits(pair)) * 2.3283064365386963e-10 + 0.37));
|
|
33
|
+
let proposal = ht[pair];
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
let
|
|
37
|
-
var light = vec3f(
|
|
38
|
-
if (
|
|
36
|
+
let hP = prepared.specularAlpha < 0.001 || count != 256u;
|
|
37
|
+
var light = vec3f(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));
|
|
38
|
+
if (hP) { light = aM(u); }
|
|
39
39
|
if ((i & 1u) != 0u) {
|
|
40
|
-
let
|
|
41
|
-
let
|
|
42
|
-
var half = normalize(vec3f(alpha, 1.0) * vec3f(
|
|
43
|
-
if (
|
|
40
|
+
let kM = (1.0 - u.y) * ku;
|
|
41
|
+
let dw = sqrt(max(0.0, (kM + (1.0 - rU)) * (u.y * ku)));
|
|
42
|
+
var half = normalize(vec3f(alpha, 1.0) * vec3f(cf.xy + dw * proposal.zw, kM));
|
|
43
|
+
if (hP) { half = aA(view, alpha, u); }
|
|
44
44
|
light = reflect(-view, half);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
if (light.z <= 0.0) { continue; }
|
|
48
48
|
let half = normalize(view + light);
|
|
49
|
-
let
|
|
50
|
-
let pdf = 0.5 * (light.z * INVPI +
|
|
49
|
+
let specularPdf = mG * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);
|
|
50
|
+
let pdf = 0.5 * (light.z * INVPI + specularPdf);
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
let
|
|
54
|
-
if (
|
|
55
|
-
let scale = abs(
|
|
56
|
-
if (
|
|
57
|
-
let compensation = prepared.diffuseSpecularEnergyCompensation *
|
|
58
|
-
prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(
|
|
59
|
-
var
|
|
60
|
-
result.diffuse +=
|
|
61
|
-
view,
|
|
53
|
+
let au = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
|
|
54
|
+
if (au.z <= 0.0) { continue; }
|
|
55
|
+
let scale = abs(au.z) / (pdf * f32(count));
|
|
56
|
+
if (rV && jw > 0.0) {
|
|
57
|
+
let compensation = prepared.diffuseSpecularEnergyCompensation * ar(
|
|
58
|
+
prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(au.z));
|
|
59
|
+
var unusedPdf = 0.0;
|
|
60
|
+
result.diffuse += jw * bB(material, prepared.diffuseColor,
|
|
61
|
+
view, au, compensation, &unusedPdf) * scale;
|
|
62
62
|
}
|
|
63
|
-
if (
|
|
64
|
-
let
|
|
65
|
-
let
|
|
66
|
-
var
|
|
63
|
+
if (lp) {
|
|
64
|
+
let evaluatedHalf = normalize(view + au);
|
|
65
|
+
let viewHalf = abs(dot(view, evaluatedHalf));
|
|
66
|
+
var fresnel = vec3f(0.0);
|
|
67
67
|
if (specularWeight > 0.0) {
|
|
68
|
-
var dielectric = vec3f(
|
|
69
|
-
if (material.thinWalled) { dielectric =
|
|
70
|
-
|
|
68
|
+
var dielectric = vec3f(ae(viewHalf, material.relativeIor));
|
|
69
|
+
if (material.thinWalled) { dielectric = aq(dielectric, material.transmissionWeight); }
|
|
70
|
+
fresnel += specularWeight * material.specularColor * dielectric;
|
|
71
71
|
}
|
|
72
|
-
if (
|
|
73
|
-
|
|
72
|
+
if (fZ > 0.0) {
|
|
73
|
+
fresnel += fZ * material.specularWeight * openpbr_metal_fresnel(viewHalf,
|
|
74
74
|
material.baseWeight * material.baseColor, material.specularColor);
|
|
75
75
|
}
|
|
76
|
-
let
|
|
77
|
-
*
|
|
78
|
-
var reflection =
|
|
79
|
-
if (
|
|
80
|
-
let
|
|
81
|
-
reflection +=
|
|
76
|
+
let sT = sampling_ggx_ndf(evaluatedHalf, alpha) * mG
|
|
77
|
+
* aD(au, alpha) / (4.0 * max(au.z * view.z, 1e-8));
|
|
78
|
+
var reflection = fresnel * sT;
|
|
79
|
+
if (fZ > 0.0 && prepared.metalMsFactor > 0.0) {
|
|
80
|
+
let cA = min(prepared.metalMsFactor * aR(prepared.specularAlpha, au.z), 1.0 / max(au.z, 1e-8));
|
|
81
|
+
reflection += fZ * prepared.metalMsScale * cA * INVPI;
|
|
82
82
|
}
|
|
83
83
|
if (prepared.dielectricMsProbability > 0.0) {
|
|
84
|
-
let
|
|
85
|
-
prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(
|
|
86
|
-
let
|
|
87
|
-
reflection += prepared.dielectricMsReflectionScale *
|
|
84
|
+
let pX = prepared.dielectricMsViewLoss * aV(
|
|
85
|
+
prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) / dY;
|
|
86
|
+
let cA = min(pX * prepared.dielectricMsReflectionRatio, 1.0 / abs(au.z));
|
|
87
|
+
reflection += prepared.dielectricMsReflectionScale * cA * INVPI;
|
|
88
88
|
}
|
|
89
89
|
result.specular += reflection * scale;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
return result;
|
|
93
93
|
}
|
|
94
|
-
fn
|
|
95
|
-
return
|
|
94
|
+
fn yk(prepared: OpenPbrPreparedBsdf) -> oP {
|
|
95
|
+
return hO(prepared, true, true);
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
98
|
//# sourceMappingURL=aovReflectance.wgsl.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Generated by scripts/generate-aov-reflectance-samples.mjs; do not edit.
|
|
2
2
|
// xy: concentric cosine disk; zw: spherical-cap azimuth cosine/sine.
|
|
3
3
|
export default /* wgsl */ `
|
|
4
|
-
const
|
|
4
|
+
const ht: array<vec4f, 128> = array<vec4f, 128>(
|
|
5
5
|
vec4f(-0.971247852, -0.202764958, 0.999698818, 0.0245412290),
|
|
6
6
|
vec4f(-0.808660269, 0.547487736, 0.997290432, 0.0735645667),
|
|
7
7
|
vec4f(-0.942509234, 0.187289074, 0.992479563, 0.122410677),
|
|
@@ -3,3 +3,7 @@ export declare const aovResolveCommon = "\nstruct AovResolvedAccumulation { geom
|
|
|
3
3
|
/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */
|
|
4
4
|
declare const _default: string;
|
|
5
5
|
export default _default;
|
|
6
|
+
/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
|
|
7
|
+
export declare const aovBorrowDepthShader: string;
|
|
8
|
+
/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
|
|
9
|
+
export declare const aovBorrowReflectanceShader: string;
|
|
@@ -5,7 +5,7 @@ struct AovResolvedCenter { identity: vec4u, motion: vec4f, }
|
|
|
5
5
|
@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;
|
|
6
6
|
@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;
|
|
7
7
|
@group(0) @binding(3) var<uniform> parameters: vec4u;
|
|
8
|
-
fn
|
|
8
|
+
fn iU(source: u32, kind: u32) -> vec4u {
|
|
9
9
|
if(kind==5u){return center[source].identity;}
|
|
10
10
|
var value=vec4f(0.0);
|
|
11
11
|
if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}
|
|
@@ -32,7 +32,26 @@ let width=parameters.x;let height=parameters.y;
|
|
|
32
32
|
if(id.x>=width||id.y>=height){return;}
|
|
33
33
|
let index=id.x+id.y*width;
|
|
34
34
|
let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;
|
|
35
|
-
output[index]=
|
|
35
|
+
output[index]=iU(source,parameters.w&255u);
|
|
36
36
|
}
|
|
37
37
|
`;
|
|
38
|
+
/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
|
|
39
|
+
export const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `
|
|
40
|
+
@group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;
|
|
41
|
+
@compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
42
|
+
if(any(id.xy>=parameters.xy)){return;}
|
|
43
|
+
let source=id.x+(parameters.y-1u-id.y)*parameters.x;
|
|
44
|
+
let value=bitcast<vec4f>(iU(source,parameters.w));
|
|
45
|
+
textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));
|
|
46
|
+
}`;
|
|
47
|
+
/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
|
|
48
|
+
export const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `
|
|
49
|
+
@vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {
|
|
50
|
+
let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);
|
|
51
|
+
}
|
|
52
|
+
@fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
53
|
+
let id=vec2u(position.xy);
|
|
54
|
+
let source=id.x+(parameters.y-1u-id.y)*parameters.x;
|
|
55
|
+
return clamp(bitcast<vec4f>(iU(source,parameters.w)),vec4f(0),vec4f(1));
|
|
56
|
+
}`;
|
|
38
57
|
//# sourceMappingURL=aovResolve.wgsl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;EAOhE,CAAC;AACH,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;EAQtE,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n\n/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */\nexport const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;\n@compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {\n if(any(id.xy>=parameters.xy)){return;}\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n let value=bitcast<vec4f>(aovResolvedValue(source,parameters.w));\n textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));\n}`;\n/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */\nexport const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `\n@vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {\n let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);\n}\n@fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let id=vec2u(position.xy);\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n return clamp(bitcast<vec4f>(aovResolvedValue(source,parameters.w)),vec4f(0),vec4f(1));\n}`;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aovLaneKind } from '../aov.js';
|
|
2
2
|
import { aovResolveCommon } from './aovResolve.wgsl.js';
|
|
3
3
|
// Two input storage buffers leave six output slots on the baseline WebGPU
|
|
4
4
|
// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.
|
|
@@ -14,7 +14,7 @@ let width=parameters.x;let height=parameters.y;
|
|
|
14
14
|
if(id.x>=width||id.y>=height){return;}
|
|
15
15
|
let index=id.x+id.y*width;
|
|
16
16
|
let source=id.x+(height-1u-id.y)*width;
|
|
17
|
-
${kinds.map((kind, i) => `output${i}[index]=
|
|
17
|
+
${kinds.map((kind, i) => `output${i}[index]=iU(source,${aovLaneKind(kind)}u);`).join('\n ')}
|
|
18
18
|
}
|
|
19
19
|
`;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAe,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAEtD,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAEjF,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAuB;QAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IACrH,OAAO,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,sBAAsB,kBAAkB,CAAC,CAAC,CAAC,mCAAmC,CAAC,iBAAiB,CACjG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;;;;;;;EAOxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,qBAAmC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;CAE3G,CAAC;AACF,CAAC","sourcesContent":["import {aovLaneKind, type AovKind} from '../aov.js';\nimport {aovResolveCommon} from './aovResolve.wgsl.js';\n\n// Two input storage buffers leave six output slots on the baseline WebGPU\n// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.\nexport const AOV_SNAPSHOT_BATCH_SIZE = 6;\nexport const aovSnapshotBinding = (index: number) => index === 0 ? 2 : index + 3;\n\nexport function aovSnapshotShader(kinds: readonly AovKind[]): string {\n if (!kinds.length || kinds.length > AOV_SNAPSHOT_BATCH_SIZE) throw new RangeError('Invalid AOV snapshot batch size');\n return aovResolveCommon + kinds.map((_, i) =>\n `@group(0) @binding(${aovSnapshotBinding(i)}) var<storage,read_write> output${i}: array<vec4u>;`\n ).join('\\n') + /* wgsl */ `\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+(height-1u-id.y)*width;\n ${kinds.map((kind, i) => `output${i}[index]=aovResolvedValue(source,${aovLaneKind(kind)}u);`).join('\\n ')}\n}\n`;\n}\n"]}
|
|
@@ -15,20 +15,20 @@ struct AovCenter { identity: vec4u, motion: vec4f, }
|
|
|
15
15
|
@group(3) @binding(9) var<storage, read> aovPrevious: array<AovCenter>;
|
|
16
16
|
@group(3) @binding(8) var<uniform> aovParameters: vec4u;
|
|
17
17
|
|
|
18
|
-
fn
|
|
18
|
+
fn lC(offset: u32) -> mat4x4f {
|
|
19
19
|
return mat4x4f(bitcast<vec4f>(vec4u(aovScene[offset], aovScene[offset+1u], aovScene[offset+2u], aovScene[offset+3u])),
|
|
20
20
|
bitcast<vec4f>(vec4u(aovScene[offset+4u], aovScene[offset+5u], aovScene[offset+6u], aovScene[offset+7u])),
|
|
21
21
|
bitcast<vec4f>(vec4u(aovScene[offset+8u], aovScene[offset+9u], aovScene[offset+10u], aovScene[offset+11u])),
|
|
22
22
|
bitcast<vec4f>(vec4u(aovScene[offset+12u], aovScene[offset+13u], aovScene[offset+14u], aovScene[offset+15u])));
|
|
23
23
|
}
|
|
24
|
-
fn
|
|
25
|
-
fn
|
|
26
|
-
var ray =
|
|
24
|
+
fn iV(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
|
|
25
|
+
fn jS(zG: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
|
|
26
|
+
var ray = zG;
|
|
27
27
|
(*si).triangleIndex = -1;
|
|
28
28
|
for (var layer = 0; layer < 32; layer++) {
|
|
29
29
|
intersectScene(ray, si, 0, false, false);
|
|
30
30
|
if (!(*si).hit) { return false; }
|
|
31
|
-
|
|
31
|
+
getMaterial(material, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
|
|
32
32
|
if ((*material).materialType != SHADOW_CATCHER && (*material).alpha >= 0.5) { return true; }
|
|
33
33
|
ray.o = (*si).position + ray.d * (EPS * 0.02);
|
|
34
34
|
}
|
|
@@ -41,21 +41,21 @@ if (any(id.xy >= size)) { return; }
|
|
|
41
41
|
let index = id.x + id.y * size.x;
|
|
42
42
|
let sample = aovParameters.z;
|
|
43
43
|
if (sample == 0u) { aovAccum[index] = AovAccumulation(); }
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let uv = (vec2f(id.xy) +
|
|
48
|
-
var ray =
|
|
44
|
+
aJ = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
|
|
45
|
+
samplingBounce = 0u; hashedCounter = 0u;
|
|
46
|
+
fA(id.xy, i32(aC ^ cD(rtUniform.sequenceSeed)));
|
|
47
|
+
let uv = (vec2f(id.xy) + sample2D(CAMERA_PIXEL)) / vec2f(size);
|
|
48
|
+
var ray = cV(uv);
|
|
49
49
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
50
50
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
51
51
|
let forward = -normalize(cameraUniform.viewInv[2].xyz);
|
|
52
|
-
let
|
|
53
|
-
let
|
|
54
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
55
|
-
|
|
52
|
+
let jY = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
|
|
53
|
+
let wJ = cameraUniform.apertureRadius * kX(sample2D(CAMERA_LENS));
|
|
54
|
+
let origin = (cameraUniform.viewInv * vec4f(wJ, 0.0, 1.0)).xyz;
|
|
55
|
+
initRay(&ray, origin, normalize(jY-origin));
|
|
56
56
|
}
|
|
57
57
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
58
|
-
if (!
|
|
58
|
+
if (!jS(ray, &si, &material)) { return; }
|
|
59
59
|
let depth = max(dot(si.position-cameraUniform.viewInv[3].xyz, -normalize(cameraUniform.viewInv[2].xyz)), 0.0);
|
|
60
60
|
let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
61
61
|
(material.coatWeight > 0.0) | (material.fuzzWeight > 0.0) |
|
|
@@ -66,17 +66,17 @@ let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
|
66
66
|
aovAccum[index].depthRoughness += vec4f(depth, material.specularRoughness, material.baseMetalness, select(0.0,1.0,unsupported));
|
|
67
67
|
if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {
|
|
68
68
|
var normal=si.normal; var face=si.faceNormal;
|
|
69
|
-
var cosine=-dot(normal,ray.d); var
|
|
69
|
+
var cosine=-dot(normal,ray.d); var fk=-dot(face,ray.d);
|
|
70
70
|
if (material.thinWalled && (material.transmissionWeight>0.0 || material.subsurfaceWeight>0.0)) {
|
|
71
71
|
if(cosine<0.0){normal=-normal;cosine=-cosine;}
|
|
72
|
-
if(
|
|
72
|
+
if(fk<0.0){face=-face;fk=-fk;}
|
|
73
73
|
}
|
|
74
|
-
if(
|
|
74
|
+
if(fk>=0.0 && cosine<0.0){normal=face;cosine=fk;}
|
|
75
75
|
normal=select(-normal,normal,cosine>=0.0);
|
|
76
76
|
material.inside=(cosine<=0.0) && !material.thinWalled;
|
|
77
77
|
material.relativeIor=select(material.specularIor,1.0/material.specularIor,cosine>0.0);
|
|
78
|
-
let prepared=
|
|
79
|
-
let reflectance=
|
|
78
|
+
let prepared=bX(si.tangent,material,-ray.d,normal);
|
|
79
|
+
let reflectance=hO(prepared, (aovParameters.w & 8u) != 0u, (aovParameters.w & 16u) != 0u);
|
|
80
80
|
aovAccum[index].diffuse+=vec4f(reflectance.diffuse,1.0);
|
|
81
81
|
aovAccum[index].specular+=vec4f(reflectance.specular,1.0);
|
|
82
82
|
}
|
|
@@ -89,26 +89,26 @@ if (any(id.xy >= size)) { return; }
|
|
|
89
89
|
let index = id.x + id.y * size.x;
|
|
90
90
|
aovCenter[index] = AovCenter(vec4u(0xffffffffu), vec4f(0.0));
|
|
91
91
|
let uv = (vec2f(id.xy) + 0.5) / vec2f(size);
|
|
92
|
-
let ray =
|
|
92
|
+
let ray = cV(uv);
|
|
93
93
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
94
|
-
if (!
|
|
94
|
+
if (!jS(ray, &si, &material)) { return; }
|
|
95
95
|
let offset = 52u + u32(si.instanceIndex) * 24u;
|
|
96
96
|
let materialOffset = aovScene[16u];
|
|
97
97
|
let primitiveOffset = aovScene[17u];
|
|
98
98
|
aovCenter[index].identity = vec4u(aovScene[offset], aovScene[offset+1u],
|
|
99
99
|
aovScene[materialOffset + u32(si.materialIndex)], aovScene[primitiveOffset + u32(si.triangleIndex)]);
|
|
100
|
-
aovCenter[index].motion.z = dot(si.position-
|
|
100
|
+
aovCenter[index].motion.z = dot(si.position-iV(36u),iV(40u));
|
|
101
101
|
if (aovScene[offset+2u] == 0u) { return; }
|
|
102
|
-
let
|
|
103
|
-
let
|
|
104
|
-
if (
|
|
105
|
-
let
|
|
106
|
-
let
|
|
107
|
-
if (any(
|
|
108
|
-
let previous=aovPrevious[u32(
|
|
109
|
-
let
|
|
110
|
-
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-
|
|
111
|
-
let motion=(
|
|
102
|
+
let rF = lC(offset+4u) * vec4f(si.position,1.0);
|
|
103
|
+
let qp = lC(0u) * rF;
|
|
104
|
+
if (qp.w <= 0.0) { return; }
|
|
105
|
+
let vJ=qp.xyz/qp.w;
|
|
106
|
+
let iF=(vJ.xy*0.5+0.5)*vec2f(size);
|
|
107
|
+
if (any(iF < vec2f(0.0)) || any(iF >= vec2f(size)) || abs(vJ.z)>1.0) { return; }
|
|
108
|
+
let previous=aovPrevious[u32(iF.x)+u32(iF.y)*size.x];
|
|
109
|
+
let rE=dot(rF.xyz-iV(44u),iV(48u));
|
|
110
|
+
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-rE)>max(1e-4,abs(rE)*1e-3)) { return; }
|
|
111
|
+
let motion=(iF-(vec2f(id.xy)+0.5))*vec2f(1.0,-1.0);
|
|
112
112
|
aovCenter[index].motion=vec4f(motion,aovCenter[index].motion.z,3.0);
|
|
113
113
|
}
|
|
114
114
|
`;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import original from './aovTrace.wgsl.js';
|
|
2
|
+
import { aovCompactStorage } from './aovCompact.wgsl.js';
|
|
3
|
+
// Web-only storage specialization. The default shader (also used by native)
|
|
4
|
+
// remains byte-identical; geometry/material evaluation comes from that source.
|
|
5
|
+
export default aovCompactStorage + '\noverride AOV_DISPLAY: bool = false;\n' + original
|
|
6
|
+
.replace(`var<storage, read_write> aovAccum: array<AovAccumulation>;`, `var<storage, read_write> aovAccum: array<u32>;`)
|
|
7
|
+
.replace(`fn lC(`, /* wgsl */ `fn zQ(index: u32) -> AovAccumulation {
|
|
8
|
+
if(AOV_COMPACT){
|
|
9
|
+
let o=index*6u;
|
|
10
|
+
return AovAccumulation(vec4f(bitcast<f32>(aovAccum[o]),0,0,0),vec4f(0,0,0,bitcast<f32>(aovAccum[o+1u])),
|
|
11
|
+
rY(vec2u(aovAccum[o+2u],aovAccum[o+3u])),rY(vec2u(aovAccum[o+4u],aovAccum[o+5u])));
|
|
12
|
+
}
|
|
13
|
+
let o=index*16u;
|
|
14
|
+
return AovAccumulation(bitcast<vec4f>(vec4u(aovAccum[o],aovAccum[o+1u],aovAccum[o+2u],aovAccum[o+3u])),
|
|
15
|
+
bitcast<vec4f>(vec4u(aovAccum[o+4u],aovAccum[o+5u],aovAccum[o+6u],aovAccum[o+7u])),
|
|
16
|
+
bitcast<vec4f>(vec4u(aovAccum[o+8u],aovAccum[o+9u],aovAccum[o+10u],aovAccum[o+11u])),
|
|
17
|
+
bitcast<vec4f>(vec4u(aovAccum[o+12u],aovAccum[o+13u],aovAccum[o+14u],aovAccum[o+15u])));
|
|
18
|
+
}
|
|
19
|
+
fn xg(index: u32,pixel: AovAccumulation){
|
|
20
|
+
if(AOV_COMPACT){
|
|
21
|
+
let o=index*6u;let d=yD(pixel.diffuse);let s=yD(pixel.specular);
|
|
22
|
+
aovAccum[o]=bitcast<u32>(pixel.depthRoughness.x);aovAccum[o+1u]=bitcast<u32>(pixel.position.w);
|
|
23
|
+
aovAccum[o+2u]=d.x;aovAccum[o+3u]=d.y;aovAccum[o+4u]=s.x;aovAccum[o+5u]=s.y;
|
|
24
|
+
}else{
|
|
25
|
+
let AJ=array<vec4f,4>(pixel.depthRoughness,pixel.position,pixel.diffuse,pixel.specular);
|
|
26
|
+
for(var nZ=0u;nZ<4u;nZ++){for(var channel=0u;channel<4u;channel++){aovAccum[index*16u+nZ*4u+channel]=bitcast<u32>(AJ[nZ][channel]);}}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
fn lC(`)
|
|
30
|
+
.replace(`if (sample == 0u) { aovAccum[index] = AovAccumulation(); }`, `var pixel=AovAccumulation(); if(sample>0u){pixel=zQ(index);}`)
|
|
31
|
+
.replace(`if (!jS(ray, &si, &material)) { return; }`, `if (!jS(ray, &si, &material)) { xg(index,pixel); return; }`)
|
|
32
|
+
.split(`aovAccum[index].`).join(`pixel.`)
|
|
33
|
+
.replace(`pixel.position += vec4f(si.position, 1.0);`, `pixel.position += vec4f(si.position, 1.0); xg(index,pixel);`)
|
|
34
|
+
.replace(`(material.transmissionDispersionScale > 0.0);`, `(material.transmissionDispersionScale > 0.0) | (AOV_DISPLAY && material.transmissionWeight > 0.0);`)
|
|
35
|
+
// Texture colors are resolved material inputs, not directional quadrature.
|
|
36
|
+
// Web requests them as diffuseColor/specularColor (mask bits 7-8); native
|
|
37
|
+
// display AOVs (AOV_DISPLAY) still request them through the albedo bits.
|
|
38
|
+
// Uniform layer factors cancel in detail ratios, so coat, fuzz, sheen-like
|
|
39
|
+
// and anisotropic surfaces stay valid; transmission and cutouts do not.
|
|
40
|
+
.replace(`if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`, /* wgsl */ `let tX = select((aovParameters.w >> 7u) & 3u, (aovParameters.w >> 3u) & 3u, AOV_DISPLAY);
|
|
41
|
+
if (tX != 0u) {
|
|
42
|
+
let zR = (material.materialType != STANDARD) | (material.alpha < 1.0) | (material.transmissionWeight > 0.0) |
|
|
43
|
+
(dot(material.mediumScattering, material.mediumScattering) > 0.0);
|
|
44
|
+
if (!zR) {
|
|
45
|
+
let metal = clamp(material.baseMetalness, 0.0, 1.0);
|
|
46
|
+
let base = material.baseWeight * material.baseColor;
|
|
47
|
+
let layer = mix(vec3f(1.0), material.coatColor, clamp(material.coatWeight, 0.0, 1.0));
|
|
48
|
+
let f = (material.specularIor - 1.0) / (material.specularIor + 1.0);
|
|
49
|
+
if ((tX & 1u) != 0u) { pixel.diffuse += vec4f(layer * base * (1.0 - metal), 1.0); }
|
|
50
|
+
if ((tX & 2u) != 0u) { pixel.specular += vec4f(layer * (metal * base + (1.0 - metal) * material.specularWeight * material.specularColor * f * f), 1.0); }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!AOV_DISPLAY && AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`)
|
|
54
|
+
.replace(`pixel.diffuse+=vec4f(reflectance.diffuse,1.0);`, `if ((aovParameters.w & 8u) != 0u) { pixel.diffuse+=vec4f(reflectance.diffuse,1.0); }`)
|
|
55
|
+
.replace(`pixel.specular+=vec4f(reflectance.specular,1.0);`, `if ((aovParameters.w & 16u) != 0u) { pixel.specular+=vec4f(reflectance.specular,1.0); }`);
|
|
56
|
+
//# sourceMappingURL=aovTraceDisplay.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aovTraceDisplay.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovTraceDisplay.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAEvD,4EAA4E;AAC5E,+EAA+E;AAC/E,eAAe,iBAAiB,GAAG,yCAAyC,GAAG,QAAQ;KACpF,OAAO,CAAC,4DAA4D,EAAE,gDAAgD,CAAC;KACvH,OAAO,CAAC,QAAe,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;OAsBzB,CAAC;KACZ,OAAO,CAAC,4DAA4D,EAAE,8DAAmE,CAAC;KAC1I,OAAO,CAAC,2CAAmD,EAAE,4DAA0E,CAAC;KACxI,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;KACxC,OAAO,CAAC,4CAA4C,EAAE,6DAAmE,CAAC;KAC1H,OAAO,CAAC,+CAA+C,EAAE,oGAAoG,CAAC;IAC/J,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;KACvE,OAAO,CAAC,yEAAyE,EAAE,UAAU,CAAC;;;;;;;;;;;;;wFAaP,CAAC;KACxF,OAAO,CAAC,gDAAgD,EAAE,sFAAsF,CAAC;KACjJ,OAAO,CAAC,kDAAkD,EAAE,yFAAyF,CAAC,CAAC","sourcesContent":["import original from './aovTrace.wgsl.js';\nimport {aovCompactStorage} from './aovCompact.wgsl.js';\n\n// Web-only storage specialization. The default shader (also used by native)\n// remains byte-identical; geometry/material evaluation comes from that source.\nexport default aovCompactStorage + '\\noverride AOV_DISPLAY: bool = false;\\n' + original\n .replace(`var<storage, read_write> aovAccum: array<AovAccumulation>;`, `var<storage, read_write> aovAccum: array<u32>;`)\n .replace(`fn aovMatrix(`, /* wgsl */ `fn aovLoad(index: u32) -> AovAccumulation {\n if(AOV_COMPACT){\n let o=index*6u;\n return AovAccumulation(vec4f(bitcast<f32>(aovAccum[o]),0,0,0),vec4f(0,0,0,bitcast<f32>(aovAccum[o+1u])),\n aovUnpack(vec2u(aovAccum[o+2u],aovAccum[o+3u])),aovUnpack(vec2u(aovAccum[o+4u],aovAccum[o+5u])));\n }\n let o=index*16u;\n return AovAccumulation(bitcast<vec4f>(vec4u(aovAccum[o],aovAccum[o+1u],aovAccum[o+2u],aovAccum[o+3u])),\n bitcast<vec4f>(vec4u(aovAccum[o+4u],aovAccum[o+5u],aovAccum[o+6u],aovAccum[o+7u])),\n bitcast<vec4f>(vec4u(aovAccum[o+8u],aovAccum[o+9u],aovAccum[o+10u],aovAccum[o+11u])),\n bitcast<vec4f>(vec4u(aovAccum[o+12u],aovAccum[o+13u],aovAccum[o+14u],aovAccum[o+15u])));\n}\nfn aovStore(index: u32,pixel: AovAccumulation){\n if(AOV_COMPACT){\n let o=index*6u;let d=aovPack(pixel.diffuse);let s=aovPack(pixel.specular);\n aovAccum[o]=bitcast<u32>(pixel.depthRoughness.x);aovAccum[o+1u]=bitcast<u32>(pixel.position.w);\n aovAccum[o+2u]=d.x;aovAccum[o+3u]=d.y;aovAccum[o+4u]=s.x;aovAccum[o+5u]=s.y;\n }else{\n let lanes=array<vec4f,4>(pixel.depthRoughness,pixel.position,pixel.diffuse,pixel.specular);\n for(var lane=0u;lane<4u;lane++){for(var channel=0u;channel<4u;channel++){aovAccum[index*16u+lane*4u+channel]=bitcast<u32>(lanes[lane][channel]);}}\n }\n}\nfn aovMatrix(`)\n .replace(`if (sample == 0u) { aovAccum[index] = AovAccumulation(); }`, `var pixel=AovAccumulation(); if(sample>0u){pixel=aovLoad(index);}`)\n .replace(`if (!aovSurface(ray, &si, &material)) { return; }`, `if (!aovSurface(ray, &si, &material)) { aovStore(index,pixel); return; }`)\n .split(`aovAccum[index].`).join(`pixel.`)\n .replace(`pixel.position += vec4f(si.position, 1.0);`, `pixel.position += vec4f(si.position, 1.0); aovStore(index,pixel);`)\n .replace(`(material.transmissionDispersionScale > 0.0);`, `(material.transmissionDispersionScale > 0.0) | (AOV_DISPLAY && material.transmissionWeight > 0.0);`)\n // Texture colors are resolved material inputs, not directional quadrature.\n // Web requests them as diffuseColor/specularColor (mask bits 7-8); native\n // display AOVs (AOV_DISPLAY) still request them through the albedo bits.\n // Uniform layer factors cancel in detail ratios, so coat, fuzz, sheen-like\n // and anisotropic surfaces stay valid; transmission and cutouts do not.\n .replace(`if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`, /* wgsl */ `let colorMask = select((aovParameters.w >> 7u) & 3u, (aovParameters.w >> 3u) & 3u, AOV_DISPLAY);\n if (colorMask != 0u) {\n let blocked = (material.materialType != STANDARD) | (material.alpha < 1.0) | (material.transmissionWeight > 0.0) |\n (dot(material.mediumScattering, material.mediumScattering) > 0.0);\n if (!blocked) {\n let metal = clamp(material.baseMetalness, 0.0, 1.0);\n let base = material.baseWeight * material.baseColor;\n let layer = mix(vec3f(1.0), material.coatColor, clamp(material.coatWeight, 0.0, 1.0));\n let f = (material.specularIor - 1.0) / (material.specularIor + 1.0);\n if ((colorMask & 1u) != 0u) { pixel.diffuse += vec4f(layer * base * (1.0 - metal), 1.0); }\n if ((colorMask & 2u) != 0u) { pixel.specular += vec4f(layer * (metal * base + (1.0 - metal) * material.specularWeight * material.specularColor * f * f), 1.0); }\n }\n }\n if (!AOV_DISPLAY && AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`)\n .replace(`pixel.diffuse+=vec4f(reflectance.diffuse,1.0);`, `if ((aovParameters.w & 8u) != 0u) { pixel.diffuse+=vec4f(reflectance.diffuse,1.0); }`)\n .replace(`pixel.specular+=vec4f(reflectance.specular,1.0);`, `if ((aovParameters.w & 16u) != 0u) { pixel.specular+=vec4f(reflectance.specular,1.0); }`);\n"]}
|