@meimu/mutracer 0.3.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/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- 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 +29 -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/viewer.md +11 -1
- 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 +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- 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/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -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/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- 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 +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- 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 +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- 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/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 +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- 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.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- 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 +12 -6
- 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.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.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 +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- 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 +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- 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.js +2 -2
- 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/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 +2 -2
- 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 +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -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 +39 -39
- 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 +31 -31
- 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 +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- 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 +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- 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 +99 -97
- 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 +11 -2
- 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.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +21 -14
- 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/package.json +5 -2
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false;\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n reset() {\n if (this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number) {\n if (width === this.width && height === this.height) return;\n if (width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxStorageBufferBindingSize || width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * AOV_LAYOUT.accumulatedBytes, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = batch.join(',');\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: aovSnapshotShader(batch)}), entryPoint: 'main'}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:aovDisplayShader('rgba16float')}),entryPoint:'main'}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n async read(kind: AovKind) {\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = kind === 'diffuseAlbedo' ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {textureBytes} from './gpuMemory.js';\nimport {compactAovResolveCode} from './wgsl/aovCompact.wgsl.js';\nimport {aovBorrowDepthShader, aovBorrowReflectanceShader} from './wgsl/aovResolve.wgsl.js';\nimport {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovLaneKind, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** @internal Content revision of each borrowed AOV texture; changes whenever it is re-resolved. */\nexport const borrowedAovRevision = new WeakMap<GPUTexture, number>();\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false; compact = false;\n private revision = 0;\n private readonly borrowed = new Map<AovKind, {image: GPUTexture; pipeline: GPUComputePipeline | GPURenderPipeline; samples: number; revision: number}>();\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n private resolveCode(code: string) {\n return this.compact ? compactAovResolveCode(code) : code;\n }\n reset() {\n this.revision++;\n if (!this.compact && this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number, compact = false) {\n if (width === this.width && height === this.height && compact === this.compact) return;\n const stride = compact ? 24 : AOV_LAYOUT.accumulatedBytes;\n if (width*height*stride>this.device.limits.maxStorageBufferBindingSize || width*height*stride>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height; this.compact = compact; this.displayPipeline = undefined;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * stride, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: compact ? 32 : width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: compact ? 32 : width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.borrowed.values()].reduce((bytes, entry) => bytes + textureBytes(entry.image), 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = `${this.compact}:${batch.join(',')}`;\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: this.resolveCode(aovSnapshotShader(batch))}), entryPoint: 'main', ...(this.compact ? {constants: {AOV_COMPACT: 1}} : {})}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:this.resolveCode(aovDisplayShader('rgba16float'))}),entryPoint:'main',...(this.compact ? {constants:{AOV_COMPACT:1}} : {})}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n texture(kind: 'depth' | 'diffuseColor' | 'specularColor'): GPUTexture | undefined {\n if (!this.samples || !this.accumulation || !this.center) return;\n const device = this.device;\n let entry = this.borrowed.get(kind);\n if (!entry) {\n // Reflectance in [0,1] is stored sRGB-encoded in 8 bits (decoded on load), halving its memory\n // with fine steps for dark albedo; depth keeps float32 precision.\n const depth = kind === 'depth', format: GPUTextureFormat = depth ? 'rg32float' : 'rgba8unorm-srgb';\n const constants = this.compact ? {constants: {AOV_COMPACT: 1}} : {};\n let pipeline: GPUComputePipeline | GPURenderPipeline;\n if (depth) {\n pipeline = device.createComputePipeline({label: `Borrow ${kind}`, layout: 'auto', compute: {\n module: device.createShaderModule({code:this.resolveCode(aovBorrowDepthShader)}), entryPoint: 'main', ...constants}});\n } else {\n const module = device.createShaderModule({code:this.resolveCode(aovBorrowReflectanceShader)});\n pipeline = device.createRenderPipeline({label: `Borrow ${kind}`, layout: 'auto', vertex: {module, entryPoint: 'vertex', ...constants},\n fragment: {module, entryPoint: 'fragment', targets: [{format}], ...constants}});\n }\n const image = device.createTexture({label: `Borrow ${kind}`, size: [this.width,this.height], format,\n usage: (depth ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.RENDER_ATTACHMENT) | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC});\n entry = {image, pipeline, samples: -1, revision: -1}; this.borrowed.set(kind, entry);\n }\n if (entry.samples !== this.samples || entry.revision !== this.revision) {\n const parameters = device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});\n new Uint32Array(parameters.getMappedRange()).set([this.width,this.height,this.samples,aovLaneKind(kind)]); parameters.unmap();\n const encoder = device.createCommandEncoder();\n const entries: GPUBindGroupEntry[] = [{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:3,resource:{buffer:parameters}}];\n if (kind === 'depth') {\n const pipeline = entry.pipeline as GPUComputePipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries:[...entries,{binding:2,resource:entry.image.createView()}]});\n const pass = encoder.beginComputePass({label:`Resolve ${kind}`});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();\n } else {\n const pipeline = entry.pipeline as GPURenderPipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries});\n const pass = encoder.beginRenderPass({label:`Resolve ${kind}`,colorAttachments:[{view:entry.image.createView(),loadOp:'clear',storeOp:'store'}]});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.draw(3);pass.end();\n }\n device.queue.submit([encoder.finish()]);parameters.destroy();entry.samples=this.samples;entry.revision=this.revision;\n borrowedAovRevision.set(entry.image, (borrowedAovRevision.get(entry.image) ?? 0) + 1);\n }\n return entry.image;\n }\n async read(kind: AovKind) {\n if (this.compact) {\n const buffers = this.snapshot([kind]), source = buffers[kind]!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder();encoder.copyBufferToBuffer(source,0,staging,0,source.size);\n this.device.queue.submit([encoder.finish()]);await staging.mapAsync(GPUMapMode.READ);\n return {width:this.width,height:this.height,data:new Float32Array(staging.getMappedRange().slice(0))};\n } finally {\n if(staging.mapState==='mapped')staging.unmap();staging.destroy();\n this.snapshotLeases.delete(source);this.snapshotBuffers.delete(source);source.destroy();\n }\n }\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = aovLaneKind(kind) === 3 ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const borrowed = [...this.borrowed.values()];this.borrowed.clear();\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{borrowed.forEach(entry=>entry.image.destroy());texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { createCanvas } from '../util/canvas.js';
|
|
2
|
+
// A canvas returns the same context to every engine, and engine disposal defers
|
|
3
|
+
// releasing its surface until submitted GPU work finishes. Only the surface that
|
|
4
|
+
// configured the context last may unconfigure it, so a later engine on the same
|
|
5
|
+
// canvas keeps presenting.
|
|
6
|
+
const owners = new WeakMap();
|
|
2
7
|
/** One canvas surface; composing or exporting an image never reconfigures it. */
|
|
3
8
|
export class WGPUCanvasSurface {
|
|
4
9
|
device;
|
|
@@ -11,6 +16,7 @@ export class WGPUCanvasSurface {
|
|
|
11
16
|
this.standardFormat = standardFormat;
|
|
12
17
|
this.context = canvas.getContext('webgpu');
|
|
13
18
|
this.context.configure({ device, format: standardFormat, alphaMode: 'premultiplied' });
|
|
19
|
+
owners.set(this.context, this);
|
|
14
20
|
}
|
|
15
21
|
get format() { return this.hdr ? 'rgba16float' : this.standardFormat; }
|
|
16
22
|
get supportsHDR() {
|
|
@@ -43,6 +49,11 @@ export class WGPUCanvasSurface {
|
|
|
43
49
|
? { device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: { mode: 'extended' } }
|
|
44
50
|
: { device: this.device, format: this.standardFormat, alphaMode: 'premultiplied' });
|
|
45
51
|
}
|
|
46
|
-
dispose() {
|
|
52
|
+
dispose() {
|
|
53
|
+
if (owners.get(this.context) !== this)
|
|
54
|
+
return;
|
|
55
|
+
owners.delete(this.context);
|
|
56
|
+
this.context.unconfigure?.();
|
|
57
|
+
}
|
|
47
58
|
}
|
|
48
59
|
//# sourceMappingURL=WGPUCanvasSurface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG/C,iFAAiF;AACjF,MAAM,OAAO,iBAAiB;IAI8C;IAAoC;IAHrG,OAAO,CAAqB;IACrC,GAAG,GAAG,KAAK,CAAC;IACJ,aAAa,CAAW;IAChC,YAAY,MAA2C,EAAmB,MAAiB,EAAmB,cAAgC;QAApE,WAAM,GAAN,MAAM,CAAW;QAAmB,mBAAc,GAAd,cAAc,CAAkB;QAC5I,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAwB,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\ntype HDRConfiguration = GPUCanvasConfiguration & {toneMapping: {mode: 'extended'}};\ntype InspectableContext = GPUCanvasContext & {getConfiguration?: () => GPUCanvasConfiguration & {toneMapping?: {mode?: string}}};\n// A canvas returns the same context to every engine, and engine disposal defers\n// releasing its surface until submitted GPU work finishes. Only the surface that\n// configured the context last may unconfigure it, so a later engine on the same\n// canvas keeps presenting.\nconst owners = new WeakMap<GPUCanvasContext, WGPUCanvasSurface>();\n/** One canvas surface; composing or exporting an image never reconfigures it. */\nexport class WGPUCanvasSurface {\n readonly context: InspectableContext;\n hdr = false;\n private compatibleHDR?: boolean;\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas, private readonly device: GPUDevice, private readonly standardFormat: GPUTextureFormat) {\n this.context = canvas.getContext('webgpu')! as InspectableContext;\n this.context.configure({device, format: standardFormat, alphaMode: 'premultiplied'});\n owners.set(this.context, this);\n }\n get format() {return this.hdr ? 'rgba16float' as const : this.standardFormat;}\n get supportsHDR() {\n if (this.compatibleHDR !== undefined) return this.compatibleHDR;\n this.compatibleHDR = false;\n let probe: InspectableContext | null = null;\n try {\n probe = createCanvas().getContext('webgpu') as InspectableContext | null;\n if (!probe) return false;\n probe.configure({device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration);\n const applied = probe.getConfiguration?.();\n this.compatibleHDR = applied?.format === 'rgba16float' && applied.toneMapping?.mode === 'extended';\n } catch {this.compatibleHDR = false;}\n finally {probe?.unconfigure?.();}\n return this.compatibleHDR;\n }\n configure(enabled: boolean) {\n const active = enabled && this.supportsHDR;\n if (active === this.hdr) return;\n this.hdr = active;\n this.context.configure(active\n ? {device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration\n : {device: this.device, format: this.standardFormat, alphaMode: 'premultiplied'});\n }\n dispose() {\n if (owners.get(this.context) !== this) return;\n owners.delete(this.context);\n this.context.unconfigure?.();\n }\n}\n"]}
|
|
@@ -5,27 +5,27 @@ const distributionWGSL = /* wgsl */ `
|
|
|
5
5
|
@group(0) @binding(2) var<storage, read_write> rows: array<vec2f>;
|
|
6
6
|
@group(0) @binding(3) var output: texture_storage_2d<rg32float, write>;
|
|
7
7
|
var<workgroup> scan: array<f32, 256>;
|
|
8
|
-
var<workgroup>
|
|
8
|
+
var<workgroup> uZ: f32;
|
|
9
9
|
|
|
10
|
-
fn
|
|
10
|
+
fn jA(nZ: u32) {
|
|
11
11
|
workgroupBarrier();
|
|
12
12
|
for (var offset = 1u; offset < 256u; offset *= 2u) {
|
|
13
13
|
var previous = 0.0;
|
|
14
|
-
if (
|
|
14
|
+
if (nZ >= offset) { previous = scan[nZ - offset]; }
|
|
15
15
|
workgroupBarrier();
|
|
16
|
-
scan[
|
|
16
|
+
scan[nZ] += previous;
|
|
17
17
|
workgroupBarrier();
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
@compute @workgroup_size(256)
|
|
22
|
-
fn scanRows(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index)
|
|
22
|
+
fn scanRows(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) nZ: u32) {
|
|
23
23
|
let size = textureDimensions(radiance);
|
|
24
24
|
let y = group.x;
|
|
25
|
-
if (
|
|
25
|
+
if (nZ == 0u) { uZ = 0.0; }
|
|
26
26
|
workgroupBarrier();
|
|
27
27
|
for (var start = 0u; start < size.x; start += 256u) {
|
|
28
|
-
let x = start +
|
|
28
|
+
let x = start + nZ;
|
|
29
29
|
var weight = 0.0;
|
|
30
30
|
if (x < size.x) {
|
|
31
31
|
|
|
@@ -38,30 +38,30 @@ maximum = max(maximum, dot(textureLoad(radiance, p, 0).rgb, vec3f(0.2126, 0.7152
|
|
|
38
38
|
}
|
|
39
39
|
weight = max(maximum, 1e-12) * sin(3.141592653589793 * (f32(y) + 0.5) / f32(size.y));
|
|
40
40
|
}
|
|
41
|
-
scan[
|
|
42
|
-
|
|
43
|
-
if (x < size.x) { pixels[y * size.x + x] = vec2f(
|
|
41
|
+
scan[nZ] = weight / f32(size.x);
|
|
42
|
+
jA(nZ);
|
|
43
|
+
if (x < size.x) { pixels[y * size.x + x] = vec2f(uZ + scan[nZ], weight); }
|
|
44
44
|
workgroupBarrier();
|
|
45
|
-
if (
|
|
45
|
+
if (nZ == 0u) { uZ += scan[255]; }
|
|
46
46
|
workgroupBarrier();
|
|
47
47
|
}
|
|
48
|
-
if (
|
|
48
|
+
if (nZ == 0u) { rows[y] = vec2f(0.0, uZ); }
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
@compute @workgroup_size(256)
|
|
52
|
-
fn scanMarginal(@builtin(local_invocation_index)
|
|
52
|
+
fn scanMarginal(@builtin(local_invocation_index) nZ: u32) {
|
|
53
53
|
let height = textureDimensions(radiance).y;
|
|
54
|
-
if (
|
|
54
|
+
if (nZ == 0u) { uZ = 0.0; }
|
|
55
55
|
workgroupBarrier();
|
|
56
56
|
for (var start = 0u; start < height; start += 256u) {
|
|
57
|
-
let y = start +
|
|
57
|
+
let y = start + nZ;
|
|
58
58
|
var integral = 0.0;
|
|
59
59
|
if (y < height) { integral = rows[y].y; }
|
|
60
|
-
scan[
|
|
61
|
-
|
|
62
|
-
if (y < height) { rows[y].x =
|
|
60
|
+
scan[nZ] = integral / f32(height);
|
|
61
|
+
jA(nZ);
|
|
62
|
+
if (y < height) { rows[y].x = uZ + scan[nZ]; }
|
|
63
63
|
workgroupBarrier();
|
|
64
|
-
if (
|
|
64
|
+
if (nZ == 0u) { uZ += scan[255]; }
|
|
65
65
|
workgroupBarrier();
|
|
66
66
|
}
|
|
67
67
|
}
|
|
@@ -274,7 +274,7 @@ ${hasInputs
|
|
|
274
274
|
${this._uniforms
|
|
275
275
|
.map((uniform, idx) => `@group(${hasInputs ? 1 : 0}) @binding(${idx}) var<uniform> ${uniform.label}: ${uniform.type};`)
|
|
276
276
|
.join('\n')}
|
|
277
|
-
struct
|
|
277
|
+
struct qZ {
|
|
278
278
|
${this._outputs
|
|
279
279
|
.map((name, idx) => `@location(${idx}) ${name}: vec4f,`)
|
|
280
280
|
.join('\n')}
|
|
@@ -284,10 +284,10 @@ ${this._fsDefine ?? ''}
|
|
|
284
284
|
@fragment
|
|
285
285
|
fn main(
|
|
286
286
|
@builtin(position) coord: vec4f
|
|
287
|
-
) ->
|
|
287
|
+
) -> qZ {
|
|
288
288
|
let uv = vec2i(floor(coord.xy));
|
|
289
289
|
let uv2 = coord.xy / viewportSize;
|
|
290
|
-
var output:
|
|
290
|
+
var output: qZ;
|
|
291
291
|
${this._fsMain}
|
|
292
292
|
return output;
|
|
293
293
|
}
|
|
@@ -19,14 +19,14 @@ ${caustics ? /* wgsl */ `@group(0) @binding(4) var<storage, read> causticBuffer:
|
|
|
19
19
|
override outputWidth: f32;
|
|
20
20
|
override outputHeight: f32;
|
|
21
21
|
|
|
22
|
-
struct
|
|
22
|
+
struct qZ {
|
|
23
23
|
${layers ? `@location(0) foreground: vec4f,
|
|
24
24
|
@location(1) catcherBackground: vec4f` : `@location(0) color: vec4f,
|
|
25
25
|
@location(1) normal: vec4f,
|
|
26
26
|
@location(2) albedo: vec4f${catcher ? ',\n @location(3) shadowCatcher: vec4f' : ''}`}
|
|
27
27
|
}
|
|
28
28
|
@fragment
|
|
29
|
-
fn main(@builtin(position) coord: vec4f) ->
|
|
29
|
+
fn main(@builtin(position) coord: vec4f) -> qZ {
|
|
30
30
|
let size = vec2u(u32(outputWidth), u32(outputHeight));
|
|
31
31
|
let pixel = vec2u(u32(coord.x), size.y - u32(coord.y) - 1u);
|
|
32
32
|
var idx = pixel.x + pixel.y * size.x;
|
|
@@ -40,12 +40,12 @@ let nearest = min(
|
|
|
40
40
|
((pixel + grid / 2u) / grid) * grid,
|
|
41
41
|
((size - vec2u(1u)) / grid) * grid
|
|
42
42
|
);
|
|
43
|
-
let
|
|
44
|
-
if (normalBuffer[
|
|
45
|
-
idx =
|
|
43
|
+
let vI = nearest.x + nearest.y * size.x;
|
|
44
|
+
if (normalBuffer[vI].a > 0.0) {
|
|
45
|
+
idx = vI;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
var output:
|
|
48
|
+
var output: qZ;
|
|
49
49
|
if (normalBuffer[idx].a <= 0.0) {
|
|
50
50
|
${layers ? `output.foreground = vec4f(0.0);
|
|
51
51
|
output.catcherBackground = vec4f(0.0);` : `output.color = vec4f(0.0);
|
|
@@ -65,22 +65,22 @@ let hit = albedo.a;
|
|
|
65
65
|
let total = max(normal.a, 1.0);
|
|
66
66
|
${layers ? `
|
|
67
67
|
let shadow = shadowCatcherBuffer[idx];
|
|
68
|
-
let
|
|
68
|
+
let jz = max(hit - shadow.mask.b, 0.0);
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
output.foreground = vec4f(
|
|
72
72
|
(color.rgb - shadow.background.rgb)
|
|
73
|
-
/ select(total,
|
|
73
|
+
/ select(total, jz, jz > 0.0),
|
|
74
74
|
clamp((color.a - shadow.mask.g) / total, 0.0, 1.0)
|
|
75
75
|
);
|
|
76
76
|
output.catcherBackground = shadow.background / total;
|
|
77
77
|
` : `output.color = vec4f(
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
vec3f(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
vec3f(fF(color.r,normal.a,hit,1.0,true),
|
|
81
|
+
fF(color.g,normal.a,hit,1.0,true),
|
|
82
|
+
fF(color.b,normal.a,hit,1.0,true)),
|
|
83
|
+
fF(color.a,normal.a,hit,1.0,false)
|
|
84
84
|
);
|
|
85
85
|
|
|
86
86
|
output.normal = vec4f(0.0);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SurfaceHit } from './surfaceHit.js';
|
|
1
2
|
import { WGPUAov } from './WGPUAov.js';
|
|
2
3
|
import { type AovKind } from './aov.js';
|
|
3
4
|
import { type MaterialTextureSelection } from './wgpuBindless.js';
|
|
@@ -149,6 +150,7 @@ declare class WGPURayTracePass {
|
|
|
149
150
|
private _clamping?;
|
|
150
151
|
private _transmissiveAlphaMin;
|
|
151
152
|
private _viewProjInv;
|
|
153
|
+
private _projectionInv;
|
|
152
154
|
private _cameraWorld;
|
|
153
155
|
private _apertureRadius;
|
|
154
156
|
private _focusDistance;
|
|
@@ -160,7 +162,8 @@ declare class WGPURayTracePass {
|
|
|
160
162
|
private _depthTracePipeline?;
|
|
161
163
|
private _depthPipeline?;
|
|
162
164
|
private _shaderCache;
|
|
163
|
-
private
|
|
165
|
+
private _bvhCPU?;
|
|
166
|
+
private _bvhDataBytes;
|
|
164
167
|
private _bakePipelineConstants;
|
|
165
168
|
constructor(device: GPUDevice, _textureSelection?: MaterialTextureSelection);
|
|
166
169
|
getOutputBuffer(): {
|
|
@@ -198,9 +201,14 @@ declare class WGPURayTracePass {
|
|
|
198
201
|
private _pumpCompiles;
|
|
199
202
|
private _requestQueuedCompile;
|
|
200
203
|
private _prepareAovPipelines;
|
|
201
|
-
prepareAovs(kinds: readonly AovKind[]): boolean;
|
|
202
|
-
renderAovs(state: WGPUAov, camera: Camera, samples: number, cap: number, kinds: readonly AovKind[]
|
|
203
|
-
|
|
204
|
+
prepareAovs(kinds: readonly AovKind[], compact?: boolean): boolean;
|
|
205
|
+
renderAovs(state: WGPUAov, camera: Camera, samples: number, cap: number, kinds: readonly AovKind[], resolution?: {
|
|
206
|
+
width: number;
|
|
207
|
+
height: number;
|
|
208
|
+
}): boolean;
|
|
209
|
+
pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
|
|
210
|
+
readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
|
|
211
|
+
private _readDepthSamples;
|
|
204
212
|
/** Whether the latest request waits on GPU work that will settle on its own. */
|
|
205
213
|
isCompilingShader(): boolean;
|
|
206
214
|
isPipelineReady(): boolean;
|
|
@@ -266,6 +274,7 @@ declare class WGPURayTracePass {
|
|
|
266
274
|
height: number;
|
|
267
275
|
data: Float32Array;
|
|
268
276
|
}): void;
|
|
277
|
+
private _shareSpectralPrefix;
|
|
269
278
|
setQuality(options: {
|
|
270
279
|
bounces: number;
|
|
271
280
|
bevel: boolean;
|
|
@@ -287,8 +296,12 @@ declare class WGPURayTracePass {
|
|
|
287
296
|
private _updateLightSamplingData;
|
|
288
297
|
/** Uploads the combined TLAS/BLAS buffer and the instance records. */
|
|
289
298
|
private _uploadBVH;
|
|
299
|
+
private _uploadBVHBlocks;
|
|
300
|
+
private _writeBVH;
|
|
290
301
|
private _updateMeshData;
|
|
291
302
|
private _updateMaterialConstants;
|
|
303
|
+
private _packTriangleMaterials;
|
|
304
|
+
private _refreshTriangleMaterials;
|
|
292
305
|
private _updateGeometryData;
|
|
293
306
|
private _updateMaterialData;
|
|
294
307
|
/** Rebuilds only instance acceleration data for a cached mesh subset. */
|