@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,439 @@
|
|
|
1
|
+
// Next-event estimation with resampled importance sampling over the light
|
|
2
|
+
// candidates, followed by BSDF (or phase function) sampling, as described in
|
|
3
|
+
// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral
|
|
4
|
+
export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
|
|
5
|
+
return /* wgsl */ `
|
|
6
|
+
|
|
7
|
+
struct mO {
|
|
8
|
+
ray: Ray,
|
|
9
|
+
maxDistance: f32,
|
|
10
|
+
triangleIndex: i32,
|
|
11
|
+
contribution: vec3f,
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
risTarget: f32,
|
|
15
|
+
lightSelectionPmf: f32,
|
|
16
|
+
valid: bool,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fn qe(
|
|
20
|
+
si: ptr<function, ad>,
|
|
21
|
+
ma: J,
|
|
22
|
+
prepared: ag,
|
|
23
|
+
aa: ptr<function, Path>,
|
|
24
|
+
ffnormal: vec3f,
|
|
25
|
+
gw: bool,
|
|
26
|
+
ca: u32,
|
|
27
|
+
aW: u32,
|
|
28
|
+
gd: ptr<function, mO>
|
|
29
|
+
) -> bool {
|
|
30
|
+
(*gd).valid = false;
|
|
31
|
+
(*gd).lightSelectionPmf = 0.0;
|
|
32
|
+
(*gd).risTarget = 0.0;
|
|
33
|
+
let kZ = vec3f(fk(qR(ca, 1u)), dz(qR(ca, 0u)));
|
|
34
|
+
|
|
35
|
+
var lightSample: LightSampleRec;
|
|
36
|
+
mv(
|
|
37
|
+
(*si).position,
|
|
38
|
+
kZ,
|
|
39
|
+
ca,
|
|
40
|
+
aW,
|
|
41
|
+
&lightSample
|
|
42
|
+
);
|
|
43
|
+
var Li = lightSample.emission;
|
|
44
|
+
|
|
45
|
+
let lightDir = lightSample.direction;
|
|
46
|
+
let oH = -(*aa).ray.d;
|
|
47
|
+
let fd = lightSample.pdf;
|
|
48
|
+
let lightSelectionPmf = lightSample.selectionPmf;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);
|
|
52
|
+
if (gw && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
|
|
53
|
+
|
|
54
|
+
if (fd <= 0.0 || lightSelectionPmf <= 0.0 ||
|
|
55
|
+
max(max(Li.x, Li.y), Li.z) <= 0.0) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var scatteringPdf = 0.0;
|
|
60
|
+
var f = vec3f(0.0);
|
|
61
|
+
if (gw) {
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if (cosThetaL <= 0.0 && ma.transmissionWeight <= 0.0 && ma.subsurfaceWeight <= 0.0) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
f = bI(prepared, lightDir, &scatteringPdf);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
scatteringPdf = bD(
|
|
71
|
+
dot(oH, lightDir),
|
|
72
|
+
(*si).mediumAnisotropy
|
|
73
|
+
);
|
|
74
|
+
f = vec3f(scatteringPdf);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var ml: Ray;
|
|
82
|
+
var hc = (*si).position + EPS * lightDir;
|
|
83
|
+
if (gw) {
|
|
84
|
+
hc = rD((*si).position, (*si).faceNormal, lightDir);
|
|
85
|
+
let bZ = 0.1;
|
|
86
|
+
var dr = dot((*si).normal, lightDir);
|
|
87
|
+
${hasCoatNormals ? /* wgsl */ ` if (ma.coatNormalEnabled) { dr = dot((*si).faceNormal, lightDir); }` : ''}
|
|
88
|
+
let geometricNormal = select(
|
|
89
|
+
(*si).faceNormal,
|
|
90
|
+
-(*si).faceNormal,
|
|
91
|
+
dr < 0.0
|
|
92
|
+
);
|
|
93
|
+
dr = abs(dr);
|
|
94
|
+
let hP = dot(geometricNormal, lightDir);
|
|
95
|
+
let oo = select(
|
|
96
|
+
clamp(1.0 - hP / bZ, 0.0, 1.0),
|
|
97
|
+
clamp(
|
|
98
|
+
2.0 - (hP + dr) / bZ,
|
|
99
|
+
0.0,
|
|
100
|
+
1.0
|
|
101
|
+
),
|
|
102
|
+
dr < bZ
|
|
103
|
+
);
|
|
104
|
+
hc += (*si).shadowOffset * oo;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
var lE = lightDir;
|
|
111
|
+
var mC = lightSample.dist - EPS;
|
|
112
|
+
if (lightSample.sourceType == 1u) {
|
|
113
|
+
let sM =
|
|
114
|
+
(*si).position + lightSample.direction * lightSample.dist;
|
|
115
|
+
let pS = sM + EPS * lightSample.normal;
|
|
116
|
+
let qd = pS - hc;
|
|
117
|
+
mC = length(qd);
|
|
118
|
+
lE = normalize(qd);
|
|
119
|
+
}
|
|
120
|
+
iw(&ml, hc, lE);
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if (gw && cosThetaL < 0.0 && lightSample.sourceType == 0u) {
|
|
126
|
+
let background = hE(ml);
|
|
127
|
+
Li = background.rgb * background.a;
|
|
128
|
+
}
|
|
129
|
+
if (SPECTRAL) {
|
|
130
|
+
Li = ai(Li, (*si).wavelength);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
let eW = select(
|
|
136
|
+
tk(fd, scatteringPdf),
|
|
137
|
+
1.0,
|
|
138
|
+
lightSample.isDelta
|
|
139
|
+
);
|
|
140
|
+
if (eW > 0.0) {
|
|
141
|
+
let kh = Li * f / fd * (*aa).beta;
|
|
142
|
+
(*gd).risTarget = max(
|
|
143
|
+
dot(max(kh * lightSelectionPmf, vec3f(0.0)), luminance),
|
|
144
|
+
0.0
|
|
145
|
+
);
|
|
146
|
+
(*gd).ray = ml;
|
|
147
|
+
(*gd).maxDistance = mC;
|
|
148
|
+
(*gd).triangleIndex = (*si).triangleIndex;
|
|
149
|
+
(*gd).contribution = eW * kh;
|
|
150
|
+
(*gd).lightSelectionPmf = lightSelectionPmf;
|
|
151
|
+
(*gd).valid = true;
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
fn mG(
|
|
158
|
+
si: ptr<function, ad>,
|
|
159
|
+
ma: J,
|
|
160
|
+
prepared: ag,
|
|
161
|
+
aa: ptr<function, Path>,
|
|
162
|
+
ffnormal: vec3f,
|
|
163
|
+
gw: bool
|
|
164
|
+
) {
|
|
165
|
+
let aW = jO();
|
|
166
|
+
var selected: mO;
|
|
167
|
+
selected.valid = false;
|
|
168
|
+
var mw = 0.0;
|
|
169
|
+
var ls = 0.0;
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
for (var ca = 0u; ca < aW; ca++) {
|
|
173
|
+
var candidate: mO;
|
|
174
|
+
let oW = qe(
|
|
175
|
+
si, ma, prepared, aa, ffnormal, gw,
|
|
176
|
+
ca, aW, &candidate);
|
|
177
|
+
if (aW == 1u) {
|
|
178
|
+
if (!oW) { return; }
|
|
179
|
+
selected = candidate;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
if (!oW) { continue; }
|
|
183
|
+
let ka = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
|
|
184
|
+
if (!(ka > 0.0) || ka != ka) { continue; }
|
|
185
|
+
ls += ka;
|
|
186
|
+
if (!selected.valid ||
|
|
187
|
+
po(ca) * ls <= ka) {
|
|
188
|
+
selected = candidate;
|
|
189
|
+
mw = candidate.risTarget;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
var qC = 1.0;
|
|
193
|
+
if (aW > 1u) {
|
|
194
|
+
if (!selected.valid || mw <= 0.0) { return; }
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
qC = selected.lightSelectionPmf * ls /
|
|
198
|
+
(f32(aW) * mw);
|
|
199
|
+
}
|
|
200
|
+
if (selected.valid &&
|
|
201
|
+
!ex(selected.ray, selected.maxDistance, selected.triangleIndex)) {
|
|
202
|
+
(*aa).li += selected.contribution * qC;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
fn pc(
|
|
207
|
+
si: ptr<function, ad>,
|
|
208
|
+
aa: ptr<function, Path>
|
|
209
|
+
) -> f32 {
|
|
210
|
+
if ((*aa).fromEye || rtUniform.lightWeightTotal <= 0.0 ||
|
|
211
|
+
i32(materialsBuffer[(*si).materialIndex].matType) == UNLIT) {
|
|
212
|
+
return 1.0;
|
|
213
|
+
}
|
|
214
|
+
let samplingLuminance = dot(
|
|
215
|
+
materialsBuffer[(*si).materialIndex].emission,
|
|
216
|
+
luminance
|
|
217
|
+
);
|
|
218
|
+
let oZ = dot((*si).faceNormal, -(*aa).ray.d);
|
|
219
|
+
if (samplingLuminance <= 0.0 || oZ <= 0.0) {
|
|
220
|
+
return 1.0;
|
|
221
|
+
}
|
|
222
|
+
let rL = distance((*si).position, (*aa).ray.o);
|
|
223
|
+
let fd = samplingLuminance / rtUniform.lightWeightTotal *
|
|
224
|
+
rL * rL / max(oZ, 1e-8);
|
|
225
|
+
return fS((*aa).scatteringPdf, fd);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
${hasCoatNormals ? /* wgsl */ `
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
fn fB(input: vec3f, tc: vec3f, view: vec3f) -> vec3f {
|
|
232
|
+
let qL = dot(tc, view) >= 0.0;
|
|
233
|
+
let ub = select(-tc, tc, qL);
|
|
234
|
+
let qK = select(-input, input, qL);
|
|
235
|
+
if (dot(input, tc) <= 0.0 || dot(qK, view) <= 1e-6) { return ub; }
|
|
236
|
+
return qK;
|
|
237
|
+
}
|
|
238
|
+
` : ''}
|
|
239
|
+
fn lO(
|
|
240
|
+
si: ptr<function, ad>,
|
|
241
|
+
ma: ptr<function, J>,
|
|
242
|
+
aa: ptr<function, Path>
|
|
243
|
+
) {
|
|
244
|
+
${hasCoatNormals ? /* wgsl */ `
|
|
245
|
+
let bC = (*si).faceNormal;
|
|
246
|
+
let mr = (*si).normal;
|
|
247
|
+
` : ''}
|
|
248
|
+
var rA: f32 = -dot((*si).faceNormal, (*aa).ray.d);
|
|
249
|
+
var sq: f32 = -dot((*si).normal, (*aa).ray.d);
|
|
250
|
+
if (((*ma).transmissionWeight > 0.0 || (*ma).subsurfaceWeight > 0.0) && (*ma).thinWalled) {
|
|
251
|
+
|
|
252
|
+
if (rA < 0.0) {
|
|
253
|
+
(*si).faceNormal = -(*si).faceNormal;
|
|
254
|
+
rA = -rA;
|
|
255
|
+
}
|
|
256
|
+
if (sq < 0.0) {
|
|
257
|
+
(*si).normal = -(*si).normal;
|
|
258
|
+
sq = -sq;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
var pI: bool = rA >= 0.0 && sq < 0.0;
|
|
264
|
+
var ndv: f32 = select(sq, rA, pI);
|
|
265
|
+
var N: vec3f = select((*si).normal, (*si).faceNormal, pI);
|
|
266
|
+
|
|
267
|
+
(*ma).inside = ndv <= 0.0 && !(*ma).thinWalled;
|
|
268
|
+
|
|
269
|
+
(*ma).relativeIor = select((*ma).specularIor, (1.0 / (*ma).specularIor), ndv > 0.0);
|
|
270
|
+
var ffnormal = select(-N, N, ndv >= 0.0);
|
|
271
|
+
${hasCoatNormals ? /* wgsl */ `
|
|
272
|
+
if ((*ma).coatNormalEnabled) {
|
|
273
|
+
let view = -(*aa).ray.d;
|
|
274
|
+
let fW = dot(bC, view);
|
|
275
|
+
(*ma).geometricNormal = select(-bC, bC, fW >= 0.0);
|
|
276
|
+
ffnormal = fB(mr, bC, view);
|
|
277
|
+
(*ma).coatNormal = fB((*si).coatNormal, bC, view);
|
|
278
|
+
(*ma).inside = fW <= 0.0 && !(*ma).thinWalled;
|
|
279
|
+
(*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, fW > 0.0 || (*ma).thinWalled);
|
|
280
|
+
}
|
|
281
|
+
` : ''}
|
|
282
|
+
|
|
283
|
+
(*aa).scatteringIsDelta = false;
|
|
284
|
+
var bl = false;
|
|
285
|
+
var hj = false;
|
|
286
|
+
let mediumType = (*si).mediumType;
|
|
287
|
+
|
|
288
|
+
var scatteringPdf: f32;
|
|
289
|
+
var cF: vec3f;
|
|
290
|
+
|
|
291
|
+
if (HAS_MEDIUM) {
|
|
292
|
+
let d = distance((*si).position, (*aa).ray.o);
|
|
293
|
+
let ne = (*aa).ray.o;
|
|
294
|
+
let extinction = (*si).mediumExtinction;
|
|
295
|
+
let scattering = min((*si).mediumScattering, extinction);
|
|
296
|
+
let sl = max(max(extinction.x, extinction.y), extinction.z);
|
|
297
|
+
if (mediumType > 0 && sl > 0.0) {
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
let mT = min(i32(dz(cv(MEDIUM_CHANNEL)) * 3.0), 2);
|
|
301
|
+
let fA = extinction[mT];
|
|
302
|
+
let ic = select(
|
|
303
|
+
d,
|
|
304
|
+
min(-log(max(dz(cv(MEDIUM_DISTANCE)), 1e-7)) / fA, d),
|
|
305
|
+
fA > 0.0
|
|
306
|
+
);
|
|
307
|
+
bl = ic < d;
|
|
308
|
+
let ew = exp(-extinction * ic);
|
|
309
|
+
let nM = select(
|
|
310
|
+
ew,
|
|
311
|
+
extinction * ew,
|
|
312
|
+
bl
|
|
313
|
+
);
|
|
314
|
+
let nt = max((nM.x + nM.y + nM.z) / 3.0, 1e-8);
|
|
315
|
+
if (bl) {
|
|
316
|
+
(*aa).beta *= ew * scattering / nt;
|
|
317
|
+
|
|
318
|
+
(*aa).ray.o = ne + ic * (*aa).ray.d;
|
|
319
|
+
(*si).position = (*aa).ray.o;
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
(*aa).beta *= ew / nt;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (!bl) {
|
|
328
|
+
(*aa).li += pc(si, aa) * (*ma).emission * (*aa).beta;
|
|
329
|
+
}
|
|
330
|
+
if ((*ma).materialType == UNLIT) {
|
|
331
|
+
(*aa).abort = true;
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
var prepared: ag;
|
|
337
|
+
if (!bl) {
|
|
338
|
+
${hasAnisotropyDirections ? /* wgsl */ `
|
|
339
|
+
(*ma).directionTangent = (*si).directionTangent;
|
|
340
|
+
(*ma).directionBitangent = (*si).directionBitangent;
|
|
341
|
+
(*ma).geometryTangent = (*si).geometryTangent;
|
|
342
|
+
(*ma).geometryBitangent = (*si).geometryBitangent;
|
|
343
|
+
` : /* wgsl */ ``}
|
|
344
|
+
prepared = eG((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
|
|
345
|
+
}
|
|
346
|
+
mG(si, *ma, prepared, aa, ffnormal, !bl);
|
|
347
|
+
if (bl) {
|
|
348
|
+
|
|
349
|
+
cF = fl(
|
|
350
|
+
-(*aa).ray.d,
|
|
351
|
+
(*si).mediumAnisotropy,
|
|
352
|
+
fk(cv(PHASE_DIRECTION))
|
|
353
|
+
);
|
|
354
|
+
scatteringPdf = bD(
|
|
355
|
+
dot(cF, -(*aa).ray.d),
|
|
356
|
+
(*si).mediumAnisotropy
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
|
|
361
|
+
var isNextRefraction: bool;
|
|
362
|
+
var aA = 1.0;
|
|
363
|
+
var aT = false;
|
|
364
|
+
var bE = true;
|
|
365
|
+
var aR = u32(OPENPBR_LOBE_DIFFUSE);
|
|
366
|
+
var qw = 0.0;
|
|
367
|
+
let ud = vec3f(fk(cv(BSDF_DIRECTION)), dz(cv(BSDF_LOBE)));
|
|
368
|
+
var gR = vec3f(0.0);
|
|
369
|
+
let f = dv(
|
|
370
|
+
prepared,
|
|
371
|
+
ud,
|
|
372
|
+
&cF,
|
|
373
|
+
&scatteringPdf,
|
|
374
|
+
&isNextRefraction,
|
|
375
|
+
&aA,
|
|
376
|
+
&aT,
|
|
377
|
+
&bE,
|
|
378
|
+
&aR,
|
|
379
|
+
&qw,
|
|
380
|
+
&gR
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
if (!(scatteringPdf > 0.0) ||
|
|
387
|
+
!all(f == f) || !all(abs(f) < vec3f(3.402823e38)) ||
|
|
388
|
+
dot(cF, cF) < 0.5) {
|
|
389
|
+
(*aa).scatteringPdf = 0.0;
|
|
390
|
+
(*aa).abort = true;
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
(*aa).scatteringIsDelta = !prepared.material.thinWalled &&
|
|
396
|
+
abs(prepared.material.relativeIor - 1.0) <= 1e-6 &&
|
|
397
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6;
|
|
398
|
+
(*aa).beta *= f / scatteringPdf;
|
|
399
|
+
|
|
400
|
+
hj = isNextRefraction && !(*ma).thinWalled;
|
|
401
|
+
(*aa).isNextRefraction = isNextRefraction;
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
(*aa).ray.o = (*si).position + EPS * cF;
|
|
405
|
+
${hasCoatNormals ? /* wgsl */ `
|
|
406
|
+
if ((*ma).coatNormalEnabled) { (*aa).ray.o = (*si).position + EPS * select(-bC, bC, dot(bC, cF) >= 0.0); }
|
|
407
|
+
` : ''}
|
|
408
|
+
}
|
|
409
|
+
(*aa).scatteringPdf = scatteringPdf;
|
|
410
|
+
(*aa).ray.d = cF;
|
|
411
|
+
if (bl) {
|
|
412
|
+
(*aa).isNextRefraction = false;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
(*aa).fromEye = false;
|
|
416
|
+
|
|
417
|
+
if (HAS_MEDIUM) {
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
if (!bl && hj && (*ma).mediumType > 0) {
|
|
421
|
+
if (rA >= 0.0) {
|
|
422
|
+
(*si).mediumType = (*ma).mediumType;
|
|
423
|
+
(*si).mediumExtinction = (*ma).mediumExtinction;
|
|
424
|
+
(*si).mediumScattering = (*ma).mediumScattering;
|
|
425
|
+
(*si).mediumAnisotropy = (*ma).mediumAnisotropy;
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
(*si).mediumType = 0;
|
|
429
|
+
(*si).mediumExtinction = vec3f(0.0);
|
|
430
|
+
(*si).mediumScattering = vec3f(0.0);
|
|
431
|
+
(*si).mediumAnisotropy = 0.0;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
`;
|
|
437
|
+
}
|
|
438
|
+
export default createSampleMaterialWgsl();
|
|
439
|
+
//# sourceMappingURL=sampleMaterial.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampleMaterial.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/sampleMaterial.wgsl.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,iIAAiI;AACjI,MAAM,UAAU,wBAAwB,CAAC,uBAAuB,GAAG,IAAI,EAAE,cAAc,GAAG,KAAK;IAC7F,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8ChB,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;mFAC4D,CAAC,CAAC,CAAC,0CAA0C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCvI,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,yEAAkF,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6InH,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;;;;;CAU7B,CAAC,CAAC,CAAC,EAAE;;;;;;EAMJ,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;CAG7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;EAwBJ,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;;;;;CAU7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDJ,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8Df,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;CAE7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BL,CAAC;AAEF,CAAC;AAED,eAAe,wBAAwB,EAAE,CAAC","sourcesContent":["// Next-event estimation with resampled importance sampling over the light\n// candidates, followed by BSDF (or phase function) sampling, as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral\nexport function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {\n return /* wgsl */ `\n\nstruct ShadowRayWork {\n ray: Ray,\n maxDistance: f32,\n triangleIndex: i32,\n contribution: vec3f,\n // RIS target of the candidate. The discrete light-selection PMF is excluded\n // and represented by the candidate's unbiased contribution weight instead.\n risTarget: f32,\n lightSelectionPmf: f32,\n valid: bool,\n}\n\nfn PrepareDirectLight(\n si: ptr<function, SurfaceInteraction>,\n ma: OpenPbrResolvedMaterial,\n prepared: OpenPbrPreparedBsdf,\n path: ptr<function, Path>,\n ffnormal: vec3f,\n isSurface: bool,\n candidateIndex: u32,\n candidateCount: u32,\n shadowWork: ptr<function, ShadowRayWork>\n) -> bool {\n (*shadowWork).valid = false;\n (*shadowWork).lightSelectionPmf = 0.0;\n (*shadowWork).risTarget = 0.0;\n let lightRnd = vec3f(sample2D(lightDim(candidateIndex, 1u)), sample1D(lightDim(candidateIndex, 0u)));\n\n var lightSample: LightSampleRec;\n sampleLightForNEECandidate(\n (*si).position,\n lightRnd,\n candidateIndex,\n candidateCount,\n &lightSample\n );\n var Li = lightSample.emission;\n\n let lightDir = lightSample.direction;\n let viewDir = -(*path).ray.d;\n let lightPdf = lightSample.pdf;\n let lightSelectionPmf = lightSample.selectionPmf;\n // Keep direct-light culling consistent with the two-sided BSDF evaluation.\n // The raw imported normal can point away from the camera on interior walls.\n ${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);\n if (isSurface && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}\n\n if (lightPdf <= 0.0 || lightSelectionPmf <= 0.0 ||\n max(max(Li.x, Li.y), Li.z) <= 0.0) {\n return false;\n }\n\n var scatteringPdf = 0.0;\n var f = vec3f(0.0);\n if (isSurface) {\n // Evaluate the cheap BSDF terms before paying for a scene traversal.\n // Back-facing, delta, and otherwise zero-contribution samples can stop here.\n if (cosThetaL <= 0.0 && ma.transmissionWeight <= 0.0 && ma.subsurfaceWeight <= 0.0) {\n return false;\n }\n f = openpbr_eval_prepared(prepared, lightDir, &scatteringPdf);\n }\n else {\n scatteringPdf = sampling_henyey_greenstein_phase(\n dot(viewDir, lightDir),\n (*si).mediumAnisotropy\n );\n f = vec3f(scatteringPdf);\n }\n\n if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {\n return false;\n }\n\n var lightRay: Ray;\n var shadowOrigin = (*si).position + EPS * lightDir;\n if (isSurface) {\n shadowOrigin = offsetSurfaceRay((*si).position, (*si).faceNormal, lightDir);\n let shadowTerminatorCutoff = 0.1;\n var normalLight = dot((*si).normal, lightDir);\n${hasCoatNormals ? /* wgsl */ ` if (ma.coatNormalEnabled) { normalLight = dot((*si).faceNormal, lightDir); }` : ''}\n let geometricNormal = select(\n (*si).faceNormal,\n -(*si).faceNormal,\n normalLight < 0.0\n );\n normalLight = abs(normalLight);\n let geometricLight = dot(geometricNormal, lightDir);\n let offsetAmount = select(\n clamp(1.0 - geometricLight / shadowTerminatorCutoff, 0.0, 1.0),\n clamp(\n 2.0 - (geometricLight + normalLight) / shadowTerminatorCutoff,\n 0.0,\n 1.0\n ),\n normalLight < shadowTerminatorCutoff\n );\n shadowOrigin += (*si).shadowOffset * offsetAmount;\n }\n // Falcor offsets sampled emissive positions along the light normal, then\n // derives the visibility ray from that offset endpoint. Without the target\n // offset, our any-hit traversal sees the sampled light triangle itself and\n // rejects virtually every emissive NEE sample as occluded.\n var visibilityDirection = lightDir;\n var visibilityDistance = lightSample.dist - EPS;\n if (lightSample.sourceType == 1u) {\n let lightEndpoint =\n (*si).position + lightSample.direction * lightSample.dist;\n let offsetLightEndpoint = lightEndpoint + EPS * lightSample.normal;\n let toOffsetLight = offsetLightEndpoint - shadowOrigin;\n visibilityDistance = length(toOffsetLight);\n visibilityDirection = normalize(toOffsetLight);\n }\n initRay(&lightRay, shadowOrigin, visibilityDirection);\n\n // The continuation of a surface transmission sees the displayed background.\n // Evaluate that same endpoint for the environment proposal, so both MIS\n // strategies estimate the same radiance even for a separate/grounded skybox.\n if (isSurface && cosThetaL < 0.0 && lightSample.sourceType == 0u) {\n let background = sampleSceneBackground(lightRay);\n Li = background.rgb * background.a;\n }\n if (SPECTRAL) {\n Li = sampling_spectral_rgb_filter(Li, (*si).wavelength);\n }\n\n // A directional source is a delta distribution and cannot be reached by\n // the BSDF-sampling strategy, so its light-sampled contribution has weight 1.\n let misWeight = select(\n neeMISWeight(lightPdf, scatteringPdf),\n 1.0,\n lightSample.isDelta\n );\n if (misWeight > 0.0) {\n let unweightedContribution = Li * f / lightPdf * (*path).beta;\n (*shadowWork).risTarget = max(\n dot(max(unweightedContribution * lightSelectionPmf, vec3f(0.0)), luminance),\n 0.0\n );\n (*shadowWork).ray = lightRay;\n (*shadowWork).maxDistance = visibilityDistance;\n (*shadowWork).triangleIndex = (*si).triangleIndex;\n (*shadowWork).contribution = misWeight * unweightedContribution;\n (*shadowWork).lightSelectionPmf = lightSelectionPmf;\n (*shadowWork).valid = true;\n return true;\n }\n return false;\n}\n\nfn DirectLight(\n si: ptr<function, SurfaceInteraction>,\n ma: OpenPbrResolvedMaterial,\n prepared: OpenPbrPreparedBsdf,\n path: ptr<function, Path>,\n ffnormal: vec3f,\n isSurface: bool\n) {\n let candidateCount = neeCandidateCount();\n var selected: ShadowRayWork;\n selected.valid = false;\n var selectedTarget = 0.0;\n var scalarWeightSum = 0.0;\n // Streaming weighted reservoir sampling over the light candidates. Only the\n // selected candidate traces a shadow ray.\n for (var candidateIndex = 0u; candidateIndex < candidateCount; candidateIndex++) {\n var candidate: ShadowRayWork;\n let candidateValid = PrepareDirectLight(\n si, ma, prepared, path, ffnormal, isSurface,\n candidateIndex, candidateCount, &candidate);\n if (candidateCount == 1u) {\n if (!candidateValid) { return; }\n selected = candidate;\n break;\n }\n if (!candidateValid) { continue; }\n let scalarWeight = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);\n if (!(scalarWeight > 0.0) || scalarWeight != scalarWeight) { continue; }\n scalarWeightSum += scalarWeight;\n if (!selected.valid ||\n lightCandidateRandom(candidateIndex) * scalarWeightSum <= scalarWeight) {\n selected = candidate;\n selectedTarget = candidate.risTarget;\n }\n }\n var candidateUCW = 1.0;\n if (candidateCount > 1u) {\n if (!selected.valid || selectedTarget <= 0.0) { return; }\n // RIS unbiased contribution weight, normalized by the target rather than\n // target / selection PMF.\n candidateUCW = selected.lightSelectionPmf * scalarWeightSum /\n (f32(candidateCount) * selectedTarget);\n }\n if (selected.valid &&\n !intersectSceneShadow(selected.ray, selected.maxDistance, selected.triangleIndex)) {\n (*path).li += selected.contribution * candidateUCW;\n }\n}\n\nfn emissiveHitMisWeight(\n si: ptr<function, SurfaceInteraction>,\n path: ptr<function, Path>\n) -> f32 {\n if ((*path).fromEye || rtUniform.lightWeightTotal <= 0.0 ||\n i32(materialsBuffer[(*si).materialIndex].matType) == UNLIT) {\n return 1.0;\n }\n let samplingLuminance = dot(\n materialsBuffer[(*si).materialIndex].emission,\n luminance\n );\n let cosLight = dot((*si).faceNormal, -(*path).ray.d);\n if (samplingLuminance <= 0.0 || cosLight <= 0.0) {\n return 1.0;\n }\n let hitDistance = distance((*si).position, (*path).ray.o);\n let lightPdf = samplingLuminance / rtUniform.lightWeightTotal *\n hitDistance * hitDistance / max(cosLight, 1e-8);\n return bsdfMISWeight((*path).scatteringPdf, lightPdf);\n}\n\n${hasCoatNormals ? /* wgsl */ `\n// Keep each shading frame in the geometric/view hemisphere. This correction\n// does not replace the face normal used for topology or ray offsets.\nfn coat_frame_normal(input: vec3f, face: vec3f, view: vec3f) -> vec3f {\n let front = dot(face, view) >= 0.0;\n let ffFace = select(-face, face, front);\n let ffInput = select(-input, input, front);\n if (dot(input, face) <= 0.0 || dot(ffInput, view) <= 1e-6) { return ffFace; }\n return ffInput;\n}\n` : ''}\nfn SampleMaterial(\n si: ptr<function, SurfaceInteraction>,\n ma: ptr<function, OpenPbrResolvedMaterial>,\n path: ptr<function, Path>\n) {\n${hasCoatNormals ? /* wgsl */ `\n let originalFace = (*si).faceNormal;\n let originalNormal = (*si).normal;\n` : ''}\n var ndv1: f32 = -dot((*si).faceNormal, (*path).ray.d);\n var ndv2: f32 = -dot((*si).normal, (*path).ray.d);\n if (((*ma).transmissionWeight > 0.0 || (*ma).subsurfaceWeight > 0.0) && (*ma).thinWalled) {\n // Always treat thin material as entering medium\n if (ndv1 < 0.0) {\n (*si).faceNormal = -(*si).faceNormal;\n ndv1 = -ndv1;\n }\n if (ndv2 < 0.0) {\n (*si).normal = -(*si).normal;\n ndv2 = -ndv2;\n }\n }\n // In same edge cases normal is not torwards the camera while we can still see the face.\n // We need to choose faceNormal in this case.\n var useFaceN: bool = ndv1 >= 0.0 && ndv2 < 0.0;\n var ndv: f32 = select(ndv2, ndv1, useFaceN);\n var N: vec3f = select((*si).normal, (*si).faceNormal, useFaceN);\n\n (*ma).inside = ndv <= 0.0 && !(*ma).thinWalled;\n // In or out\n (*ma).relativeIor = select((*ma).specularIor, (1.0 / (*ma).specularIor), ndv > 0.0);\n var ffnormal = select(-N, N, ndv >= 0.0);\n${hasCoatNormals ? /* wgsl */ `\n if ((*ma).coatNormalEnabled) {\n let view = -(*path).ray.d;\n let geometricView = dot(originalFace, view);\n (*ma).geometricNormal = select(-originalFace, originalFace, geometricView >= 0.0);\n ffnormal = coat_frame_normal(originalNormal, originalFace, view);\n (*ma).coatNormal = coat_frame_normal((*si).coatNormal, originalFace, view);\n (*ma).inside = geometricView <= 0.0 && !(*ma).thinWalled;\n (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, geometricView > 0.0 || (*ma).thinWalled);\n }\n` : ''}\n\n (*path).scatteringIsDelta = false;\n var mediumSampled = false;\n var crossedBoundary = false;\n let mediumType = (*si).mediumType;\n\n var scatteringPdf: f32;\n var scatterDir: vec3f;\n\n if (HAS_MEDIUM) {\n let d = distance((*si).position, (*path).ray.o);\n let segmentOrigin = (*path).ray.o;\n let extinction = (*si).mediumExtinction;\n let scattering = min((*si).mediumScattering, extinction);\n let majorant = max(max(extinction.x, extinction.y), extinction.z);\n if (mediumType > 0 && majorant > 0.0) {\n // Sample one RGB extinction channel and divide by the mixture PDF. This\n // avoids high-variance majorant weights for channel-dependent SSS radii.\n let mediumChannel = min(i32(sample1D(bounceDim(MEDIUM_CHANNEL)) * 3.0), 2);\n let channelExtinction = extinction[mediumChannel];\n let scatterDist = select(\n d,\n min(-log(max(sample1D(bounceDim(MEDIUM_DISTANCE)), 1e-7)) / channelExtinction, d),\n channelExtinction > 0.0\n );\n mediumSampled = scatterDist < d;\n let transmittance = exp(-extinction * scatterDist);\n let density = select(\n transmittance,\n extinction * transmittance,\n mediumSampled\n );\n let mediumPdf = max((density.x + density.y + density.z) / 3.0, 1e-8);\n if (mediumSampled) {\n (*path).beta *= transmittance * scattering / mediumPdf;\n // Move from the start of the segment, not from its end surface.\n (*path).ray.o = segmentOrigin + scatterDist * (*path).ray.d;\n (*si).position = (*path).ray.o;\n }\n else {\n (*path).beta *= transmittance / mediumPdf;\n }\n }\n }\n\n if (!mediumSampled) {\n (*path).li += emissiveHitMisWeight(si, path) * (*ma).emission * (*path).beta;\n }\n if ((*ma).materialType == UNLIT) {\n (*path).abort = true;\n return;\n }\n // Surface and medium events share the light estimator. Emission is added\n // before NEE, then the continuation direction is sampled.\n var prepared: OpenPbrPreparedBsdf;\n if (!mediumSampled) {\n${hasAnisotropyDirections ? /* wgsl */ `\n (*ma).directionTangent = (*si).directionTangent;\n (*ma).directionBitangent = (*si).directionBitangent;\n (*ma).geometryTangent = (*si).geometryTangent;\n (*ma).geometryBitangent = (*si).geometryBitangent;\n` : /* wgsl */ ``}\n prepared = openpbr_prepare((*si).tangent, *ma, -(*path).ray.d, ffnormal);\n }\n DirectLight(si, *ma, prepared, path, ffnormal, !mediumSampled);\n if (mediumSampled) {\n // Pick a new direction based on the phase function.\n scatterDir = sampling_henyey_greenstein(\n -(*path).ray.d,\n (*si).mediumAnisotropy,\n sample2D(bounceDim(PHASE_DIRECTION))\n );\n scatteringPdf = sampling_henyey_greenstein_phase(\n dot(scatterDir, -(*path).ray.d),\n (*si).mediumAnisotropy\n );\n }\n else {\n // Sample BSDF for color and outgoing direction\n var isNextRefraction: bool;\n var sampledLobeRoughness = 1.0;\n var sampledLobeSpecular = false;\n var sampledLobeDiffuse = true;\n var sampledLobeIndex = u32(OPENPBR_LOBE_DIFFUSE);\n var sampledMarginalPdf = 0.0;\n let matRnd = vec3f(sample2D(bounceDim(BSDF_DIRECTION)), sample1D(bounceDim(BSDF_LOBE)));\n var fullResponse = vec3f(0.0);\n let f = openpbr_sample_prepared(\n prepared,\n matRnd,\n &scatterDir,\n &scatteringPdf,\n &isNextRefraction,\n &sampledLobeRoughness,\n &sampledLobeSpecular,\n &sampledLobeDiffuse,\n &sampledLobeIndex,\n &sampledMarginalPdf,\n &fullResponse\n );\n // A rejected microfacet proposal (including failed refraction), or a\n // material with no scattering lobes, has no continuation. Keep emission\n // and NEE already accumulated at this vertex, but never trace a default\n // direction with the incoming throughput: that invents extra light paths.\n if (!(scatteringPdf > 0.0) ||\n !all(f == f) || !all(abs(f) < vec3f(3.402823e38)) ||\n dot(scatterDir, scatterDir) < 0.5) {\n (*path).scatteringPdf = 0.0;\n (*path).abort = true;\n return;\n }\n // Exactly index-matched solid transmission is a discrete null boundary;\n // environment NEE has no competing density for that event.\n (*path).scatteringIsDelta = !prepared.material.thinWalled &&\n abs(prepared.material.relativeIor - 1.0) <= 1e-6 &&\n prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6;\n (*path).beta *= f / scatteringPdf;\n\n crossedBoundary = isNextRefraction && !(*ma).thinWalled;\n (*path).isNextRefraction = isNextRefraction;\n // TODO prefer the opaque surface when transmission surface and opaque surface are overlapped.\n // Or the ray go out from transmission material will miss the opque surface.\n (*path).ray.o = (*si).position + EPS * scatterDir;\n${hasCoatNormals ? /* wgsl */ `\n if ((*ma).coatNormalEnabled) { (*path).ray.o = (*si).position + EPS * select(-originalFace, originalFace, dot(originalFace, scatterDir) >= 0.0); }\n` : ''}\n }\n (*path).scatteringPdf = scatteringPdf;\n (*path).ray.d = scatterDir;\n if (mediumSampled) {\n (*path).isNextRefraction = false;\n }\n\n (*path).fromEye = false;\n\n if (HAS_MEDIUM) {\n // Reflections stay in the current medium. Enter or leave only after the\n // BSDF actually sampled transmission through a medium boundary.\n if (!mediumSampled && crossedBoundary && (*ma).mediumType > 0) {\n if (ndv1 >= 0.0) {\n (*si).mediumType = (*ma).mediumType;\n (*si).mediumExtinction = (*ma).mediumExtinction;\n (*si).mediumScattering = (*ma).mediumScattering;\n (*si).mediumAnisotropy = (*ma).mediumAnisotropy;\n }\n else {\n (*si).mediumType = 0;\n (*si).mediumExtinction = vec3f(0.0);\n (*si).mediumScattering = vec3f(0.0);\n (*si).mediumAnisotropy = 0.0;\n }\n }\n }\n}\n`;\n\n}\n\nexport default createSampleMaterialWgsl();\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: "\n\n// A one-sample binary shadow test leaves scattered fully dark pixels far\n// from the occluder at low sample counts. Averaging a few light samples per\n// primary hit costs only shadow rays and lets the mask settle much sooner.\nconst SHADOW_CATCHER_LIGHT_SAMPLES = 4u;\n\nfn sampleShadowCatcher(si: SurfaceInteraction, bounce: i32, path: ptr<function, Path>) {\n let viewDir = -(*path).ray.d;\n\n // The unified table also contains emissive mesh lights.\n if (rtUniform.lightChoiceCount > 0) {\n var shadow = 0.0;\n for (var candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {\n var lightSample: LightSampleRec;\n let lightRnd = vec3f(sample2D(lightDim(candidate, 1u)), sample1D(lightDim(candidate, 0u)));\n sampleLight(si.position, lightRnd, &lightSample, false);\n let lightDir = lightSample.direction;\n let cosThetaL = dot(si.normal, lightDir);\n let orientation = dot(si.normal, viewDir) * cosThetaL;\n if (lightSample.pdf > 0.0 && orientation >= 0.0) {\n var ray: Ray;\n initRay(&ray, si.position + EPS * lightDir, lightDir);\n if (intersectSceneShadow(ray, lightSample.dist - EPS, si.triangleIndex)) {\n shadow += 1.0;\n }\n }\n }\n // WebGPU's compose pass consumes shadow opacity directly.\n (*path).alpha = shadow / f32(SHADOW_CATCHER_LIGHT_SAMPLES);\n }\n (*path).fromEye = false;\n}\n";
|
|
2
|
+
export default _default;
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
// Estimate the direct lighting integral using multiple importance sampling
|
|
5
|
+
// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral
|
|
6
|
+
export default /*wgsl*/ `
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const SHADOW_CATCHER_LIGHT_SAMPLES = 4u;
|
|
12
|
+
|
|
13
|
+
fn sampleShadowCatcher(si: ad, bounce: i32, aa: ptr<function, Path>) {
|
|
14
|
+
let oH = -(*aa).ray.d;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if (rtUniform.lightChoiceCount > 0) {
|
|
18
|
+
var shadow = 0.0;
|
|
19
|
+
for (var candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {
|
|
20
|
+
var lightSample: LightSampleRec;
|
|
21
|
+
let kZ = vec3f(fk(qR(candidate, 1u)), dz(qR(candidate, 0u)));
|
|
22
|
+
sampleLight(si.position, kZ, &lightSample, false);
|
|
23
|
+
let lightDir = lightSample.direction;
|
|
24
|
+
let cosThetaL = dot(si.normal, lightDir);
|
|
25
|
+
let pq = dot(si.normal, oH) * cosThetaL;
|
|
26
|
+
if (lightSample.pdf > 0.0 && pq >= 0.0) {
|
|
27
|
+
var ray: Ray;
|
|
28
|
+
iw(&ray, si.position + EPS * lightDir, lightDir);
|
|
29
|
+
if (ex(ray, lightSample.dist - EPS, si.triangleIndex)) {
|
|
30
|
+
shadow += 1.0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
(*aa).alpha = shadow / f32(SHADOW_CATCHER_LIGHT_SAMPLES);
|
|
36
|
+
}
|
|
37
|
+
(*aa).fromEye = false;
|
|
38
|
+
}
|
|
39
|
+
`;
|
|
40
|
+
//# sourceMappingURL=sampleShadowCatcher.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampleShadowCatcher.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,2EAA2E;AAC3E,iIAAiI;AAEjI,eAAe,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCvB,CAAC","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\n// Estimate the direct lighting integral using multiple importance sampling\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral\n\nexport default /*wgsl*/ `\n\n// A one-sample binary shadow test leaves scattered fully dark pixels far\n// from the occluder at low sample counts. Averaging a few light samples per\n// primary hit costs only shadow rays and lets the mask settle much sooner.\nconst SHADOW_CATCHER_LIGHT_SAMPLES = 4u;\n\nfn sampleShadowCatcher(si: SurfaceInteraction, bounce: i32, path: ptr<function, Path>) {\n let viewDir = -(*path).ray.d;\n\n // The unified table also contains emissive mesh lights.\n if (rtUniform.lightChoiceCount > 0) {\n var shadow = 0.0;\n for (var candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {\n var lightSample: LightSampleRec;\n let lightRnd = vec3f(sample2D(lightDim(candidate, 1u)), sample1D(lightDim(candidate, 0u)));\n sampleLight(si.position, lightRnd, &lightSample, false);\n let lightDir = lightSample.direction;\n let cosThetaL = dot(si.normal, lightDir);\n let orientation = dot(si.normal, viewDir) * cosThetaL;\n if (lightSample.pdf > 0.0 && orientation >= 0.0) {\n var ray: Ray;\n initRay(&ray, si.position + EPS * lightDir, lightDir);\n if (intersectSceneShadow(ray, lightSample.dist - EPS, si.triangleIndex)) {\n shadow += 1.0;\n }\n }\n }\n // WebGPU's compose pass consumes shadow opacity directly.\n (*path).alpha = shadow / f32(SHADOW_CATCHER_LIGHT_SAMPLES);\n }\n (*path).fromEye = false;\n}\n`;\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: "\n// The GGX distribution and spherical-cap VNDF sampler are adapted from\n// adobe/openpbr-bsdf, Copyright 2026 Adobe, Apache-2.0. Other routines are\n// project implementations of their stated analytic distributions.\n\nfn sampling_ggx_visible_normal(view: vec3f, alpha: vec2f, samplePoint: vec2f) -> vec3f {\n let stretch = vec3f(alpha, 1.0);\n let sphericalView = normalize(stretch * view);\n let viewZ = min(sphericalView.z, 1.0);\n let capSpan = 1.0 + viewZ;\n let normalZ = (1.0 - samplePoint.y) * capSpan;\n let oneMinusZ = samplePoint.y * capSpan;\n let onePlusZ = normalZ + (1.0 - viewZ);\n let radial = sqrt(max(0.0, onePlusZ * oneMinusZ));\n let azimuth = TWOPI * samplePoint.x;\n let sphericalNormal = vec3f(\n sphericalView.x + radial * cos(azimuth),\n sphericalView.y + radial * sin(azimuth),\n normalZ\n );\n return normalize(stretch * sphericalNormal);\n}\n\nfn sampling_ggx_ndf(halfway: vec3f, alpha: vec2f) -> f32 {\n let ellipsoidNormal = vec3f(\n halfway.x / alpha.x,\n halfway.y / alpha.y,\n halfway.z\n );\n let denominator = dot(ellipsoidNormal, ellipsoidNormal);\n return 1.0 / (\n PI * alpha.x * alpha.y * denominator * denominator\n );\n}\n\nfn sampling_ggx_smith_g1(direction: vec3f, alpha: vec2f) -> f32 {\n let normalComponent = abs(direction.z);\n if (normalComponent <= 1e-8) {\n return 0.0;\n }\n let roughDirection = alpha * direction.xy;\n let tanThetaSquared = dot(roughDirection, roughDirection)\n / (normalComponent * normalComponent);\n return 2.0 / (1.0 + sqrt(1.0 + tanThetaSquared));\n}\n\nfn sampling_schlick_fifth_power(cosine: f32) -> f32 {\n let complement = clamp(1.0 - cosine, 0.0, 1.0);\n return pow(complement, 5.0);\n}\n\nfn sampling_dielectric_fresnel(incidentCosine: f32, etaIOverEtaT: f32) -> f32 {\n let cosineI = clamp(abs(incidentCosine), 0.0, 1.0);\n let sineTSquared = etaIOverEtaT * etaIOverEtaT\n * max(0.0, 1.0 - cosineI * cosineI);\n if (sineTSquared >= 1.0) {\n return 1.0;\n }\n\n let cosineT = sqrt(max(0.0, 1.0 - sineTSquared));\n let perpendicular = (cosineI - etaIOverEtaT * cosineT)\n / max(cosineI + etaIOverEtaT * cosineT, 1e-8);\n let parallel = (etaIOverEtaT * cosineI - cosineT)\n / max(etaIOverEtaT * cosineI + cosineT, 1e-8);\n return 0.5 * (\n perpendicular * perpendicular + parallel * parallel\n );\n}\n\nfn sampling_concentric_disk(samplePoint: vec2f) -> vec2f {\n let offset = 2.0 * samplePoint - vec2f(1.0);\n if (offset.x == 0.0 && offset.y == 0.0) {\n return vec2f(0.0);\n }\n\n var radius: f32;\n var angle: f32;\n if (abs(offset.x) > abs(offset.y)) {\n radius = offset.x;\n angle = 0.25 * PI * (offset.y / offset.x);\n }\n else {\n radius = offset.y;\n angle = 0.5 * PI - 0.25 * PI * (offset.x / offset.y);\n }\n return radius * vec2f(cos(angle), sin(angle));\n}\n\nfn sampling_cosine_hemisphere(samplePoint: vec2f) -> vec3f {\n let diskPoint = sampling_concentric_disk(samplePoint);\n return vec3f(\n diskPoint,\n sqrt(max(0.0, 1.0 - dot(diskPoint, diskPoint)))\n );\n}\n\nfn sampling_power_heuristic(firstPdf: f32, secondPdf: f32) -> f32 {\n let scale = max(firstPdf, secondPdf);\n if (scale <= 0.0) {\n return 0.0;\n }\n let normalized = vec2f(firstPdf, secondPdf) / scale;\n let squared = normalized * normalized;\n return squared.x / (squared.x + squared.y);\n}\n\nfn sampling_orthonormal_basis(\n normal: vec3f,\n tangent: ptr<function, vec3f>,\n bitangent: ptr<function, vec3f>\n) {\n let signZ = select(-1.0, 1.0, normal.z >= 0.0);\n let factor = -1.0 / (signZ + normal.z);\n let xy = normal.x * normal.y * factor;\n *tangent = vec3f(\n 1.0 + signZ * normal.x * normal.x * factor,\n signZ * xy,\n -signZ * normal.x\n );\n *bitangent = vec3f(\n xy,\n signZ + normal.y * normal.y * factor,\n -normal.y\n );\n}\n\nfn sampling_spectral_rgb_filter(rgb: vec3f, wavelength: f32) -> vec3f {\n if (wavelength == 0.0) {\n return rgb;\n }\n if (wavelength > 600.0) {\n return vec3f(rgb.r, 0.0, 0.0);\n }\n if (wavelength > 500.0) {\n return vec3f(0.0, rgb.g, 0.0);\n }\n return vec3f(0.0, 0.0, rgb.b);\n}\n\nfn sampling_cauchy_ior(\n wavelength: f32,\n referenceIor: f32,\n dispersionScale: f32,\n abbeNumber: f32\n) -> f32 {\n if (wavelength == 0.0 || dispersionScale <= 0.0) {\n return referenceIor;\n }\n\n let FRAUNHOFER_C = 656.3;\n let FRAUNHOFER_D = 587.6;\n let FRAUNHOFER_F = 486.1;\n let inverseDifference = 1.0 / (\n 1.0 / (FRAUNHOFER_F * FRAUNHOFER_F)\n - 1.0 / (FRAUNHOFER_C * FRAUNHOFER_C)\n );\n let effectiveAbbe = max(abbeNumber / dispersionScale, 1e-6);\n let cauchyB = (referenceIor - 1.0) * inverseDifference / effectiveAbbe;\n let cauchyA = referenceIor\n - cauchyB / (FRAUNHOFER_D * FRAUNHOFER_D);\n return cauchyA + cauchyB / (wavelength * wavelength);\n}\n\nfn sampling_henyey_greenstein(\n forwardDirection: vec3f,\n anisotropy: f32,\n samplePoint: vec2f\n) -> vec3f {\n var cosine: f32;\n if (abs(anisotropy) < 0.001) {\n cosine = 1.0 - 2.0 * samplePoint.y;\n }\n else {\n let ratio = (1.0 - anisotropy * anisotropy)\n / (1.0 + anisotropy - 2.0 * anisotropy * samplePoint.y);\n cosine = (\n ratio * ratio - 1.0 - anisotropy * anisotropy\n ) / (2.0 * anisotropy);\n }\n\n let sine = sqrt(max(0.0, 1.0 - cosine * cosine));\n let azimuth = TWOPI * samplePoint.x;\n var tangent: vec3f;\n var bitangent: vec3f;\n sampling_orthonormal_basis(forwardDirection, &tangent, &bitangent);\n return tangent * (sine * cos(azimuth))\n + bitangent * (sine * sin(azimuth))\n + forwardDirection * cosine;\n}\n\nfn sampling_henyey_greenstein_phase(cosine: f32, anisotropy: f32) -> f32 {\n let denominator = 1.0 + anisotropy * anisotropy\n + 2.0 * anisotropy * cosine;\n return INV4PI * (1.0 - anisotropy * anisotropy)\n / (denominator * sqrt(denominator));\n}\n";
|
|
2
|
+
export default _default;
|