@meimu/mutracer 0.1.5 → 0.3.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/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +36 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +6 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- 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.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +36 -3
- package/lib/settings/render.js +4 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +20 -7
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const bloomBrightDefine = "\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";
|
|
2
|
+
export declare const bloomBrightMain = "\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";
|
|
3
|
+
export declare const bloomDownDefine = "\nfn brightness(c: vec3f) -> f32 {\n return max(max(c.r, c.g), c.b);\n}\n";
|
|
4
|
+
export declare const bloomDownMain = "\nlet size = vec2f(colorTexRegion());\nlet d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;\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";
|
|
5
|
+
export declare const bloomBlurDefine = "\nconst kernel = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);\n";
|
|
6
|
+
export declare const bloomBlurMain = "\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";
|
|
7
|
+
export declare const bloomBlendMain = "\nlet color1 = sample_colorTex1_linearSampler(uv2);\nlet color2 = sample_colorTex2_linearSampler(uv2);\noutput.color = mix(color1, color2, weight);\n";
|
|
8
|
+
export declare const BLOOM_LEVELS = 6;
|
|
9
|
+
export declare function bloomBlurSize(radius: number): number;
|
|
10
|
+
export declare function bloomBlendWeight(radius: number): number;
|
|
11
|
+
export type BloomStep = readonly [kind: number, a: number, b: number, target: number, dx: number, dy: number];
|
|
12
|
+
export declare function createBloomPlan(levels: number): BloomStep[];
|
|
13
|
+
export declare const BLOOM_PLAN: BloomStep[];
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Shared pass bodies; each host supplies texture access and the entry point.
|
|
2
|
+
// Median bright pass adapted from KinoBloom (MIT), Keijiro Takahashi:
|
|
3
|
+
// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
|
|
4
|
+
// See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.
|
|
5
|
+
export const bloomBrightDefine = /* wgsl */ `
|
|
6
|
+
fn tV(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
|
|
7
|
+
return a + b + c - min(min(a, b), c) - max(max(a, b), c);
|
|
8
|
+
}
|
|
9
|
+
`;
|
|
10
|
+
export const bloomBrightMain = /* wgsl */ `
|
|
11
|
+
|
|
12
|
+
let d = vec3i(1, 1, 0);
|
|
13
|
+
|
|
14
|
+
var cR = load_colorTex(uv, 0);
|
|
15
|
+
let s1 = load_colorTex(uv - d.xz, 0);
|
|
16
|
+
let s2 = load_colorTex(uv + d.xz, 0);
|
|
17
|
+
let s3 = load_colorTex(uv - d.zy, 0);
|
|
18
|
+
let s4 = load_colorTex(uv + d.zy, 0);
|
|
19
|
+
cR = tV(tV(cR, s1, s2), s3, s4);
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
let lum = dot(cR.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
23
|
+
var color: vec4f;
|
|
24
|
+
if (lum > threshold && cR.a > 0.0) {
|
|
25
|
+
color = vec4f(cR.rgb * scale, cR.a);
|
|
26
|
+
} else {
|
|
27
|
+
|
|
28
|
+
color = vec4f(vec3(0.0), cR.a);
|
|
29
|
+
}
|
|
30
|
+
output.color = color;
|
|
31
|
+
`;
|
|
32
|
+
export const bloomDownDefine = /* wgsl */ `
|
|
33
|
+
fn yo(c: vec3f) -> f32 {
|
|
34
|
+
return max(max(c.r, c.g), c.b);
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
export const bloomDownMain = /* wgsl */ `
|
|
38
|
+
let size = vec2f(colorTexRegion());
|
|
39
|
+
let d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;
|
|
40
|
+
|
|
41
|
+
output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
|
|
42
|
+
+ sample_colorTex_linearSampler(uv2 + d.zy) * 0.25
|
|
43
|
+
+ sample_colorTex_linearSampler(uv2 + d.xw) * 0.25
|
|
44
|
+
+ sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
|
|
45
|
+
`;
|
|
46
|
+
export const bloomBlurDefine = /* wgsl */ `
|
|
47
|
+
const yu = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
|
|
48
|
+
`;
|
|
49
|
+
export const bloomBlurMain = /* wgsl */ `
|
|
50
|
+
let yh = vec2f(colorTexRegion());
|
|
51
|
+
let off = direction / yh * size;
|
|
52
|
+
|
|
53
|
+
var sum = vec4f(0.0);
|
|
54
|
+
var uI = 0.0;
|
|
55
|
+
for (var i = 0; i < 9; i++) {
|
|
56
|
+
let w = yu[i];
|
|
57
|
+
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
58
|
+
uI += w;
|
|
59
|
+
}
|
|
60
|
+
output.color = sum / max(uI, 0.01);
|
|
61
|
+
`;
|
|
62
|
+
export const bloomBlendMain = /* wgsl */ `
|
|
63
|
+
let yq = sample_colorTex1_linearSampler(uv2);
|
|
64
|
+
let yr = sample_colorTex2_linearSampler(uv2);
|
|
65
|
+
output.color = mix(yq, yr, weight);
|
|
66
|
+
`;
|
|
67
|
+
export const BLOOM_LEVELS = 6;
|
|
68
|
+
export function bloomBlurSize(radius) {
|
|
69
|
+
return Math.max(Math.min(radius * 2, 1), 0.2);
|
|
70
|
+
}
|
|
71
|
+
export function bloomBlendWeight(radius) {
|
|
72
|
+
return 1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0);
|
|
73
|
+
}
|
|
74
|
+
export function createBloomPlan(levels) {
|
|
75
|
+
const down = 1, h = down + levels, v = h + levels, blend = v + levels;
|
|
76
|
+
const input = blend + levels - 1;
|
|
77
|
+
const steps = [[0, input, input, 0, 0, 0]];
|
|
78
|
+
for (let i = 0; i < levels; i++) {
|
|
79
|
+
const source = i === 0 ? 0 : down + i - 1;
|
|
80
|
+
steps.push([1, source, source, down + i, 0, 0]);
|
|
81
|
+
}
|
|
82
|
+
for (let i = levels - 1; i >= 0; i--) {
|
|
83
|
+
steps.push([2, down + i, down + i, h + i, 1, 0]);
|
|
84
|
+
steps.push([2, h + i, h + i, v + i, 0, 1]);
|
|
85
|
+
}
|
|
86
|
+
for (let i = levels - 2; i >= 0; i--) {
|
|
87
|
+
steps.push([3, i === levels - 2 ? v + levels - 1 : blend + i + 1, v + i, blend + i, 0, 0]);
|
|
88
|
+
}
|
|
89
|
+
return steps;
|
|
90
|
+
}
|
|
91
|
+
export const BLOOM_PLAN = createBloomPlan(BLOOM_LEVELS);
|
|
92
|
+
//# sourceMappingURL=bloom.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloom.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/bloom.wgsl.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,4FAA4F;AAC5F,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;CAI3C,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBzC,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;CAIzC,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;CAQvC,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;CAEzC,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;CAYvC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;;;;CAIxC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAKD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC","sourcesContent":["// Shared pass bodies; each host supplies texture access and the entry point.\n// Median bright pass adapted from KinoBloom (MIT), Keijiro Takahashi:\n// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96\n// See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.\nexport const bloomBrightDefine = /* 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`;\nexport const bloomBrightMain = /* wgsl */ `\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`;\nexport const bloomDownDefine = /* wgsl */ `\nfn brightness(c: vec3f) -> f32 {\n return max(max(c.r, c.g), c.b);\n}\n`;\nexport const bloomDownMain = /* wgsl */ `\nlet size = vec2f(colorTexRegion());\nlet d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;\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`;\nexport const bloomBlurDefine = /* 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`;\nexport const bloomBlurMain = /* 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`;\nexport const bloomBlendMain = /* wgsl */ `\nlet color1 = sample_colorTex1_linearSampler(uv2);\nlet color2 = sample_colorTex2_linearSampler(uv2);\noutput.color = mix(color1, color2, weight);\n`;\n\nexport const BLOOM_LEVELS = 6;\nexport function bloomBlurSize(radius: number): number {\n return Math.max(Math.min(radius * 2, 1), 0.2);\n}\nexport function bloomBlendWeight(radius: number): number {\n return 1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0);\n}\n\n// Slots: bright, down[], horizontal[], vertical[], blend[], external input.\n// Kind selects bright/down/blur/blend. Hosts only bind their own pass resources.\nexport type BloomStep = readonly [kind: number, a: number, b: number, target: number, dx: number, dy: number];\nexport function createBloomPlan(levels: number): BloomStep[] {\n const down = 1, h = down + levels, v = h + levels, blend = v + levels;\n const input = blend + levels - 1;\n const steps: BloomStep[] = [[0, input, input, 0, 0, 0]];\n for (let i = 0; i < levels; i++) {\n const source = i === 0 ? 0 : down + i - 1;\n steps.push([1, source, source, down + i, 0, 0]);\n }\n for (let i = levels - 1; i >= 0; i--) {\n steps.push([2, down + i, down + i, h + i, 1, 0]);\n steps.push([2, h + i, h + i, v + i, 0, 1]);\n }\n for (let i = levels - 2; i >= 0; i--) {\n steps.push([3, i === levels - 2 ? v + levels - 1 : blend + i + 1, v + i, blend + i, 0, 0]);\n }\n return steps;\n}\nexport const BLOOM_PLAN = createBloomPlan(BLOOM_LEVELS);\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CAUSTIC_UNIFORM_BYTES = 112;
|
|
2
|
+
export declare const causticUnitRandomWgsl = "\n fn causticUnitRandom(value:f32)->f32 {\n return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);\n }\n";
|
|
3
|
+
export declare function causticLightCompute(constants: Record<string, boolean | number>, blasLayoutMask: number, hasDisplacement: boolean, mode?: 'lightTracing' | 'photonMapping', sceneIntersections?: string, fullEmissionRandom?: boolean): string;
|
|
4
|
+
export declare const causticAccumulateCompute = "\n @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;\n @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&accumulation)) {\n return;\n }\n let i=pixel*3u;\n accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);\n }\n";
|
|
5
|
+
/** Native buffer resolve has the same independent batch normalization as web. */
|
|
6
|
+
export declare const causticBufferCompositeCompute = "\n @group(0)@binding(0)var<storage,read>pt:array<vec4f>;\n @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;\n @group(0)@binding(2)var<storage,read>normal:array<vec4f>;\n @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;\n @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&output)) {\n return;\n }\n let c=caustics[pixel];\n let p=pt[pixel];\n output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);\n }\n";
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { PHOTON_GRID_SIZE, photonPackingWgsl } from './photonMap.compute.js';
|
|
2
|
+
import { SPECTRUM_PHOTON_DISTRIBUTION, SPECTRUM_WAVELENGTH_RANGE, spectrumWgsl } from '../spectrum.js';
|
|
3
|
+
import background from './chunks/background.wgsl.js';
|
|
4
|
+
import atomic from './chunks/causticAtomic.wgsl.js';
|
|
5
|
+
import adjoint from './chunks/causticAdjoint.wgsl.js';
|
|
6
|
+
import common from './chunks/common.wgsl.js';
|
|
7
|
+
import core from './chunks/rayTraceCore.wgsl.js';
|
|
8
|
+
import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
|
|
9
|
+
import intersect from './chunks/intersect.wgsl.js';
|
|
10
|
+
import rand from './chunks/rand.wgsl.js';
|
|
11
|
+
import random from './chunks/random.wgsl.js';
|
|
12
|
+
import env from './chunks/envMap.wgsl.js';
|
|
13
|
+
import sampling from './chunks/sampling.wgsl.js';
|
|
14
|
+
import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
|
|
15
|
+
import light from './chunks/sampleLight.wgsl.js';
|
|
16
|
+
import uv from './chunks/uvProjection.wgsl.js';
|
|
17
|
+
import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
|
|
18
|
+
import { wgpuShaderPreamble } from '../wgpuShaderSource.js';
|
|
19
|
+
import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
|
|
20
|
+
export const CAUSTIC_UNIFORM_BYTES = 112;
|
|
21
|
+
export const causticUnitRandomWgsl = /* wgsl */ `
|
|
22
|
+
fn causticUnitRandom(value:f32)->f32 {
|
|
23
|
+
return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
// Preserve the dormant R1 uniform slot and shader spelling for source parity.
|
|
27
|
+
// Production packs zero; only an explicitly registered research adapter sets it.
|
|
28
|
+
export function causticLightCompute(constants, blasLayoutMask, hasDisplacement, mode = 'lightTracing', sceneIntersections = '', fullEmissionRandom = true) {
|
|
29
|
+
const frames = !!constants.USE_ANISOTROPY_DIRECTIONS || !!constants.USE_COAT_NORMAL_FRAMES, coat = !!constants.USE_COAT_NORMAL_FRAMES;
|
|
30
|
+
return (wgpuShaderPreamble(constants, true) +
|
|
31
|
+
/* wgsl */ `
|
|
32
|
+
${Object.keys(WGPU_SCENE_FEATURE_BITS)
|
|
33
|
+
.map((name) => `const ${name} = ${!!constants[name]};`)
|
|
34
|
+
.join('\n')}
|
|
35
|
+
${common}
|
|
36
|
+
${core({ hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
|
|
37
|
+
${uv}
|
|
38
|
+
${createMaterialBufferWgsl({ hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
|
|
39
|
+
${intersect({
|
|
40
|
+
hasDisplacement,
|
|
41
|
+
blasLayoutMask,
|
|
42
|
+
hasAnisotropyDirections: frames,
|
|
43
|
+
hasCoatNormals: coat,
|
|
44
|
+
sceneIntersections
|
|
45
|
+
})}
|
|
46
|
+
${rand}
|
|
47
|
+
${random}
|
|
48
|
+
${env}
|
|
49
|
+
${sampling}
|
|
50
|
+
${spectrumWgsl}
|
|
51
|
+
${createOpenPbrBsdfWgsl(frames, coat)}
|
|
52
|
+
${light}
|
|
53
|
+
${background.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${{ USE_BACKGROUND: 1, USE_BACKGROUND_MAP: 2, USE_GROUNDED_BACKGROUND: 4 }[name]}) != 0)`)}
|
|
54
|
+
${causticPartitionWGSL(false, false)}
|
|
55
|
+
${adjoint}
|
|
56
|
+
struct CausticLightUniform {
|
|
57
|
+
casterSphere: vec4f,
|
|
58
|
+
viewProjection: mat4x4f,
|
|
59
|
+
photonCount: u32,
|
|
60
|
+
batch: u32,
|
|
61
|
+
mnee: u32,
|
|
62
|
+
cameraScale: f32,
|
|
63
|
+
casterCount: u32,
|
|
64
|
+
choiceCount: u32,
|
|
65
|
+
orthographic: u32,
|
|
66
|
+
experiments: u32,
|
|
67
|
+
}
|
|
68
|
+
@group(3) @binding(0) var<uniform> caustic: CausticLightUniform;
|
|
69
|
+
${mode === 'lightTracing'
|
|
70
|
+
? '@group(3) @binding(1) var<storage,read_write> splats: array<atomic<u32>>;'
|
|
71
|
+
: `${photonPackingWgsl}
|
|
72
|
+
@group(3)@binding(1)var photons:texture_storage_2d<rgba32uint,write>;
|
|
73
|
+
@group(3)@binding(3)var photonDirections:texture_storage_2d<r32uint,write>;
|
|
74
|
+
fn photonStore(i:u32,value:vec4u) {
|
|
75
|
+
let width=textureDimensions(photons).x;
|
|
76
|
+
textureStore(photons,vec2i(vec2u(i%width,i/width)),value);
|
|
77
|
+
}
|
|
78
|
+
fn pU(i:u32,value:u32) {
|
|
79
|
+
let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
|
|
80
|
+
let index=8u+buckets*4u+caustic.photonCount*2u+i;
|
|
81
|
+
let width=textureDimensions(photonDirections).x;
|
|
82
|
+
textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(value));
|
|
83
|
+
}
|
|
84
|
+
`}
|
|
85
|
+
@group(3) @binding(2) var causticDistribution:texture_2d<f32>;
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
${causticUnitRandomWgsl}
|
|
89
|
+
fn fB(dim:u32)->f32{return ${fullEmissionRandom ? 'causticUnitRandom(sample1D(dim))' : 'sample1D(dim)'}
|
|
90
|
+
;
|
|
91
|
+
}
|
|
92
|
+
fn hE(dim:u32)->vec2f {
|
|
93
|
+
let value=sample2D(dim);
|
|
94
|
+
return
|
|
95
|
+
${fullEmissionRandom ? 'vec2f(causticUnitRandom(value.x),causticUnitRandom(value.y))' : 'value'}
|
|
96
|
+
;
|
|
97
|
+
}
|
|
98
|
+
fn nH(i:u32)->vec4f {
|
|
99
|
+
let width=textureDimensions(causticDistribution).x;
|
|
100
|
+
return textureLoad(causticDistribution,vec2i(vec2u(i%width,i/width)),0);
|
|
101
|
+
}
|
|
102
|
+
fn ds(i:u32)->vec4f {
|
|
103
|
+
return nH(i);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
var<private> kH:vec3f;
|
|
109
|
+
var<private> causticEmissionAreaPdf:f32;
|
|
110
|
+
fn kL(origin:vec3f,position:vec3f,normal:vec3f,emission:vec3f,area:f32,pmf:f32,result:ptr<function,LightSampleRec>) {
|
|
111
|
+
kH=position;
|
|
112
|
+
causticEmissionAreaPdf=pmf/max(area,1e-20);
|
|
113
|
+
let offset=position-origin;
|
|
114
|
+
(*result).dist=length(offset);
|
|
115
|
+
(*result).direction=offset/max((*result).dist,1e-20);
|
|
116
|
+
(*result).normal=normal;
|
|
117
|
+
(*result).emission=emission;
|
|
118
|
+
(*result).pdf=pmf;
|
|
119
|
+
}
|
|
120
|
+
fn rn(origin:vec3f,rnd:vec3f,result:ptr<function,LightSampleRec>) {
|
|
121
|
+
causticEmissionAreaPdf=0.0;
|
|
122
|
+
(*result).pdf=0.0;
|
|
123
|
+
(*result).sourceType=0u;
|
|
124
|
+
(*result).isDelta=false;
|
|
125
|
+
if(caustic.choiceCount==0u) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
let scaled=rnd.z*f32(caustic.choiceCount);
|
|
129
|
+
let column=min(u32(scaled),caustic.choiceCount-1u);
|
|
130
|
+
let entry=nH(caustic.casterCount+column*2u);
|
|
131
|
+
let selected=select(bitcast<u32>(entry.y),column,fract(scaled)<entry.x);
|
|
132
|
+
let choice=bitcast<vec4u>(nH(caustic.casterCount+selected*2u));
|
|
133
|
+
let pmf=nH(caustic.casterCount+selected*2u+1u).x;
|
|
134
|
+
(*result).sourceIndex=choice.w;
|
|
135
|
+
if(choice.z==1u) {
|
|
136
|
+
(*result).sourceType=0u;
|
|
137
|
+
ig(rnd.xy,result);
|
|
138
|
+
(*result).pdf*=pmf;
|
|
139
|
+
}
|
|
140
|
+
else if(choice.z==2u) {
|
|
141
|
+
(*result).sourceType=2u;
|
|
142
|
+
var light=analyticLights[choice.w];
|
|
143
|
+
let kind=i32(light.litType);
|
|
144
|
+
if(kind==RECT_LIGHT) {
|
|
145
|
+
let position=light.position+light.u*(rnd.x-.5)+light.v*(rnd.y-.5);
|
|
146
|
+
kL(origin,position,normalize(cross(light.u,light.v)),light.emission,light.area,pmf,result);
|
|
147
|
+
(*result).isDelta=light.radiusOrSpread<=.001;
|
|
148
|
+
bC(light,position,light.position-.5*(light.u+light.v),result);
|
|
149
|
+
}
|
|
150
|
+
else if((kind==SPHERE_LIGHT||kind==SPOT_LIGHT)&&light.radiusOrSpread>0.0) {
|
|
151
|
+
let z=1.0-2.0*rnd.x;
|
|
152
|
+
let dr=sqrt(max(0.0,1.0-z*z));
|
|
153
|
+
let normal=vec3f(dr*cos(TWOPI*rnd.y),dr*sin(TWOPI*rnd.y),z);
|
|
154
|
+
kL(origin,light.position+light.radiusOrSpread*normal,normal,light.emission,light.area,pmf,result);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
light.selectionPmf=1.0;
|
|
158
|
+
sampleAnalyticLight(light,origin,rnd.xy,result);
|
|
159
|
+
(*result).pdf*=pmf;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
(*result).sourceType=1u;
|
|
164
|
+
let triangle=getEmissiveTriangle(i32(choice.w));
|
|
165
|
+
let u=sqrt(rnd.x);
|
|
166
|
+
let bary=vec3f(1.0-u,u*(1.0-rnd.y),u*rnd.y);
|
|
167
|
+
let position=bary.x*triangle.p0+bary.y*triangle.p1+bary.z*triangle.p2;
|
|
168
|
+
let normal=normalize(cross(triangle.p1-triangle.p0,triangle.p2-triangle.p0));
|
|
169
|
+
let uv=bary.x*triangle.uv0+bary.y*triangle.uv1+bary.z*triangle.uv2;
|
|
170
|
+
let uv1=bary.x*triangle.secondaryUv0+bary.y*triangle.secondaryUv1+bary.z*triangle.secondaryUv2;
|
|
171
|
+
kL(origin,position,normal,getMaterialEmission(i32(triangle.materialIndex),uv,uv1),triangle.area,pmf,result);
|
|
172
|
+
}
|
|
173
|
+
(*result).selectionPmf=pmf;
|
|
174
|
+
}
|
|
175
|
+
fn lj(s:vec4f,origin:vec3f)->f32 {
|
|
176
|
+
let bG=dot(s.xyz-origin,s.xyz-origin);
|
|
177
|
+
return select(-1.0,sqrt(max(0.0,1.0-s.w*s.w/bG)),bG>s.w*s.w);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
fn dN(s:vec4f)->f32 {
|
|
182
|
+
if((caustic.experiments&2u)==0u) { return 1.0; }
|
|
183
|
+
let tB=caustic.viewProjection*vec4f(s.xyz,1.0);
|
|
184
|
+
let m=caustic.viewProjection;
|
|
185
|
+
let extent=s.w*max(length(vec3f(m[0].x,m[1].x,m[2].x)),length(vec3f(m[0].y,m[1].y,m[2].y)));
|
|
186
|
+
if(tB.w<=0.0||abs(tB.x)>tB.w+extent||abs(tB.y)>tB.w+extent) { return .05; }
|
|
187
|
+
return .05+min(1.0,extent*extent/max(tB.w*tB.w,1e-20));
|
|
188
|
+
}
|
|
189
|
+
fn sv(origin:vec3f,rnd:vec3f,pdf:ptr<function,f32>,ky:ptr<function,f32>)->vec3f {
|
|
190
|
+
var total=0.0;
|
|
191
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
192
|
+
total+=(1.0-lj(ds(i),origin))*dN(ds(i));
|
|
193
|
+
}
|
|
194
|
+
var choice=rnd.z*total;
|
|
195
|
+
var selected=ds(0u);
|
|
196
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
197
|
+
let sphere=ds(i);
|
|
198
|
+
selected=sphere;
|
|
199
|
+
choice-=(1.0-lj(sphere,origin))*dN(sphere);
|
|
200
|
+
if(choice<=0.0) {
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
*ky=selected.w;
|
|
205
|
+
let offset=selected.xyz-origin;
|
|
206
|
+
let axis=normalize(select(vec3f(0.0,0.0,1.0),offset,dot(offset,offset)>1e-20));
|
|
207
|
+
let cosine=mix(1.0,lj(selected,origin),rnd.x);
|
|
208
|
+
let uC=sqrt(max(0.0,1.0-cosine*cosine));
|
|
209
|
+
var t:vec3f;
|
|
210
|
+
var b:vec3f;
|
|
211
|
+
sampling_orthonormal_basis(axis,&t,&b);
|
|
212
|
+
let direction=axis*cosine+(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y))*uC;
|
|
213
|
+
|
|
214
|
+
var overlaps=0.0;
|
|
215
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
216
|
+
let sphere=ds(i);
|
|
217
|
+
let c=lj(sphere,origin);
|
|
218
|
+
if(c<0.0||dot(normalize(sphere.xyz-origin),direction)>=c) {
|
|
219
|
+
overlaps+=dN(sphere);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
*pdf=overlaps/max(TWOPI*total,1e-20);
|
|
223
|
+
return direction;
|
|
224
|
+
}
|
|
225
|
+
${mode === 'lightTracing'
|
|
226
|
+
? /* wgsl */ `${atomic}
|
|
227
|
+
fn causticCameraConnect(si: SurfaceInteraction, material: OpenPbrResolvedMaterial, hQ: Ray, flux: vec3f, extinction: vec3f) {
|
|
228
|
+
let eye=cameraUniform.viewInv[3].xyz;
|
|
229
|
+
let forward=-normalize(cameraUniform.viewInv[2].xyz);
|
|
230
|
+
let rB=hE(causticDim(68u));
|
|
231
|
+
let radius=cameraUniform.apertureRadius*sqrt(rB.x);
|
|
232
|
+
var uV=eye+radius*(cos(TWOPI*rB.y)*cameraUniform.viewInv[0].xyz+sin(TWOPI*rB.y)*cameraUniform.viewInv[1].xyz);
|
|
233
|
+
if(caustic.orthographic!=0u) {
|
|
234
|
+
uV=si.position-forward*dot(si.position-eye,forward);
|
|
235
|
+
}
|
|
236
|
+
let xM=uV-si.position;
|
|
237
|
+
let bG=dot(xM,xM);
|
|
238
|
+
let direction=normalize(xM);
|
|
239
|
+
let wf=uV+(si.position-uV)*cameraUniform.focusDistance/max(dot(si.position-uV,forward),1e-12);
|
|
240
|
+
let qO=select(wf,si.position,caustic.orthographic!=0u);
|
|
241
|
+
let tB=caustic.viewProjection*vec4f(qO,1.0);
|
|
242
|
+
if(tB.w<=0.0||dot(si.position-eye,forward)<=0.0) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
let wY=tB.xy/tB.w*0.5+0.5;
|
|
246
|
+
if(any(wY<vec2f(0.0))||any(wY>=vec2f(1.0))) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
var shadow:Ray;
|
|
250
|
+
initRay(&shadow,si.position+EPS*direction,direction);
|
|
251
|
+
if(intersectSceneShadow(shadow,sqrt(bG)-2.0*EPS,si.triangleIndex,si.instanceIndex)) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
var m=material;
|
|
255
|
+
let normal=select(-si.normal,si.normal,dot(si.normal,-hQ.d)>=0.0);
|
|
256
|
+
m.inside=dot(si.faceNormal,-hQ.d)<0.0;
|
|
257
|
+
m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
|
|
258
|
+
${frames
|
|
259
|
+
? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
|
|
260
|
+
: ''}
|
|
261
|
+
${coat
|
|
262
|
+
? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,-hQ.d)>=0.0);`
|
|
263
|
+
: ''}
|
|
264
|
+
let prepared=bV(si.tangent,m,-hQ.d,normal);
|
|
265
|
+
var pdf:f32;
|
|
266
|
+
let response=openpbr_eval_prepared(prepared,direction,&pdf);
|
|
267
|
+
let mj=dot(-direction,-normalize(cameraUniform.viewInv[2].xyz));
|
|
268
|
+
if(mj<=0.0) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
let wg=caustic.cameraScale*rtUniform.outputSize.x*rtUniform.outputSize.y /
|
|
272
|
+
select(max(bG*mj*mj*mj,1e-12),1.0,caustic.orthographic!=0u);
|
|
273
|
+
let transmittance=exp(-extinction*sqrt(bG));
|
|
274
|
+
let value=flux*transmittance*response*causticAdjoint(-hQ.d,direction,normal,si.faceNormal)*wg/f32(caustic.photonCount);
|
|
275
|
+
let pixel=vec2u(wY*rtUniform.outputSize);
|
|
276
|
+
let index=(pixel.x+pixel.y*u32(rtUniform.outputSize.x))*3u;
|
|
277
|
+
kM(index,value.x);
|
|
278
|
+
kM(index+1u,value.y);
|
|
279
|
+
kM(index+2u,value.z);
|
|
280
|
+
}
|
|
281
|
+
`
|
|
282
|
+
: ''}
|
|
283
|
+
@compute @workgroup_size(64)
|
|
284
|
+
fn main(@builtin(global_invocation_id) id:vec3u) {
|
|
285
|
+
let photonIndex=id.x+id.y*4194240u;
|
|
286
|
+
if(photonIndex>=caustic.photonCount) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
${mode === 'photonMapping' ? 'photonStore(photonIndex,vec4u(0u));' : ''}
|
|
290
|
+
aI=vec2u(photonIndex%u32(rtUniform.outputSize.x),photonIndex/u32(rtUniform.outputSize.x));
|
|
291
|
+
aC=caustic.batch;
|
|
292
|
+
samplingBounce=0u;
|
|
293
|
+
ca=0u;
|
|
294
|
+
fi(aI,i32(ak(caustic.batch,rtUniform.sequenceSeed)));
|
|
295
|
+
var wavelength=0.0;
|
|
296
|
+
var wavelengthPdf=1.0;
|
|
297
|
+
if(SPECTRAL) {
|
|
298
|
+
wavelength=spectrumSample(${SPECTRUM_PHOTON_DISTRIBUTION}u,fB(causticDim(69u)),&wavelengthPdf);
|
|
299
|
+
}
|
|
300
|
+
var ls:LightSampleRec;
|
|
301
|
+
rn(caustic.casterSphere.xyz,vec3f(hE(causticDim(60u)),fB(causticDim(61u))),&ls);
|
|
302
|
+
if(ls.pdf<=0.0) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
var infinite=ls.sourceType==0u;
|
|
306
|
+
if(ls.sourceType==2u) {
|
|
307
|
+
infinite=i32(analyticLights[ls.sourceIndex].litType)==DIRECTIONAL_LIGHT;
|
|
308
|
+
}
|
|
309
|
+
var origin=caustic.casterSphere.xyz+ls.direction*ls.dist;
|
|
310
|
+
if(causticEmissionAreaPdf>0.0) { origin=kH; }
|
|
311
|
+
var direction:vec3f;
|
|
312
|
+
var flux:vec3f;
|
|
313
|
+
var ky=caustic.casterSphere.w;
|
|
314
|
+
if(infinite) {
|
|
315
|
+
direction=-ls.direction;
|
|
316
|
+
|
|
317
|
+
var area=0.0;
|
|
318
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
319
|
+
let s=ds(i);
|
|
320
|
+
area+=s.w*s.w*dN(s);
|
|
321
|
+
}
|
|
322
|
+
var choice=fB(causticDim(63u))*area;
|
|
323
|
+
var sphere=ds(0u);
|
|
324
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
325
|
+
sphere=ds(i);
|
|
326
|
+
choice-=sphere.w*sphere.w*dN(sphere);
|
|
327
|
+
if(choice<=0.0) {
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
ky=sphere.w;
|
|
332
|
+
var t:vec3f;
|
|
333
|
+
var b:vec3f;
|
|
334
|
+
sampling_orthonormal_basis(direction,&t,&b);
|
|
335
|
+
let rnd=hE(causticDim(62u));
|
|
336
|
+
origin=sphere.xyz-direction*dot(sphere.xyz-caustic.casterSphere.xyz,direction)-direction*caustic.casterSphere.w;
|
|
337
|
+
origin+=sphere.w*sqrt(rnd.x)*(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y));
|
|
338
|
+
var overlaps=0.0;
|
|
339
|
+
for(var i=0u;i<caustic.casterCount;i++) {
|
|
340
|
+
let s=ds(i);
|
|
341
|
+
let offset=origin-s.xyz;
|
|
342
|
+
let qO=offset-direction*dot(offset,direction);
|
|
343
|
+
if(dot(qO,qO)<=s.w*s.w) {
|
|
344
|
+
overlaps+=dN(s);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
let diskPdf=overlaps/max(PI*area,1e-20);
|
|
348
|
+
flux=ls.emission/(ls.pdf*diskPdf);
|
|
349
|
+
}
|
|
350
|
+
else if(ls.sourceType==2u&&i32(analyticLights[ls.sourceIndex].litType)==RECT_LIGHT&&ls.isDelta) {
|
|
351
|
+
|
|
352
|
+
direction=ls.normal;
|
|
353
|
+
flux=ls.emission/causticEmissionAreaPdf;
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
var areaPdf=ls.pdf*abs(dot(ls.normal,-ls.direction))/max(ls.dist*ls.dist,1e-20);
|
|
357
|
+
if(causticEmissionAreaPdf>0.0) { areaPdf=causticEmissionAreaPdf; }
|
|
358
|
+
if(ls.isDelta) {
|
|
359
|
+
areaPdf=ls.selectionPmf;
|
|
360
|
+
}
|
|
361
|
+
if(areaPdf<=0.0) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
var directionPdf:f32;
|
|
365
|
+
direction=sv(origin,vec3f(hE(causticDim(62u)),fB(causticDim(63u))),&directionPdf,&ky);
|
|
366
|
+
var emission=ls.emission;
|
|
367
|
+
var mL=max(0.0,dot(ls.normal,direction));
|
|
368
|
+
if(ls.sourceType==2u) {
|
|
369
|
+
let source=analyticLights[ls.sourceIndex];
|
|
370
|
+
emission=source.emission;
|
|
371
|
+
if(i32(source.litType)==SPOT_LIGHT) {
|
|
372
|
+
emission*=evaluateSpotEmissionMultiplier(source,direction);
|
|
373
|
+
}
|
|
374
|
+
if(ls.isDelta) {
|
|
375
|
+
mL=1.0;
|
|
376
|
+
}
|
|
377
|
+
if(i32(source.litType)==RECT_LIGHT&&mL<cos(0.5*PI*source.radiusOrSpread)) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if(i32(source.litType)==RECT_LIGHT) {
|
|
381
|
+
var un:LightSampleRec;
|
|
382
|
+
un.emission=emission;
|
|
383
|
+
bC(source,origin,source.position-0.5*(source.u+source.v),&un);
|
|
384
|
+
emission=un.emission;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
flux=emission*mL/(areaPdf*directionPdf);
|
|
388
|
+
}
|
|
389
|
+
if(SPECTRAL) {
|
|
390
|
+
flux*=spectrumRgb(wavelength)/(wavelengthPdf*${SPECTRUM_WAVELENGTH_RANGE}.0);
|
|
391
|
+
}
|
|
392
|
+
var ray:Ray;
|
|
393
|
+
initRay(&ray,origin+EPS*direction,direction);
|
|
394
|
+
var vt=0u;
|
|
395
|
+
var wN=false;
|
|
396
|
+
var extinction=vec3f(0.0);
|
|
397
|
+
var scattering=vec3f(0.0);
|
|
398
|
+
var si:SurfaceInteraction;
|
|
399
|
+
for(var depth=0;
|
|
400
|
+
${mode === 'photonMapping' ? 'depth<=max(rtUniform.bounces,0)' : 'depth<20'}
|
|
401
|
+
;
|
|
402
|
+
depth++) {
|
|
403
|
+
samplingBounce=u32(depth);
|
|
404
|
+
si.triangleIndex=-1;
|
|
405
|
+
intersectScene(ray,&si,0,true,depth>0);
|
|
406
|
+
if(!si.hit) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
var m:OpenPbrResolvedMaterial;
|
|
410
|
+
getMaterial(&m,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
|
|
411
|
+
if(m.alpha<1.0&&fB(causticDim(79u))>=m.alpha) {
|
|
412
|
+
initRay(&ray,si.position+EPS*ray.d,ray.d);
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if(m.materialType==SHADOW_CATCHER) {
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
let segment=distance(ray.o,si.position);
|
|
419
|
+
let channel=min(u32(sample1D(bE(MEDIUM_CHANNEL))*3.0),2u);
|
|
420
|
+
if(extinction[channel]>0.0&&any(scattering>vec3f(0.0))) {
|
|
421
|
+
let sampled=-log(max(sample1D(bE(MEDIUM_DISTANCE)),1e-7))/extinction[channel];
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
if(sampled<segment) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
let transmittance=exp(-extinction*segment);
|
|
429
|
+
let xK=(transmittance.x+transmittance.y+transmittance.z)/3.0;
|
|
430
|
+
flux*=transmittance/select(1.0,max(xK,1e-20),any(scattering>vec3f(0.0)));
|
|
431
|
+
if(SPECTRAL) {
|
|
432
|
+
m.specularIor=sampling_cauchy_ior(spectrumIorWavelength(wavelength),m.specularIor,m.transmissionDispersionScale,m.dispersionAbbeNumber);
|
|
433
|
+
}
|
|
434
|
+
if(!isCausticSpecular(m)) {
|
|
435
|
+
let wj=ls.sourceType!=0u;
|
|
436
|
+
let r1=wj&&vt==1u&&wN&&m.baseWeight*(1.0-m.baseMetalness)*(1.0-m.transmissionWeight)>0.0&&m.subsurfaceWeight==0.0;
|
|
437
|
+
if(vt>0u
|
|
438
|
+
${mode === 'lightTracing' ? '&&!(caustic.mnee!=0u&&r1)' : ''}){${mode === 'lightTracing'
|
|
439
|
+
? 'causticCameraConnect(si,m,ray,flux,extinction);'
|
|
440
|
+
: /* wgsl */ `
|
|
441
|
+
let position=bitcast<vec3u>(si.position);
|
|
442
|
+
photonStore(photonIndex,vec4u(position,sS(flux)));
|
|
443
|
+
if((caustic.experiments&1u)!=0u) {
|
|
444
|
+
var maximum=1e-8;
|
|
445
|
+
for(var i=0u;i<caustic.casterCount;i++) { maximum=max(maximum,ds(i).w); }
|
|
446
|
+
let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
|
|
447
|
+
let index=8u+buckets*4u+caustic.photonCount*3u+photonIndex;
|
|
448
|
+
let width=textureDimensions(photonDirections).x;
|
|
449
|
+
textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(bitcast<u32>(ky/maximum)));
|
|
450
|
+
}
|
|
451
|
+
let hQ=vec2u(round(pN(-ray.d)*255.0));
|
|
452
|
+
let normal=vec2u(round(pN(si.faceNormal)*vec2f(255.0,127.0)));
|
|
453
|
+
pU(photonIndex,normal.x|(normal.y<<8u)|(select(0u,1u,r1)<<15u)|(hQ.x<<16u)|(hQ.y<<24u));
|
|
454
|
+
`}
|
|
455
|
+
}
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
let view=-ray.d;
|
|
459
|
+
let normal=select(-si.normal,si.normal,dot(si.normal,view)>=0.0);
|
|
460
|
+
m.inside=dot(si.faceNormal,view)<0.0;
|
|
461
|
+
m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
|
|
462
|
+
${frames
|
|
463
|
+
? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
|
|
464
|
+
: ''}
|
|
465
|
+
${coat
|
|
466
|
+
? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,view)>=0.0);`
|
|
467
|
+
: ''}
|
|
468
|
+
let prepared=bV(si.tangent,m,view,normal);
|
|
469
|
+
var next:vec3f;
|
|
470
|
+
var pdf:f32;
|
|
471
|
+
var transmission:bool;
|
|
472
|
+
var roughness:f32;
|
|
473
|
+
var specular:bool;
|
|
474
|
+
var diffuse:bool;
|
|
475
|
+
var lobe:u32;
|
|
476
|
+
var marginal:f32;
|
|
477
|
+
var full:vec3f;
|
|
478
|
+
let response=dl(prepared,vec3f(sample2D(bE(BSDF_DIRECTION)),sample1D(bE(BSDF_LOBE))),&next,&pdf,&transmission,&roughness,&specular,&diffuse,&lobe,&marginal,&full);
|
|
479
|
+
if(!(pdf>0.0)) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
if(vt==0u&&ls.sourceType==0u&&transmission) {
|
|
483
|
+
var reverse:Ray;
|
|
484
|
+
initRay(&reverse,si.position,-ray.d);
|
|
485
|
+
let bg=ft(reverse);
|
|
486
|
+
flux*=bg.rgb*bg.a/max(ls.emission,vec3f(1e-20));
|
|
487
|
+
}
|
|
488
|
+
flux*=response/pdf*causticAdjoint(view,next,normal,si.faceNormal);
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
if(transmission&&!m.thinWalled) {
|
|
492
|
+
flux/=m.relativeIor*m.relativeIor;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if(transmission&&!m.thinWalled&&m.mediumType>0) {
|
|
496
|
+
extinction=select(m.mediumExtinction,vec3f(0.0),m.inside);
|
|
497
|
+
scattering=select(m.mediumScattering,vec3f(0.0),m.inside);
|
|
498
|
+
}
|
|
499
|
+
vt++;
|
|
500
|
+
wN=vt==1u&&((isCausticT(m)&&transmission)||(isCausticR(m)&&!transmission));
|
|
501
|
+
initRay(&ray,si.position+EPS*next,next);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
`);
|
|
505
|
+
}
|
|
506
|
+
export const causticAccumulateCompute = /* wgsl */ `
|
|
507
|
+
@group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;
|
|
508
|
+
@group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;
|
|
509
|
+
@compute @workgroup_size(64)
|
|
510
|
+
fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {
|
|
511
|
+
|
|
512
|
+
let pixel=id.x+id.y*groups.x*64u;
|
|
513
|
+
if(pixel>=arrayLength(&accumulation)) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
let i=pixel*3u;
|
|
517
|
+
accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);
|
|
518
|
+
}
|
|
519
|
+
`;
|
|
520
|
+
/** Native buffer resolve has the same independent batch normalization as web. */
|
|
521
|
+
export const causticBufferCompositeCompute = /* wgsl */ `
|
|
522
|
+
@group(0)@binding(0)var<storage,read>pt:array<vec4f>;
|
|
523
|
+
@group(0)@binding(1)var<storage,read>caustics:array<vec4f>;
|
|
524
|
+
@group(0)@binding(2)var<storage,read>normal:array<vec4f>;
|
|
525
|
+
@group(0)@binding(3)var<storage,read_write>output:array<vec4f>;
|
|
526
|
+
@compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {
|
|
527
|
+
|
|
528
|
+
let pixel=id.x+id.y*groups.x*64u;
|
|
529
|
+
if(pixel>=arrayLength(&output)) {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
let c=caustics[pixel];
|
|
533
|
+
let p=pt[pixel];
|
|
534
|
+
output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);
|
|
535
|
+
}
|
|
536
|
+
`;
|
|
537
|
+
//# sourceMappingURL=causticLight.compute.js.map
|