@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 @@
|
|
|
1
|
+
{"version":3,"file":"intersect.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/intersect.glsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,SAAS,kBAAkB,CACzB,aAAqB,EACrB,gBAAgB,GAAG,EAAE,EACrB,WAAW,GAAG,kBAAkB;IAEhC,MAAM,kBAAkB,GAAG,IAAI,CAAA;oDACqC,oBAAoB;;;EAG9E,gBAAgB;;;;;;;;;;;;;;;;yBAgBqB,oBAAoB;;;;;;;;;EASvD,aAAa;;;CAG1B,CAAC;IACA,OAAO,IAAI,CAAA;;;;eAII,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8BE,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;;;;;;;;;;;kDAWiC,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmN/F,kBAAkB;;;CAGzB,CAAC;AACF,CAAC;AAED,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACxC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAEhD,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACtC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAE5C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAEvC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAE1C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACrC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmjBV,kBAAkB,CAAC,IAAI,CAAA;;;;;;;;CAQxB,CAAC;;;;mDAImF,oBAAoB;;;;UAI5E,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;;;UAGpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC/C,kBAAkB,CAClB,IAAI,CAAA;;;;;;;;CAQL,EACC,IAAI,CAAA;;;;CAIL,EACC,aAAa,CACd;;;;mDAIoF,oBAAoB;;;UAG5E,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;;;UAGpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;UACpB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC/C,kBAAkB,CAClB,IAAI,CAAA;;;;;;;;;oDAS6E,oBAAoB;;;;;;;;;;;;;;;;uBAgB5E,sBAAsB,CAAC,KAAK,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkD3D,EACC,IAAI,CAAA;;;;CAIL,EACC,gDAAgD,CACjD;;;CAGA;CACA,CAAC,CAAC","sourcesContent":["import { mapAlphaUsageConstants } from '../../materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nfunction getBVHTraverseCode(\n handleHitCode: string,\n skipTriangleCode = '',\n initialTMax = 'RAY_MAX_DISTANCE'\n) {\n const intersectTriangles = glsl`\n ivec3 vertexOffset = ivec3(floatBitsToInt(fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE}).y));\n for (int k = 0; k < primitiveCount; k++) {\n int triangleIndex = primitiveOffset + k;\n ${skipTriangleCode}\n vec4 r3 = fetchBVH(triangleIndex);\n ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;\n Triangle tri = Triangle(\n fetchData(positionBuffer, index.x, vertexColumns).xyz,\n fetchData(positionBuffer, index.y, vertexColumns).xyz,\n fetchData(positionBuffer, index.z, vertexColumns).xyz\n );\n TriangleIntersect hit = intersectTriangle(o, d, tri, maxDim, shear, tMax);\n\n if (hit.t > 0.0) {\n tMax = hit.t;\n vec3 e1 = tri.p1 - tri.p0;\n vec3 e2 = tri.p2 - tri.p0;\n vec3 faceNormal = normalize(cross(e1, e2));\n int sideMaterialIndex = int(unpackMaterialIndex(\n floatBitsToInt(fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE}).z)\n ).x);\n bool materialDoubleSided = fetchMatData(\n sideMaterialIndex * MAT_DATA_SIZE + MAT_ROW_ALPHA\n ).z > 0.5;\n if (!doubleSided && !materialDoubleSided && dot(faceNormal, d) > 0.0) {\n continue;\n }\n\n ${handleHitCode}\n }\n }\n`;\n return glsl`\n ivec2 stack[STACK_SIZE];\n int top = -1;\n int prevInsIdx = -1;\n float tMax = ${initialTMax};\n\n vec3 o = ray.o;\n vec3 d = ray.d;\n\n bool isHit = false;\n vec3 hitFaceNormal;\n vec3 hitBarycentric;\n ivec3 hitIndex;\n\n Triangle hitTri;\n\n // TODO not sure why. but do root node check here will cause rendering wrong in windows.\n top = 0;\n stack[0] = ivec2(0, -1);\n\n int iter = 0;\n while(top >= 0 && iter < 5000) {\n iter++;\n ivec2 node = stack[top--];\n\n int insIdx = node.y;\n\n if (insIdx != prevInsIdx) {\n if (insIdx < 0) {\n o = ray.o;\n d = ray.d;\n }\n else {\n mat4 w2l = mat4(\n fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE} + 1),\n fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE} + 2),\n fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE} + 3),\n fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE} + 4)\n );\n o = (w2l * vec4(ray.o, 1.0)).xyz;\n d = (w2l * vec4(ray.d, 0.0)).xyz;\n }\n maxDim = maxDimension(abs(d));\n shear = getShear(d, maxDim);\n prevInsIdx = insIdx;\n }\n\n int bufferOff = insIdx < 0 ? 0 : blasOffset;\n uint encodedBlasOffset = insIdx < 0 ? 0u : floatBitsToUint(fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE}).x);\n int blasLayout = int(encodedBlasOffset >> 30u);\n int blasInsOffset = int(encodedBlasOffset & 0x3fffffffu);\n int primitiveCount = 0;\n int primitiveOffset = 0;\n\n if (blasLayout == 3) {\n uint nodeInfo = uint(node.x);\n if ((nodeInfo & 0x80000000u) != 0u) {\n primitiveCount = int((nodeInfo >> 23u) & 0xffu);\n primitiveOffset = bufferOff + blasInsOffset + int(nodeInfo & 0x007fffffu);\n }\n else {\n int i = node.x + bufferOff;\n vec4 compressed0 = fetchBVH(i);\n vec4 compressed1 = fetchBVH(i + 1);\n vec4 compressed2 = fetchBVH(i + 2);\n vec4 compressed3 = fetchBVH(i + 3);\n vec4 compressed4 = fetchBVH(i + 4);\n uint header = floatBitsToUint(compressed0.w);\n int exponentX = int(header << 24u) >> 24;\n int exponentY = int((header >> 8u) << 24u) >> 24;\n int exponentZ = int((header >> 16u) << 24u) >> 24;\n vec3 quantizationScale = vec3(\n uintBitsToFloat(uint(exponentX + 127) << 23u),\n uintBitsToFloat(uint(exponentY + 127) << 23u),\n uintBitsToFloat(uint(exponentZ + 127) << 23u)\n );\n uint childBase = floatBitsToUint(compressed1.x);\n uint triangleBase = floatBitsToUint(compressed1.y);\n uint internalMask = header >> 24u;\n uint octant = (d.x < 0.0 ? 4u : 0u) |\n (d.y < 0.0 ? 2u : 0u) |\n (d.z < 0.0 ? 1u : 0u);\n uint quantizedWords[12] = uint[12](\n floatBitsToUint(compressed2.x), floatBitsToUint(compressed2.y),\n floatBitsToUint(compressed2.z), floatBitsToUint(compressed2.w),\n floatBitsToUint(compressed3.x), floatBitsToUint(compressed3.y),\n floatBitsToUint(compressed3.z), floatBitsToUint(compressed3.w),\n floatBitsToUint(compressed4.x), floatBitsToUint(compressed4.y),\n floatBitsToUint(compressed4.z), floatBitsToUint(compressed4.w)\n );\n\n for (int order = 7; order >= 0; order--) {\n uint slot = uint(order) ^ octant;\n uint metaWord = slot >= 4u\n ? floatBitsToUint(compressed1.w)\n : floatBitsToUint(compressed1.z);\n uint meta = (metaWord >> ((slot & 3u) * 8u)) & 0xffu;\n if (meta == 0u) continue;\n uint byteShift = (slot & 3u) * 8u;\n uint wordOffset = slot >> 2u;\n vec3 quantizedMin = vec3(\n float((quantizedWords[wordOffset] >> byteShift) & 0xffu),\n float((quantizedWords[2u + wordOffset] >> byteShift) & 0xffu),\n float((quantizedWords[4u + wordOffset] >> byteShift) & 0xffu)\n );\n vec3 quantizedMax = vec3(\n float((quantizedWords[6u + wordOffset] >> byteShift) & 0xffu),\n float((quantizedWords[8u + wordOffset] >> byteShift) & 0xffu),\n float((quantizedWords[10u + wordOffset] >> byteShift) & 0xffu)\n );\n vec3 childMin = compressed0.xyz + quantizedMin * quantizationScale;\n vec3 childMax = compressed0.xyz + quantizedMax * quantizationScale;\n if (intersectBox(o, d, childMin, childMax, tMax) <= 0.0) continue;\n uint localOffset = meta & 0x1fu;\n if (localOffset >= 24u) {\n uint precedingMask = internalMask & ((1u << slot) - 1u);\n uint internalIndex = childBase + countBvhBits(precedingMask);\n stack[++top] = ivec2(\n blasInsOffset + int(internalIndex * 5u), insIdx\n );\n }\n else {\n uint triangleCount = countBvhBits(meta >> 5u);\n uint primitiveAddress = triangleBase + localOffset;\n uint leafInfo = 0x80000000u |\n (triangleCount << 23u) |\n (primitiveAddress & 0x007fffffu);\n stack[++top] = ivec2(int(leafInfo), insIdx);\n }\n }\n }\n }\n else if (blasLayout == 2) {\n int i = node.x + bufferOff;\n vec4 gpu0 = fetchBVH(i);\n vec4 gpu1 = fetchBVH(i + 1);\n vec4 gpu2 = fetchBVH(i + 2);\n vec4 gpu3 = fetchBVH(i + 3);\n primitiveCount = int(floatBitsToUint(gpu2.w));\n if (primitiveCount > 0) {\n primitiveOffset = bufferOff + blasInsOffset + int(floatBitsToUint(gpu3.w));\n }\n else {\n int left = blasInsOffset + int(floatBitsToUint(gpu0.w) * 4u);\n int right = blasInsOffset + int(floatBitsToUint(gpu1.w) * 4u);\n float d0 = intersectBox(o, d, gpu0.xyz, gpu1.xyz, tMax);\n float d1 = intersectBox(o, d, gpu2.xyz, gpu3.xyz, tMax);\n if (d0 > d1) {\n if (d0 > 0.0) stack[++top] = ivec2(left, insIdx);\n if (d1 > 0.0) stack[++top] = ivec2(right, insIdx);\n }\n else {\n if (d1 > 0.0) stack[++top] = ivec2(right, insIdx);\n if (d0 > 0.0) stack[++top] = ivec2(left, insIdx);\n }\n }\n }\n else if (blasLayout == 1) {\n uint nodeInfo = uint(node.x);\n if ((nodeInfo & 0x80000000u) != 0u) {\n primitiveCount = int((nodeInfo >> 23u) & 0xffu);\n primitiveOffset = bufferOff + blasInsOffset + int(nodeInfo & 0x007fffffu);\n }\n else {\n int i = node.x + bufferOff;\n vec4 wide0 = fetchBVH(i);\n vec4 wide1 = fetchBVH(i + 1);\n vec4 wide2 = fetchBVH(i + 2);\n vec4 wide3 = fetchBVH(i + 3);\n vec3 nodeMin = wide0.xyz;\n vec3 nodeExtent = vec3(wide0.w, wide1.x, wide1.y);\n uint childInfos[4] = uint[4](\n floatBitsToUint(wide1.z), floatBitsToUint(wide1.w),\n floatBitsToUint(wide2.x), floatBitsToUint(wide2.y)\n );\n vec4 childMinX = unpackBvh4Bounds(floatBitsToUint(wide2.z));\n vec4 childMinY = unpackBvh4Bounds(floatBitsToUint(wide2.w));\n vec4 childMinZ = unpackBvh4Bounds(floatBitsToUint(wide3.x));\n vec4 childMaxX = unpackBvh4Bounds(floatBitsToUint(wide3.y));\n vec4 childMaxY = unpackBvh4Bounds(floatBitsToUint(wide3.z));\n vec4 childMaxZ = unpackBvh4Bounds(floatBitsToUint(wide3.w));\n vec3 invD = traversalInverse(d);\n vec3 padding = depthSlabPadding(invD, o);\n vec4 tx0 = (nodeMin.x + childMinX * nodeExtent.x - o.x) * invD.x;\n vec4 tx1 = (nodeMin.x + childMaxX * nodeExtent.x - o.x) * invD.x;\n vec4 ty0 = (nodeMin.y + childMinY * nodeExtent.y - o.y) * invD.y;\n vec4 ty1 = (nodeMin.y + childMaxY * nodeExtent.y - o.y) * invD.y;\n vec4 tz0 = (nodeMin.z + childMinZ * nodeExtent.z - o.z) * invD.z;\n vec4 tz1 = (nodeMin.z + childMaxZ * nodeExtent.z - o.z) * invD.z;\n vec4 tNear = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));\n vec4 tFar = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));\n vec4 distance = mix(tFar, tNear, greaterThan(tNear, vec4(0.0)));\n distance = mix(distance, vec4(-1.0), greaterThan(tNear, min(tFar, vec4(tMax))));\n float childDistances[4] = float[4](distance.x, distance.y, distance.z, distance.w);\n\n // Push far-to-near so that the closest child is popped first.\n for (int order = 0; order < 4; order++) {\n float farthestDistance = -1.0;\n int farthestChild = -1;\n for (int child = 0; child < 4; child++) {\n if (childInfos[child] != 0u && childDistances[child] > farthestDistance) {\n farthestDistance = childDistances[child];\n farthestChild = child;\n }\n }\n if (farthestChild >= 0 && farthestDistance > 0.0) {\n uint childInfo = childInfos[farthestChild];\n int childAddress = int(childInfo);\n if ((childInfo & 0x80000000u) == 0u) {\n childAddress += blasInsOffset;\n }\n stack[++top] = ivec2(childAddress, insIdx);\n childDistances[farthestChild] = -1.0;\n }\n }\n }\n }\n else {\n int i = node.x + bufferOff;\n vec4 r1 = fetchBVH(i);\n int pointerToRightOrNumPrims = floatBitsToInt(r1.w);\n\n if (pointerToRightOrNumPrims >= 0) {\n int left = node.x + 2;\n int right = pointerToRightOrNumPrims + blasInsOffset;\n\n float d0 = intersectBox(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);\n float d1 = intersectBox(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);\n if (d0 > d1) {\n if (d0 > 0.0) {\n stack[++top] = ivec2(left, insIdx);\n }\n if (d1 > 0.0) {\n stack[++top] = ivec2(right, insIdx);\n }\n }\n else {\n if (d1 > 0.0) {\n stack[++top] = ivec2(right, insIdx);\n }\n if (d0 > 0.0) {\n stack[++top] = ivec2(left, insIdx);\n }\n }\n }\n else {\n if (insIdx < 0) {\n for (int k = 0; k < -pointerToRightOrNumPrims; k++) {\n vec4 r3 = fetchBVH(i + 2 + k);\n stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));\n }\n }\n else {\n primitiveCount = -pointerToRightOrNumPrims;\n primitiveOffset = i + 2;\n }\n }\n }\n if (primitiveCount > 0) {\n ${intersectTriangles}\n }\n }\n`;\n}\n\nexport default createShaderMixin({\n uniforms: {\n positionBuffer: Shader.uniform('sampler2D'),\n normalBuffer: Shader.uniform('sampler2D'),\n tangentBuffer: Shader.uniform('sampler2D'),\n uvBuffer: Shader.uniform('sampler2D'),\n uv1Buffer: Shader.uniform('sampler2D'),\n colorBuffer: Shader.uniform('sampler2D'),\n materialIndexBuffer: Shader.uniform('sampler2D'),\n\n bvhBuffer: Shader.uniform('sampler2D'),\n instancesBuffer: Shader.uniform('sampler2D'),\n\n bvhColumns: Shader.uniform('int', 1),\n vertexColumns: Shader.uniform('int', 1),\n\n instancesColumns: Shader.uniform('int', 1),\n\n blasOffset: Shader.uniform('int'),\n\n isEmptyScene: Shader.uniform('bool')\n },\n main: glsl`\n\nstruct Triangle {\n vec3 p0;\n vec3 p1;\n vec3 p2;\n};\n#ifdef NUM_LIGHTS\nfloat intersectSphere(float rad, vec3 pos, Ray r) {\n vec3 op = pos - r.o;\n float eps = 0.001;\n float b = dot(op, r.d);\n float det = b * b - dot(op, op) + rad * rad;\n if (det < 0.0)\n return INF;\n\n det = sqrt(det);\n float t1 = b - det;\n if (t1 > eps)\n return t1;\n\n float t2 = b + det;\n if (t2 > eps)\n return t2;\n\n return INF;\n}\n\nfloat intersectRect(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {\n float dt = dot(r.d, n);\n float t = (dot(n, pos) - dot(n, r.o)) / dt;\n\n if (t > EPS) {\n vec3 p = r.o + r.d * t;\n vec3 vi = p - pos;\n float a1 = dot(u / dot(u, u), vi);\n if (a1 >= 0.0 && a1 <= 1.0) {\n float a2 = dot(v / dot(v, v), vi);\n if (a2 >= 0.0 && a2 <= 1.0) {\n return t;\n }\n }\n }\n\n return INF;\n}\n\nfloat intersectLight(Ray r, Light light, out LightSampleRec lightSample) {\n // Directional lights are delta sources without finite geometry. Start at\n // INF so they cannot accidentally terminate a BSDF continuation as a\n // geometric light hit; rect and sphere branches overwrite this value.\n float d = INF;\n vec3 u = light.u;\n vec3 v = light.v;\n int type = int(light.type);\n\n#ifdef HAS_RECT_LIGHTS\n if (type == RECT_LIGHT) {\n // Adjust the position from center to start corner\n vec3 pos = light.position-u*0.5-v*0.5;\n vec3 normal = normalize(cross(u, v));\n if (dot(normal, r.d) > 0.) // Hide backfacing quad light\n return INF;\n\n d = intersectRect(pos, u, v, normal, r);\n if (d < 0.) {\n d = INF;\n }\n else {\n float cosTheta = dot(-r.d, normal);\n float spread = light.spread;\n if (cosTheta >= cos(spread * PI / 2.0)) {\n lightSample.pdf = (d * d) / (light.area * cosTheta);\n lightSample.emission = light.emission;\n }\n }\n }\n#endif\n#ifdef HAS_SPHERE_LIGHTS\n if (type == SPHERE_LIGHT) {\n if (light.radius <= 0.0) {\n vec3 toPoint = light.position - r.o;\n float projection = dot(toPoint, r.d);\n vec3 perpendicular = toPoint - projection * r.d;\n if (projection <= EPS || dot(perpendicular, perpendicular) > 1e-8) return INF;\n d = projection;\n lightSample.direction = r.d;\n lightSample.normal = -r.d;\n lightSample.dist = d;\n lightSample.pdf = 1.0;\n lightSample.isDelta = true;\n } else {\n d = intersectSphere(light.radius, light.position, r);\n lightSample.isDelta = false;\n }\n if (d < 0.) {\n d = INF;\n }\n else {\n float centerDistance = distance(r.o, light.position);\n float cosThetaMax = centerDistance <= light.radius\n ? -1.0\n : sqrt(max(0.0, 1.0 - light.radius * light.radius / (centerDistance * centerDistance)));\n if (light.radius > 0.0) {\n lightSample.pdf = centerDistance <= light.radius\n ? INV4PI\n : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);\n }\n lightSample.emission = light.radius <= 0.0\n ? light.emission / max(d * d, 1e-8)\n : light.emission;\n }\n }\n#endif\n#ifdef HAS_SPOT_LIGHTS\n if (type == SPOT_LIGHT) {\n if (light.radius <= 0.0) {\n vec3 toPoint = light.position - r.o;\n float projection = dot(toPoint, r.d);\n vec3 perpendicular = toPoint - projection * r.d;\n if (projection <= EPS || dot(perpendicular, perpendicular) > 1e-8) return INF;\n d = projection;\n lightSample.direction = r.d;\n lightSample.normal = -r.d;\n lightSample.dist = d;\n lightSample.pdf = 1.0;\n lightSample.isDelta = true;\n } else {\n d = intersectSphere(light.radius, light.position, r);\n lightSample.isDelta = false;\n }\n if (d != INF) {\n vec3 hitPt = r.o + d * r.d;\n float multiplier = evaluateSpotEmissionMultiplier(light, normalize(r.o - hitPt));\n if (multiplier <= 0.0) return INF;\n float centerDistance = distance(r.o, light.position);\n float cosThetaMax = centerDistance <= light.radius\n ? -1.0\n : sqrt(max(0.0, 1.0 - light.radius * light.radius / (centerDistance * centerDistance)));\n if (light.radius > 0.0) {\n lightSample.pdf = centerDistance <= light.radius\n ? INV4PI\n : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);\n }\n lightSample.emission = light.emission * multiplier * (light.radius <= 0.0\n ? 1.0 / max(d * d, 1e-8)\n : 1.0);\n }\n }\n#endif\n\n return d;\n}\n#endif\n\nint randomPickMaterial(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {\n vec2 m00 = unpackMaterialIndex(m0.x);\n vec2 m01 = unpackMaterialIndex(m0.y);\n vec2 m02 = unpackMaterialIndex(m0.z);\n vec2 m10 = unpackMaterialIndex(m1.x);\n vec2 m11 = unpackMaterialIndex(m1.y);\n vec2 m12 = unpackMaterialIndex(m1.z);\n vec2 m20 = unpackMaterialIndex(m2.x);\n vec2 m21 = unpackMaterialIndex(m2.y);\n vec2 m22 = unpackMaterialIndex(m2.z);\n float w00 = m00.y * bary.x;\n float w01 = m01.y * bary.x;\n float w02 = m02.y * bary.x;\n float w10 = m10.y * bary.y;\n float w11 = m11.y * bary.y;\n float w12 = m12.y * bary.y;\n float w20 = m20.y * bary.z;\n float w21 = m21.y * bary.z;\n float w22 = m22.y * bary.z;\n\n float wTotal = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;\n // Accumulate weights\n w00 = w00 / wTotal;\n w01 = w01 / wTotal + w00;\n w02 = w02 / wTotal + w01;\n w10 = w10 / wTotal + w02;\n w11 = w11 / wTotal + w10;\n w12 = w12 / wTotal + w11;\n w20 = w20 / wTotal + w12;\n w21 = w21 / wTotal + w20;\n w22 = w22 / wTotal + w21;\n\n float rand = hashedSample(0u);\n float mIdx;\n if (rand < w00) {\n mIdx = m00.x;\n } else if (rand < w01) {\n mIdx = m01.x;\n } else if (rand < w02) {\n mIdx = m02.x;\n } else if (rand < w10) {\n mIdx = m10.x;\n } else if (rand < w11) {\n mIdx = m11.x;\n } else if (rand < w12) {\n mIdx = m12.x;\n } else if (rand < w20) {\n mIdx = m20.x;\n } else if (rand < w21) {\n mIdx = m21.x;\n } else {\n mIdx = m22.x;\n }\n return int(mIdx);\n}\n\n\nvec4 fetchIns(int i);\n\n\nmat2x3 anisotropy_axes(vec3 normal, vec3 dp1, vec3 dp2, vec2 duv1, vec2 duv2, vec4 inputTangent) {\n float determinant = duv1.x * duv2.y - duv1.y * duv2.x;\n vec3 t = inputTangent.xyz;\n vec3 b = vec3(0.0);\n // Internal W=2 marks an authored XYZ tangent whose sign is derived from UVs.\n float handedness = abs(inputTangent.w) > 1.5 ? 0.0 : inputTangent.w;\n if (abs(determinant) > 1e-12) {\n vec3 dt = (dp1 * duv2.y - dp2 * duv1.y) / determinant;\n vec3 db = (dp2 * duv1.x - dp1 * duv2.x) / determinant;\n if (dot(t, t) < 1e-8) { t = dt; }\n if (handedness == 0.0) { handedness = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }\n }\n t -= normal * dot(normal, t);\n if (dot(t, t) < 1e-8) {\n float signZ = (normal.z >= 0.0 ? 1.0 : -1.0);\n float factor = -1.0 / (signZ + normal.z);\n float xy = normal.x * normal.y * factor;\n t = vec3(1.0 + signZ * normal.x * normal.x * factor, signZ * xy, -signZ * normal.x);\n b = vec3(xy, signZ + normal.y * normal.y * factor, -normal.y);\n }\n else { t = normalize(t); b = normalize(cross(normal, t)); }\n return mat2x3(t, b * (handedness < 0.0 ? -1.0 : 1.0));\n}\n\nvoid fetchAttributes(inout SurfaceInteraction si, Triangle tri, vec3 barycentric, ivec3 index) {\n si.hit = true;\n si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;\n ivec2 i0 = unpackTexel(index.x, vertexColumns);\n ivec2 i1 = unpackTexel(index.y, vertexColumns);\n ivec2 i2 = unpackTexel(index.z, vertexColumns);\n\n vec3 n0 = texelFetch(normalBuffer, i0, 0).xyz;\n vec3 n1 = texelFetch(normalBuffer, i1, 0).xyz;\n vec3 n2 = texelFetch(normalBuffer, i2, 0).xyz;\n vec3 normal = normalize(barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2);\n si.vertexNormal = normal;\n\n // Approximate the smooth limit surface at this triangle hit. Direct-light\n // rays use this geometric offset only near the shadow terminator, avoiding\n // false self-shadowing by adjacent facets without moving ordinary hits.\n // Architecture follows Cycles' shadow_ray_smooth_surface_offset.\n vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));\n vec3 smoothNormal = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;\n float a = dot(n2 - n0, tri.p0 - tri.p2);\n float b = dot(n2 - n1, tri.p1 - tri.p2);\n float c = dot(n1 - n0, tri.p1 - tri.p0);\n float h = a * barycentric.x * (barycentric.x - 1.0)\n + (a + b + c) * barycentric.x * barycentric.y\n + b * barycentric.y * (barycentric.y - 1.0);\n if (dot(smoothNormal, geometricNormal) > 0.0) {\n float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);\n float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);\n float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);\n h0 = max(dot(tri.p0 - si.position, n0) + h0, 0.0);\n h1 = max(dot(tri.p1 - si.position, n1) + h1, 0.0);\n h2 = max(dot(tri.p2 - si.position, n2) + h2, 0.0);\n h = max(min(min(h0, h1), h2), h * 0.5);\n }\n else {\n float h0 = max(max(dot(tri.p0 - tri.p1, n0), dot(tri.p0 - tri.p2, n0)), 0.0);\n float h1 = max(max(dot(tri.p1 - tri.p0, n1), dot(tri.p1 - tri.p2, n1)), 0.0);\n float h2 = max(max(dot(tri.p2 - tri.p0, n2), dot(tri.p2 - tri.p1, n2)), 0.0);\n h0 = max(dot(si.position - tri.p0, n0) + h0, 0.0);\n h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);\n h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);\n h = min(-min(min(h0, h1), h2), h * 0.5);\n }\n si.shadowOffset = smoothNormal * h;\n\n // TODO currently isampler doesn't work\n ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));\n ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));\n ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));\n \n if (m0.x > 0 || m1.x > 0 || m2.x > 0) {\n si.materialIndex = randomPickMaterial(m0, m1, m2, barycentric);\n }\n \n vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;\n vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;\n vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;\n #if defined(NUM_DIFFUSE_MAPS) || defined(NUM_NORMAL_MAPS) || defined(NUM_METALLIC_ROUGHNESS_MAPS) || defined(NUM_ROUGHNESS_MAPS) || defined(NUM_METALNESS_MAPS) || defined(NUM_EMISSIVE_MAPS) || defined(NUM_THIN_FILM_MAPS) || defined(NUM_ANISOTROPY_MAPS) || defined(NUM_COAT_NORMAL_MAPS)\n vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;\n vec2 secondaryUv0 = texelFetch(uv1Buffer, i0, 0).xy;\n vec2 secondaryUv1 = texelFetch(uv1Buffer, i1, 0).xy;\n vec2 secondaryUv2 = texelFetch(uv1Buffer, i2, 0).xy;\n vec2 secondaryUv = barycentric.x * secondaryUv0\n + barycentric.y * secondaryUv1\n + barycentric.z * secondaryUv2;\n\n vec4 uvInfo = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);\n int uvProjection = int(uvInfo.r);\n if (uvProjection > 0) {\n uv = projectUV(uvProjection, si.position, normal, uvInfo.zw);\n secondaryUv = uv;\n } else {\n uv *= uvInfo.zw;\n secondaryUv *= uvInfo.zw;\n }\n #else\n vec2 uv = vec2(0.0);\n vec2 secondaryUv = vec2(0.0);\n #endif\n\n#ifdef NUM_COAT_NORMAL_MAPS\n si.coatNormal = normal;\n float coatNormalIndex = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;\n#endif\n vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);\n float coatRotation = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;\n if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || coatRotation != 0.0\n#ifdef NUM_COAT_NORMAL_MAPS\n || coatNormalIndex >= 0.0\n#endif\n ) {\n vec3 dp1 = tri.p0 - tri.p2;\n vec3 dp2 = tri.p1 - tri.p2;\n vec4 inputTangent = vec4(0.0);\n#ifdef USE_TANGENT\n inputTangent = barycentric.x * texelFetch(tangentBuffer, i0, 0)\n + barycentric.y * texelFetch(tangentBuffer, i1, 0)\n + barycentric.z * texelFetch(tangentBuffer, i2, 0);\n#endif\n mat2x3 geometryAxes = anisotropy_axes(normal, dp1, dp2, uv0-uv2, uv1-uv2, inputTangent);\n si.geometryTangent = geometryAxes[0];\n si.geometryBitangent = geometryAxes[1];\n mat2x3 directionAxes = geometryAxes;\n#ifdef NUM_ANISOTROPY_MAPS\n if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {\n vec2 a = texelFetch(uv1Buffer, i0, 0).xy;\n vec2 b = texelFetch(uv1Buffer, i1, 0).xy;\n vec2 c = texelFetch(uv1Buffer, i2, 0).xy;\n directionAxes = anisotropy_axes(normal, dp1, dp2, a-c, b-c, (inputTangent.w == 0.0 ? vec4(0.0) : inputTangent));\n }\n#endif\n si.directionTangent = directionAxes[0];\n si.directionBitangent = directionAxes[1];\n#ifdef NUM_COAT_NORMAL_MAPS\n if (coatNormalIndex >= 0.0) {\n int coatIndex = int(coatNormalIndex);\n mat2x3 coatAxes = geometryAxes;\n if (mapUvChannel[coatIndex] > 0.5) {\n vec2 a = texelFetch(uv1Buffer, i0, 0).xy;\n vec2 b = texelFetch(uv1Buffer, i1, 0).xy;\n vec2 c = texelFetch(uv1Buffer, i2, 0).xy;\n coatAxes = anisotropy_axes(normal, dp1, dp2, a-c, b-c,\n inputTangent.w == 0.0 ? vec4(0.0) : inputTangent);\n }\n vec3 decoded = sampleMap(coatIndex, getMapUvSet(coatIndex, uv, secondaryUv)).rgb * 2.0 - 1.0;\n vec3 mapped = coatAxes[0] * decoded.x * directionMaterial.z\n + coatAxes[1] * decoded.y * directionMaterial.w + normal * decoded.z;\n if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }\n }\n#endif\n }\n\n si.uv = uv;\n si.uv1 = secondaryUv;\n\n #ifdef USE_TANGENT\n vec3 t0 = texelFetch(tangentBuffer, i0, 0).xyz;\n vec3 t1 = texelFetch(tangentBuffer, i1, 0).xyz;\n vec3 t2 = texelFetch(tangentBuffer, i2, 0).xyz;\n si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z * t2);\n #endif\n #if defined(NUM_NORMAL_MAPS)\n vec3 dp1 = tri.p0 - tri.p2;\n vec3 dp2 = tri.p1 - tri.p2;\n vec2 duv1 = uv0 - uv2;\n vec2 duv2 = uv1 - uv2;\n si.normal = getMatNormal(\n si.materialIndex, uv, normal, dp1, dp2, duv1, duv2\n );\n #else\n si.normal = normal;\n #endif\n}\n\nstruct TriangleIntersect {\n float t;\n vec3 barycentric;\n};\n\nvec4 fetchBVH(int i) {\n return fetchData(bvhBuffer, i, bvhColumns);\n}\n\nvec4 fetchIns(int i) {\n return fetchData(instancesBuffer, i, instancesColumns);\n}\n\n// GLSL ES 3.00 has no bitCount intrinsic. Count the CWBVH mask bits using\n// integer operations supported by WebGL 2.\nuint countBvhBits(uint value) {\n value -= (value >> 1u) & 0x55555555u;\n value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);\n value = (value + (value >> 4u)) & 0x0f0f0f0fu;\n return (value * 0x01010101u) >> 24u;\n}\n\nvec4 unpackBvh4Bounds(uint packedBounds) {\n return vec4(\n float(packedBounds & 0xffu),\n float((packedBounds >> 8u) & 0xffu),\n float((packedBounds >> 16u) & 0xffu),\n float(packedBounds >> 24u)\n ) / 255.0;\n}\n\n// Triangle-ray intersection\n// Faster than the classic Möller–Trumbore intersection algorithm\n// http://www.pbr-book.org/3ed-2018/Shapes/Triangle_Meshes.html#TriangleIntersection\nTriangleIntersect intersectTriangle(vec3 o, vec3 d, Triangle tri, int maxDim, vec3 shear, float tMax) {\n TriangleIntersect ti;\n\n // translate vertices based on ray origin\n vec3 p0t = tri.p0 - o;\n vec3 p1t = tri.p1 - o;\n vec3 p2t = tri.p2 - o;\n\n // permute components of triangle vertices\n if (maxDim == 0) {\n p0t = p0t.yzx;\n p1t = p1t.yzx;\n p2t = p2t.yzx;\n } else if (maxDim == 1) {\n p0t = p0t.zxy;\n p1t = p1t.zxy;\n p2t = p2t.zxy;\n }\n\n // apply shear transformation to translated vertex positions\n p0t.xy += shear.xy * p0t.z;\n p1t.xy += shear.xy * p1t.z;\n p2t.xy += shear.xy * p2t.z;\n\n // compute edge function coefficients\n vec3 e = vec3(\n p1t.x * p2t.y - p1t.y * p2t.x,\n p2t.x * p0t.y - p2t.y * p0t.x,\n p0t.x * p1t.y - p0t.y * p1t.x\n );\n\n#ifdef DEPTH_QUERY_MODE\n vec3 edgeScale = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))\n + abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));\n e = mix(e, vec3(0.0), lessThanEqual(abs(e), edgeScale * 1e-6));\n#endif\n\n // check if intersection is inside triangle\n if (any(lessThan(e, vec3(0))) && any(greaterThan(e, vec3(0)))) {\n return ti;\n }\n\n float det = e.x + e.y + e.z;\n#ifdef DEPTH_QUERY_MODE\n if (det == 0.0) return ti;\n#endif\n\n p0t.z *= shear.z;\n p1t.z *= shear.z;\n p2t.z *= shear.z;\n float tScaled = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);\n\n // check if closer intersection already exists\n if (abs(tScaled) > abs(tMax * det)) {\n return ti;\n }\n\n float invDet = 1. / det;\n ti.t = tScaled * invDet;\n ti.barycentric = e * invDet;\n\n return ti;\n}\n\nstruct Box {\n vec3 min;\n vec3 max;\n};\n\n// Conservative slabs only for the unjittered depth query shader.\nvec3 traversalInverse(vec3 d) {\n#ifdef DEPTH_QUERY_MODE\n vec3 denominator = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));\n return 1.0 / denominator;\n#else\n return 1.0 / d;\n#endif\n}\n\nvec3 depthSlabPadding(vec3 invD, vec3 o) {\n#ifdef DEPTH_QUERY_MODE\n return abs(invD) * max(vec3(1.0), abs(o)) * 1e-6;\n#else\n return vec3(0.0);\n#endif\n}\n\n// Branchless ray/box intersection\n// https://tavianator.com/fast-branchless-raybounding-box-intersections/\nfloat intersectBox(vec3 o, vec3 d, vec3 bmin, vec3 bmax, float tMax) {\n#ifdef DEPTH_QUERY_MODE\n vec3 invD = traversalInverse(d);\n vec3 tBot = (bmin - o) * invD;\n vec3 tTop = (bmax - o) * invD;\n vec3 padding = depthSlabPadding(invD, o);\n#else\n vec3 tBot = (bmin - o) / d;\n vec3 tTop = (bmax - o) / d;\n vec3 padding = vec3(0.0);\n#endif\n vec3 tNear = min(tBot, tTop) - padding;\n vec3 tFar = max(tBot, tTop) + padding;\n float t0 = max(tNear.x, max(tNear.y, tNear.z));\n float t1 = min(tFar.x, min(tFar.y, tFar.z));\n\n return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);\n}\n\nint maxDimension(vec3 v) {\n return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);\n}\n\nvec3 getShear(vec3 d, int maxDim) {\n // Permute space so that the z dimension is the one where the absolute value of the ray's direction is largest.\n // Then create a shear transformation that aligns ray direction with the +z axis\n if (maxDim == 0) {\n return vec3(-d.y, -d.z, 1.0) / d.x;\n } else if (maxDim == 1) {\n return vec3(-d.z, -d.x, 1.0) / d.y;\n } else {\n return vec3(-d.x, -d.y, 1.0) / d.z;\n }\n}\n\n// Traverse BVH, find closest triangle intersection, and return surface information\nvoid intersectScene(in Ray ray, inout SurfaceInteraction si, bool doubleSided) {\n si.hit = false;\n\n if (isEmptyScene) {\n return;\n }\n\n int maxDim = maxDimension(abs(ray.d));\n vec3 shear = getShear(ray.d, maxDim);\n int hitInsIdx;\n\n${getBVHTraverseCode(glsl`\n si.triangleIndex = triangleIndex;\n hitTri = tri;\n hitFaceNormal = faceNormal;\n hitBarycentric = hit.barycentric;\n hitIndex = index;\n isHit = true;\n hitInsIdx = insIdx;\n`)}\n\n if (isHit) {\n si.instanceIndex = hitInsIdx;\n si.materialIndex = int(unpackMaterialIndex(floatBitsToInt(fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE}).z)).x);\n // fetchAttributes before transform to world space.\n fetchAttributes(si, hitTri, hitBarycentric, hitIndex);\n mat4 l2w = mat4(\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 5),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 6),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 7),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 8)\n );\n mat4 w2l = mat4(\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 1),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 2),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 3),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 4)\n );\n mat3 normalTransform = transpose(mat3(w2l));\n si.faceNormal = normalize(normalTransform * hitFaceNormal);\n si.vertexNormal = normalize(normalTransform * si.vertexNormal);\n si.normal = normalize(normalTransform * si.normal);\n#ifdef NUM_COAT_NORMAL_MAPS\n si.coatNormal = normalize(normalTransform * si.coatNormal);\n#endif\n#ifdef USE_TANGENT\n if (dot(si.tangent, si.tangent) > 0.0) {\n si.tangent = normalize(mat3(l2w) * si.tangent);\n }\n#endif\n si.shadowOffset = (l2w * vec4(si.shadowOffset, 0.0)).xyz;\n si.directionTangent = mat3(l2w) * si.directionTangent;\n si.directionBitangent = mat3(l2w) * si.directionBitangent;\n si.geometryTangent = mat3(l2w) * si.geometryTangent;\n si.geometryBitangent = mat3(l2w) * si.geometryBitangent;\n si.position = (l2w * vec4(si.position, 1.0)).xyz;\n }\n}\n\n// Local intersection helper for shader bevel.\nvoid intersectSceneBevel(in Ray ray, inout SurfaceInteraction si, int instanceIndex, float maxDistance) {\n si.hit = false;\n\n if (isEmptyScene) {\n return;\n }\n\n bool doubleSided = true;\n int maxDim = maxDimension(abs(ray.d));\n vec3 shear = getShear(ray.d, maxDim);\n int hitInsIdx;\n\n${getBVHTraverseCode(\n glsl`\n si.triangleIndex = triangleIndex;\n hitTri = tri;\n hitFaceNormal = faceNormal;\n hitBarycentric = hit.barycentric;\n hitIndex = index;\n isHit = true;\n hitInsIdx = insIdx;\n`,\n glsl`\n if (insIdx != instanceIndex) {\n continue;\n }\n`,\n 'maxDistance'\n)}\n\n if (isHit) {\n si.instanceIndex = hitInsIdx;\n si.materialIndex = int(unpackMaterialIndex(floatBitsToInt(fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE}).z)).x);\n fetchAttributes(si, hitTri, hitBarycentric, hitIndex);\n mat4 l2w = mat4(\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 5),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 6),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 7),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 8)\n );\n mat4 w2l = mat4(\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 1),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 2),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 3),\n fetchIns(hitInsIdx * ${INSTANCE_VEC4_STRIDE} + 4)\n );\n mat3 normalTransform = transpose(mat3(w2l));\n si.faceNormal = normalize(normalTransform * hitFaceNormal);\n si.vertexNormal = normalize(normalTransform * si.vertexNormal);\n si.normal = normalize(normalTransform * si.normal);\n#ifdef NUM_COAT_NORMAL_MAPS\n si.coatNormal = normalize(normalTransform * si.coatNormal);\n#endif\n#ifdef USE_TANGENT\n if (dot(si.tangent, si.tangent) > 0.0) {\n si.tangent = normalize(mat3(l2w) * si.tangent);\n }\n#endif\n si.shadowOffset = (l2w * vec4(si.shadowOffset, 0.0)).xyz;\n si.directionTangent = mat3(l2w) * si.directionTangent;\n si.directionBitangent = mat3(l2w) * si.directionBitangent;\n si.geometryTangent = mat3(l2w) * si.geometryTangent;\n si.geometryBitangent = mat3(l2w) * si.geometryBitangent;\n si.position = (l2w * vec4(si.position, 1.0)).xyz;\n }\n}\n\nbool intersectSceneShadow(in Ray ray, float lightDistance, int currTriangleIndex) {\n\n if (isEmptyScene) {\n return false;\n }\n\n bool doubleSided = true;\n int maxDim = maxDimension(abs(ray.d));\n vec3 shear = getShear(ray.d, maxDim);\n\n${getBVHTraverseCode(\n glsl`\n // Traversal is clipped to lightDistance. Affine instance transforms keep\n // the ray parameter unchanged because local directions are not normalized.\n bool isOccluded = true;\n vec3 barycentric = hit.barycentric;\n vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;\n\n if (isOccluded) {\n#ifdef HAS_ALPHA\n int materialIndex = int(unpackMaterialIndex(floatBitsToInt(fetchIns(insIdx * ${INSTANCE_VEC4_STRIDE}).z)).x);\n ivec2 i0 = unpackTexel(index.x, vertexColumns);\n ivec2 i1 = unpackTexel(index.y, vertexColumns);\n ivec2 i2 = unpackTexel(index.z, vertexColumns);\n ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));\n ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));\n ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));\n \n if (m0.x > 0 || m1.x > 0 || m2.x > 0) {\n materialIndex = randomPickMaterial(m0, m1, m2, barycentric);\n }\n \n int ii = materialIndex * MAT_DATA_SIZE;\n int mapAlphaUsage = int(fetchMatData(ii + MAT_ROW_MISC).a);\n float alpha = fetchMatData(ii + MAT_ROW_ALPHA_FILM).r;\n #ifdef NUM_DIFFUSE_MAPS\n if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {\n int diffuseMapIndex = int(fetchMatData(ii + MAT_ROW_METALLIC_MAPS).z);\n if (diffuseMapIndex >= 0) {\n vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;\n vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;\n vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;\n vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;\n vec4 uvInfo = fetchMatData(ii + MAT_ROW_UV);\n int uvProjection = int(uvInfo.r);\n if (uvProjection > 0) {\n uv = projectUV(uvProjection, position, hitFaceNormal, uvInfo.zw);\n } else {\n uv *= uvInfo.zw;\n }\n \n alpha *= sampleMap(diffuseMapIndex, uv).a;\n }\n }\n #endif\n #ifdef NUM_ALPHA_MAPS\n int alphaMapIndex = int(fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).z);\n if (alphaMapIndex >= 0) {\n vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;\n vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;\n vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;\n vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;\n vec4 uvInfo = fetchMatData(ii + MAT_ROW_UV);\n int uvProjection = int(uvInfo.r);\n if (uvProjection > 0) {\n uv = projectUV(uvProjection, position, hitFaceNormal, uvInfo.zw);\n } else {\n uv *= uvInfo.zw;\n }\n alpha *= sampleMap(alphaMapIndex, uv).g;\n }\n #endif\n float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;\n alpha = resolveMaterialAlpha(\n alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff\n );\n if (hashedSample(0u) > alpha) {\n // Continue after a transparent hit without traversing beyond the light.\n tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);\n isOccluded = false;\n }\n#endif\n }\n if (isOccluded) {\n return true;\n }\n`,\n glsl`\n if (triangleIndex == currTriangleIndex) {\n continue;\n }\n`,\n 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)'\n)}\n return false;\n}\n`\n});\n"]}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { simpleTextureSample, thinFilmTextureSample } from '../../materialTextureSlots.js';
|
|
2
|
+
import { materialRowsGlsl } from '../../materialLayout.js';
|
|
3
|
+
import { materialAlphaModeConstants } from '../../../scene/OpenPBRMaterial.js';
|
|
4
|
+
import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
|
|
5
|
+
import { mapAlphaUsageConstants } from '../../materialConstants.js';
|
|
6
|
+
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
7
|
+
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
8
|
+
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
9
|
+
import { createShaderMixin, glsl, Shader } from '../../shader.js';
|
|
10
|
+
export default createShaderMixin({
|
|
11
|
+
uniforms: {
|
|
12
|
+
materialBuffer: Shader.uniform('sampler2D'),
|
|
13
|
+
materialBufferColumns: Shader.uniform('int', 1),
|
|
14
|
+
mapInfo: Shader.arrayUniform('vec4', 'NUM_MAPS'),
|
|
15
|
+
mapTransform: Shader.arrayUniform('vec4', 'NUM_MAPS'),
|
|
16
|
+
mapUvChannel: Shader.arrayUniform('float', 'NUM_MAPS'),
|
|
17
|
+
mapColorLinear: Shader.arrayUniform('float', 'NUM_MAPS'),
|
|
18
|
+
map: Shader.uniform('sampler2DArray')
|
|
19
|
+
},
|
|
20
|
+
defines: {
|
|
21
|
+
NUM_MATERIALS: 1
|
|
22
|
+
},
|
|
23
|
+
main: glsl `
|
|
24
|
+
${materialRowsGlsl()}
|
|
25
|
+
#ifdef HAS_GLTF_ANISOTROPY
|
|
26
|
+
vec2 fb(float roughness, float strength) {
|
|
27
|
+
if (strength == 0.0) { return vec2(roughness, 0.0); }
|
|
28
|
+
float u = roughness * roughness;
|
|
29
|
+
float a = u + (1.0 - u) * strength * strength;
|
|
30
|
+
if (a == 0.0) { return vec2(0.0); }
|
|
31
|
+
return vec2(pow((a*a + u*u) * 0.5, 0.25), clamp(1.0 - u/a, 0.0, 1.0));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
vec3 oy(vec3 c) {
|
|
37
|
+
return mix(pow(c * 0.9478672986 + 0.0521327014, vec3(2.4)), c * 0.0773993808, vec3(lessThan(c, vec3(0.04045))));
|
|
38
|
+
}
|
|
39
|
+
vec4 fetchMatData(int i) {
|
|
40
|
+
return kw(materialBuffer, i, materialBufferColumns);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
float ld(float alpha, int alphaMode, float alphaCutoff) {
|
|
45
|
+
if (alphaMode == ${materialAlphaModeConstants.opaque}) {
|
|
46
|
+
return 1.0;
|
|
47
|
+
}
|
|
48
|
+
if (alphaMode == ${materialAlphaModeConstants.mask}) {
|
|
49
|
+
return alpha >= alphaCutoff ? 1.0 : 0.0;
|
|
50
|
+
}
|
|
51
|
+
return alpha;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
float vO(int idx) {
|
|
55
|
+
return fetchMatData(idx * MAT_DATA_SIZE + MAT_ROW_COLOR).w;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
vec2 ae(int val) {
|
|
59
|
+
return vec2(float(val >> 8), float(val & 0xff) / 255.0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#ifdef NUM_MAPS
|
|
63
|
+
vec3 decodeMapColor(int index, vec3 c) {
|
|
64
|
+
if (mapColorLinear[index] > 0.5) { return c; }
|
|
65
|
+
return oy(c);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vec2 nX(int index) {
|
|
69
|
+
return mapInfo[index].xy;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
float pf(int index) {
|
|
73
|
+
return floor(mapInfo[index].z);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
vec2 nW(int index) {
|
|
77
|
+
return vec2(fract(mapInfo[index].z), mapInfo[index].w);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
vec2 sb(int index, vec2 uv) {
|
|
81
|
+
vec4 transform = mapTransform[index];
|
|
82
|
+
vec2 qv = fract(uv * transform.xy + transform.zw);
|
|
83
|
+
vec2 je = 1.0 / vec2(textureSize(map, 0).xy);
|
|
84
|
+
vec2 dZ = nW(index);
|
|
85
|
+
vec2 ke = nX(index) + je;
|
|
86
|
+
vec2 oB = dZ - 0.5 * je;
|
|
87
|
+
vec2 lo = dZ + ke - je;
|
|
88
|
+
return clamp(
|
|
89
|
+
oB + qv * ke,
|
|
90
|
+
dZ,
|
|
91
|
+
lo
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
vec2 getMapUvSet(int index, vec2 uv, vec2 uv1) {
|
|
96
|
+
return mapUvChannel[index] > 0.5 ? uv1 : uv;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
vec4 sampleMap(int index, vec2 uv) {
|
|
100
|
+
return texture(map, vec3(sb(index, uv), pf(index)));
|
|
101
|
+
}
|
|
102
|
+
#endif
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
vec2 aJ(float roughness, float anisotropy) {
|
|
106
|
+
float alpha = roughness * roughness;
|
|
107
|
+
float oT = ROUGHNESS_MIN * ROUGHNESS_MIN;
|
|
108
|
+
if (anisotropy == 0.0) { return vec2(max(oT, alpha)); }
|
|
109
|
+
float dg = 1.0 - anisotropy;
|
|
110
|
+
float rU = alpha * sqrt(2.0 / (1.0 + dg * dg));
|
|
111
|
+
return max(vec2(oT), vec2(rU, dg * rU));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
vec4 bv(int i);
|
|
115
|
+
vec3 kx(int instanceIndex) {
|
|
116
|
+
if (instanceIndex < 0) return vec3(1.0);
|
|
117
|
+
return bv(instanceIndex * ${INSTANCE_VEC4_STRIDE + ''} + 9).rgb;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
void eT(
|
|
121
|
+
inout J mat,
|
|
122
|
+
int materialIndex,
|
|
123
|
+
vec2 uv,
|
|
124
|
+
vec2 uv1,
|
|
125
|
+
int instanceIndex
|
|
126
|
+
) {
|
|
127
|
+
int i = materialIndex * MAT_DATA_SIZE;
|
|
128
|
+
vec4 oJ = fetchMatData(i + MAT_ROW_COLOR);
|
|
129
|
+
vec4 hb = fetchMatData(i + MAT_ROW_ROUGHNESS_NORMAL);
|
|
130
|
+
vec4 gh = fetchMatData(i + MAT_ROW_METALLIC_MAPS);
|
|
131
|
+
vec4 hF = fetchMatData(i + MAT_ROW_EMISSION);
|
|
132
|
+
vec4 gT = fetchMatData(i + MAT_ROW_IOR_TRANSMISSION);
|
|
133
|
+
vec4 misc = fetchMatData(i + MAT_ROW_MISC);
|
|
134
|
+
vec4 nh = fetchMatData(i + MAT_ROW_ALPHA_FILM);
|
|
135
|
+
vec4 lF = fetchMatData(i + MAT_ROW_BASE_CONTROLS);
|
|
136
|
+
vec4 oM = fetchMatData(i + MAT_ROW_SPECULAR_FUZZ);
|
|
137
|
+
vec4 subsurface = fetchMatData(i + MAT_ROW_SUBSURFACE);
|
|
138
|
+
vec4 wc = fetchMatData(i + MAT_ROW_FUZZ);
|
|
139
|
+
vec4 vx = fetchMatData(i + MAT_ROW_COAT);
|
|
140
|
+
vec4 lG = fetchMatData(i + MAT_ROW_COAT_CONTROLS);
|
|
141
|
+
vec4 mK = fetchMatData(i + MAT_ROW_FILM_DISPERSION);
|
|
142
|
+
vec4 ng = fetchMatData(i + MAT_ROW_STANDALONE_MAPS);
|
|
143
|
+
int mapAlphaUsage = int(misc.a);
|
|
144
|
+
|
|
145
|
+
mat.baseColor = oJ.rgb;
|
|
146
|
+
mat.materialType = int(oJ.w);
|
|
147
|
+
mat.specularRoughness = hb.x;
|
|
148
|
+
mat.baseMetalness = gh.x;
|
|
149
|
+
mat.specularAnisotropy = clamp(gh.y, 0.0, 1.0);
|
|
150
|
+
mat.emission = hF.rgb;
|
|
151
|
+
mat.inside = false;
|
|
152
|
+
mat.specularIor = gT.x;
|
|
153
|
+
mat.transmissionWeight = gT.y;
|
|
154
|
+
#ifdef HAS_MEDIUM
|
|
155
|
+
mat.mediumType = int(gT.z);
|
|
156
|
+
#else
|
|
157
|
+
mat.mediumType = 0;
|
|
158
|
+
#endif
|
|
159
|
+
mat.thinWalled = gT.w > 0.5;
|
|
160
|
+
mat.bevel = misc.r;
|
|
161
|
+
mat.transmissionDispersionScale = misc.g;
|
|
162
|
+
mat.dispersionAbbeNumber = max(mK.y, 1e-6);
|
|
163
|
+
mat.thinFilmThickness = misc.b;
|
|
164
|
+
mat.thinFilmIor = nh.b;
|
|
165
|
+
mat.thinFilmWeight = clamp(mK.x, 0.0, 1.0);
|
|
166
|
+
|
|
167
|
+
mat.thinFilmThickness *= 1000.0;
|
|
168
|
+
mat.baseWeight = clamp(lF.x, 0.0, 1.0);
|
|
169
|
+
mat.diffuseRoughness = clamp(lF.y, 0.0, 1.0);
|
|
170
|
+
mat.specularWeight = max(0.0, lF.z);
|
|
171
|
+
mat.subsurfaceWeight = clamp(lF.w, 0.0, 1.0);
|
|
172
|
+
mat.specularColor = max(oM.rgb, vec3(0.0));
|
|
173
|
+
mat.fuzzWeight = clamp(oM.w, 0.0, 1.0);
|
|
174
|
+
mat.subsurfaceColor = max(subsurface.rgb, vec3(0.0));
|
|
175
|
+
mat.transmissionColor = max(fetchMatData(i + MAT_ROW_TRANSMISSION_COLOR).rgb, vec3(0.0));
|
|
176
|
+
mat.fuzzColor = max(wc.rgb, vec3(0.0));
|
|
177
|
+
mat.fuzzRoughness = clamp(wc.w, 0.0, 1.0);
|
|
178
|
+
mat.coatColor = max(vx.rgb, vec3(0.0));
|
|
179
|
+
mat.coatWeight = clamp(vx.w, 0.0, 1.0);
|
|
180
|
+
mat.coatRoughness = clamp(lG.x, ROUGHNESS_MIN, 1.0);
|
|
181
|
+
mat.coatAnisotropy = clamp(lG.y, 0.0, 1.0);
|
|
182
|
+
mat.coatIor = max(lG.z, 1.0);
|
|
183
|
+
mat.coatDarkening = clamp(lG.w, 0.0, 1.0);
|
|
184
|
+
|
|
185
|
+
#ifdef HAS_MEDIUM
|
|
186
|
+
mat.mediumExtinction = max(fetchMatData(i + MAT_ROW_MEDIUM_EXTINCTION).rgb, vec3(0.0));
|
|
187
|
+
mat.mediumAnisotropy = clamp(fetchMatData(i + MAT_ROW_MEDIUM_EXTINCTION).a, -1.0, 1.0);
|
|
188
|
+
mat.mediumScattering = max(fetchMatData(i + MAT_ROW_MEDIUM_SCATTERING).rgb, vec3(0.0));
|
|
189
|
+
mat.mediumType = max(max(mat.mediumExtinction.x, mat.mediumExtinction.y), mat.mediumExtinction.z) > 0.0 ? 1 : 0;
|
|
190
|
+
#endif
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
#ifdef HAS_ALPHA
|
|
194
|
+
mat.alpha = nh.r;
|
|
195
|
+
#else
|
|
196
|
+
mat.alpha = 1.0;
|
|
197
|
+
#endif
|
|
198
|
+
|
|
199
|
+
#ifdef NUM_DIFFUSE_MAPS
|
|
200
|
+
int diffuseMapIndex = int(gh.z);
|
|
201
|
+
if (diffuseMapIndex >= 0) {
|
|
202
|
+
vec4 nN = sampleMap(
|
|
203
|
+
diffuseMapIndex, getMapUvSet(diffuseMapIndex, uv, uv1)
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
mat.baseColor *= decodeMapColor(diffuseMapIndex, nN.rgb);
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
if (mapAlphaUsage == ${mapAlphaUsageConstants.transmission + ''}) {
|
|
211
|
+
mat.transmissionWeight = 1.0 - nN.a;
|
|
212
|
+
}
|
|
213
|
+
else if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {
|
|
214
|
+
mat.alpha *= nN.a;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
#endif
|
|
218
|
+
|
|
219
|
+
${simpleTextureSample('alphaMap', 'glsl')}
|
|
220
|
+
|
|
221
|
+
mat.alpha = ld(
|
|
222
|
+
mat.alpha, int(fetchMatData(i + MAT_ROW_ALPHA).w), ng.w
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
${simpleTextureSample('transmissionMap', 'glsl')}
|
|
226
|
+
|
|
227
|
+
#ifdef NUM_METALLIC_ROUGHNESS_MAPS
|
|
228
|
+
int metallicRoughnessMapIndex = int(gh.w);
|
|
229
|
+
if (metallicRoughnessMapIndex >= 0) {
|
|
230
|
+
vec4 fK = sampleMap(
|
|
231
|
+
metallicRoughnessMapIndex,
|
|
232
|
+
getMapUvSet(metallicRoughnessMapIndex, uv, uv1)
|
|
233
|
+
);
|
|
234
|
+
mat.baseMetalness *= fK.b;
|
|
235
|
+
mat.specularRoughness *= fK.g;
|
|
236
|
+
}
|
|
237
|
+
#endif
|
|
238
|
+
|
|
239
|
+
${simpleTextureSample('roughnessMap', 'glsl')}
|
|
240
|
+
|
|
241
|
+
${simpleTextureSample('metalnessMap', 'glsl')}
|
|
242
|
+
|
|
243
|
+
#ifdef NUM_EMISSIVE_MAPS
|
|
244
|
+
int emissiveMapIndex = int(hF.w);
|
|
245
|
+
if (emissiveMapIndex >= 0) {
|
|
246
|
+
vec3 emissive = sampleMap(
|
|
247
|
+
emissiveMapIndex, getMapUvSet(emissiveMapIndex, uv, uv1)
|
|
248
|
+
).rgb;
|
|
249
|
+
mat.emission *= decodeMapColor(emissiveMapIndex, emissive);
|
|
250
|
+
}
|
|
251
|
+
#endif
|
|
252
|
+
|
|
253
|
+
#ifdef NUM_COAT_WEIGHT_MAPS
|
|
254
|
+
int hN = int(fetchMatData(i + MAT_ROW_LAYER_MAPS).x);
|
|
255
|
+
if (hN >= 0 && mat.materialType == 0) {
|
|
256
|
+
float qk = clamp(vx.w, 0.0, 1.0) * sampleMap(
|
|
257
|
+
hN, getMapUvSet(hN, uv, uv1)
|
|
258
|
+
).r;
|
|
259
|
+
mat.emission *= mix(vec3(1.0), sqrt(max(vx.rgb, vec3(0.0))), qk);
|
|
260
|
+
}
|
|
261
|
+
#endif
|
|
262
|
+
|
|
263
|
+
${thinFilmTextureSample('glsl')}
|
|
264
|
+
|
|
265
|
+
${simpleTextureSample('coatWeightMap', 'glsl')}
|
|
266
|
+
#ifdef NUM_COAT_NORMAL_MAPS
|
|
267
|
+
mat.coatNormalEnabled = fetchMatData(i + MAT_ROW_LAYER_MAPS).z >= 0.0 && mat.coatWeight > 0.0;
|
|
268
|
+
#endif
|
|
269
|
+
|
|
270
|
+
${simpleTextureSample('coatRoughnessMap', 'glsl')}
|
|
271
|
+
|
|
272
|
+
${simpleTextureSample('fuzzColorMap', 'glsl')}
|
|
273
|
+
|
|
274
|
+
${simpleTextureSample('fuzzRoughnessMap', 'glsl')}
|
|
275
|
+
|
|
276
|
+
${simpleTextureSample('specularWeightMap', 'glsl')}
|
|
277
|
+
|
|
278
|
+
${simpleTextureSample('specularColorMap', 'glsl')}
|
|
279
|
+
|
|
280
|
+
vec4 kK = fetchMatData(i + MAT_ROW_DIRECTION_NORMAL);
|
|
281
|
+
mat.anisotropyDirection = vec2(1.0, 0.0);
|
|
282
|
+
mat.anisotropyDirectionEnabled = kK.y != 0.0;
|
|
283
|
+
mat.coatAnisotropyRotation = fetchMatData(i + MAT_ROW_FILM_TEXTURE).x;
|
|
284
|
+
#ifdef NUM_ANISOTROPY_MAPS
|
|
285
|
+
if (kK.x >= 0.0) {
|
|
286
|
+
int index = int(kK.x);
|
|
287
|
+
vec4 iW = sampleMap(index, getMapUvSet(index, uv, uv1));
|
|
288
|
+
mat.specularAnisotropy *= iW.b;
|
|
289
|
+
vec2 direction = iW.rg * 2.0 - 1.0;
|
|
290
|
+
if (dot(direction, direction) > 1e-4) mat.anisotropyDirection = normalize(direction);
|
|
291
|
+
mat.anisotropyDirectionEnabled = true;
|
|
292
|
+
}
|
|
293
|
+
#endif
|
|
294
|
+
#ifdef HAS_GLTF_ANISOTROPY
|
|
295
|
+
if (fetchMatData(i + MAT_ROW_FILM_TEXTURE).y > 0.5 && mat.specularAnisotropy > 0.0) {
|
|
296
|
+
vec2 sp = fb(clamp(mat.specularRoughness, 0.0, 1.0), mat.specularAnisotropy);
|
|
297
|
+
mat.specularRoughness = sp.x;
|
|
298
|
+
mat.specularAnisotropy = sp.y;
|
|
299
|
+
}
|
|
300
|
+
#endif
|
|
301
|
+
if (mat.anisotropyDirectionEnabled) {
|
|
302
|
+
float theta = kK.y;
|
|
303
|
+
vec2 d = mat.anisotropyDirection;
|
|
304
|
+
mat.anisotropyDirection = vec2(cos(theta)*d.x - sin(theta)*d.y, sin(theta)*d.x + cos(theta)*d.y);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
if (mat.coatWeight > 0.0 && mat.coatRoughness > 0.0) {
|
|
310
|
+
float hJ = mat.specularRoughness * mat.specularRoughness;
|
|
311
|
+
float hK = mat.coatRoughness * mat.coatRoughness;
|
|
312
|
+
mat.specularRoughness = mix(mat.specularRoughness,
|
|
313
|
+
pow(min(1.0, hJ * hJ + 2.0 * hK * hK), 0.25), mat.coatWeight);
|
|
314
|
+
}
|
|
315
|
+
vec3 instanceColor = kx(instanceIndex);
|
|
316
|
+
mat.baseColor *= instanceColor;
|
|
317
|
+
if (mat.materialType == UNLIT) mat.emission *= instanceColor;
|
|
318
|
+
|
|
319
|
+
mat.specularRoughness = clamp(mat.specularRoughness, ROUGHNESS_MIN, 1.0);
|
|
320
|
+
mat.baseMetalness = clamp(mat.baseMetalness, 0.0, 1.0);
|
|
321
|
+
vec2 specularAlpha = aJ(mat.specularRoughness, mat.specularAnisotropy);
|
|
322
|
+
mat.alphaX = specularAlpha.x;
|
|
323
|
+
mat.alphaY = specularAlpha.y;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
#if defined(NUM_NORMAL_MAPS)
|
|
327
|
+
vec3 nY(int materialIndex, vec2 uv, vec3 normal, vec3 dp1, vec3 dp2, vec2 nP, vec2 nQ) {
|
|
328
|
+
int i = materialIndex * MAT_DATA_SIZE;
|
|
329
|
+
vec4 hb = fetchMatData(i + MAT_ROW_ROUGHNESS_NORMAL);
|
|
330
|
+
int normalMapIndex = int(hb.y);
|
|
331
|
+
if (normalMapIndex >= 0) {
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
vec3 qJ = cross(dp2, normal);
|
|
336
|
+
vec3 qI = cross(normal, dp1);
|
|
337
|
+
vec3 dpdu = qJ * nP.x + qI * nQ.x;
|
|
338
|
+
vec3 rZ = qJ * nP.y + qI * nQ.y;
|
|
339
|
+
float dS = max(dot(dpdu, dpdu), dot(rZ, rZ));
|
|
340
|
+
if (dS > 1e-12) {
|
|
341
|
+
float sh = inversesqrt(dS);
|
|
342
|
+
dpdu *= sh;
|
|
343
|
+
rZ *= sh;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
vec3 mZ = abs(normal.z) < 0.999
|
|
350
|
+
? vec3(0.0, 0.0, 1.0)
|
|
351
|
+
: vec3(0.0, 1.0, 0.0);
|
|
352
|
+
dpdu = normalize(cross(mZ, normal));
|
|
353
|
+
rZ = cross(normal, dpdu);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
vec3 n = 2.0 * sampleMap(normalMapIndex, uv).rgb - 1.0;
|
|
357
|
+
n.xy *= hb.zw;
|
|
358
|
+
n = normalize(n);
|
|
359
|
+
|
|
360
|
+
mat3 tbn = mat3(dpdu, rZ, normal);
|
|
361
|
+
|
|
362
|
+
return normalize(tbn * n);
|
|
363
|
+
} else {
|
|
364
|
+
return normal;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
#endif
|
|
368
|
+
|
|
369
|
+
`
|
|
370
|
+
});
|
|
371
|
+
//# sourceMappingURL=materialBuffer.glsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialBuffer.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/materialBuffer.glsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3C,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;QAChD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;QACrD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC;QACtD,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC;QACxD,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;KACtC;IACD,OAAO,EAAE;QACP,aAAa,EAAE,CAAC;KACjB;IACD,IAAI,EAAE,IAAI,CAAA;EACV,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;mBAqBC,0BAA0B,CAAC,MAAM;;;mBAGjC,0BAA0B,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAqEhB,oBAAoB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA6FhC,sBAAsB,CAAC,YAAY,GAAG,EAAE;;;4BAGnC,sBAAsB,CAAC,KAAK,GAAG,EAAE;;;;;;EAM/D,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC;;;;;;EAMvC,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC;;;;;;;;;;;;;;EAc9C,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC;;EAE3C,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;EAsB3C,qBAAqB,CAAC,MAAM,CAAC;;EAE7B,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;;;;;EAK5C,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC;;EAE/C,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC;;EAE3C,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC;;EAE/C,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,CAAC;;EAEhD,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FlD;CACA,CAAC,CAAC","sourcesContent":["import { simpleTextureSample, thinFilmTextureSample } from '../../materialTextureSlots.js';\nimport { materialRowsGlsl } from '../../materialLayout.js';\nimport { materialAlphaModeConstants } from '../../../scene/OpenPBRMaterial.js';\nimport { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';\nimport { mapAlphaUsageConstants } from '../../materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n materialBuffer: Shader.uniform('sampler2D'),\n materialBufferColumns: Shader.uniform('int', 1),\n mapInfo: Shader.arrayUniform('vec4', 'NUM_MAPS'),\n mapTransform: Shader.arrayUniform('vec4', 'NUM_MAPS'),\n mapUvChannel: Shader.arrayUniform('float', 'NUM_MAPS'),\n mapColorLinear: Shader.arrayUniform('float', 'NUM_MAPS'),\n map: Shader.uniform('sampler2DArray')\n },\n defines: {\n NUM_MATERIALS: 1\n },\n main: glsl`\n${materialRowsGlsl()}\n#ifdef HAS_GLTF_ANISOTROPY\nvec2 gltf_anisotropy_to_openpbr(float roughness, float strength) {\n if (strength == 0.0) { return vec2(roughness, 0.0); }\n float u = roughness * roughness;\n float a = u + (1.0 - u) * strength * strength;\n if (a == 0.0) { return vec2(0.0); }\n return vec2(pow((a*a + u*u) * 0.5, 0.25), clamp(1.0 - u/a, 0.0, 1.0));\n}\n\n#endif\n\nvec3 sRGBToLinear(vec3 c) {\n return mix(pow(c * 0.9478672986 + 0.0521327014, vec3(2.4)), c * 0.0773993808, vec3(lessThan(c, vec3(0.04045))));\n}\nvec4 fetchMatData(int i) {\n return fetchData(materialBuffer, i, materialBufferColumns);\n}\n\n// Shared by surface evaluation and shadow occlusion, after texture factors.\nfloat resolveMaterialAlpha(float alpha, int alphaMode, float alphaCutoff) {\n if (alphaMode == ${materialAlphaModeConstants.opaque}) {\n return 1.0;\n }\n if (alphaMode == ${materialAlphaModeConstants.mask}) {\n return alpha >= alphaCutoff ? 1.0 : 0.0;\n }\n return alpha;\n}\n\nfloat getMatType(int idx) {\n return fetchMatData(idx * MAT_DATA_SIZE + MAT_ROW_COLOR).w;\n}\n\nvec2 unpackMaterialIndex(int val) {\n return vec2(float(val >> 8), float(val & 0xff) / 255.0);\n}\n\n#ifdef NUM_MAPS\nvec3 decodeMapColor(int index, vec3 c) {\n if (mapColorLinear[index] > 0.5) { return c; }\n return sRGBToLinear(c);\n}\n\nvec2 getMapSize(int index) {\n return mapInfo[index].xy;\n}\n\nfloat getMapLayer(int index) {\n return floor(mapInfo[index].z);\n}\n\nvec2 getMapOffset(int index) {\n return vec2(fract(mapInfo[index].z), mapInfo[index].w);\n}\n\nvec2 getMapUV(int index, vec2 uv) {\n vec4 transform = mapTransform[index];\n vec2 repeatedUv = fract(uv * transform.xy + transform.zw);\n vec2 atlasTexel = 1.0 / vec2(textureSize(map, 0).xy);\n vec2 firstTexelCenter = getMapOffset(index);\n vec2 sourceExtent = getMapSize(index) + atlasTexel;\n vec2 sourceOrigin = firstTexelCenter - 0.5 * atlasTexel;\n vec2 lastTexelCenter = firstTexelCenter + sourceExtent - atlasTexel;\n return clamp(\n sourceOrigin + repeatedUv * sourceExtent,\n firstTexelCenter,\n lastTexelCenter\n );\n}\n\nvec2 getMapUvSet(int index, vec2 uv, vec2 uv1) {\n return mapUvChannel[index] > 0.5 ? uv1 : uv;\n}\n\nvec4 sampleMap(int index, vec2 uv) {\n return texture(map, vec3(getMapUV(index, uv), getMapLayer(index)));\n}\n#endif\n\n// OpenPBR 1.1.1: RMS-preserving GGX anisotropy, shared by base and coat.\nvec2 openpbr_roughness_to_alpha(float roughness, float anisotropy) {\n float alpha = roughness * roughness;\n float alphaMin = ROUGHNESS_MIN * ROUGHNESS_MIN;\n if (anisotropy == 0.0) { return vec2(max(alphaMin, alpha)); }\n float complement = 1.0 - anisotropy;\n float alphaT = alpha * sqrt(2.0 / (1.0 + complement * complement));\n return max(vec2(alphaMin), vec2(alphaT, complement * alphaT));\n}\n\nvec4 fetchIns(int i);\nvec3 getInstanceColor(int instanceIndex) {\n if (instanceIndex < 0) return vec3(1.0);\n return fetchIns(instanceIndex * ${INSTANCE_VEC4_STRIDE + ''} + 9).rgb;\n}\n\nvoid getMaterial(\n inout OpenPbrResolvedMaterial mat,\n int materialIndex,\n vec2 uv,\n vec2 uv1,\n int instanceIndex\n) {\n int i = materialIndex * MAT_DATA_SIZE;\n vec4 colorAndMatType = fetchMatData(i + MAT_ROW_COLOR);\n vec4 roughnessAndNormal = fetchMatData(i + MAT_ROW_ROUGHNESS_NORMAL);\n vec4 metallicAndMapIndex = fetchMatData(i + MAT_ROW_METALLIC_MAPS);\n vec4 emissionAndEmissiveMapIndex = fetchMatData(i + MAT_ROW_EMISSION);\n vec4 iorAndTransmission = fetchMatData(i + MAT_ROW_IOR_TRANSMISSION);\n vec4 misc = fetchMatData(i + MAT_ROW_MISC);\n vec4 alphaAndThinFilm = fetchMatData(i + MAT_ROW_ALPHA_FILM);\n vec4 baseControls = fetchMatData(i + MAT_ROW_BASE_CONTROLS);\n vec4 specularAndFuzz = fetchMatData(i + MAT_ROW_SPECULAR_FUZZ);\n vec4 subsurface = fetchMatData(i + MAT_ROW_SUBSURFACE);\n vec4 fuzz = fetchMatData(i + MAT_ROW_FUZZ);\n vec4 coat = fetchMatData(i + MAT_ROW_COAT);\n vec4 coatControls = fetchMatData(i + MAT_ROW_COAT_CONTROLS);\n vec4 filmAndDispersion = fetchMatData(i + MAT_ROW_FILM_DISPERSION);\n vec4 standaloneMetalRoughMaps = fetchMatData(i + MAT_ROW_STANDALONE_MAPS);\n int mapAlphaUsage = int(misc.a);\n\n mat.baseColor = colorAndMatType.rgb;\n mat.materialType = int(colorAndMatType.w);\n mat.specularRoughness = roughnessAndNormal.x;\n mat.baseMetalness = metallicAndMapIndex.x;\n mat.specularAnisotropy = clamp(metallicAndMapIndex.y, 0.0, 1.0);\n mat.emission = emissionAndEmissiveMapIndex.rgb;\n mat.inside = false;\n mat.specularIor = iorAndTransmission.x;\n mat.transmissionWeight = iorAndTransmission.y;\n#ifdef HAS_MEDIUM\n mat.mediumType = int(iorAndTransmission.z);\n#else\n mat.mediumType = 0;\n#endif\n mat.thinWalled = iorAndTransmission.w > 0.5;\n mat.bevel = misc.r;\n mat.transmissionDispersionScale = misc.g;\n mat.dispersionAbbeNumber = max(filmAndDispersion.y, 1e-6);\n mat.thinFilmThickness = misc.b;\n mat.thinFilmIor = alphaAndThinFilm.b;\n mat.thinFilmWeight = clamp(filmAndDispersion.x, 0.0, 1.0);\n // OpenPBR specifies micrometres; the interference routine uses nanometres.\n mat.thinFilmThickness *= 1000.0;\n mat.baseWeight = clamp(baseControls.x, 0.0, 1.0);\n mat.diffuseRoughness = clamp(baseControls.y, 0.0, 1.0);\n mat.specularWeight = max(0.0, baseControls.z);\n mat.subsurfaceWeight = clamp(baseControls.w, 0.0, 1.0);\n mat.specularColor = max(specularAndFuzz.rgb, vec3(0.0));\n mat.fuzzWeight = clamp(specularAndFuzz.w, 0.0, 1.0);\n mat.subsurfaceColor = max(subsurface.rgb, vec3(0.0));\n mat.transmissionColor = max(fetchMatData(i + MAT_ROW_TRANSMISSION_COLOR).rgb, vec3(0.0));\n mat.fuzzColor = max(fuzz.rgb, vec3(0.0));\n mat.fuzzRoughness = clamp(fuzz.w, 0.0, 1.0);\n mat.coatColor = max(coat.rgb, vec3(0.0));\n mat.coatWeight = clamp(coat.w, 0.0, 1.0);\n mat.coatRoughness = clamp(coatControls.x, ROUGHNESS_MIN, 1.0);\n mat.coatAnisotropy = clamp(coatControls.y, 0.0, 1.0);\n mat.coatIor = max(coatControls.z, 1.0);\n mat.coatDarkening = clamp(coatControls.w, 0.0, 1.0);\n\n#ifdef HAS_MEDIUM\n mat.mediumExtinction = max(fetchMatData(i + MAT_ROW_MEDIUM_EXTINCTION).rgb, vec3(0.0));\n mat.mediumAnisotropy = clamp(fetchMatData(i + MAT_ROW_MEDIUM_EXTINCTION).a, -1.0, 1.0);\n mat.mediumScattering = max(fetchMatData(i + MAT_ROW_MEDIUM_SCATTERING).rgb, vec3(0.0));\n mat.mediumType = max(max(mat.mediumExtinction.x, mat.mediumExtinction.y), mat.mediumExtinction.z) > 0.0 ? 1 : 0;\n#endif\n\n\n#ifdef HAS_ALPHA\n mat.alpha = alphaAndThinFilm.r;\n#else\n mat.alpha = 1.0;\n#endif\n\n #ifdef NUM_DIFFUSE_MAPS\n int diffuseMapIndex = int(metallicAndMapIndex.z);\n if (diffuseMapIndex >= 0) {\n vec4 diffuse = sampleMap(\n diffuseMapIndex, getMapUvSet(diffuseMapIndex, uv, uv1)\n );\n // Material factors from THREE / glTF are already linear. Only color\n // textures need decoding from their stored sRGB values.\n mat.baseColor *= decodeMapColor(diffuseMapIndex, diffuse.rgb);\n\n // Map alpha to transmission\n if (mapAlphaUsage == ${mapAlphaUsageConstants.transmission + ''}) {\n mat.transmissionWeight = 1.0 - diffuse.a;\n }\n else if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {\n mat.alpha *= diffuse.a;\n }\n }\n #endif\n\n ${simpleTextureSample('alphaMap', 'glsl')}\n\n mat.alpha = resolveMaterialAlpha(\n mat.alpha, int(fetchMatData(i + MAT_ROW_ALPHA).w), standaloneMetalRoughMaps.w\n );\n\n ${simpleTextureSample('transmissionMap', 'glsl')}\n\n #ifdef NUM_METALLIC_ROUGHNESS_MAPS\n int metallicRoughnessMapIndex = int(metallicAndMapIndex.w);\n if (metallicRoughnessMapIndex >= 0) {\n vec4 metallicRoughness = sampleMap(\n metallicRoughnessMapIndex,\n getMapUvSet(metallicRoughnessMapIndex, uv, uv1)\n );\n mat.baseMetalness *= metallicRoughness.b;\n mat.specularRoughness *= metallicRoughness.g;\n }\n #endif\n\n ${simpleTextureSample('roughnessMap', 'glsl')}\n\n ${simpleTextureSample('metalnessMap', 'glsl')}\n\n #ifdef NUM_EMISSIVE_MAPS\n int emissiveMapIndex = int(emissionAndEmissiveMapIndex.w);\n if (emissiveMapIndex >= 0) {\n vec3 emissive = sampleMap(\n emissiveMapIndex, getMapUvSet(emissiveMapIndex, uv, uv1)\n ).rgb;\n mat.emission *= decodeMapColor(emissiveMapIndex, emissive);\n }\n #endif\n\n #ifdef NUM_COAT_WEIGHT_MAPS\n int emissionCoatMapIndex = int(fetchMatData(i + MAT_ROW_LAYER_MAPS).x);\n if (emissionCoatMapIndex >= 0 && mat.materialType == 0) {\n float emissionCoatWeight = clamp(coat.w, 0.0, 1.0) * sampleMap(\n emissionCoatMapIndex, getMapUvSet(emissionCoatMapIndex, uv, uv1)\n ).r;\n mat.emission *= mix(vec3(1.0), sqrt(max(coat.rgb, vec3(0.0))), emissionCoatWeight);\n }\n #endif\n\n ${thinFilmTextureSample('glsl')}\n\n ${simpleTextureSample('coatWeightMap', 'glsl')}\n#ifdef NUM_COAT_NORMAL_MAPS\n mat.coatNormalEnabled = fetchMatData(i + MAT_ROW_LAYER_MAPS).z >= 0.0 && mat.coatWeight > 0.0;\n#endif\n\n ${simpleTextureSample('coatRoughnessMap', 'glsl')}\n\n ${simpleTextureSample('fuzzColorMap', 'glsl')}\n\n ${simpleTextureSample('fuzzRoughnessMap', 'glsl')}\n\n ${simpleTextureSample('specularWeightMap', 'glsl')}\n\n ${simpleTextureSample('specularColorMap', 'glsl')}\n\n vec4 directionInfo = fetchMatData(i + MAT_ROW_DIRECTION_NORMAL);\n mat.anisotropyDirection = vec2(1.0, 0.0);\n mat.anisotropyDirectionEnabled = directionInfo.y != 0.0;\n mat.coatAnisotropyRotation = fetchMatData(i + MAT_ROW_FILM_TEXTURE).x;\n#ifdef NUM_ANISOTROPY_MAPS\n if (directionInfo.x >= 0.0) {\n int index = int(directionInfo.x);\n vec4 texel = sampleMap(index, getMapUvSet(index, uv, uv1));\n mat.specularAnisotropy *= texel.b;\n vec2 direction = texel.rg * 2.0 - 1.0;\n if (dot(direction, direction) > 1e-4) mat.anisotropyDirection = normalize(direction);\n mat.anisotropyDirectionEnabled = true;\n }\n#endif\n#ifdef HAS_GLTF_ANISOTROPY\n if (fetchMatData(i + MAT_ROW_FILM_TEXTURE).y > 0.5 && mat.specularAnisotropy > 0.0) {\n vec2 native = gltf_anisotropy_to_openpbr(clamp(mat.specularRoughness, 0.0, 1.0), mat.specularAnisotropy);\n mat.specularRoughness = native.x;\n mat.specularAnisotropy = native.y;\n }\n#endif\n if (mat.anisotropyDirectionEnabled) {\n float theta = directionInfo.y;\n vec2 d = mat.anisotropyDirection;\n mat.anisotropyDirection = vec2(cos(theta)*d.x - sin(theta)*d.y, sin(theta)*d.x + cos(theta)*d.y);\n }\n\n // OpenPBR 1.1.1: coat refraction broadens all base microfacet lobes.\n // Keep the zero-coat / smooth-coat paths byte-identical.\n if (mat.coatWeight > 0.0 && mat.coatRoughness > 0.0) {\n float baseRoughness2 = mat.specularRoughness * mat.specularRoughness;\n float coatRoughness2 = mat.coatRoughness * mat.coatRoughness;\n mat.specularRoughness = mix(mat.specularRoughness,\n pow(min(1.0, baseRoughness2 * baseRoughness2 + 2.0 * coatRoughness2 * coatRoughness2), 0.25), mat.coatWeight);\n }\n vec3 instanceColor = getInstanceColor(instanceIndex);\n mat.baseColor *= instanceColor;\n if (mat.materialType == UNLIT) mat.emission *= instanceColor;\n\n mat.specularRoughness = clamp(mat.specularRoughness, ROUGHNESS_MIN, 1.0);\n mat.baseMetalness = clamp(mat.baseMetalness, 0.0, 1.0);\n vec2 specularAlpha = openpbr_roughness_to_alpha(mat.specularRoughness, mat.specularAnisotropy);\n mat.alphaX = specularAlpha.x;\n mat.alphaY = specularAlpha.y;\n}\n\n#if defined(NUM_NORMAL_MAPS)\nvec3 getMatNormal(int materialIndex, vec2 uv, vec3 normal, vec3 dp1, vec3 dp2, vec2 duv1, vec2 duv2) {\n int i = materialIndex * MAT_DATA_SIZE;\n vec4 roughnessAndNormal = fetchMatData(i + MAT_ROW_ROUGHNESS_NORMAL);\n int normalMapIndex = int(roughnessAndNormal.y);\n if (normalMapIndex >= 0) {\n // http://www.thetenthplanet.de/archives/1180\n // TODO use tangent attribute\n // Compute co-tangent and co-bitangent vectors\n vec3 dp2perp = cross(dp2, normal);\n vec3 dp1perp = cross(normal, dp1);\n vec3 dpdu = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 dpdv = dp2perp * duv1.y + dp1perp * duv2.y;\n float gradientLengthSquared = max(dot(dpdu, dpdu), dot(dpdv, dpdv));\n if (gradientLengthSquared > 1e-12) {\n float invmax = inversesqrt(gradientLengthSquared);\n dpdu *= invmax;\n dpdv *= invmax;\n }\n else {\n // Imported meshes can legitimately omit UVs and use generated or\n // triplanar projection. Their zero UV derivatives must not turn the TBN\n // basis (and then every lighting result) into NaN.\n vec3 referenceAxis = abs(normal.z) < 0.999\n ? vec3(0.0, 0.0, 1.0)\n : vec3(0.0, 1.0, 0.0);\n dpdu = normalize(cross(referenceAxis, normal));\n dpdv = cross(normal, dpdu);\n }\n\n vec3 n = 2.0 * sampleMap(normalMapIndex, uv).rgb - 1.0;\n n.xy *= roughnessAndNormal.zw;\n n = normalize(n);\n\n mat3 tbn = mat3(dpdu, dpdv, normal);\n\n return normalize(tbn * n);\n } else {\n return normal;\n }\n}\n#endif\n\n`\n});\n"]}
|