@driftengine/core 3.63.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +122 -0
- package/NOTICE +20 -0
- package/README.md +1 -1
- package/dist/core/loop.js +18 -2
- package/dist/core/storage.js +5 -0
- package/dist/geometry/meshBuilder.d.ts +1 -1
- package/dist/geometry/meshBuilder.js +6 -2
- package/dist/index.d.ts +69 -4
- package/dist/index.js +112 -2
- package/dist/input/input.js +6 -1
- package/dist/math/exact.d.ts +13 -3
- package/dist/math/exact.js +68 -3
- package/dist/math/frustum.d.ts +17 -2
- package/dist/math/frustum.js +24 -0
- package/dist/render/backend/api.d.ts +34 -1
- package/dist/render/backend/api.js +22 -1
- package/dist/render/backend/budget.d.ts +7 -6
- package/dist/render/backend/budget.js +7 -6
- package/dist/render/backend/createRenderer.d.ts +57 -0
- package/dist/render/backend/createRenderer.js +51 -2
- package/dist/render/backend/materialChanges.d.ts +41 -0
- package/dist/render/backend/materialChanges.js +38 -0
- package/dist/render/backend/select.js +8 -0
- package/dist/render/backend/webgl2/renderer.d.ts +80 -1
- package/dist/render/backend/webgl2/renderer.js +208 -10
- package/dist/render/backend/webgpu/buffers.d.ts +20 -1
- package/dist/render/backend/webgpu/buffers.js +116 -58
- package/dist/render/backend/webgpu/fieldCompose.d.ts +156 -0
- package/dist/render/backend/webgpu/fieldCompose.js +396 -0
- package/dist/render/backend/webgpu/giFieldPass.d.ts +66 -0
- package/dist/render/backend/webgpu/giFieldPass.js +137 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +728 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.js +2473 -0
- package/dist/render/backend/webgpu/linePass.d.ts +4 -14
- package/dist/render/backend/webgpu/linePass.js +4 -33
- package/dist/render/backend/webgpu/probeBake.d.ts +148 -0
- package/dist/render/backend/webgpu/probeBake.js +493 -0
- package/dist/render/backend/webgpu/renderer.d.ts +379 -24
- package/dist/render/backend/webgpu/renderer.js +1369 -76
- package/dist/render/backend/webgpu/scatterPass.js +15 -1
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +19 -9
- package/dist/render/backend/webgpu/surfaceTexturePass.js +58 -32
- package/dist/render/causticsRenderer.d.ts +3 -1
- package/dist/render/causticsRenderer.js +4 -1
- package/dist/render/depthConvention.d.ts +12 -0
- package/dist/render/depthConvention.js +14 -0
- package/dist/render/deviceFeatures.d.ts +32 -0
- package/dist/render/deviceFeatures.js +41 -0
- package/dist/render/fog.d.ts +79 -0
- package/dist/render/fog.js +138 -0
- package/dist/render/frame/alias.d.ts +30 -0
- package/dist/render/frame/alias.js +61 -0
- package/dist/render/frame/deps.d.ts +37 -0
- package/dist/render/frame/deps.js +122 -0
- package/dist/render/frame/flushGraph.d.ts +43 -0
- package/dist/render/frame/flushGraph.js +84 -0
- package/dist/render/frame/graphSchedule.d.ts +49 -0
- package/dist/render/frame/graphSchedule.js +120 -0
- package/dist/render/frame/index.d.ts +15 -0
- package/dist/render/frame/index.js +8 -0
- package/dist/render/frame/lifetime.d.ts +24 -0
- package/dist/render/frame/lifetime.js +36 -0
- package/dist/render/frame/passTimings.d.ts +42 -0
- package/dist/render/frame/passTimings.js +38 -0
- package/dist/render/frame/validate.d.ts +15 -0
- package/dist/render/frame/validate.js +22 -0
- package/dist/render/frame/virtual.d.ts +44 -0
- package/dist/render/frame/virtual.js +61 -0
- package/dist/render/gi/chain.d.ts +82 -0
- package/dist/render/gi/chain.js +135 -0
- package/dist/render/gi/denoise.d.ts +114 -0
- package/dist/render/gi/denoise.js +169 -0
- package/dist/render/gi/fieldScene.d.ts +125 -0
- package/dist/render/gi/fieldScene.js +219 -0
- package/dist/render/gi/globalField.d.ts +157 -0
- package/dist/render/gi/globalField.js +373 -0
- package/dist/render/gi/probeGridFit.d.ts +24 -0
- package/dist/render/gi/probeGridFit.js +71 -0
- package/dist/render/gi/probeTrace.d.ts +82 -0
- package/dist/render/gi/probeTrace.js +128 -0
- package/dist/render/gi/probeVolume.d.ts +136 -0
- package/dist/render/gi/probeVolume.js +191 -0
- package/dist/render/gi/reflection.d.ts +73 -0
- package/dist/render/gi/reflection.js +109 -0
- package/dist/render/gi/traceField.d.ts +91 -0
- package/dist/render/gi/traceField.js +129 -0
- package/dist/render/gi/traceScreen.d.ts +68 -0
- package/dist/render/gi/traceScreen.js +82 -0
- package/dist/render/gpuScene.d.ts +38 -0
- package/dist/render/gpuScene.js +41 -0
- package/dist/render/gpudriven/alphaTest.d.ts +28 -0
- package/dist/render/gpudriven/alphaTest.js +32 -0
- package/dist/render/gpudriven/clusterUpload.d.ts +59 -0
- package/dist/render/gpudriven/clusterUpload.js +75 -0
- package/dist/render/gpudriven/clusterWorld.d.ts +57 -0
- package/dist/render/gpudriven/clusterWorld.js +155 -0
- package/dist/render/gpudriven/compact.d.ts +51 -0
- package/dist/render/gpudriven/compact.js +68 -0
- package/dist/render/gpudriven/cullClusters.d.ts +129 -0
- package/dist/render/gpudriven/cullClusters.js +237 -0
- package/dist/render/gpudriven/decodeTables.d.ts +64 -0
- package/dist/render/gpudriven/decodeTables.js +219 -0
- package/dist/render/gpudriven/frustum.d.ts +25 -0
- package/dist/render/gpudriven/frustum.js +59 -0
- package/dist/render/gpudriven/geometryHarness.d.ts +15 -0
- package/dist/render/gpudriven/geometryHarness.js +31 -0
- package/dist/render/gpudriven/hzb.d.ts +60 -0
- package/dist/render/gpudriven/hzb.js +97 -0
- package/dist/render/gpudriven/ibl.d.ts +85 -0
- package/dist/render/gpudriven/ibl.js +129 -0
- package/dist/render/gpudriven/indirect.d.ts +67 -0
- package/dist/render/gpudriven/indirect.js +77 -0
- package/dist/render/gpudriven/instances.d.ts +43 -0
- package/dist/render/gpudriven/instances.js +172 -0
- package/dist/render/gpudriven/lit.d.ts +165 -0
- package/dist/render/gpudriven/lit.js +165 -0
- package/dist/render/gpudriven/lodCut.d.ts +28 -0
- package/dist/render/gpudriven/lodCut.js +38 -0
- package/dist/render/gpudriven/materialBin.d.ts +60 -0
- package/dist/render/gpudriven/materialBin.js +108 -0
- package/dist/render/gpudriven/materialTable.d.ts +88 -0
- package/dist/render/gpudriven/materialTable.js +115 -0
- package/dist/render/gpudriven/pipeline.d.ts +135 -0
- package/dist/render/gpudriven/pipeline.js +237 -0
- package/dist/render/gpudriven/rangeAlloc.d.ts +50 -0
- package/dist/render/gpudriven/rangeAlloc.js +112 -0
- package/dist/render/gpudriven/sceneUpload.d.ts +96 -0
- package/dist/render/gpudriven/sceneUpload.js +115 -0
- package/dist/render/gpudriven/shadeBins.d.ts +92 -0
- package/dist/render/gpudriven/shadeBins.js +182 -0
- package/dist/render/gpudriven/shadow.d.ts +136 -0
- package/dist/render/gpudriven/shadow.js +224 -0
- package/dist/render/gpudriven/shadowCamera.d.ts +87 -0
- package/dist/render/gpudriven/shadowCamera.js +345 -0
- package/dist/render/gpudriven/streamScene.d.ts +194 -0
- package/dist/render/gpudriven/streamScene.js +459 -0
- package/dist/render/gpudriven/surfaceFrame.d.ts +25 -0
- package/dist/render/gpudriven/surfaceFrame.js +51 -0
- package/dist/render/gpudriven/twoPhase.d.ts +122 -0
- package/dist/render/gpudriven/twoPhase.js +160 -0
- package/dist/render/gpudriven/visbuffer.d.ts +25 -0
- package/dist/render/gpudriven/visbuffer.js +37 -0
- package/dist/render/halfFloat.d.ts +10 -0
- package/dist/render/halfFloat.js +23 -4
- package/dist/render/inference/attentionTiled.d.ts +27 -0
- package/dist/render/inference/attentionTiled.js +117 -0
- package/dist/render/inference/denseKernels.d.ts +29 -0
- package/dist/render/inference/denseKernels.js +312 -0
- package/dist/render/inference/device.d.ts +21 -0
- package/dist/render/inference/device.js +32 -0
- package/dist/render/inference/deviceGraph.d.ts +34 -0
- package/dist/render/inference/deviceGraph.js +17 -0
- package/dist/render/inference/fuse.d.ts +15 -0
- package/dist/render/inference/fuse.js +37 -0
- package/dist/render/inference/kernelKit.d.ts +52 -0
- package/dist/render/inference/kernelKit.js +70 -0
- package/dist/render/inference/kernels.d.ts +3 -0
- package/dist/render/inference/kernels.js +11 -0
- package/dist/render/inference/plan.d.ts +13 -0
- package/dist/render/inference/plan.js +18 -0
- package/dist/render/inference/reuse.d.ts +39 -0
- package/dist/render/inference/reuse.js +65 -0
- package/dist/render/inference/runner.d.ts +31 -0
- package/dist/render/inference/runner.js +175 -0
- package/dist/render/inference/schedule.d.ts +39 -0
- package/dist/render/inference/schedule.js +59 -0
- package/dist/render/inference/shapeKernels.d.ts +10 -0
- package/dist/render/inference/shapeKernels.js +80 -0
- package/dist/render/inference/spatialKernels.d.ts +21 -0
- package/dist/render/inference/spatialKernels.js +179 -0
- package/dist/render/inference/splatRaster.wgsl.d.ts +75 -0
- package/dist/render/inference/splatRaster.wgsl.js +337 -0
- package/dist/render/inference/splatTiles.d.ts +79 -0
- package/dist/render/inference/splatTiles.js +161 -0
- package/dist/render/lineBatch.d.ts +2 -5
- package/dist/render/lineBatch.js +4 -24
- package/dist/render/mesh.d.ts +4 -0
- package/dist/render/mesh.js +45 -1
- package/dist/render/pass.d.ts +145 -8
- package/dist/render/prefilterEnvMap.d.ts +22 -0
- package/dist/render/prefilterEnvMap.js +31 -0
- package/dist/render/readback.d.ts +30 -0
- package/dist/render/readback.js +47 -0
- package/dist/render/recon/clamp.d.ts +36 -0
- package/dist/render/recon/clamp.js +92 -0
- package/dist/render/recon/disocclusion.d.ts +60 -0
- package/dist/render/recon/disocclusion.js +109 -0
- package/dist/render/recon/frameGen.d.ts +81 -0
- package/dist/render/recon/frameGen.js +150 -0
- package/dist/render/recon/frameSizes.d.ts +34 -0
- package/dist/render/recon/frameSizes.js +58 -0
- package/dist/render/recon/jitter.d.ts +60 -0
- package/dist/render/recon/jitter.js +118 -0
- package/dist/render/recon/motionVectors.d.ts +55 -0
- package/dist/render/recon/motionVectors.js +107 -0
- package/dist/render/recon/reproject.d.ts +41 -0
- package/dist/render/recon/reproject.js +131 -0
- package/dist/render/recon/resolve.d.ts +90 -0
- package/dist/render/recon/resolve.js +313 -0
- package/dist/render/recon/tier.d.ts +24 -0
- package/dist/render/recon/tier.js +8 -0
- package/dist/render/reflectionProbe.d.ts +26 -0
- package/dist/render/reflectionProbe.js +33 -0
- package/dist/render/renderQuality.d.ts +69 -0
- package/dist/render/renderQuality.js +22 -0
- package/dist/render/screenSpaceReflection.d.ts +23 -0
- package/dist/render/screenSpaceReflection.js +22 -3
- package/dist/render/sdfFont.js +2 -0
- package/dist/render/segmentQuads.d.ts +13 -0
- package/dist/render/segmentQuads.js +32 -0
- package/dist/render/shaders/flat/lobes.d.ts +27 -0
- package/dist/render/shaders/flat/lobes.js +33 -3
- package/dist/render/shaders/flat/preamble.d.ts +7 -0
- package/dist/render/shaders/flat/preamble.js +24 -1
- package/dist/render/shaders/flat/probeGrid.d.ts +1 -1
- package/dist/render/shaders/flat/probeGrid.js +71 -2
- package/dist/render/shaders/generated/flat.wgsl.d.ts +48 -8
- package/dist/render/shaders/generated/flat.wgsl.js +64 -24
- package/dist/render/shaders/gi/composeField.wgsl.d.ts +56 -0
- package/dist/render/shaders/gi/composeField.wgsl.js +231 -0
- package/dist/render/shaders/gi/marchField.wgsl.d.ts +30 -0
- package/dist/render/shaders/gi/marchField.wgsl.js +141 -0
- package/dist/render/shaders/gi/probeBake.wgsl.d.ts +113 -0
- package/dist/render/shaders/gi/probeBake.wgsl.js +635 -0
- package/dist/render/shaders/gi/probeTrace.wgsl.d.ts +72 -0
- package/dist/render/shaders/gi/probeTrace.wgsl.js +261 -0
- package/dist/render/shaders/gi/probeVolume.wgsl.d.ts +49 -0
- package/dist/render/shaders/gi/probeVolume.wgsl.js +242 -0
- package/dist/render/shaders/gi/sampleField.wgsl.d.ts +32 -0
- package/dist/render/shaders/gi/sampleField.wgsl.js +134 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +26 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +339 -0
- package/dist/render/shaders/gpudriven/compact.wgsl.d.ts +29 -0
- package/dist/render/shaders/gpudriven/compact.wgsl.js +58 -0
- package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +90 -0
- package/dist/render/shaders/gpudriven/cull.wgsl.js +423 -0
- package/dist/render/shaders/gpudriven/decode.wgsl.d.ts +72 -0
- package/dist/render/shaders/gpudriven/decode.wgsl.js +349 -0
- package/dist/render/shaders/gpudriven/environment.wgsl.d.ts +44 -0
- package/dist/render/shaders/gpudriven/environment.wgsl.js +137 -0
- package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +28 -0
- package/dist/render/shaders/gpudriven/fog.wgsl.js +107 -0
- package/dist/render/shaders/gpudriven/frameBlock.wgsl.d.ts +13 -0
- package/dist/render/shaders/gpudriven/frameBlock.wgsl.js +62 -0
- package/dist/render/shaders/gpudriven/materialBin.wgsl.d.ts +51 -0
- package/dist/render/shaders/gpudriven/materialBin.wgsl.js +112 -0
- package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +25 -0
- package/dist/render/shaders/gpudriven/materialTable.wgsl.js +43 -0
- package/dist/render/shaders/gpudriven/meshTransform.wgsl.d.ts +18 -0
- package/dist/render/shaders/gpudriven/meshTransform.wgsl.js +37 -0
- package/dist/render/shaders/gpudriven/present.wgsl.d.ts +43 -0
- package/dist/render/shaders/gpudriven/present.wgsl.js +127 -0
- package/dist/render/shaders/gpudriven/shade.wgsl.d.ts +127 -0
- package/dist/render/shaders/gpudriven/shade.wgsl.js +874 -0
- package/dist/render/shaders/gpudriven/shadow.wgsl.d.ts +44 -0
- package/dist/render/shaders/gpudriven/shadow.wgsl.js +308 -0
- package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.d.ts +28 -0
- package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.js +245 -0
- package/dist/render/shaders/network.wgsl.d.ts +101 -0
- package/dist/render/shaders/network.wgsl.js +206 -0
- package/dist/render/shaders/recon/motion.wgsl.d.ts +44 -0
- package/dist/render/shaders/recon/motion.wgsl.js +96 -0
- package/dist/render/shaders/recon/resolve.wgsl.d.ts +51 -0
- package/dist/render/shaders/recon/resolve.wgsl.js +733 -0
- package/dist/render/temporalAa.js +8 -33
- package/dist/render/textLayout.js +12 -6
- package/dist/render/textRenderer.d.ts +3 -1
- package/dist/render/textRenderer.js +4 -1
- package/dist/render/translucentQueue.d.ts +6 -0
- package/dist/render/translucentQueue.js +11 -0
- package/dist/render/windStreakRenderer.d.ts +2 -1
- package/dist/render/windStreakRenderer.js +3 -1
- package/dist/world/cell.d.ts +63 -0
- package/dist/world/cell.js +181 -0
- package/dist/world/cellStream.d.ts +103 -0
- package/dist/world/cellStream.js +198 -0
- package/dist/world/freeze.d.ts +81 -0
- package/dist/world/freeze.js +114 -0
- package/dist/world/rebase.d.ts +29 -0
- package/dist/world/rebase.js +41 -0
- package/package.json +8 -3
- package/scripts/frames.mjs +92 -0
- package/scripts/gpuCompute.mjs +323 -0
- package/scripts/png.d.mts +16 -0
- package/scripts/png.mjs +25 -0
- package/src/core/loop.ts +19 -2
- package/src/core/storage.ts +5 -0
- package/src/geometry/meshBuilder.ts +5 -1
- package/src/index.ts +246 -4
- package/src/input/input.ts +6 -1
- package/src/math/exact.ts +69 -3
- package/src/math/frustum.ts +52 -3
- package/src/render/backend/api.ts +42 -1
- package/src/render/backend/budget.ts +7 -6
- package/src/render/backend/createRenderer.ts +92 -3
- package/src/render/backend/materialChanges.ts +54 -0
- package/src/render/backend/select.ts +8 -0
- package/src/render/backend/webgl2/renderer.ts +211 -9
- package/src/render/backend/webgpu/buffers.ts +182 -69
- package/src/render/backend/webgpu/fieldCompose.ts +482 -0
- package/src/render/backend/webgpu/giFieldPass.ts +200 -0
- package/src/render/backend/webgpu/gpuDrivenPass.ts +2993 -0
- package/src/render/backend/webgpu/linePass.ts +4 -39
- package/src/render/backend/webgpu/probeBake.ts +588 -0
- package/src/render/backend/webgpu/renderer.ts +1481 -76
- package/src/render/backend/webgpu/scatterPass.ts +15 -1
- package/src/render/backend/webgpu/surfaceTexturePass.ts +63 -36
- package/src/render/causticsRenderer.ts +5 -2
- package/src/render/depthConvention.ts +15 -0
- package/src/render/deviceFeatures.ts +77 -0
- package/src/render/fog.ts +185 -0
- package/src/render/frame/alias.ts +97 -0
- package/src/render/frame/deps.ts +155 -0
- package/src/render/frame/flushGraph.ts +135 -0
- package/src/render/frame/graphSchedule.ts +170 -0
- package/src/render/frame/index.ts +52 -0
- package/src/render/frame/lifetime.ts +61 -0
- package/src/render/frame/passTimings.ts +69 -0
- package/src/render/frame/validate.ts +40 -0
- package/src/render/frame/virtual.ts +91 -0
- package/src/render/gi/chain.ts +225 -0
- package/src/render/gi/denoise.ts +276 -0
- package/src/render/gi/fieldScene.ts +264 -0
- package/src/render/gi/globalField.ts +543 -0
- package/src/render/gi/probeGridFit.ts +89 -0
- package/src/render/gi/probeTrace.ts +143 -0
- package/src/render/gi/probeVolume.ts +288 -0
- package/src/render/gi/reflection.ts +163 -0
- package/src/render/gi/traceField.ts +223 -0
- package/src/render/gi/traceScreen.ts +106 -0
- package/src/render/gpuScene.ts +80 -0
- package/src/render/gpudriven/alphaTest.ts +33 -0
- package/src/render/gpudriven/clusterUpload.ts +123 -0
- package/src/render/gpudriven/clusterWorld.ts +239 -0
- package/src/render/gpudriven/compact.ts +80 -0
- package/src/render/gpudriven/cullClusters.ts +333 -0
- package/src/render/gpudriven/decodeTables.ts +332 -0
- package/src/render/gpudriven/frustum.ts +70 -0
- package/src/render/gpudriven/geometryHarness.ts +51 -0
- package/src/render/gpudriven/hzb.ts +113 -0
- package/src/render/gpudriven/ibl.ts +147 -0
- package/src/render/gpudriven/indirect.ts +89 -0
- package/src/render/gpudriven/instances.ts +234 -0
- package/src/render/gpudriven/lit.ts +329 -0
- package/src/render/gpudriven/lodCut.ts +62 -0
- package/src/render/gpudriven/materialBin.ts +131 -0
- package/src/render/gpudriven/materialTable.ts +164 -0
- package/src/render/gpudriven/pipeline.ts +336 -0
- package/src/render/gpudriven/rangeAlloc.ts +122 -0
- package/src/render/gpudriven/sceneUpload.ts +173 -0
- package/src/render/gpudriven/shadeBins.ts +222 -0
- package/src/render/gpudriven/shadow.ts +285 -0
- package/src/render/gpudriven/shadowCamera.ts +406 -0
- package/src/render/gpudriven/streamScene.ts +575 -0
- package/src/render/gpudriven/surfaceFrame.ts +68 -0
- package/src/render/gpudriven/twoPhase.ts +214 -0
- package/src/render/gpudriven/visbuffer.ts +41 -0
- package/src/render/halfFloat.ts +22 -4
- package/src/render/inference/attentionTiled.ts +132 -0
- package/src/render/inference/denseKernels.ts +369 -0
- package/src/render/inference/device.ts +44 -0
- package/src/render/inference/deviceGraph.ts +39 -0
- package/src/render/inference/fuse.ts +47 -0
- package/src/render/inference/kernelKit.ts +120 -0
- package/src/render/inference/kernels.ts +18 -0
- package/src/render/inference/plan.ts +26 -0
- package/src/render/inference/reuse.ts +79 -0
- package/src/render/inference/runner.ts +204 -0
- package/src/render/inference/schedule.ts +80 -0
- package/src/render/inference/shapeKernels.ts +112 -0
- package/src/render/inference/spatialKernels.ts +220 -0
- package/src/render/inference/splatRaster.wgsl.ts +348 -0
- package/src/render/inference/splatTiles.ts +186 -0
- package/src/render/lineBatch.ts +4 -24
- package/src/render/mesh.ts +46 -1
- package/src/render/pass.ts +155 -10
- package/src/render/prefilterEnvMap.ts +33 -0
- package/src/render/readback.ts +73 -0
- package/src/render/recon/clamp.ts +113 -0
- package/src/render/recon/disocclusion.ts +143 -0
- package/src/render/recon/frameGen.ts +191 -0
- package/src/render/recon/frameSizes.ts +64 -0
- package/src/render/recon/jitter.ts +126 -0
- package/src/render/recon/motionVectors.ts +138 -0
- package/src/render/recon/reproject.ts +179 -0
- package/src/render/recon/resolve.ts +444 -0
- package/src/render/recon/tier.ts +31 -0
- package/src/render/reflectionProbe.ts +34 -0
- package/src/render/renderQuality.ts +87 -0
- package/src/render/screenSpaceReflection.ts +37 -3
- package/src/render/sdfFont.ts +2 -0
- package/src/render/segmentQuads.ts +39 -0
- package/src/render/shaders/flat/lobes.ts +35 -3
- package/src/render/shaders/flat/preamble.ts +25 -1
- package/src/render/shaders/flat/probeGrid.ts +77 -2
- package/src/render/shaders/generated/flat.wgsl.ts +64 -24
- package/src/render/shaders/gi/composeField.wgsl.ts +239 -0
- package/src/render/shaders/gi/marchField.wgsl.ts +146 -0
- package/src/render/shaders/gi/probeBake.wgsl.ts +649 -0
- package/src/render/shaders/gi/probeTrace.wgsl.ts +269 -0
- package/src/render/shaders/gi/probeVolume.wgsl.ts +246 -0
- package/src/render/shaders/gi/sampleField.wgsl.ts +140 -0
- package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +343 -0
- package/src/render/shaders/gpudriven/compact.wgsl.ts +59 -0
- package/src/render/shaders/gpudriven/cull.wgsl.ts +433 -0
- package/src/render/shaders/gpudriven/decode.wgsl.ts +373 -0
- package/src/render/shaders/gpudriven/environment.wgsl.ts +141 -0
- package/src/render/shaders/gpudriven/fog.wgsl.ts +110 -0
- package/src/render/shaders/gpudriven/frameBlock.wgsl.ts +62 -0
- package/src/render/shaders/gpudriven/materialBin.wgsl.ts +116 -0
- package/src/render/shaders/gpudriven/materialTable.wgsl.ts +46 -0
- package/src/render/shaders/gpudriven/meshTransform.wgsl.ts +37 -0
- package/src/render/shaders/gpudriven/present.wgsl.ts +129 -0
- package/src/render/shaders/gpudriven/shade.wgsl.ts +884 -0
- package/src/render/shaders/gpudriven/shadow.wgsl.ts +322 -0
- package/src/render/shaders/gpudriven/visbufferRaster.wgsl.ts +251 -0
- package/src/render/shaders/network.wgsl.ts +238 -0
- package/src/render/shaders/recon/motion.wgsl.ts +101 -0
- package/src/render/shaders/recon/resolve.wgsl.ts +741 -0
- package/src/render/temporalAa.ts +9 -33
- package/src/render/textLayout.ts +12 -6
- package/src/render/textRenderer.ts +5 -2
- package/src/render/translucentQueue.ts +11 -0
- package/src/render/windStreakRenderer.ts +4 -2
- package/src/world/cell.ts +231 -0
- package/src/world/cellStream.ts +278 -0
- package/src/world/freeze.ts +157 -0
- package/src/world/rebase.ts +56 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one network evaluator the device has, in single or half precision.
|
|
3
|
+
*
|
|
4
|
+
* **Every network the engine evaluates on a device goes through this text.** A DriftTexture's
|
|
5
|
+
* decode interpreter reads its networks from uniform tables; reconstruction's refinement tier and
|
|
6
|
+
* capture's priors read theirs from storage buffers, in half precision where the device has it.
|
|
7
|
+
* Those are different bindings and the same arithmetic, so the arithmetic is written once and the
|
|
8
|
+
* weights are reached through a function the including module defines — the arrangement
|
|
9
|
+
* `shadow.wgsl.ts` uses for its map. A second evaluator would be a second set of numerical
|
|
10
|
+
* conventions to keep in step, which `@driftengine/texture`'s `inference.ts` names as the thing this
|
|
11
|
+
* engine refuses.
|
|
12
|
+
*
|
|
13
|
+
* **The reference is `evalNetwork`, and in half precision `evalNetworkHalf`**, operation for
|
|
14
|
+
* operation: the weighted inputs summed in index order, then the bias, then the rectifier on hidden
|
|
15
|
+
* layers and nothing on the output. The weights are laid out as `NNET` stores them — each layer's
|
|
16
|
+
* matrix row by row by output, then its biases.
|
|
17
|
+
*
|
|
18
|
+
* **Half precision needs `enable f16;` at the top of the including module** and a device created
|
|
19
|
+
* with `shader-f16`. It is chosen per network by its consumer, and `activationBound` is what that
|
|
20
|
+
* consumer asks first: past 65,504 the format has no finite value.
|
|
21
|
+
*
|
|
22
|
+
* `scripts/gpu-parity.mjs` runs both instantiations against the references, and
|
|
23
|
+
* `scripts/wgsl-handwritten.test.mjs` has `naga` validate them without a device.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export interface NetworkWgslOptions {
|
|
27
|
+
/** The prefix every function this defines carries, so a module can include more than one. */
|
|
28
|
+
readonly name: string;
|
|
29
|
+
/** The scalar the network computes in. `f16` needs `enable f16;` in the including module. */
|
|
30
|
+
readonly scalar: 'f32' | 'f16';
|
|
31
|
+
/** The widest layer, which is the length of the function-scope arrays the layers pass through. */
|
|
32
|
+
readonly width: number;
|
|
33
|
+
/** The most hidden layers a network may have here. */
|
|
34
|
+
readonly hidden: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The evaluator, as text.
|
|
39
|
+
*
|
|
40
|
+
* Defines `fn <name>Eval(first, inputs, hidden, widths, outputs, input) -> array<S, width>`:
|
|
41
|
+
* `first` is where the network's weights start, `widths` its hidden widths, and `input` its first
|
|
42
|
+
* `inputs` values. The including module defines `fn <name>Weight(index: u32) -> S`.
|
|
43
|
+
*
|
|
44
|
+
* **Every count is clamped to what the arrays hold.** A loader refuses a network wider or deeper
|
|
45
|
+
* than this was instantiated for; the clamps are what keep a malformed one from indexing past a
|
|
46
|
+
* function-scope array, which the language would otherwise clamp silently and differently.
|
|
47
|
+
*/
|
|
48
|
+
export function networkWgsl(options: NetworkWgslOptions): string {
|
|
49
|
+
const { name, scalar: s, width: w, hidden: h } = options;
|
|
50
|
+
return /* wgsl */ `
|
|
51
|
+
fn ${name}Eval(
|
|
52
|
+
first: u32,
|
|
53
|
+
inputs: u32,
|
|
54
|
+
hidden: u32,
|
|
55
|
+
widths: array<u32, ${h}>,
|
|
56
|
+
outputs: u32,
|
|
57
|
+
input: array<${s}, ${w}>,
|
|
58
|
+
) -> array<${s}, ${w}> {
|
|
59
|
+
var current = input;
|
|
60
|
+
var next: array<${s}, ${w}>;
|
|
61
|
+
var at = first;
|
|
62
|
+
var previous = min(inputs, ${w}u);
|
|
63
|
+
let layers = min(hidden, ${h}u);
|
|
64
|
+
for (var layer = 0u; layer < layers; layer = layer + 1u) {
|
|
65
|
+
let width = min(widths[layer], ${w}u);
|
|
66
|
+
for (var o = 0u; o < width; o = o + 1u) {
|
|
67
|
+
var total = ${s}(0.0);
|
|
68
|
+
for (var i = 0u; i < previous; i = i + 1u) {
|
|
69
|
+
total = total + current[i] * ${name}Weight(at + o * previous + i);
|
|
70
|
+
}
|
|
71
|
+
/* Rectified linear on hidden layers and nothing on the output, as inference.ts insists. */
|
|
72
|
+
next[o] = max(total + ${name}Weight(at + width * previous + o), ${s}(0.0));
|
|
73
|
+
}
|
|
74
|
+
at = at + previous * width + width;
|
|
75
|
+
previous = width;
|
|
76
|
+
current = next;
|
|
77
|
+
}
|
|
78
|
+
var result: array<${s}, ${w}>;
|
|
79
|
+
let count = min(outputs, ${w}u);
|
|
80
|
+
for (var o = 0u; o < count; o = o + 1u) {
|
|
81
|
+
var total = ${s}(0.0);
|
|
82
|
+
for (var i = 0u; i < previous; i = i + 1u) {
|
|
83
|
+
total = total + current[i] * ${name}Weight(at + o * previous + i);
|
|
84
|
+
}
|
|
85
|
+
result[o] = total + ${name}Weight(at + count * previous + o);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A network's shape, which the fixed form bakes in. The same shape `evalNetwork` takes. */
|
|
93
|
+
export interface FixedNetworkShape {
|
|
94
|
+
readonly inputs: number;
|
|
95
|
+
readonly hidden: readonly number[];
|
|
96
|
+
readonly outputs: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface FixedNetworkWgslOptions {
|
|
100
|
+
/** The prefix every function this defines carries, as for the variable form. */
|
|
101
|
+
readonly name: string;
|
|
102
|
+
readonly scalar: 'f32' | 'f16';
|
|
103
|
+
readonly shape: FixedNetworkShape;
|
|
104
|
+
/** Where the network's weights start in what `<name>Weight` reads. */
|
|
105
|
+
readonly first?: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The same evaluator with its shape fixed when the pipeline is built, for a consumer whose network
|
|
110
|
+
* is known then — reconstruction's refinement tier, capture's priors.
|
|
111
|
+
*
|
|
112
|
+
* **Nine to fourteen times faster, measured**, 2026-09-19 on an RX 9070 XT, once per pixel of a
|
|
113
|
+
* 1280×720 frame: a network of 11-8-3 in 0.031 ms against the variable form's 0.286, and 11-16-16-3
|
|
114
|
+
* in 0.076 against 1.09 (`tools/recon-train/budget.ts`). The variable form indexes function-scope
|
|
115
|
+
* arrays with counts it reads at run time, which a compiler cannot keep in registers; with every
|
|
116
|
+
* count a constant the loops unroll and the arrays are registers. The DriftTexture interpreter keeps
|
|
117
|
+
* the variable form, because its networks change per material and its pipeline does not.
|
|
118
|
+
*
|
|
119
|
+
* **The arithmetic is the variable form's, in the same order** — the weighted inputs summed in index
|
|
120
|
+
* order, then the bias, then the rectifier on hidden layers and nothing on the output, over weights
|
|
121
|
+
* laid out as `NNET` stores them — so `evalNetwork` and `evalNetworkHalf` are its references too,
|
|
122
|
+
* and `gpu-parity.mjs` holds it to them the same way.
|
|
123
|
+
*
|
|
124
|
+
* Defines `fn <name>Eval(input: array<S, inputs>) -> array<S, outputs>`. The including module
|
|
125
|
+
* defines `fn <name>Weight(index: u32) -> S`, as for the variable form.
|
|
126
|
+
*/
|
|
127
|
+
export function networkFixedWgsl(options: FixedNetworkWgslOptions): string {
|
|
128
|
+
const { name, scalar: s, shape } = options;
|
|
129
|
+
const layers = [shape.inputs, ...shape.hidden, shape.outputs];
|
|
130
|
+
let at = options.first ?? 0;
|
|
131
|
+
let body = '';
|
|
132
|
+
let previous = 'input';
|
|
133
|
+
for (let layer = 1; layer < layers.length; layer += 1) {
|
|
134
|
+
const width = layers[layer] as number;
|
|
135
|
+
const fanIn = layers[layer - 1] as number;
|
|
136
|
+
const output = layer === layers.length - 1;
|
|
137
|
+
const target = output ? 'result' : `layer${layer}`;
|
|
138
|
+
const bias = at + width * fanIn;
|
|
139
|
+
const value = output
|
|
140
|
+
? `total + ${name}Weight(${bias}u + o)`
|
|
141
|
+
: `max(total + ${name}Weight(${bias}u + o), ${s}(0.0))`;
|
|
142
|
+
body += `
|
|
143
|
+
var ${target}: array<${s}, ${width}>;
|
|
144
|
+
for (var o = 0u; o < ${width}u; o = o + 1u) {
|
|
145
|
+
var total = ${s}(0.0);
|
|
146
|
+
for (var i = 0u; i < ${fanIn}u; i = i + 1u) {
|
|
147
|
+
total = total + ${previous}[i] * ${name}Weight(${at}u + o * ${fanIn}u + i);
|
|
148
|
+
}
|
|
149
|
+
${target}[o] = ${value};
|
|
150
|
+
}`;
|
|
151
|
+
at = bias + width;
|
|
152
|
+
previous = target;
|
|
153
|
+
}
|
|
154
|
+
return /* wgsl */ `
|
|
155
|
+
fn ${name}Eval(input: array<${s}, ${shape.inputs}>) -> array<${s}, ${shape.outputs}> {${body}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* An entry point that evaluates one fixed-shape network over many inputs, so a harness can hold
|
|
163
|
+
* the fixed form to `evalNetwork` and `evalNetworkHalf` as it holds the variable one. Inputs and
|
|
164
|
+
* outputs cross as `f32`, as the variable form's parity entry point has them.
|
|
165
|
+
*/
|
|
166
|
+
export function networkFixedParityWgsl(scalar: 'f32' | 'f16', shape: FixedNetworkShape): string {
|
|
167
|
+
return /* wgsl */ `${scalar === 'f16' ? 'enable f16;\n' : ''}
|
|
168
|
+
@group(0) @binding(0) var<storage, read> weights: array<${scalar}>;
|
|
169
|
+
@group(0) @binding(1) var<storage, read> inputs: array<f32>;
|
|
170
|
+
@group(0) @binding(2) var<storage, read_write> outputs: array<f32>;
|
|
171
|
+
|
|
172
|
+
fn parityWeight(index: u32) -> ${scalar} {
|
|
173
|
+
return weights[index];
|
|
174
|
+
}
|
|
175
|
+
${networkFixedWgsl({ name: 'parity', scalar, shape })}
|
|
176
|
+
@compute @workgroup_size(64)
|
|
177
|
+
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
178
|
+
let count = arrayLength(&inputs) / ${shape.inputs}u;
|
|
179
|
+
if (id.x >= count) { return; }
|
|
180
|
+
var input: array<${scalar}, ${shape.inputs}>;
|
|
181
|
+
for (var i = 0u; i < ${shape.inputs}u; i = i + 1u) {
|
|
182
|
+
input[i] = ${scalar}(inputs[id.x * ${shape.inputs}u + i]);
|
|
183
|
+
}
|
|
184
|
+
let result = parityEval(input);
|
|
185
|
+
for (var o = 0u; o < ${shape.outputs}u; o = o + 1u) {
|
|
186
|
+
outputs[id.x * ${shape.outputs}u + o] = f32(result[o]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** The widest network the parity entry points evaluate. */
|
|
193
|
+
export const NETWORK_PARITY_WIDTH = 16;
|
|
194
|
+
/** The deepest. */
|
|
195
|
+
export const NETWORK_PARITY_HIDDEN = 4;
|
|
196
|
+
/** Unsigned words per case: first, inputs, hidden count, outputs, then the hidden widths. */
|
|
197
|
+
export const NETWORK_CASE_WORDS = 4 + NETWORK_PARITY_HIDDEN;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* An entry point that evaluates one network per invocation from storage buffers, so a harness can
|
|
201
|
+
* compare the device with `evalNetwork` or `evalNetworkHalf`.
|
|
202
|
+
*
|
|
203
|
+
* Inputs and outputs cross as `f32` whatever the network computes in: a half-precision network's
|
|
204
|
+
* inputs are converted on the way in, as `evalNetworkHalf` rounds them, and its outputs widen on
|
|
205
|
+
* the way out, which loses nothing.
|
|
206
|
+
*/
|
|
207
|
+
export function networkParityWgsl(scalar: 'f32' | 'f16'): string {
|
|
208
|
+
const w = NETWORK_PARITY_WIDTH;
|
|
209
|
+
return /* wgsl */ `${scalar === 'f16' ? 'enable f16;\n' : ''}
|
|
210
|
+
@group(0) @binding(0) var<storage, read> cases: array<u32>;
|
|
211
|
+
@group(0) @binding(1) var<storage, read> weights: array<${scalar}>;
|
|
212
|
+
@group(0) @binding(2) var<storage, read> inputs: array<f32>;
|
|
213
|
+
@group(0) @binding(3) var<storage, read_write> outputs: array<f32>;
|
|
214
|
+
|
|
215
|
+
fn parityWeight(index: u32) -> ${scalar} {
|
|
216
|
+
return weights[index];
|
|
217
|
+
}
|
|
218
|
+
${networkWgsl({ name: 'parity', scalar, width: w, hidden: NETWORK_PARITY_HIDDEN })}
|
|
219
|
+
@compute @workgroup_size(64)
|
|
220
|
+
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
221
|
+
let count = arrayLength(&cases) / ${NETWORK_CASE_WORDS}u;
|
|
222
|
+
if (id.x >= count) { return; }
|
|
223
|
+
let at = id.x * ${NETWORK_CASE_WORDS}u;
|
|
224
|
+
var widths: array<u32, ${NETWORK_PARITY_HIDDEN}>;
|
|
225
|
+
for (var layer = 0u; layer < ${NETWORK_PARITY_HIDDEN}u; layer = layer + 1u) {
|
|
226
|
+
widths[layer] = cases[at + 4u + layer];
|
|
227
|
+
}
|
|
228
|
+
var input: array<${scalar}, ${w}>;
|
|
229
|
+
for (var i = 0u; i < ${w}u; i = i + 1u) {
|
|
230
|
+
input[i] = ${scalar}(inputs[id.x * ${w}u + i]);
|
|
231
|
+
}
|
|
232
|
+
let result = parityEval(cases[at], cases[at + 1u], cases[at + 2u], widths, cases[at + 3u], input);
|
|
233
|
+
for (var o = 0u; o < ${w}u; o = o + 1u) {
|
|
234
|
+
outputs[id.x * ${w}u + o] = f32(result[o]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
`;
|
|
238
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a drawn surface was last frame, written into the reconstruction's motion target.
|
|
3
|
+
*
|
|
4
|
+
* **A pass of its own rather than a second output on every material.** The alternative is a second
|
|
5
|
+
* colour attachment on every generated fragment stage, which `ARCHITECTURE.md` §1 prices at 196,910
|
|
6
|
+
* gzipped bytes for one flag — and it would be paid by every consumer, including the ones who never
|
|
7
|
+
* reconstruct anything. This draws only the meshes a caller said had moved, with one small shader
|
|
8
|
+
* over the position buffer alone.
|
|
9
|
+
*
|
|
10
|
+
* **What a pixel carries**: the offset from where it is now to where its surface was, in the uv the
|
|
11
|
+
* resolve measures in; the view depth it had then, which is what the disocclusion compares against
|
|
12
|
+
* last frame's depth; and a flag. `recon/resolve.ts`'s `historyWeight` is the reader, and a texel
|
|
13
|
+
* this pass did not write is a zero flag, which means *derive the camera's motion from the depth* —
|
|
14
|
+
* so a scene that says nothing about its movers is exactly the scene this pass never ran for.
|
|
15
|
+
*
|
|
16
|
+
* **The rasterisation matrix is handed over whole, and that is deliberate.** The scene is drawn by
|
|
17
|
+
* shaders `naga` generated, every one of which ends its vertex stage with `gl_Position.y = -y`, and
|
|
18
|
+
* `CLIP_CORRECTION` carries a negation to cancel it — §3 rows 56 and 57. This shader is hand
|
|
19
|
+
* written and has no such negation, so rather than reason about halves of that pair per draw, the
|
|
20
|
+
* renderer multiplies the two together once a frame and passes the product. The vertex stage then
|
|
21
|
+
* has one job: put the position exactly where the scene put it, so the depth test compares like
|
|
22
|
+
* with like.
|
|
23
|
+
*
|
|
24
|
+
* **The motion itself is measured from the *unjittered* matrices**, which is the whole of §3 row
|
|
25
|
+
* 121: the history stands for a picture of the scene as it would have been drawn with no jitter, so
|
|
26
|
+
* a motion vector that carried the jitter difference would move every sample by a fraction of a
|
|
27
|
+
* pixel in a pattern that repeats with the jitter period — shimmer, diagnosed as anything but its
|
|
28
|
+
* cause.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/** Floats in the per-frame block: three matrices. */
|
|
32
|
+
export const MOTION_FRAME_FLOATS = 48;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Bytes a draw's own block takes.
|
|
36
|
+
*
|
|
37
|
+
* Two matrices is 128, and a dynamic uniform offset must be a multiple of 256 — the same alignment
|
|
38
|
+
* §3 row 50's neighbours are about. So each draw takes a whole 256 and half of it is padding, which
|
|
39
|
+
* is the cheaper half of the trade against a bind group per draw inside the frame loop.
|
|
40
|
+
*/
|
|
41
|
+
export const MOTION_DRAW_STRIDE = 256;
|
|
42
|
+
|
|
43
|
+
/** Floats a draw actually writes inside that stride. */
|
|
44
|
+
export const MOTION_DRAW_FLOATS = 32;
|
|
45
|
+
|
|
46
|
+
/** The motion target's format. Half float holds a uv to a hundredth of a pixel and a view depth. */
|
|
47
|
+
export const MOTION_TARGET_FORMAT: GPUTextureFormat = 'rgba16float';
|
|
48
|
+
|
|
49
|
+
export const RECON_MOTION_WGSL = /* wgsl */ `
|
|
50
|
+
struct MotionFrame {
|
|
51
|
+
/* The scene's own clip transform, with the generated shaders' y negation already folded in. */
|
|
52
|
+
raster: mat4x4<f32>,
|
|
53
|
+
/* This frame's and last frame's view-projections, unjittered, in the matrices' own convention. */
|
|
54
|
+
viewProj: mat4x4<f32>,
|
|
55
|
+
previousViewProj: mat4x4<f32>,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
struct MotionDraw {
|
|
59
|
+
model: mat4x4<f32>,
|
|
60
|
+
previousModel: mat4x4<f32>,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@group(0) @binding(0) var<uniform> frame: MotionFrame;
|
|
64
|
+
@group(0) @binding(1) var<uniform> draw: MotionDraw;
|
|
65
|
+
|
|
66
|
+
struct Varyings {
|
|
67
|
+
@builtin(position) clip: vec4<f32>,
|
|
68
|
+
/* Clip positions rather than uv: an interpolator divides by w for us, so dividing these by their
|
|
69
|
+
own interpolated w in the fragment stage is the perspective-correct answer at every pixel. */
|
|
70
|
+
@location(0) now: vec4<f32>,
|
|
71
|
+
@location(1) was: vec4<f32>,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@vertex
|
|
75
|
+
fn motionVert(@location(0) position: vec3<f32>) -> Varyings {
|
|
76
|
+
let world = draw.model * vec4<f32>(position, 1.0);
|
|
77
|
+
let wasWorld = draw.previousModel * vec4<f32>(position, 1.0);
|
|
78
|
+
var out: Varyings;
|
|
79
|
+
out.clip = frame.raster * world;
|
|
80
|
+
out.now = frame.viewProj * world;
|
|
81
|
+
out.was = frame.previousViewProj * wasWorld;
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Normalised device coordinates to the uv the resolve measures in: v increases upward, as the
|
|
86
|
+
references' images do, and the accessor that reads this target is what flips the texture's rows. */
|
|
87
|
+
fn motionUv(clip: vec4<f32>) -> vec2<f32> {
|
|
88
|
+
return clip.xy / clip.w * 0.5 + vec2<f32>(0.5);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@fragment
|
|
92
|
+
fn motionFrag(in: Varyings) -> @location(0) vec4<f32> {
|
|
93
|
+
/*
|
|
94
|
+
* A surface behind last frame's eye has a w that is not positive, and there is no uv for it. The
|
|
95
|
+
* flag stays set: the disocclusion refuses a depth that is not positive, so the resolve drops the
|
|
96
|
+
* history rather than reading it from wherever a divide by a negative w would have pointed.
|
|
97
|
+
*/
|
|
98
|
+
let offset = select(vec2<f32>(0.0), motionUv(in.was) - motionUv(in.now), in.was.w > 0.0);
|
|
99
|
+
return vec4<f32>(offset, in.was.w, 1.0);
|
|
100
|
+
}
|
|
101
|
+
`;
|