@meimu/mutracer 0.0.0-stage → 0.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/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
- package/LICENSES/GlMatrix-MIT.txt +19 -0
- package/LICENSES/KinoBloom-MIT.txt +21 -0
- package/LICENSES/OIDNWeb-MIT.txt +21 -0
- package/LICENSES/Octicons-MIT.txt +21 -0
- package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
- package/LICENSES/TinyBVH-MIT.txt +21 -0
- package/LICENSES/WebGPUUtils-MIT.txt +21 -0
- package/LICENSES/ZetaRay-MIT.txt +21 -0
- package/README.md +195 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14352 -0
- package/docs/api.md +394 -0
- package/docs/bvh.md +141 -0
- package/docs/denoising.md +301 -0
- package/docs/getting-started.md +308 -0
- package/docs/materials.md +281 -0
- package/docs/performance.md +85 -0
- package/docs/post-processing.md +87 -0
- package/docs/progressive-rendering.md +144 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +273 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +121 -0
- package/lib/Display.js.map +1 -0
- package/lib/Engine.d.ts +161 -0
- package/lib/Engine.js +681 -0
- package/lib/Engine.js.map +1 -0
- package/lib/Render.d.ts +256 -0
- package/lib/Render.js +671 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +76 -0
- package/lib/RenderLoop.js +204 -0
- package/lib/RenderLoop.js.map +1 -0
- package/lib/Sync.d.ts +19 -0
- package/lib/Sync.js +19 -0
- package/lib/Sync.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +3 -0
- package/lib/constants.js.map +1 -0
- package/lib/main.d.ts +56 -0
- package/lib/main.js +43 -0
- package/lib/main.js.map +1 -0
- package/lib/math.d.ts +23 -0
- package/lib/math.js +56 -0
- package/lib/math.js.map +1 -0
- package/lib/oidn.d.ts +45 -0
- package/lib/oidn.js +42 -0
- package/lib/oidn.js.map +1 -0
- package/lib/oidnBundledWeights.cdn.d.ts +2 -0
- package/lib/oidnBundledWeights.cdn.js +5 -0
- package/lib/oidnBundledWeights.cdn.js.map +1 -0
- package/lib/oidnBundledWeights.d.ts +2 -0
- package/lib/oidnBundledWeights.js +4 -0
- package/lib/oidnBundledWeights.js.map +1 -0
- package/lib/renderer/DisplayPostProcess.d.ts +14 -0
- package/lib/renderer/DisplayPostProcess.js +41 -0
- package/lib/renderer/DisplayPostProcess.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +119 -0
- package/lib/renderer/MaterialTable.js +550 -0
- package/lib/renderer/MaterialTable.js.map +1 -0
- package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
- package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
- package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
- package/lib/renderer/RenderingPipeline.d.ts +232 -0
- package/lib/renderer/RenderingPipeline.js +18 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -0
- package/lib/renderer/ScratchPool.d.ts +13 -0
- package/lib/renderer/ScratchPool.js +21 -0
- package/lib/renderer/ScratchPool.js.map +1 -0
- package/lib/renderer/TileRender.d.ts +44 -0
- package/lib/renderer/TileRender.js +283 -0
- package/lib/renderer/TileRender.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.d.ts +17 -0
- package/lib/renderer/WGPUBloomPass.js +243 -0
- package/lib/renderer/WGPUBloomPass.js.map +1 -0
- package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
- package/lib/renderer/WGPUCanvasSurface.js +48 -0
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +73 -0
- package/lib/renderer/WGPUComputePass.js +317 -0
- package/lib/renderer/WGPUComputePass.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
- package/lib/renderer/WGPUFullQuadPass.js +389 -0
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
- package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
- package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
- package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
- package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
- package/lib/renderer/WGPURayTraceOutput.js +368 -0
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
- package/lib/renderer/WGPURayTracePass.d.ts +284 -0
- package/lib/renderer/WGPURayTracePass.js +2323 -0
- package/lib/renderer/WGPURayTracePass.js.map +1 -0
- package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
- package/lib/renderer/WGPURenderingPipeline.js +1446 -0
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
- package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
- package/lib/renderer/WGPUSceneFeatures.js +20 -0
- package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
- package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
- package/lib/renderer/WGPUScratchBuffer.js +21 -0
- package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
- package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
- package/lib/renderer/WGPUScratchTexture.js +27 -0
- package/lib/renderer/WGPUScratchTexture.js.map +1 -0
- package/lib/renderer/WGPUShaderCache.d.ts +26 -0
- package/lib/renderer/WGPUShaderCache.js +103 -0
- package/lib/renderer/WGPUShaderCache.js.map +1 -0
- package/lib/renderer/WebGLBloomPass.d.ts +18 -0
- package/lib/renderer/WebGLBloomPass.js +113 -0
- package/lib/renderer/WebGLBloomPass.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
- package/lib/renderer/WebGLFullQuadPass.js +208 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
- package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
- package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
- package/lib/renderer/WebGLRayTracePass.js +845 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -0
- package/lib/renderer/WebGLReadback.d.ts +4 -0
- package/lib/renderer/WebGLReadback.js +75 -0
- package/lib/renderer/WebGLReadback.js.map +1 -0
- package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
- package/lib/renderer/WebGLRenderingPipeline.js +510 -0
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
- package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
- package/lib/renderer/WebGLScratchCopy.js +27 -0
- package/lib/renderer/WebGLScratchCopy.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +26 -0
- package/lib/renderer/accumulationTarget.js +2 -0
- package/lib/renderer/accumulationTarget.js.map +1 -0
- package/lib/renderer/binnedSahBvh.d.ts +31 -0
- package/lib/renderer/binnedSahBvh.js +263 -0
- package/lib/renderer/binnedSahBvh.js.map +1 -0
- package/lib/renderer/bvh.worker.d.ts +1 -0
- package/lib/renderer/bvh.worker.js +16 -0
- package/lib/renderer/bvh.worker.js.map +1 -0
- package/lib/renderer/bvhAccel.d.ts +81 -0
- package/lib/renderer/bvhAccel.js +621 -0
- package/lib/renderer/bvhAccel.js.map +1 -0
- package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
- package/lib/renderer/bvhWorkerBuild.js +17 -0
- package/lib/renderer/bvhWorkerBuild.js.map +1 -0
- package/lib/renderer/bvhWorkerClient.d.ts +57 -0
- package/lib/renderer/bvhWorkerClient.js +166 -0
- package/lib/renderer/bvhWorkerClient.js.map +1 -0
- package/lib/renderer/cameraLens.d.ts +5 -0
- package/lib/renderer/cameraLens.js +15 -0
- package/lib/renderer/cameraLens.js.map +1 -0
- package/lib/renderer/cameraSnapshot.d.ts +3 -0
- package/lib/renderer/cameraSnapshot.js +7 -0
- package/lib/renderer/cameraSnapshot.js.map +1 -0
- package/lib/renderer/committedScene.d.ts +13 -0
- package/lib/renderer/committedScene.js +121 -0
- package/lib/renderer/committedScene.js.map +1 -0
- package/lib/renderer/dataTextureUtil.d.ts +32 -0
- package/lib/renderer/dataTextureUtil.js +46 -0
- package/lib/renderer/dataTextureUtil.js.map +1 -0
- package/lib/renderer/denoiser.d.ts +65 -0
- package/lib/renderer/denoiser.js +2 -0
- package/lib/renderer/denoiser.js.map +1 -0
- package/lib/renderer/depthQuery.d.ts +14 -0
- package/lib/renderer/depthQuery.js +14 -0
- package/lib/renderer/depthQuery.js.map +1 -0
- package/lib/renderer/deviceRequirements.d.ts +23 -0
- package/lib/renderer/deviceRequirements.js +50 -0
- package/lib/renderer/deviceRequirements.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +10 -0
- package/lib/renderer/envMapCreation.js +96 -0
- package/lib/renderer/envMapCreation.js.map +1 -0
- package/lib/renderer/envMapDistribution.d.ts +9 -0
- package/lib/renderer/envMapDistribution.js +107 -0
- package/lib/renderer/envMapDistribution.js.map +1 -0
- package/lib/renderer/float16.d.ts +1 -0
- package/lib/renderer/float16.js +19 -0
- package/lib/renderer/float16.js.map +1 -0
- package/lib/renderer/geometryBvh.d.ts +11 -0
- package/lib/renderer/geometryBvh.js +24 -0
- package/lib/renderer/geometryBvh.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +28 -0
- package/lib/renderer/geometryUpdates.js +131 -0
- package/lib/renderer/geometryUpdates.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
- package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
- package/lib/renderer/glsl/depthQuery.frag.js +55 -0
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
- package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/rayTrace.frag.js +619 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
- package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
- package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
- package/lib/renderer/gpuMemory.d.ts +2 -0
- package/lib/renderer/gpuMemory.js +10 -0
- package/lib/renderer/gpuMemory.js.map +1 -0
- package/lib/renderer/halton.d.ts +1 -0
- package/lib/renderer/halton.js +15 -0
- package/lib/renderer/halton.js.map +1 -0
- package/lib/renderer/jnlm.d.ts +85 -0
- package/lib/renderer/jnlm.js +87 -0
- package/lib/renderer/jnlm.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +75 -0
- package/lib/renderer/lightSampling.js +305 -0
- package/lib/renderer/lightSampling.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +26 -0
- package/lib/renderer/lightsUtil.js +154 -0
- package/lib/renderer/lightsUtil.js.map +1 -0
- package/lib/renderer/materialChanges.d.ts +13 -0
- package/lib/renderer/materialChanges.js +59 -0
- package/lib/renderer/materialChanges.js.map +1 -0
- package/lib/renderer/materialComparison.generated.d.ts +5 -0
- package/lib/renderer/materialComparison.generated.js +655 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +6 -0
- package/lib/renderer/materialConstants.js +3 -0
- package/lib/renderer/materialConstants.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +9 -0
- package/lib/renderer/materialEmission.js +21 -0
- package/lib/renderer/materialEmission.js.map +1 -0
- package/lib/renderer/materialIndices.d.ts +7 -0
- package/lib/renderer/materialIndices.js +34 -0
- package/lib/renderer/materialIndices.js.map +1 -0
- package/lib/renderer/materialLayout.d.ts +102 -0
- package/lib/renderer/materialLayout.js +189 -0
- package/lib/renderer/materialLayout.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +537 -0
- package/lib/renderer/materialTextureSlots.js +219 -0
- package/lib/renderer/materialTextureSlots.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
- package/lib/renderer/mergeMeshesToGeometry.js +236 -0
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
- package/lib/renderer/meshInstances.d.ts +23 -0
- package/lib/renderer/meshInstances.js +66 -0
- package/lib/renderer/meshInstances.js.map +1 -0
- package/lib/renderer/meshMembership.d.ts +10 -0
- package/lib/renderer/meshMembership.js +72 -0
- package/lib/renderer/meshMembership.js.map +1 -0
- package/lib/renderer/oidnNetwork.d.ts +20 -0
- package/lib/renderer/oidnNetwork.js +123 -0
- package/lib/renderer/oidnNetwork.js.map +1 -0
- package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
- package/lib/renderer/openPbrEnergyLut.js +965 -0
- package/lib/renderer/openPbrEnergyLut.js.map +1 -0
- package/lib/renderer/pathLimits.d.ts +4 -0
- package/lib/renderer/pathLimits.js +7 -0
- package/lib/renderer/pathLimits.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +110 -0
- package/lib/renderer/prepareMeshBVH.js +857 -0
- package/lib/renderer/prepareMeshBVH.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +11 -0
- package/lib/renderer/progressiveScheduler.js +19 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -0
- package/lib/renderer/renderPipeline.d.ts +57 -0
- package/lib/renderer/renderPipeline.js +49 -0
- package/lib/renderer/renderPipeline.js.map +1 -0
- package/lib/renderer/sampling.d.ts +10 -0
- package/lib/renderer/sampling.js +28 -0
- package/lib/renderer/sampling.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +29 -0
- package/lib/renderer/sceneChangeDetector.js +232 -0
- package/lib/renderer/sceneChangeDetector.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +14 -0
- package/lib/renderer/sceneLightChanges.js +34 -0
- package/lib/renderer/sceneLightChanges.js.map +1 -0
- package/lib/renderer/scratchSampling.d.ts +3 -0
- package/lib/renderer/scratchSampling.js +39 -0
- package/lib/renderer/scratchSampling.js.map +1 -0
- package/lib/renderer/shader.d.ts +37 -0
- package/lib/renderer/shader.js +41 -0
- package/lib/renderer/shader.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +24 -0
- package/lib/renderer/staticBvhPreparation.js +116 -0
- package/lib/renderer/staticBvhPreparation.js.map +1 -0
- package/lib/renderer/textureRegion.d.ts +8 -0
- package/lib/renderer/textureRegion.js +9 -0
- package/lib/renderer/textureRegion.js.map +1 -0
- package/lib/renderer/texturesFromMaterials.d.ts +6 -0
- package/lib/renderer/texturesFromMaterials.js +37 -0
- package/lib/renderer/texturesFromMaterials.js.map +1 -0
- package/lib/renderer/util.d.ts +17 -0
- package/lib/renderer/util.js +56 -0
- package/lib/renderer/util.js.map +1 -0
- package/lib/renderer/webgl.d.ts +131 -0
- package/lib/renderer/webgl.js +586 -0
- package/lib/renderer/webgl.js.map +1 -0
- package/lib/renderer/webglShaders.d.ts +4 -0
- package/lib/renderer/webglShaders.js +41 -0
- package/lib/renderer/webglShaders.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
- package/lib/scene/AmbientLight.d.ts +17 -0
- package/lib/scene/AmbientLight.js +15 -0
- package/lib/scene/AmbientLight.js.map +1 -0
- package/lib/scene/Camera.d.ts +78 -0
- package/lib/scene/Camera.js +111 -0
- package/lib/scene/Camera.js.map +1 -0
- package/lib/scene/DirectionalLight.d.ts +18 -0
- package/lib/scene/DirectionalLight.js +17 -0
- package/lib/scene/DirectionalLight.js.map +1 -0
- package/lib/scene/EnvironmentLight.d.ts +14 -0
- package/lib/scene/EnvironmentLight.js +14 -0
- package/lib/scene/EnvironmentLight.js.map +1 -0
- package/lib/scene/Geometry.d.ts +87 -0
- package/lib/scene/Geometry.js +108 -0
- package/lib/scene/Geometry.js.map +1 -0
- package/lib/scene/IESProfile.d.ts +19 -0
- package/lib/scene/IESProfile.js +165 -0
- package/lib/scene/IESProfile.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +43 -0
- package/lib/scene/InstancedMesh.js +79 -0
- package/lib/scene/InstancedMesh.js.map +1 -0
- package/lib/scene/Mesh.d.ts +14 -0
- package/lib/scene/Mesh.js +17 -0
- package/lib/scene/Mesh.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +224 -0
- package/lib/scene/OpenPBRMaterial.js +240 -0
- package/lib/scene/OpenPBRMaterial.js.map +1 -0
- package/lib/scene/RectLight.d.ts +31 -0
- package/lib/scene/RectLight.js +26 -0
- package/lib/scene/RectLight.js.map +1 -0
- package/lib/scene/Scene.d.ts +55 -0
- package/lib/scene/Scene.js +2 -0
- package/lib/scene/Scene.js.map +1 -0
- package/lib/scene/SceneNode.d.ts +16 -0
- package/lib/scene/SceneNode.js +33 -0
- package/lib/scene/SceneNode.js.map +1 -0
- package/lib/scene/SphereLight.d.ts +22 -0
- package/lib/scene/SphereLight.js +20 -0
- package/lib/scene/SphereLight.js.map +1 -0
- package/lib/scene/SpotLight.d.ts +35 -0
- package/lib/scene/SpotLight.js +29 -0
- package/lib/scene/SpotLight.js.map +1 -0
- package/lib/scene/Texture.d.ts +38 -0
- package/lib/scene/Texture.js +37 -0
- package/lib/scene/Texture.js.map +1 -0
- package/lib/scene/anisotropyParameters.d.ts +1 -0
- package/lib/scene/anisotropyParameters.js +13 -0
- package/lib/scene/anisotropyParameters.js.map +1 -0
- package/lib/scene/geometryChanges.d.ts +5 -0
- package/lib/scene/geometryChanges.js +18 -0
- package/lib/scene/geometryChanges.js.map +1 -0
- package/lib/scene/materialTextureNames.d.ts +2 -0
- package/lib/scene/materialTextureNames.js +9 -0
- package/lib/scene/materialTextureNames.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +400 -0
- package/lib/scene/openPbrSchema.js +149 -0
- package/lib/scene/openPbrSchema.js.map +1 -0
- package/lib/scene/thinFilmParameters.d.ts +4 -0
- package/lib/scene/thinFilmParameters.js +12 -0
- package/lib/scene/thinFilmParameters.js.map +1 -0
- package/lib/settings/display.d.ts +118 -0
- package/lib/settings/display.js +34 -0
- package/lib/settings/display.js.map +1 -0
- package/lib/settings/engine.d.ts +37 -0
- package/lib/settings/engine.js +26 -0
- package/lib/settings/engine.js.map +1 -0
- package/lib/settings/render.d.ts +178 -0
- package/lib/settings/render.js +36 -0
- package/lib/settings/render.js.map +1 -0
- package/lib/tinybvh/LICENSE +21 -0
- package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
- package/lib/tinybvh/TinyBvhBuilder.js +211 -0
- package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util/canvas.d.ts +2 -0
- package/lib/util/canvas.js +13 -0
- package/lib/util/canvas.js.map +1 -0
- package/lib/util/commonGeometry.d.ts +15 -0
- package/lib/util/commonGeometry.js +240 -0
- package/lib/util/commonGeometry.js.map +1 -0
- package/lib/util/events.d.ts +7 -0
- package/lib/util/events.js +23 -0
- package/lib/util/events.js.map +1 -0
- package/lib/util/frame.d.ts +2 -0
- package/lib/util/frame.js +10 -0
- package/lib/util/frame.js.map +1 -0
- package/lib/util/fromTHREE.d.ts +100 -0
- package/lib/util/fromTHREE.js +1063 -0
- package/lib/util/fromTHREE.js.map +1 -0
- package/lib/util/geometry.d.ts +13 -0
- package/lib/util/geometry.js +292 -0
- package/lib/util/geometry.js.map +1 -0
- package/lib/util/loadRGBE.d.ts +7 -0
- package/lib/util/loadRGBE.js +168 -0
- package/lib/util/loadRGBE.js.map +1 -0
- package/lib/util/math.d.ts +8 -0
- package/lib/util/math.js +64 -0
- package/lib/util/math.js.map +1 -0
- package/lib/util/mesh.d.ts +7 -0
- package/lib/util/mesh.js +20 -0
- package/lib/util/mesh.js.map +1 -0
- package/lib/util/threeDeformation.d.ts +20 -0
- package/lib/util/threeDeformation.js +218 -0
- package/lib/util/threeDeformation.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +3 -0
- package/lib/version.js.map +1 -0
- package/llms.txt +62 -0
- package/oidn/weights/LICENSE.txt +202 -0
- package/oidn/weights/README.md +43 -0
- package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
- package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
- package/package.json +124 -4
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
2
|
+
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
|
+
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
|
+
import { clamp } from './util.js';
|
|
5
|
+
// TileRender is based on the concept of a compute shader's work group.
|
|
6
|
+
// Path tracing the scene can be very slow (<1 fps).
|
|
7
|
+
// This overworks the GPU and tends to lock up the OS, making it unresponsive.
|
|
8
|
+
// To fix this, we can split the screen into smaller tiles, and sample the scene one tile at a time
|
|
9
|
+
// The tile size is set such that each tile takes approximately a constant amount of time to render.
|
|
10
|
+
// Since the render time of a tile is dependent on the device, we find the desired tile dimensions by measuring
|
|
11
|
+
// the time it takes to render an arbitrarily-set tile size and adjusting the size according to the benchmark.
|
|
12
|
+
export function makeTileRender(gl) {
|
|
13
|
+
let desiredMsPerTile = 21;
|
|
14
|
+
let maxNumTiles = Infinity;
|
|
15
|
+
let currentTile = -1;
|
|
16
|
+
let numTiles = 1;
|
|
17
|
+
let numSamples = 1;
|
|
18
|
+
let tileWidth;
|
|
19
|
+
let tileHeight;
|
|
20
|
+
let columns;
|
|
21
|
+
let rows;
|
|
22
|
+
let width = 0;
|
|
23
|
+
let height = 0;
|
|
24
|
+
let totalElapsedMs = 0;
|
|
25
|
+
let timedTiles = 0;
|
|
26
|
+
// initial number of pixels per rendered tile
|
|
27
|
+
// based on correlation between system performance and max supported render buffer size
|
|
28
|
+
// adjusted dynamically according to system performance
|
|
29
|
+
let pixelsPerTile = gl ? pixelsPerTileEstimate(gl) : 600000;
|
|
30
|
+
function reset() {
|
|
31
|
+
currentTile = -1;
|
|
32
|
+
totalElapsedMs = 0;
|
|
33
|
+
timedTiles = 0;
|
|
34
|
+
}
|
|
35
|
+
function setSize(w, h) {
|
|
36
|
+
width = w;
|
|
37
|
+
height = h;
|
|
38
|
+
reset();
|
|
39
|
+
calcTileDimensions();
|
|
40
|
+
}
|
|
41
|
+
function calcTileDimensions() {
|
|
42
|
+
const maxWidth = 3000;
|
|
43
|
+
const aspectRatio = width / height;
|
|
44
|
+
// quantize the width of the tile so that it evenly divides the entire window
|
|
45
|
+
tileWidth = Math.ceil(maxWidth /
|
|
46
|
+
Math.max(Math.round(maxWidth / Math.sqrt(pixelsPerTile * aspectRatio)), 1));
|
|
47
|
+
tileHeight = Math.ceil(tileWidth / aspectRatio);
|
|
48
|
+
if (tileWidth > width && tileHeight > height) {
|
|
49
|
+
columns = 1;
|
|
50
|
+
rows = 1;
|
|
51
|
+
numTiles = 1;
|
|
52
|
+
numSamples =
|
|
53
|
+
Math.round(tileWidth / width) * Math.round(tileHeight / height);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
numSamples = 1;
|
|
57
|
+
columns = Math.ceil(width / tileWidth);
|
|
58
|
+
rows = Math.ceil(height / tileHeight);
|
|
59
|
+
numTiles = columns * rows;
|
|
60
|
+
}
|
|
61
|
+
if (numTiles > maxNumTiles) {
|
|
62
|
+
// TODO maxNumTiles is not exact value.
|
|
63
|
+
numTiles = maxNumTiles;
|
|
64
|
+
columns = Math.ceil(Math.sqrt(numTiles));
|
|
65
|
+
rows = Math.ceil(numTiles / columns);
|
|
66
|
+
numTiles = columns * rows;
|
|
67
|
+
tileWidth = Math.ceil(width / columns);
|
|
68
|
+
tileHeight = Math.ceil(height / rows);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function updatePixelsPerTile() {
|
|
72
|
+
const msPerTile = totalElapsedMs / timedTiles;
|
|
73
|
+
const error = desiredMsPerTile - msPerTile;
|
|
74
|
+
// tweak to find balance. higher = faster convergence, lower = less fluctuations to microstutters
|
|
75
|
+
const strength = 5000;
|
|
76
|
+
// sqrt prevents massive fluctuations in pixelsPerTile for the occasional stutter
|
|
77
|
+
pixelsPerTile += strength * Math.sign(error) * Math.sqrt(Math.abs(error));
|
|
78
|
+
pixelsPerTile = Math.max(pixelsPerTile, 8192);
|
|
79
|
+
}
|
|
80
|
+
function nextTile(elapsedFrameMs) {
|
|
81
|
+
// The supplied time belongs to the previous tile. After a reset it may
|
|
82
|
+
// instead describe scene preparation, compilation, or the previous view.
|
|
83
|
+
if (currentTile >= 0 && elapsedFrameMs != null &&
|
|
84
|
+
Number.isFinite(elapsedFrameMs) && elapsedFrameMs > 0) {
|
|
85
|
+
totalElapsedMs += elapsedFrameMs;
|
|
86
|
+
timedTiles++;
|
|
87
|
+
}
|
|
88
|
+
currentTile++;
|
|
89
|
+
if (currentTile % numTiles === 0) {
|
|
90
|
+
if (timedTiles) {
|
|
91
|
+
updatePixelsPerTile();
|
|
92
|
+
calcTileDimensions();
|
|
93
|
+
}
|
|
94
|
+
totalElapsedMs = 0;
|
|
95
|
+
timedTiles = 0;
|
|
96
|
+
currentTile = 0;
|
|
97
|
+
}
|
|
98
|
+
const isLastTile = currentTile === numTiles - 1;
|
|
99
|
+
const x = currentTile % columns;
|
|
100
|
+
const y = Math.floor(currentTile / columns) % rows;
|
|
101
|
+
return {
|
|
102
|
+
xIndex: x,
|
|
103
|
+
yIndex: y,
|
|
104
|
+
columns,
|
|
105
|
+
rows,
|
|
106
|
+
x: x * tileWidth,
|
|
107
|
+
y: y * tileHeight,
|
|
108
|
+
tileWidth,
|
|
109
|
+
tileHeight,
|
|
110
|
+
isFirstTile: currentTile === 0,
|
|
111
|
+
isLastTile,
|
|
112
|
+
samplesPerFrame: numSamples
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
nextTile,
|
|
117
|
+
reset,
|
|
118
|
+
setSize,
|
|
119
|
+
setMaxTiles(maxTiles) {
|
|
120
|
+
maxNumTiles = maxTiles;
|
|
121
|
+
},
|
|
122
|
+
setDesiredMsPerTile(time) {
|
|
123
|
+
desiredMsPerTile = time;
|
|
124
|
+
},
|
|
125
|
+
getDesiredMsPerTile() {
|
|
126
|
+
return desiredMsPerTile;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function getPredictResult(width, height, lastTraceTime, expectFrameTime, tilePixels, maxNumTiles) {
|
|
131
|
+
const maxTileSize = [width, height];
|
|
132
|
+
const rawCount = lastTraceTime > 0 ? expectFrameTime / lastTraceTime : 1;
|
|
133
|
+
// GPU cost is not perfectly linear with tile area: tiny probes include fixed
|
|
134
|
+
// dispatch overhead, while very large tiles can hit cache and divergence
|
|
135
|
+
// cliffs. Limit each update to 2x per dimension so prediction converges in a
|
|
136
|
+
// few samples without jumping from the probe straight to a blocking 4K tile.
|
|
137
|
+
const count = clamp(rawCount, 0.25, 4);
|
|
138
|
+
const wScale = Math.sqrt(count);
|
|
139
|
+
const hScale = count / wScale;
|
|
140
|
+
let newTileWidth = Math.ceil(wScale * tilePixels[0]);
|
|
141
|
+
let newTileHeight = Math.ceil(hScale * tilePixels[1]);
|
|
142
|
+
let samplesPerFrame = 1;
|
|
143
|
+
if (newTileWidth > maxTileSize[0] * 2) {
|
|
144
|
+
samplesPerFrame *= Math.floor(newTileWidth / maxTileSize[0]);
|
|
145
|
+
}
|
|
146
|
+
newTileWidth = Math.min(newTileWidth, maxTileSize[0]);
|
|
147
|
+
if (newTileHeight > maxTileSize[1] * 2) {
|
|
148
|
+
samplesPerFrame *= Math.floor(newTileHeight / maxTileSize[1]);
|
|
149
|
+
}
|
|
150
|
+
newTileHeight = Math.min(newTileHeight, maxTileSize[1]);
|
|
151
|
+
let newColumns = Math.round(width / newTileWidth);
|
|
152
|
+
let newRows = Math.round(height / newTileHeight);
|
|
153
|
+
newTileWidth = Math.ceil(width / newColumns);
|
|
154
|
+
newTileHeight = Math.ceil(height / newRows);
|
|
155
|
+
let newNumTiles = newRows * newColumns;
|
|
156
|
+
if (newNumTiles > maxNumTiles) {
|
|
157
|
+
newNumTiles = maxNumTiles;
|
|
158
|
+
newColumns = Math.ceil(Math.sqrt(newNumTiles));
|
|
159
|
+
newRows = Math.ceil(newNumTiles / newColumns);
|
|
160
|
+
newNumTiles = newColumns * newRows;
|
|
161
|
+
newTileWidth = Math.ceil(width / newColumns);
|
|
162
|
+
newTileHeight = Math.ceil(height / newRows);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
tileWidth: newTileWidth,
|
|
166
|
+
tileHeight: newTileHeight,
|
|
167
|
+
columns: newColumns,
|
|
168
|
+
rows: newRows,
|
|
169
|
+
numTiles: newNumTiles,
|
|
170
|
+
samplesPerFrame
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// A 64x64 probe is dominated by dispatch and timestamp overhead on modern
|
|
174
|
+
// GPUs. At 4K it also leads to an extremely conservative first prediction.
|
|
175
|
+
// Use a still-small but representative amount of work, shaped like the frame.
|
|
176
|
+
const initialProbePixels = 262144;
|
|
177
|
+
function getInitialProbeSize(width, height) {
|
|
178
|
+
const aspectRatio = width > 0 && height > 0 ? width / height : 1;
|
|
179
|
+
return [
|
|
180
|
+
Math.min(width, Math.max(1, Math.round(Math.sqrt(initialProbePixels * aspectRatio)))),
|
|
181
|
+
Math.min(height, Math.max(1, Math.round(Math.sqrt(initialProbePixels / aspectRatio))))
|
|
182
|
+
];
|
|
183
|
+
}
|
|
184
|
+
export function makeTileRenderWithPredict() {
|
|
185
|
+
let numTiles = 1;
|
|
186
|
+
let currentTile = -1;
|
|
187
|
+
let lastTraceTime = -1;
|
|
188
|
+
let lastFrameTotalTraceTime = 0;
|
|
189
|
+
let lastFrameTraceTimeValidCount = 0;
|
|
190
|
+
let tilePixels = [64, 64];
|
|
191
|
+
let width = 0;
|
|
192
|
+
let height = 0;
|
|
193
|
+
let expectFrameTime = 0;
|
|
194
|
+
// Calcualate
|
|
195
|
+
let tileWidth = 0;
|
|
196
|
+
let tileHeight = 0;
|
|
197
|
+
let samplesPerFrame = 1;
|
|
198
|
+
let columns = 0;
|
|
199
|
+
let rows = 0;
|
|
200
|
+
let maxNumTiles = Infinity;
|
|
201
|
+
function nextTile() {
|
|
202
|
+
currentTile++;
|
|
203
|
+
const avgTileTime = lastFrameTraceTimeValidCount > 0
|
|
204
|
+
? lastFrameTotalTraceTime / lastFrameTraceTimeValidCount
|
|
205
|
+
: lastTraceTime;
|
|
206
|
+
if (currentTile % numTiles === 0) {
|
|
207
|
+
currentTile = 0;
|
|
208
|
+
}
|
|
209
|
+
if (currentTile === 0) {
|
|
210
|
+
const result = getPredictResult(width, height, avgTileTime, expectFrameTime, lastTraceTime >= 0 ? tilePixels : getInitialProbeSize(width, height), maxNumTiles);
|
|
211
|
+
lastFrameTotalTraceTime = 0;
|
|
212
|
+
lastFrameTraceTimeValidCount = 0;
|
|
213
|
+
tileWidth = result.tileWidth;
|
|
214
|
+
tileHeight = result.tileHeight;
|
|
215
|
+
columns = result.columns;
|
|
216
|
+
rows = result.rows;
|
|
217
|
+
numTiles = result.numTiles;
|
|
218
|
+
samplesPerFrame = result.samplesPerFrame;
|
|
219
|
+
}
|
|
220
|
+
const x = currentTile % columns;
|
|
221
|
+
const y = Math.floor(currentTile / columns) % rows;
|
|
222
|
+
const isLastTile = currentTile === numTiles - 1;
|
|
223
|
+
tilePixels = [tileWidth, tileHeight];
|
|
224
|
+
return {
|
|
225
|
+
xIndex: x,
|
|
226
|
+
yIndex: y,
|
|
227
|
+
columns,
|
|
228
|
+
rows,
|
|
229
|
+
x: x * tileWidth,
|
|
230
|
+
y: y * tileHeight,
|
|
231
|
+
tileWidth,
|
|
232
|
+
tileHeight,
|
|
233
|
+
isFirstTile: currentTile === 0,
|
|
234
|
+
isLastTile,
|
|
235
|
+
samplesPerFrame
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
nextTile,
|
|
240
|
+
reset() {
|
|
241
|
+
currentTile = -1;
|
|
242
|
+
},
|
|
243
|
+
setSize(w, h) {
|
|
244
|
+
width = w;
|
|
245
|
+
height = h;
|
|
246
|
+
},
|
|
247
|
+
setMaxTiles(maxTiles) {
|
|
248
|
+
maxNumTiles = maxTiles;
|
|
249
|
+
},
|
|
250
|
+
setDesiredMsPerTile(time) {
|
|
251
|
+
expectFrameTime = time;
|
|
252
|
+
},
|
|
253
|
+
needsUpdatePredicting() {
|
|
254
|
+
lastTraceTime = -1;
|
|
255
|
+
lastFrameTotalTraceTime = 0;
|
|
256
|
+
lastFrameTraceTimeValidCount = 0;
|
|
257
|
+
},
|
|
258
|
+
setLastTraceTime(time) {
|
|
259
|
+
lastTraceTime = time;
|
|
260
|
+
lastFrameTraceTimeValidCount++;
|
|
261
|
+
lastFrameTotalTraceTime += time;
|
|
262
|
+
},
|
|
263
|
+
getLastTraceTime() {
|
|
264
|
+
return lastTraceTime;
|
|
265
|
+
},
|
|
266
|
+
getDesiredMsPerTile() {
|
|
267
|
+
return expectFrameTime;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function pixelsPerTileEstimate(gl) {
|
|
272
|
+
const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
|
|
273
|
+
if (maxRenderbufferSize <= 8192) {
|
|
274
|
+
return 200000;
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// 16K render targets are common on current desktop/integrated GPUs. The
|
|
278
|
+
// old 400K seed unnecessarily split even 720p into several tiles and took
|
|
279
|
+
// dozens of samples to grow to a full-frame tile.
|
|
280
|
+
return 1000000;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=TileRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TileRender.js","sourceRoot":"","sources":["../../src/renderer/TileRender.ts"],"names":[],"mappings":"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","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { clamp } from './util.js';\n\n// TileRender is based on the concept of a compute shader's work group.\n\n// Path tracing the scene can be very slow (<1 fps).\n// This overworks the GPU and tends to lock up the OS, making it unresponsive.\n\n// To fix this, we can split the screen into smaller tiles, and sample the scene one tile at a time\n// The tile size is set such that each tile takes approximately a constant amount of time to render.\n\n// Since the render time of a tile is dependent on the device, we find the desired tile dimensions by measuring\n// the time it takes to render an arbitrarily-set tile size and adjusting the size according to the benchmark.\n\nexport function makeTileRender(gl?: WebGL2RenderingContext) {\n let desiredMsPerTile = 21;\n let maxNumTiles = Infinity;\n\n let currentTile = -1;\n let numTiles = 1;\n let numSamples = 1;\n\n let tileWidth: number;\n let tileHeight: number;\n\n let columns: number;\n let rows: number;\n\n let width = 0;\n let height = 0;\n\n let totalElapsedMs = 0;\n let timedTiles = 0;\n\n // initial number of pixels per rendered tile\n // based on correlation between system performance and max supported render buffer size\n // adjusted dynamically according to system performance\n let pixelsPerTile = gl ? pixelsPerTileEstimate(gl) : 600000;\n\n function reset() {\n currentTile = -1;\n totalElapsedMs = 0;\n timedTiles = 0;\n }\n\n function setSize(w: number, h: number) {\n width = w;\n height = h;\n reset();\n calcTileDimensions();\n }\n\n function calcTileDimensions() {\n const maxWidth = 3000;\n const aspectRatio = width / height;\n\n // quantize the width of the tile so that it evenly divides the entire window\n tileWidth = Math.ceil(\n maxWidth /\n Math.max(\n Math.round(maxWidth / Math.sqrt(pixelsPerTile * aspectRatio)),\n 1\n )\n );\n tileHeight = Math.ceil(tileWidth / aspectRatio);\n\n if (tileWidth > width && tileHeight > height) {\n columns = 1;\n rows = 1;\n numTiles = 1;\n\n numSamples =\n Math.round(tileWidth / width) * Math.round(tileHeight / height);\n } else {\n numSamples = 1;\n\n columns = Math.ceil(width / tileWidth);\n rows = Math.ceil(height / tileHeight);\n numTiles = columns * rows;\n }\n\n if (numTiles > maxNumTiles) {\n // TODO maxNumTiles is not exact value.\n numTiles = maxNumTiles;\n columns = Math.ceil(Math.sqrt(numTiles));\n rows = Math.ceil(numTiles / columns);\n numTiles = columns * rows;\n tileWidth = Math.ceil(width / columns);\n tileHeight = Math.ceil(height / rows);\n }\n }\n\n function updatePixelsPerTile() {\n const msPerTile = totalElapsedMs / timedTiles;\n\n const error = desiredMsPerTile - msPerTile;\n\n // tweak to find balance. higher = faster convergence, lower = less fluctuations to microstutters\n const strength = 5000;\n\n // sqrt prevents massive fluctuations in pixelsPerTile for the occasional stutter\n pixelsPerTile += strength * Math.sign(error) * Math.sqrt(Math.abs(error));\n pixelsPerTile = Math.max(pixelsPerTile, 8192);\n }\n\n function nextTile(elapsedFrameMs?: number) {\n // The supplied time belongs to the previous tile. After a reset it may\n // instead describe scene preparation, compilation, or the previous view.\n if (\n currentTile >= 0 && elapsedFrameMs != null &&\n Number.isFinite(elapsedFrameMs) && elapsedFrameMs > 0\n ) {\n totalElapsedMs += elapsedFrameMs;\n timedTiles++;\n }\n currentTile++;\n\n if (currentTile % numTiles === 0) {\n if (timedTiles) {\n updatePixelsPerTile();\n calcTileDimensions();\n }\n\n totalElapsedMs = 0;\n timedTiles = 0;\n currentTile = 0;\n }\n\n const isLastTile = currentTile === numTiles - 1;\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame: numSamples\n };\n }\n\n return {\n nextTile,\n reset,\n setSize,\n setMaxTiles(maxTiles: number) {\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n desiredMsPerTile = time;\n },\n getDesiredMsPerTile() {\n return desiredMsPerTile;\n }\n };\n}\n\nfunction getPredictResult(\n width: number,\n height: number,\n lastTraceTime: number,\n expectFrameTime: number,\n tilePixels: number[],\n maxNumTiles: number\n) {\n const maxTileSize = [width, height];\n const rawCount = lastTraceTime > 0 ? expectFrameTime / lastTraceTime : 1;\n // GPU cost is not perfectly linear with tile area: tiny probes include fixed\n // dispatch overhead, while very large tiles can hit cache and divergence\n // cliffs. Limit each update to 2x per dimension so prediction converges in a\n // few samples without jumping from the probe straight to a blocking 4K tile.\n const count = clamp(rawCount, 0.25, 4);\n\n const wScale = Math.sqrt(count);\n const hScale = count / wScale;\n\n let newTileWidth = Math.ceil(wScale * tilePixels[0]);\n let newTileHeight = Math.ceil(hScale * tilePixels[1]);\n\n let samplesPerFrame = 1;\n if (newTileWidth > maxTileSize[0] * 2) {\n samplesPerFrame *= Math.floor(newTileWidth / maxTileSize[0]);\n }\n newTileWidth = Math.min(newTileWidth, maxTileSize[0]);\n if (newTileHeight > maxTileSize[1] * 2) {\n samplesPerFrame *= Math.floor(newTileHeight / maxTileSize[1]);\n }\n newTileHeight = Math.min(newTileHeight, maxTileSize[1]);\n\n let newColumns = Math.round(width / newTileWidth);\n let newRows = Math.round(height / newTileHeight);\n\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n\n let newNumTiles = newRows * newColumns;\n\n if (newNumTiles > maxNumTiles) {\n newNumTiles = maxNumTiles;\n newColumns = Math.ceil(Math.sqrt(newNumTiles));\n newRows = Math.ceil(newNumTiles / newColumns);\n newNumTiles = newColumns * newRows;\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n }\n\n return {\n tileWidth: newTileWidth,\n tileHeight: newTileHeight,\n columns: newColumns,\n rows: newRows,\n numTiles: newNumTiles,\n samplesPerFrame\n };\n}\n\n// A 64x64 probe is dominated by dispatch and timestamp overhead on modern\n// GPUs. At 4K it also leads to an extremely conservative first prediction.\n// Use a still-small but representative amount of work, shaped like the frame.\nconst initialProbePixels = 262144;\n\nfunction getInitialProbeSize(width: number, height: number) {\n const aspectRatio = width > 0 && height > 0 ? width / height : 1;\n return [\n Math.min(width, Math.max(1, Math.round(Math.sqrt(initialProbePixels * aspectRatio)))),\n Math.min(height, Math.max(1, Math.round(Math.sqrt(initialProbePixels / aspectRatio))))\n ];\n}\n\nexport function makeTileRenderWithPredict() {\n let numTiles = 1;\n let currentTile = -1;\n let lastTraceTime = -1;\n let lastFrameTotalTraceTime = 0;\n let lastFrameTraceTimeValidCount = 0;\n let tilePixels = [64, 64];\n let width = 0;\n let height = 0;\n let expectFrameTime = 0;\n\n // Calcualate\n let tileWidth = 0;\n let tileHeight = 0;\n let samplesPerFrame = 1;\n let columns = 0;\n let rows = 0;\n\n let maxNumTiles = Infinity;\n\n function nextTile() {\n currentTile++;\n const avgTileTime =\n lastFrameTraceTimeValidCount > 0\n ? lastFrameTotalTraceTime / lastFrameTraceTimeValidCount\n : lastTraceTime;\n\n if (currentTile % numTiles === 0) {\n currentTile = 0;\n }\n\n if (currentTile === 0) {\n const result = getPredictResult(\n width,\n height,\n avgTileTime,\n expectFrameTime,\n lastTraceTime >= 0 ? tilePixels : getInitialProbeSize(width, height),\n maxNumTiles\n );\n\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n tileWidth = result.tileWidth;\n tileHeight = result.tileHeight;\n columns = result.columns;\n rows = result.rows;\n numTiles = result.numTiles;\n samplesPerFrame = result.samplesPerFrame;\n }\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n const isLastTile = currentTile === numTiles - 1;\n\n tilePixels = [tileWidth, tileHeight];\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame\n };\n }\n\n return {\n nextTile,\n reset() {\n currentTile = -1;\n },\n setSize(w: number, h: number) {\n width = w;\n height = h;\n },\n setMaxTiles(maxTiles: number) {\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n expectFrameTime = time;\n },\n needsUpdatePredicting() {\n lastTraceTime = -1;\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n },\n setLastTraceTime(time: number) {\n lastTraceTime = time;\n lastFrameTraceTimeValidCount++;\n lastFrameTotalTraceTime += time;\n },\n getLastTraceTime() {\n return lastTraceTime;\n },\n getDesiredMsPerTile() {\n return expectFrameTime;\n }\n };\n}\n\nexport type TileRenderWithPredict = ReturnType<\n typeof makeTileRenderWithPredict\n>;\n\nfunction pixelsPerTileEstimate(gl: WebGL2RenderingContext) {\n const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);\n\n if (maxRenderbufferSize <= 8192) {\n return 200000;\n } else {\n // 16K render targets are common on current desktop/integrated GPUs. The\n // old 400K seed unnecessarily split even 720p into several tiles and took\n // dozens of samples to grow to a full-frame tile.\n return 1000000;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare class WGPUBloomPass {
|
|
2
|
+
private _brightPass;
|
|
3
|
+
private _downsamplePasses;
|
|
4
|
+
private _blurHPasses;
|
|
5
|
+
private _blurVPasses;
|
|
6
|
+
private _blendPasses;
|
|
7
|
+
constructor(device: GPUDevice);
|
|
8
|
+
reserveCapacity(): void;
|
|
9
|
+
setSize(width: number, height: number): void;
|
|
10
|
+
setBrightThreshold(threshold: number): void;
|
|
11
|
+
setRadius(radius: number): void;
|
|
12
|
+
createPass(encoder: GPUCommandEncoder, colorTex: GPUTexture): GPUTexture;
|
|
13
|
+
getMemoryBytes(): number;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
getOutput(): GPUTexture;
|
|
16
|
+
}
|
|
17
|
+
export default WGPUBloomPass;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { WGPUFullQuadPass } from './WGPUFullQuadPass.js';
|
|
2
|
+
const COUNT = 5;
|
|
3
|
+
const linearSamplerDescriptor = {
|
|
4
|
+
magFilter: 'linear',
|
|
5
|
+
minFilter: 'linear'
|
|
6
|
+
};
|
|
7
|
+
function createBrightPass(device) {
|
|
8
|
+
return new WGPUFullQuadPass('bright', device, {
|
|
9
|
+
inputs: ['colorTex'],
|
|
10
|
+
outputs: ['color'],
|
|
11
|
+
uniforms: [
|
|
12
|
+
{
|
|
13
|
+
label: 'threshold',
|
|
14
|
+
type: 'f32',
|
|
15
|
+
data: 1
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: 'scale',
|
|
19
|
+
type: 'f32',
|
|
20
|
+
data: 1
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
fsDefine: /*wgsl*/ `
|
|
24
|
+
fn sm(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
|
|
25
|
+
return a + b + c - min(min(a, b), c) - max(max(a, b), c);
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
fsMain: /*wgsl*/ `
|
|
29
|
+
${''
|
|
30
|
+
// Use median filter to reduce noise
|
|
31
|
+
// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
|
|
32
|
+
}
|
|
33
|
+
let d = vec3i(1, 1, 0);
|
|
34
|
+
|
|
35
|
+
var iW = load_colorTex(uv, 0);
|
|
36
|
+
let s1 = load_colorTex(uv - d.xz, 0);
|
|
37
|
+
let s2 = load_colorTex(uv + d.xz, 0);
|
|
38
|
+
let s3 = load_colorTex(uv - d.zy, 0);
|
|
39
|
+
let s4 = load_colorTex(uv + d.zy, 0);
|
|
40
|
+
iW = sm(sm(iW, s1, s2), s3, s4);
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
let lum = dot(iW.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
44
|
+
var color: vec4f;
|
|
45
|
+
if (lum > threshold && iW.a > 0.0) {
|
|
46
|
+
color = vec4f(iW.rgb * scale, iW.a);
|
|
47
|
+
} else {
|
|
48
|
+
|
|
49
|
+
color = vec4f(vec3(0.0), iW.a);
|
|
50
|
+
}
|
|
51
|
+
output.color = color;
|
|
52
|
+
`
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function createDownsamplePass(device) {
|
|
56
|
+
return new WGPUFullQuadPass('downsample', device, {
|
|
57
|
+
inputs: ['colorTex'],
|
|
58
|
+
outputs: ['color'],
|
|
59
|
+
uniforms: [],
|
|
60
|
+
samplers: {
|
|
61
|
+
linearSampler: device.createSampler(linearSamplerDescriptor)
|
|
62
|
+
},
|
|
63
|
+
fsDefine: /*wgsl*/ `
|
|
64
|
+
fn vL(c: vec3f) -> f32 {
|
|
65
|
+
return max(max(c.r, c.g), c.b);
|
|
66
|
+
}
|
|
67
|
+
`,
|
|
68
|
+
fsMain: /*wgsl*/ `
|
|
69
|
+
let size = vec2f(colorTexRegion());
|
|
70
|
+
let d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;
|
|
71
|
+
${''}
|
|
72
|
+
output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
|
|
73
|
+
+ sample_colorTex_linearSampler(uv2 + d.zy) * 0.25
|
|
74
|
+
+ sample_colorTex_linearSampler(uv2 + d.xw) * 0.25
|
|
75
|
+
+ sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
|
|
76
|
+
`
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function createGaussianPass(device) {
|
|
80
|
+
return new WGPUFullQuadPass('gaussian', device, {
|
|
81
|
+
inputs: ['colorTex'],
|
|
82
|
+
outputs: ['color'],
|
|
83
|
+
uniforms: [
|
|
84
|
+
{
|
|
85
|
+
label: 'direction',
|
|
86
|
+
type: 'vec2f',
|
|
87
|
+
data: [1, 0]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
label: 'size',
|
|
91
|
+
type: 'f32',
|
|
92
|
+
data: 1.0
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
samplers: {
|
|
96
|
+
linearSampler: device.createSampler(linearSamplerDescriptor)
|
|
97
|
+
},
|
|
98
|
+
fsDefine: /*wgsl*/ `
|
|
99
|
+
const vP = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
|
|
100
|
+
`,
|
|
101
|
+
fsMain: /*wgsl*/ `
|
|
102
|
+
let vE = vec2f(colorTexRegion());
|
|
103
|
+
let off = direction / vE * size;
|
|
104
|
+
|
|
105
|
+
var sum = vec4f(0.0);
|
|
106
|
+
var sU = 0.0;
|
|
107
|
+
for (var i = 0; i < 9; i++) {
|
|
108
|
+
let w = vP[i];
|
|
109
|
+
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
110
|
+
sU += w;
|
|
111
|
+
}
|
|
112
|
+
output.color = sum / max(sU, 0.01);
|
|
113
|
+
`
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function createBlendPass(device) {
|
|
117
|
+
return new WGPUFullQuadPass('blend', device, {
|
|
118
|
+
inputs: ['colorTex1', 'colorTex2'],
|
|
119
|
+
outputs: ['color'],
|
|
120
|
+
uniforms: [
|
|
121
|
+
{
|
|
122
|
+
label: 'weight',
|
|
123
|
+
type: 'f32',
|
|
124
|
+
data: 0.3
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
samplers: {
|
|
128
|
+
linearSampler: device.createSampler(linearSamplerDescriptor)
|
|
129
|
+
},
|
|
130
|
+
fsMain: /*wgsl*/ `
|
|
131
|
+
let vM = sample_colorTex1_linearSampler(uv2);
|
|
132
|
+
let vN = sample_colorTex2_linearSampler(uv2);
|
|
133
|
+
output.color = mix(vM, vN, weight);
|
|
134
|
+
`
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
class WGPUBloomPass {
|
|
138
|
+
_brightPass;
|
|
139
|
+
_downsamplePasses = [];
|
|
140
|
+
_blurHPasses = [];
|
|
141
|
+
_blurVPasses = [];
|
|
142
|
+
_blendPasses = [];
|
|
143
|
+
constructor(device) {
|
|
144
|
+
this._brightPass = createBrightPass(device);
|
|
145
|
+
const commonOutputParams = {
|
|
146
|
+
color: {
|
|
147
|
+
format: 'rgba16float'
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
this._brightPass.setOutputParams(commonOutputParams);
|
|
151
|
+
for (let i = 0; i <= COUNT; i++) {
|
|
152
|
+
const downsamplePass = createDownsamplePass(device);
|
|
153
|
+
const blurHPass = createGaussianPass(device);
|
|
154
|
+
const blurVPass = createGaussianPass(device);
|
|
155
|
+
downsamplePass.setOutputParams(commonOutputParams);
|
|
156
|
+
blurHPass.setOutputParams(commonOutputParams);
|
|
157
|
+
blurVPass.setOutputParams(commonOutputParams);
|
|
158
|
+
blurHPass.setUniform('direction', [1, 0]);
|
|
159
|
+
blurVPass.setUniform('direction', [0, 1]);
|
|
160
|
+
this._downsamplePasses.push(downsamplePass);
|
|
161
|
+
this._blurHPasses.push(blurHPass);
|
|
162
|
+
this._blurVPasses.push(blurVPass);
|
|
163
|
+
if (i > 0) {
|
|
164
|
+
const blendPass = createBlendPass(device);
|
|
165
|
+
blendPass.setOutputParams(commonOutputParams);
|
|
166
|
+
this._blendPasses.push(blendPass);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
reserveCapacity() {
|
|
171
|
+
[this._brightPass, ...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses].forEach(pass => pass.reserveCapacity());
|
|
172
|
+
}
|
|
173
|
+
setSize(width, height) {
|
|
174
|
+
this._brightPass.setSize(width, height);
|
|
175
|
+
for (let i = 0; i <= COUNT; i++) {
|
|
176
|
+
this._downsamplePasses[i].setSize(width >> (i + 1), height >> (i + 1));
|
|
177
|
+
this._blurHPasses[i].setSize(width >> (i + 1), height >> (i + 1));
|
|
178
|
+
this._blurVPasses[i].setSize(width >> i, height >> i);
|
|
179
|
+
if (i > 0) {
|
|
180
|
+
this._blendPasses[i - 1].setSize(width >> (i - 1), height >> (i - 1));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
setBrightThreshold(threshold) {
|
|
185
|
+
this._brightPass.setUniform('threshold', threshold);
|
|
186
|
+
}
|
|
187
|
+
setRadius(radius) {
|
|
188
|
+
this._blendPasses.forEach((blendPass) => {
|
|
189
|
+
blendPass.setUniform('weight',
|
|
190
|
+
// Use weight to control radius
|
|
191
|
+
1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0));
|
|
192
|
+
});
|
|
193
|
+
[...this._blurHPasses, ...this._blurVPasses].forEach((blurPass) => {
|
|
194
|
+
//Some magic fomular
|
|
195
|
+
blurPass.setUniform('size', Math.max(Math.min(radius * 2, 1.0), 0.2));
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
createPass(encoder, colorTex) {
|
|
199
|
+
const brightPass = this._brightPass;
|
|
200
|
+
const downSamplePasses = this._downsamplePasses;
|
|
201
|
+
const blendPasses = this._blendPasses;
|
|
202
|
+
const blurHPasses = this._blurHPasses;
|
|
203
|
+
const blurVPasses = this._blurVPasses;
|
|
204
|
+
brightPass.createPass(encoder, { colorTex });
|
|
205
|
+
// Downsample
|
|
206
|
+
for (let i = 0; i <= COUNT; i++) {
|
|
207
|
+
const colorTex1 = (i === 0 ? brightPass : downSamplePasses[i - 1]).getOutput('color');
|
|
208
|
+
downSamplePasses[i].createPass(encoder, { colorTex: colorTex1 });
|
|
209
|
+
}
|
|
210
|
+
// Upsample with gaussian and blending
|
|
211
|
+
for (let i = COUNT; i >= 0; i--) {
|
|
212
|
+
// Blur
|
|
213
|
+
blurHPasses[i].createPass(encoder, {
|
|
214
|
+
colorTex: downSamplePasses[i].getOutput('color')
|
|
215
|
+
});
|
|
216
|
+
blurVPasses[i].createPass(encoder, {
|
|
217
|
+
colorTex: blurHPasses[i].getOutput('color')
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
for (let i = COUNT - 1; i >= 0; i--) {
|
|
221
|
+
blendPasses[i].createPass(encoder, {
|
|
222
|
+
colorTex1: (i === COUNT - 1
|
|
223
|
+
? blurVPasses[COUNT]
|
|
224
|
+
: blendPasses[i + 1]).getOutput('color'),
|
|
225
|
+
colorTex2: blurVPasses[i].getOutput('color')
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return blendPasses[0].getOutput('color');
|
|
229
|
+
}
|
|
230
|
+
getMemoryBytes() {
|
|
231
|
+
return [this._brightPass, ...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses]
|
|
232
|
+
.reduce((sum, pass) => sum + pass.getMemoryBytes(), 0);
|
|
233
|
+
}
|
|
234
|
+
dispose() {
|
|
235
|
+
this._brightPass.dispose();
|
|
236
|
+
[...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses].forEach(pass => pass.dispose());
|
|
237
|
+
}
|
|
238
|
+
getOutput() {
|
|
239
|
+
return this._blendPasses[0].getOutput('color');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
export default WGPUBloomPass;
|
|
243
|
+
//# sourceMappingURL=WGPUBloomPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WGPUBloomPass.js","sourceRoot":"","sources":["../../src/renderer/WGPUBloomPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\n\nconst COUNT = 5;\n\nconst linearSamplerDescriptor = {\n magFilter: 'linear',\n minFilter: 'linear'\n} satisfies GPUSamplerDescriptor;\n\nfunction createBrightPass(device: GPUDevice) {\n return new WGPUFullQuadPass('bright', device, {\n inputs: ['colorTex'],\n outputs: ['color'],\n uniforms: [\n {\n label: 'threshold',\n type: 'f32',\n data: 1\n },\n {\n label: 'scale',\n type: 'f32',\n data: 1\n }\n ],\n fsDefine: /*wgsl*/ `\nfn median(a: vec4f, b: vec4f, c: vec4f) -> vec4f {\nreturn a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\n`,\n fsMain: /*wgsl*/ `\n${\n ''\n // Use median filter to reduce noise\n // https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96\n}\nlet d = vec3i(1, 1, 0);\n\nvar texel = load_colorTex(uv, 0);\nlet s1 = load_colorTex(uv - d.xz, 0);\nlet s2 = load_colorTex(uv + d.xz, 0);\nlet s3 = load_colorTex(uv - d.zy, 0);\nlet s4 = load_colorTex(uv + d.zy, 0);\ntexel = median(median(texel, s1, s2), s3, s4);\n\n// Premultiplied Alpha\nlet lum = dot(texel.rgb, vec3f(0.2125, 0.7154, 0.0721));\nvar color: vec4f;\nif (lum > threshold && texel.a > 0.0) {\n color = vec4f(texel.rgb * scale, texel.a);\n} else {\n // Bleed the alpha to avoid sharp edge when using alpha\n color = vec4f(vec3(0.0), texel.a);\n}\noutput.color = color;\n`\n });\n}\n\nfunction createDownsamplePass(device: GPUDevice) {\n return new WGPUFullQuadPass('downsample', device, {\n inputs: ['colorTex'],\n outputs: ['color'],\n uniforms: [],\n samplers: {\n linearSampler: device.createSampler(linearSamplerDescriptor)\n },\n fsDefine: /*wgsl*/ `\nfn brightness(c: vec3f) -> f32 {\n return max(max(c.r, c.g), c.b);\n}\n`,\n fsMain: /*wgsl*/ `\nlet size = vec2f(colorTexRegion());\nlet d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;\n${\n ''\n}\noutput.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.xw) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;\n`\n });\n}\n\nfunction createGaussianPass(device: GPUDevice) {\n return new WGPUFullQuadPass('gaussian', device, {\n inputs: ['colorTex'],\n outputs: ['color'],\n uniforms: [\n {\n label: 'direction',\n type: 'vec2f',\n data: [1, 0]\n },\n {\n label: 'size',\n type: 'f32',\n data: 1.0\n }\n ],\n samplers: {\n linearSampler: device.createSampler(linearSamplerDescriptor)\n },\n fsDefine: /*wgsl*/ `\nconst kernel = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);\n`,\n fsMain: /*wgsl*/ `\nlet texSize = vec2f(colorTexRegion());\nlet off = direction / texSize * size;\n\nvar sum = vec4f(0.0);\nvar weightAll = 0.0;\nfor (var i = 0; i < 9; i++) {\n let w = kernel[i];\n sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;\n weightAll += w;\n}\noutput.color = sum / max(weightAll, 0.01);\n`\n });\n}\n\nfunction createBlendPass(device: GPUDevice) {\n return new WGPUFullQuadPass('blend', device, {\n inputs: ['colorTex1', 'colorTex2'],\n outputs: ['color'],\n uniforms: [\n {\n label: 'weight',\n type: 'f32',\n data: 0.3\n }\n ],\n\n samplers: {\n linearSampler: device.createSampler(linearSamplerDescriptor)\n },\n fsMain: /*wgsl*/ `\nlet color1 = sample_colorTex1_linearSampler(uv2);\nlet color2 = sample_colorTex2_linearSampler(uv2);\noutput.color = mix(color1, color2, weight);\n`\n });\n}\n\nclass WGPUBloomPass {\n private _brightPass;\n private _downsamplePasses: ReturnType<typeof createDownsamplePass>[] = [];\n private _blurHPasses: ReturnType<typeof createGaussianPass>[] = [];\n private _blurVPasses: ReturnType<typeof createGaussianPass>[] = [];\n private _blendPasses: ReturnType<typeof createBlendPass>[] = [];\n\n constructor(device: GPUDevice) {\n this._brightPass = createBrightPass(device);\n const commonOutputParams = {\n color: {\n format: 'rgba16float'\n }\n } as const;\n this._brightPass.setOutputParams(commonOutputParams);\n for (let i = 0; i <= COUNT; i++) {\n const downsamplePass = createDownsamplePass(device);\n const blurHPass = createGaussianPass(device);\n const blurVPass = createGaussianPass(device);\n downsamplePass.setOutputParams(commonOutputParams);\n blurHPass.setOutputParams(commonOutputParams);\n blurVPass.setOutputParams(commonOutputParams);\n blurHPass.setUniform('direction', [1, 0]);\n blurVPass.setUniform('direction', [0, 1]);\n this._downsamplePasses.push(downsamplePass);\n this._blurHPasses.push(blurHPass);\n this._blurVPasses.push(blurVPass);\n if (i > 0) {\n const blendPass = createBlendPass(device);\n blendPass.setOutputParams(commonOutputParams);\n this._blendPasses.push(blendPass);\n }\n }\n }\n\n reserveCapacity() {\n [this._brightPass, ...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses].forEach(pass => pass.reserveCapacity());\n }\n\n setSize(width: number, height: number) {\n this._brightPass.setSize(width, height);\n for (let i = 0; i <= COUNT; i++) {\n this._downsamplePasses[i].setSize(width >> (i + 1), height >> (i + 1));\n this._blurHPasses[i].setSize(width >> (i + 1), height >> (i + 1));\n this._blurVPasses[i].setSize(width >> i, height >> i);\n if (i > 0) {\n this._blendPasses[i - 1].setSize(width >> (i - 1), height >> (i - 1));\n }\n }\n }\n\n setBrightThreshold(threshold: number) {\n this._brightPass.setUniform('threshold', threshold);\n }\n\n setRadius(radius: number) {\n this._blendPasses.forEach((blendPass) => {\n blendPass.setUniform(\n 'weight',\n // Use weight to control radius\n 1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0)\n );\n });\n [...this._blurHPasses, ...this._blurVPasses].forEach((blurPass) => {\n //Some magic fomular\n blurPass.setUniform('size', Math.max(Math.min(radius * 2, 1.0), 0.2));\n });\n }\n\n createPass(encoder: GPUCommandEncoder, colorTex: GPUTexture) {\n const brightPass = this._brightPass;\n const downSamplePasses = this._downsamplePasses;\n const blendPasses = this._blendPasses;\n const blurHPasses = this._blurHPasses;\n const blurVPasses = this._blurVPasses;\n brightPass.createPass(encoder, { colorTex });\n // Downsample\n for (let i = 0; i <= COUNT; i++) {\n const colorTex1 = (\n i === 0 ? brightPass : downSamplePasses[i - 1]\n ).getOutput('color');\n downSamplePasses[i].createPass(encoder, { colorTex: colorTex1 });\n }\n\n // Upsample with gaussian and blending\n for (let i = COUNT; i >= 0; i--) {\n // Blur\n blurHPasses[i].createPass(encoder, {\n colorTex: downSamplePasses[i].getOutput('color')\n });\n blurVPasses[i].createPass(encoder, {\n colorTex: blurHPasses[i].getOutput('color')\n });\n }\n for (let i = COUNT - 1; i >= 0; i--) {\n blendPasses[i].createPass(encoder, {\n colorTex1: (i === COUNT - 1\n ? blurVPasses[COUNT]\n : blendPasses[i + 1]\n ).getOutput('color'),\n colorTex2: blurVPasses[i].getOutput('color')\n });\n }\n\n return blendPasses[0].getOutput('color');\n }\n\n getMemoryBytes() {\n return [this._brightPass, ...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses]\n .reduce((sum, pass) => sum + pass.getMemoryBytes(), 0);\n }\n\n dispose() {\n this._brightPass.dispose();\n [...this._downsamplePasses, ...this._blurHPasses, ...this._blurVPasses, ...this._blendPasses].forEach(pass => pass.dispose());\n }\n\n getOutput() {\n return this._blendPasses[0].getOutput('color');\n }\n}\n\nexport default WGPUBloomPass;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type InspectableContext = GPUCanvasContext & {
|
|
2
|
+
getConfiguration?: () => GPUCanvasConfiguration & {
|
|
3
|
+
toneMapping?: {
|
|
4
|
+
mode?: string;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
/** One canvas surface; composing or exporting an image never reconfigures it. */
|
|
9
|
+
export declare class WGPUCanvasSurface {
|
|
10
|
+
private readonly device;
|
|
11
|
+
private readonly standardFormat;
|
|
12
|
+
readonly context: InspectableContext;
|
|
13
|
+
hdr: boolean;
|
|
14
|
+
private compatibleHDR?;
|
|
15
|
+
constructor(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, standardFormat: GPUTextureFormat);
|
|
16
|
+
get format(): GPUTextureFormat;
|
|
17
|
+
get supportsHDR(): boolean;
|
|
18
|
+
configure(enabled: boolean): void;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
21
|
+
export {};
|