@meimu/mutracer 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +7 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +10407 -8353
- package/docs/api.md +200 -10
- package/docs/denoising.md +30 -15
- package/docs/materials.md +1 -1
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +32 -1
- package/docs/threejs.md +14 -5
- package/docs/updates.md +44 -2
- package/docs/viewer.md +11 -6
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +27 -6
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +52 -25
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +44 -9
- package/lib/Render.js +115 -17
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -1
- package/lib/RenderLoop.js +94 -13
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +10 -0
- package/lib/renderer/GPUTraceQueue.js +31 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +32 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPURayTraceOutput.js +26 -17
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +36 -40
- package/lib/renderer/WGPURayTracePass.js +399 -550
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +239 -60
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
- package/lib/renderer/WebGLFullQuadPass.js +18 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
- package/lib/renderer/WebGLRayTracePass.js +82 -7
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +116 -8
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +5 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +191 -191
- package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +20 -17
- package/lib/renderer/lightSampling.js +123 -56
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +3 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +3 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +31 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +742 -705
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +25 -3
- package/lib/settings/render.js +3 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +18 -5
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +4 -0
- package/package.json +31 -5
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* rough-diffuse/specular coupling; fuzz still uses an analytic approximation.
|
|
16
16
|
*/
|
|
17
17
|
import { OPENPBR_METAL_ENERGY_LUT_ROW, OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW } from '../../openPbrEnergyLut.js';
|
|
18
|
+
const LOBE_INDICES = [0, 1, 2, 3, 4, 5, 6];
|
|
18
19
|
export function createOpenPbrBsdfWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
|
|
19
20
|
return /* wgsl */ `
|
|
20
21
|
const OPENPBR_LOBE_FUZZ: i32 = 0;
|
|
@@ -24,19 +25,22 @@ const OPENPBR_LOBE_SPECULAR: i32 = 3;
|
|
|
24
25
|
const OPENPBR_LOBE_TRANSMISSION: i32 = 4;
|
|
25
26
|
const OPENPBR_LOBE_DIFFUSE: i32 = 5;
|
|
26
27
|
const OPENPBR_LOBE_SUBSURFACE: i32 = 6;
|
|
27
|
-
const OPENPBR_LOBE_COUNT: i32 =
|
|
28
|
+
const OPENPBR_LOBE_COUNT: i32 = ${LOBE_INDICES.length};
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
struct bq {
|
|
30
34
|
tangent: vec3f,
|
|
31
35
|
bitangent: vec3f,
|
|
32
36
|
normal: vec3f,
|
|
33
37
|
};
|
|
34
38
|
|
|
35
39
|
struct ag {
|
|
36
|
-
material:
|
|
37
|
-
basis:
|
|
40
|
+
material: OpenPbrResolvedMaterial,
|
|
41
|
+
basis: bq,
|
|
38
42
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
39
|
-
coatBasis:
|
|
43
|
+
coatBasis: bq,
|
|
40
44
|
directionFrames: bool,
|
|
41
45
|
` : /* wgsl */ ``}
|
|
42
46
|
${hasCoatNormals ? /* wgsl */ ` coatViewLocal: vec3f,` : ''}
|
|
@@ -64,251 +68,251 @@ weights: array<f32, OPENPBR_LOBE_COUNT>,
|
|
|
64
68
|
probabilities: array<f32, OPENPBR_LOBE_COUNT>,
|
|
65
69
|
};
|
|
66
70
|
|
|
67
|
-
fn
|
|
71
|
+
fn aE(color: vec3f) -> f32 {
|
|
68
72
|
return dot(color, vec3f(0.212671, 0.715160, 0.072169));
|
|
69
73
|
}
|
|
70
74
|
|
|
71
|
-
fn
|
|
72
|
-
let value = (
|
|
75
|
+
fn dd(bE: f32) -> f32 {
|
|
76
|
+
let value = (bE - 1.0) / (bE + 1.0);
|
|
73
77
|
return value * value;
|
|
74
78
|
}
|
|
75
79
|
|
|
76
|
-
fn
|
|
77
|
-
|
|
80
|
+
fn bi(
|
|
81
|
+
bE: f32,
|
|
78
82
|
specularWeight: f32
|
|
79
83
|
) -> f32 {
|
|
80
|
-
let
|
|
81
|
-
|
|
84
|
+
let uh = min(
|
|
85
|
+
dd(bE) * specularWeight,
|
|
82
86
|
0.9999
|
|
83
87
|
);
|
|
84
|
-
let
|
|
85
|
-
let
|
|
86
|
-
return select(
|
|
88
|
+
let uj = sqrt(uh);
|
|
89
|
+
let lR = (1.0 + uj) / (1.0 - uj);
|
|
90
|
+
return select(lR, 1.0 / lR, bE < 1.0);
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
fn af(
|
|
93
|
+
fn af(ci: f32, relativeIor: f32) -> f32 {
|
|
90
94
|
if (abs(relativeIor - 1.0) < 1e-6) {
|
|
91
95
|
return 0.0;
|
|
92
96
|
}
|
|
93
|
-
return
|
|
97
|
+
return cC(ci, relativeIor);
|
|
94
98
|
}
|
|
95
99
|
|
|
96
|
-
fn
|
|
100
|
+
fn aG(ior: f32) -> f32 {
|
|
97
101
|
if (ior < 1.0) {
|
|
98
102
|
return 15.0 - ((1.0 / ior - 1.0) / 1.5) * 15.0;
|
|
99
103
|
}
|
|
100
104
|
return 16.0 + ((ior - 1.0) / 1.5) * 15.0;
|
|
101
105
|
}
|
|
102
106
|
|
|
103
|
-
fn F(
|
|
104
|
-
return textureLoad(openPbrEnergyLut, vec2i(
|
|
107
|
+
fn F(tB: i32, row: i32) -> f32 {
|
|
108
|
+
return textureLoad(openPbrEnergyLut, vec2i(tB, row), 0).r;
|
|
105
109
|
}
|
|
106
110
|
|
|
107
|
-
fn
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
fn gt(
|
|
112
|
+
dU: f32,
|
|
113
|
+
bV: f32,
|
|
114
|
+
im: f32
|
|
111
115
|
) -> f32 {
|
|
112
|
-
let
|
|
113
|
-
let
|
|
114
|
-
let
|
|
115
|
-
let
|
|
116
|
-
let
|
|
117
|
-
let
|
|
118
|
-
let
|
|
119
|
-
let
|
|
120
|
-
let
|
|
121
|
-
let
|
|
122
|
-
let
|
|
123
|
-
let
|
|
124
|
-
|
|
125
|
-
let
|
|
126
|
-
let
|
|
127
|
-
let
|
|
128
|
-
let
|
|
129
|
-
let
|
|
130
|
-
let
|
|
131
|
-
let
|
|
132
|
-
let
|
|
133
|
-
let v00 = mix(
|
|
134
|
-
let v01 = mix(
|
|
135
|
-
let v10 = mix(
|
|
136
|
-
let v11 = mix(
|
|
116
|
+
let bH = clamp(dU, 0.0, 31.0);
|
|
117
|
+
let aL = clamp(bV, 0.0, 31.0);
|
|
118
|
+
let bD = clamp(im, 0.0, 31.0);
|
|
119
|
+
let ef = i32(floor(bH));
|
|
120
|
+
let aT = i32(floor(aL));
|
|
121
|
+
let cQ = i32(floor(bD));
|
|
122
|
+
let hU = min(ef + 1, 31);
|
|
123
|
+
let cu = min(aT + 1, 31);
|
|
124
|
+
let fb = min(cQ + 1, 31);
|
|
125
|
+
let cv = bH - f32(ef);
|
|
126
|
+
let cI = aL - f32(aT);
|
|
127
|
+
let lj = bD - f32(cQ);
|
|
128
|
+
|
|
129
|
+
let wb = F(cQ, ef * 32 + aT);
|
|
130
|
+
let wc = F(fb, ef * 32 + aT);
|
|
131
|
+
let wd = F(cQ, ef * 32 + cu);
|
|
132
|
+
let wf = F(fb, ef * 32 + cu);
|
|
133
|
+
let wg = F(cQ, hU * 32 + aT);
|
|
134
|
+
let wh = F(fb, hU * 32 + aT);
|
|
135
|
+
let wi = F(cQ, hU * 32 + cu);
|
|
136
|
+
let wj = F(fb, hU * 32 + cu);
|
|
137
|
+
let v00 = mix(wb, wg, cv);
|
|
138
|
+
let v01 = mix(wc, wh, cv);
|
|
139
|
+
let v10 = mix(wd, wi, cv);
|
|
140
|
+
let v11 = mix(wf, wj, cv);
|
|
137
141
|
return mix(
|
|
138
|
-
mix(v00, v10,
|
|
139
|
-
mix(v01, v11,
|
|
140
|
-
|
|
142
|
+
mix(v00, v10, cI),
|
|
143
|
+
mix(v01, v11, cI),
|
|
144
|
+
lj
|
|
141
145
|
);
|
|
142
146
|
}
|
|
143
147
|
|
|
144
|
-
fn
|
|
145
|
-
let
|
|
146
|
-
let
|
|
147
|
-
let
|
|
148
|
-
let
|
|
149
|
-
let
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
let v00 = F(
|
|
154
|
-
let v01 = F(
|
|
155
|
-
let v10 = F(
|
|
156
|
-
let v11 = F(
|
|
148
|
+
fn gS(dU: f32, bV: f32) -> f32 {
|
|
149
|
+
let bH = clamp(dU, 0.0, 31.0);
|
|
150
|
+
let aL = clamp(bV, 0.0, 31.0);
|
|
151
|
+
let ef = i32(floor(bH));
|
|
152
|
+
let aT = i32(floor(aL));
|
|
153
|
+
let hU = min(ef + 1, 31);
|
|
154
|
+
let cu = min(aT + 1, 31);
|
|
155
|
+
let cv = bH - f32(ef);
|
|
156
|
+
let cI = aL - f32(aT);
|
|
157
|
+
let v00 = F(aT, 1024 + ef);
|
|
158
|
+
let v01 = F(cu, 1024 + ef);
|
|
159
|
+
let v10 = F(aT, 1024 + hU);
|
|
160
|
+
let v11 = F(cu, 1024 + hU);
|
|
157
161
|
return mix(
|
|
158
|
-
mix(v00, v10,
|
|
159
|
-
mix(v01, v11,
|
|
160
|
-
|
|
162
|
+
mix(v00, v10, cv),
|
|
163
|
+
mix(v01, v11, cv),
|
|
164
|
+
cI
|
|
161
165
|
);
|
|
162
166
|
}
|
|
163
167
|
|
|
164
168
|
|
|
165
169
|
|
|
166
|
-
fn
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
+
fn ev(
|
|
171
|
+
dU: f32,
|
|
172
|
+
bV: f32,
|
|
173
|
+
im: f32
|
|
170
174
|
) -> f32 {
|
|
171
|
-
let
|
|
172
|
-
let
|
|
173
|
-
let
|
|
174
|
-
let
|
|
175
|
-
let
|
|
176
|
-
let
|
|
177
|
-
let
|
|
178
|
-
let
|
|
179
|
-
let
|
|
180
|
-
let
|
|
181
|
-
let
|
|
182
|
-
let
|
|
183
|
-
|
|
184
|
-
let
|
|
185
|
-
let
|
|
186
|
-
let
|
|
187
|
-
let
|
|
188
|
-
let
|
|
189
|
-
let
|
|
190
|
-
let
|
|
191
|
-
let
|
|
192
|
-
let v00 = mix(
|
|
193
|
-
let v01 = mix(
|
|
194
|
-
let v10 = mix(
|
|
195
|
-
let v11 = mix(
|
|
175
|
+
let bH = clamp(dU, 0.0, 31.0);
|
|
176
|
+
let aL = clamp(bV, 0.0, 31.0);
|
|
177
|
+
let bD = clamp(im, 0.0, 31.0);
|
|
178
|
+
let ef = i32(floor(bH));
|
|
179
|
+
let aT = i32(floor(aL));
|
|
180
|
+
let cQ = i32(floor(bD));
|
|
181
|
+
let hU = min(ef + 1, 31);
|
|
182
|
+
let cu = min(aT + 1, 31);
|
|
183
|
+
let fb = min(cQ + 1, 31);
|
|
184
|
+
let cv = bH - f32(ef);
|
|
185
|
+
let cI = aL - f32(aT);
|
|
186
|
+
let lj = bD - f32(cQ);
|
|
187
|
+
|
|
188
|
+
let wb = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + aT);
|
|
189
|
+
let wc = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + aT);
|
|
190
|
+
let wd = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + cu);
|
|
191
|
+
let wf = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + cu);
|
|
192
|
+
let wg = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + aT);
|
|
193
|
+
let wh = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + aT);
|
|
194
|
+
let wi = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + cu);
|
|
195
|
+
let wj = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + cu);
|
|
196
|
+
let v00 = mix(wb, wg, cv);
|
|
197
|
+
let v01 = mix(wc, wh, cv);
|
|
198
|
+
let v10 = mix(wd, wi, cv);
|
|
199
|
+
let v11 = mix(wf, wj, cv);
|
|
196
200
|
return mix(
|
|
197
|
-
mix(v00, v10,
|
|
198
|
-
mix(v01, v11,
|
|
199
|
-
|
|
201
|
+
mix(v00, v10, cI),
|
|
202
|
+
mix(v01, v11, cI),
|
|
203
|
+
lj
|
|
200
204
|
);
|
|
201
205
|
}
|
|
202
206
|
|
|
203
|
-
fn
|
|
204
|
-
let
|
|
205
|
-
let
|
|
206
|
-
let
|
|
207
|
-
let
|
|
208
|
-
let
|
|
209
|
-
let
|
|
210
|
-
let
|
|
211
|
-
let
|
|
212
|
-
let v00 = F(
|
|
213
|
-
let v01 = F(
|
|
214
|
-
let v10 = F(
|
|
215
|
-
let v11 = F(
|
|
207
|
+
fn eu(dU: f32, bV: f32) -> f32 {
|
|
208
|
+
let bH = clamp(dU, 0.0, 31.0);
|
|
209
|
+
let aL = clamp(bV, 0.0, 31.0);
|
|
210
|
+
let ef = i32(floor(bH));
|
|
211
|
+
let aT = i32(floor(aL));
|
|
212
|
+
let hU = min(ef + 1, 31);
|
|
213
|
+
let cu = min(aT + 1, 31);
|
|
214
|
+
let cv = bH - f32(ef);
|
|
215
|
+
let cI = aL - f32(aT);
|
|
216
|
+
let v00 = F(aT, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + ef);
|
|
217
|
+
let v01 = F(cu, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + ef);
|
|
218
|
+
let v10 = F(aT, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hU);
|
|
219
|
+
let v11 = F(cu, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hU);
|
|
216
220
|
return mix(
|
|
217
|
-
mix(v00, v10,
|
|
218
|
-
mix(v01, v11,
|
|
219
|
-
|
|
221
|
+
mix(v00, v10, cv),
|
|
222
|
+
mix(v01, v11, cv),
|
|
223
|
+
cI
|
|
220
224
|
);
|
|
221
225
|
}
|
|
222
226
|
|
|
223
|
-
fn
|
|
224
|
-
let
|
|
225
|
-
let
|
|
226
|
-
let
|
|
227
|
-
let
|
|
228
|
-
let
|
|
229
|
-
let
|
|
230
|
-
let
|
|
231
|
-
let
|
|
232
|
-
let v00 = F(
|
|
233
|
-
let v01 = F(
|
|
234
|
-
let v10 = F(
|
|
235
|
-
let v11 = F(
|
|
227
|
+
fn eR(dU: f32, bV: f32) -> f32 {
|
|
228
|
+
let bH = clamp(dU, 0.0, 31.0);
|
|
229
|
+
let aL = clamp(bV, 0.0, 31.0);
|
|
230
|
+
let ef = i32(floor(bH));
|
|
231
|
+
let aT = i32(floor(aL));
|
|
232
|
+
let hU = min(ef + 1, 31);
|
|
233
|
+
let cu = min(aT + 1, 31);
|
|
234
|
+
let cv = bH - f32(ef);
|
|
235
|
+
let cI = aL - f32(aT);
|
|
236
|
+
let v00 = F(aT, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + ef);
|
|
237
|
+
let v01 = F(cu, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + ef);
|
|
238
|
+
let v10 = F(aT, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hU);
|
|
239
|
+
let v11 = F(cu, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hU);
|
|
236
240
|
return mix(
|
|
237
|
-
mix(v00, v10,
|
|
238
|
-
mix(v01, v11,
|
|
239
|
-
|
|
241
|
+
mix(v00, v10, cv),
|
|
242
|
+
mix(v01, v11, cv),
|
|
243
|
+
cI
|
|
240
244
|
);
|
|
241
245
|
}
|
|
242
246
|
|
|
243
|
-
fn
|
|
244
|
-
return
|
|
247
|
+
fn bb(ior: f32, alpha: f32, cosine: f32) -> f32 {
|
|
248
|
+
return ev(aG(ior), sqrt(alpha) * 31.0, cosine * 31.0);
|
|
245
249
|
}
|
|
246
|
-
fn
|
|
247
|
-
return
|
|
250
|
+
fn bf(ior: f32, alpha: f32) -> f32 {
|
|
251
|
+
return eu(aG(ior), sqrt(alpha) * 31.0);
|
|
248
252
|
}
|
|
249
|
-
fn
|
|
250
|
-
return
|
|
253
|
+
fn ck(ior: f32, alpha: f32) -> f32 {
|
|
254
|
+
return eR(aG(ior), sqrt(alpha) * 31.0);
|
|
251
255
|
}
|
|
252
256
|
|
|
253
257
|
|
|
254
258
|
|
|
255
|
-
fn
|
|
256
|
-
let
|
|
257
|
-
let
|
|
258
|
-
let r0 = i32(floor(
|
|
259
|
-
let c0 = i32(floor(
|
|
259
|
+
fn aV(alpha: f32, cosine: f32) -> f32 {
|
|
260
|
+
let iF = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
|
|
261
|
+
let bD = clamp(cosine * 31.0, 0.0, 31.0);
|
|
262
|
+
let r0 = i32(floor(iF));
|
|
263
|
+
let c0 = i32(floor(bD));
|
|
260
264
|
let r1 = min(r0 + 1, 31);
|
|
261
265
|
let c1 = min(c0 + 1, 31);
|
|
262
266
|
return mix(
|
|
263
|
-
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(
|
|
264
|
-
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(
|
|
265
|
-
fract(
|
|
267
|
+
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bD)),
|
|
268
|
+
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bD)),
|
|
269
|
+
fract(iF));
|
|
266
270
|
}
|
|
267
271
|
|
|
268
|
-
fn
|
|
272
|
+
fn cD(alpha: f32) -> f32 {
|
|
269
273
|
let index = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
|
|
270
274
|
let i0 = i32(floor(index));
|
|
271
275
|
return mix(F(i0, ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}),
|
|
272
276
|
F(min(i0 + 1, 31), ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}), fract(index));
|
|
273
277
|
}
|
|
274
278
|
|
|
275
|
-
fn
|
|
276
|
-
if (ior > 2.5
|
|
277
|
-
let
|
|
278
|
-
let progress = (
|
|
279
|
+
fn bd(value: f32, ior: f32) -> f32 {
|
|
280
|
+
if ((ior > 2.5) | (ior < 0.4)) {
|
|
281
|
+
let vu = dd(2.5);
|
|
282
|
+
let progress = (dd(ior) - vu) / (1.0 - vu);
|
|
279
283
|
return (1.0 - progress) * value;
|
|
280
284
|
}
|
|
281
285
|
return value;
|
|
282
286
|
}
|
|
283
287
|
|
|
284
|
-
fn
|
|
288
|
+
fn aw(
|
|
285
289
|
ior: f32,
|
|
286
290
|
alpha: f32,
|
|
287
|
-
|
|
291
|
+
cosine: f32
|
|
288
292
|
) -> f32 {
|
|
289
|
-
let value =
|
|
290
|
-
|
|
293
|
+
let value = gt(
|
|
294
|
+
aG(ior),
|
|
291
295
|
sqrt(alpha) * 31.0,
|
|
292
|
-
|
|
296
|
+
cosine * 31.0
|
|
293
297
|
);
|
|
294
|
-
return
|
|
298
|
+
return bd(value, ior);
|
|
295
299
|
}
|
|
296
300
|
|
|
297
|
-
fn
|
|
298
|
-
let value =
|
|
299
|
-
|
|
301
|
+
fn cA(ior: f32, alpha: f32) -> f32 {
|
|
302
|
+
let value = gS(
|
|
303
|
+
aG(ior),
|
|
300
304
|
sqrt(alpha) * 31.0
|
|
301
305
|
);
|
|
302
|
-
return
|
|
306
|
+
return bd(value, ior);
|
|
303
307
|
}
|
|
304
308
|
|
|
305
|
-
fn openpbr_to_world(basis:
|
|
309
|
+
fn openpbr_to_world(basis: bq, direction: vec3f) -> vec3f {
|
|
306
310
|
return direction.x * basis.tangent
|
|
307
311
|
+ direction.y * basis.bitangent
|
|
308
312
|
+ direction.z * basis.normal;
|
|
309
313
|
}
|
|
310
314
|
|
|
311
|
-
fn openpbr_to_local(basis:
|
|
315
|
+
fn openpbr_to_local(basis: bq, direction: vec3f) -> vec3f {
|
|
312
316
|
return vec3f(
|
|
313
317
|
dot(direction, basis.tangent),
|
|
314
318
|
dot(direction, basis.bitangent),
|
|
@@ -316,17 +320,17 @@ dot(direction, basis.normal)
|
|
|
316
320
|
);
|
|
317
321
|
}
|
|
318
322
|
|
|
319
|
-
fn
|
|
320
|
-
|
|
323
|
+
fn fD(
|
|
324
|
+
aX: vec3f,
|
|
321
325
|
normal: vec3f,
|
|
322
326
|
anisotropy: f32
|
|
323
|
-
) ->
|
|
324
|
-
var basis:
|
|
327
|
+
) -> bq {
|
|
328
|
+
var basis: bq;
|
|
325
329
|
basis.normal = normal;
|
|
326
|
-
var tangent =
|
|
330
|
+
var tangent = aX;
|
|
327
331
|
var bitangent = vec3f(0.0);
|
|
328
|
-
if (dot(tangent, tangent) < 0.001
|
|
329
|
-
|
|
332
|
+
if ((dot(tangent, tangent) < 0.001) | (anisotropy <= 0.0)) {
|
|
333
|
+
aP(normal, &tangent, &bitangent);
|
|
330
334
|
}
|
|
331
335
|
else {
|
|
332
336
|
bitangent = normalize(cross(normal, tangent));
|
|
@@ -337,198 +341,198 @@ basis.bitangent = bitangent;
|
|
|
337
341
|
return basis;
|
|
338
342
|
}
|
|
339
343
|
|
|
340
|
-
fn
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
344
|
+
fn kF(
|
|
345
|
+
aB: f32,
|
|
346
|
+
am: f32,
|
|
347
|
+
J: f32,
|
|
348
|
+
ae: f32
|
|
345
349
|
) -> f32 {
|
|
346
|
-
return (
|
|
347
|
-
/ (
|
|
350
|
+
return (aB * J - am * ae)
|
|
351
|
+
/ (aB * J + am * ae);
|
|
348
352
|
}
|
|
349
353
|
|
|
350
|
-
fn
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
354
|
+
fn kE(
|
|
355
|
+
aB: f32,
|
|
356
|
+
am: f32,
|
|
357
|
+
J: f32,
|
|
358
|
+
ae: f32
|
|
355
359
|
) -> f32 {
|
|
356
|
-
return (
|
|
357
|
-
/ (
|
|
360
|
+
return (am * J - aB * ae)
|
|
361
|
+
/ (aB * ae + am * J);
|
|
358
362
|
}
|
|
359
363
|
|
|
360
|
-
fn
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
364
|
+
fn ht(
|
|
365
|
+
aB: f32,
|
|
366
|
+
am: f32,
|
|
367
|
+
J: f32,
|
|
368
|
+
ae: f32
|
|
365
369
|
) -> f32 {
|
|
366
|
-
return 2.0 *
|
|
367
|
-
/ (
|
|
370
|
+
return 2.0 * aB * J
|
|
371
|
+
/ (aB * J + am * ae);
|
|
368
372
|
}
|
|
369
373
|
|
|
370
|
-
fn
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
374
|
+
fn hs(
|
|
375
|
+
aB: f32,
|
|
376
|
+
am: f32,
|
|
377
|
+
J: f32,
|
|
378
|
+
ae: f32
|
|
375
379
|
) -> f32 {
|
|
376
|
-
return 2.0 *
|
|
377
|
-
/ (
|
|
380
|
+
return 2.0 * aB * J
|
|
381
|
+
/ (aB * ae + am * J);
|
|
378
382
|
}
|
|
379
383
|
|
|
380
|
-
fn
|
|
384
|
+
fn aY(a: vec2f, b: vec2f) -> vec2f {
|
|
381
385
|
return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
|
|
382
386
|
}
|
|
383
387
|
|
|
384
|
-
fn
|
|
385
|
-
let
|
|
388
|
+
fn bj(a: vec2f, b: vec2f) -> vec2f {
|
|
389
|
+
let aq = max(dot(b, b), 1e-9);
|
|
386
390
|
return vec2f(
|
|
387
|
-
(a.x * b.x + a.y * b.y) /
|
|
388
|
-
(a.y * b.x - a.x * b.y) /
|
|
391
|
+
(a.x * b.x + a.y * b.y) / aq,
|
|
392
|
+
(a.y * b.x - a.x * b.y) / aq
|
|
389
393
|
);
|
|
390
394
|
}
|
|
391
395
|
|
|
392
|
-
fn
|
|
393
|
-
let
|
|
394
|
-
let
|
|
395
|
-
let
|
|
396
|
-
return vec2f(
|
|
396
|
+
fn iA(value: vec2f) -> vec2f {
|
|
397
|
+
let gR = length(value);
|
|
398
|
+
let uf = sqrt(max(0.0, 0.5 * (gR + value.x)));
|
|
399
|
+
let fw = sqrt(max(0.0, 0.5 * (gR - value.x)));
|
|
400
|
+
return vec2f(uf, select(-fw, fw, value.y >= 0.0));
|
|
397
401
|
}
|
|
398
402
|
|
|
399
|
-
fn
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
403
|
+
fn ce(
|
|
404
|
+
J: f32,
|
|
405
|
+
aB: f32,
|
|
406
|
+
am: vec2f,
|
|
407
|
+
rM: bool
|
|
404
408
|
) -> vec2f {
|
|
405
|
-
let
|
|
406
|
-
let
|
|
407
|
-
let
|
|
408
|
-
var
|
|
409
|
-
vec2f(1.0, 0.0) -
|
|
409
|
+
let pg = sqrt(max(0.0, 1.0 - J * J));
|
|
410
|
+
let tP = bj(vec2f(aB, 0.0), am);
|
|
411
|
+
let hQ = tP * pg;
|
|
412
|
+
var ae = iA(
|
|
413
|
+
vec2f(1.0, 0.0) - aY(hQ, hQ)
|
|
410
414
|
);
|
|
411
|
-
if (
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
let
|
|
416
|
-
let
|
|
417
|
-
if (
|
|
418
|
-
let
|
|
419
|
-
let
|
|
420
|
-
return
|
|
421
|
-
|
|
422
|
-
|
|
415
|
+
if (aY(am, ae).y < 0.0) {
|
|
416
|
+
ae = -ae;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
let fZ = vec2f(aB * J, 0.0);
|
|
420
|
+
let eJ = aY(am, ae);
|
|
421
|
+
if (rM) {
|
|
422
|
+
let cl = am * J;
|
|
423
|
+
let cj = ae * aB;
|
|
424
|
+
return bj(
|
|
425
|
+
cl - cj,
|
|
426
|
+
cl + cj
|
|
423
427
|
);
|
|
424
428
|
}
|
|
425
|
-
return
|
|
426
|
-
|
|
427
|
-
|
|
429
|
+
return bj(
|
|
430
|
+
fZ - eJ,
|
|
431
|
+
fZ + eJ
|
|
428
432
|
);
|
|
429
433
|
}
|
|
430
434
|
|
|
431
|
-
fn
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
435
|
+
fn eE(
|
|
436
|
+
iZ: f32,
|
|
437
|
+
ha: f32,
|
|
438
|
+
pw: f32,
|
|
439
|
+
nL: f32,
|
|
440
|
+
kL: vec2f,
|
|
437
441
|
phase: f32
|
|
438
442
|
) -> f32 {
|
|
439
|
-
let
|
|
440
|
-
let
|
|
441
|
-
let
|
|
442
|
-
let
|
|
443
|
-
let
|
|
444
|
-
+
|
|
445
|
-
return dot(
|
|
443
|
+
let ol = vec2f(cos(phase), sin(phase));
|
|
444
|
+
let iD = aY(kL, ol);
|
|
445
|
+
let lv = iD * (ha * nL);
|
|
446
|
+
let aq = vec2f(1.0, 0.0) - iD * pw;
|
|
447
|
+
let hP = vec2f(iZ, 0.0)
|
|
448
|
+
+ bj(lv, aq);
|
|
449
|
+
return dot(hP, hP);
|
|
446
450
|
}
|
|
447
451
|
|
|
448
|
-
fn
|
|
449
|
-
|
|
452
|
+
fn au(
|
|
453
|
+
J: f32,
|
|
450
454
|
wavelength: f32,
|
|
455
|
+
ct: f32,
|
|
456
|
+
aR: f32,
|
|
451
457
|
cn: f32,
|
|
452
|
-
|
|
453
|
-
ck: f32,
|
|
454
|
-
eu: vec2f
|
|
458
|
+
eG: vec2f
|
|
455
459
|
) -> f32 {
|
|
456
|
-
let
|
|
457
|
-
let
|
|
458
|
-
* (1.0 -
|
|
459
|
-
if (
|
|
460
|
+
let dF = clamp(abs(J), 1e-5, 1.0);
|
|
461
|
+
let hI = pow(aR / cn, 2.0)
|
|
462
|
+
* (1.0 - dF * dF);
|
|
463
|
+
if (hI >= 1.0) {
|
|
460
464
|
return 1.0;
|
|
461
465
|
}
|
|
462
|
-
let
|
|
463
|
-
let
|
|
464
|
-
|
|
466
|
+
let dc = sqrt(1.0 - hI);
|
|
467
|
+
let lL = kF(
|
|
468
|
+
aR, cn, dF, dc
|
|
465
469
|
);
|
|
466
|
-
let
|
|
467
|
-
|
|
470
|
+
let lK = kE(
|
|
471
|
+
aR, cn, dF, dc
|
|
468
472
|
);
|
|
469
|
-
let
|
|
470
|
-
|
|
473
|
+
let jG = ht(
|
|
474
|
+
aR, cn, dF, dc
|
|
471
475
|
);
|
|
472
|
-
let
|
|
473
|
-
|
|
476
|
+
let jF = hs(
|
|
477
|
+
aR, cn, dF, dc
|
|
474
478
|
);
|
|
475
|
-
let
|
|
476
|
-
/ max(
|
|
477
|
-
let phase = 2.0 * PI * (2.0 *
|
|
478
|
-
var
|
|
479
|
+
let gG = cn * dc
|
|
480
|
+
/ max(aR * dF, 1e-9);
|
|
481
|
+
let phase = 2.0 * PI * (2.0 * cn * ct * dc) / wavelength;
|
|
482
|
+
var reflectance = 0.0;
|
|
479
483
|
|
|
480
|
-
for (var
|
|
481
|
-
let
|
|
482
|
-
let
|
|
483
|
-
let
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
-
|
|
484
|
+
for (var kJ = 0u; kJ < (rtUniform.loopUnrollGuard >> 1u); kJ++) {
|
|
485
|
+
let iZ = select(lL, lK, kJ == 1u);
|
|
486
|
+
let ha = select(jG, jF, kJ == 1u);
|
|
487
|
+
let kL = ce(
|
|
488
|
+
dc, cn, eG, kJ == 1u);
|
|
489
|
+
reflectance += eE(iZ, ha,
|
|
490
|
+
-iZ, ha * gG, kL, phase);
|
|
487
491
|
}
|
|
488
|
-
return clamp(0.5 *
|
|
492
|
+
return clamp(0.5 * reflectance, 0.0, 1.0);
|
|
489
493
|
}
|
|
490
494
|
|
|
491
495
|
|
|
492
496
|
|
|
493
497
|
|
|
494
|
-
fn
|
|
495
|
-
let
|
|
496
|
-
if (all(tint == vec3f(1.0))) { return
|
|
497
|
-
let
|
|
498
|
-
let
|
|
499
|
-
let
|
|
500
|
-
let
|
|
501
|
-
let
|
|
502
|
-
/ (
|
|
503
|
-
return clamp(
|
|
498
|
+
fn cw(cosine: f32, f0: vec3f, tint: vec3f) -> vec3f {
|
|
499
|
+
let sr = mix(f0, vec3f(1.0), aI(cosine));
|
|
500
|
+
if (all(tint == vec3f(1.0))) { return sr; }
|
|
501
|
+
let dD = 1.0 / 7.0;
|
|
502
|
+
let mY = 1.0 - dD;
|
|
503
|
+
let fX = mix(f0, vec3f(1.0), aI(dD));
|
|
504
|
+
let dw = 1.0 - cosine;
|
|
505
|
+
let ru = cosine * aI(cosine) * dw
|
|
506
|
+
/ (dD * pow(mY, 6.0));
|
|
507
|
+
return clamp(sr - ru * (fX - tint * fX), vec3f(0.0), vec3f(1.0));
|
|
504
508
|
}
|
|
505
509
|
|
|
506
|
-
fn
|
|
507
|
-
let
|
|
508
|
-
let
|
|
509
|
-
let
|
|
510
|
-
let
|
|
511
|
-
let ior = mix(
|
|
512
|
-
let
|
|
513
|
-
(ior + 1.0) * (ior + 1.0) *
|
|
510
|
+
fn cX(f0: f32, uN: f32) -> vec2f {
|
|
511
|
+
let dY = clamp(f0, 0.0, 0.99);
|
|
512
|
+
let gZ = sqrt(dY);
|
|
513
|
+
let rK = (1.0 - dY) / (1.0 + dY);
|
|
514
|
+
let rH = (1.0 + gZ) / max(1.0 - gZ, 1e-9);
|
|
515
|
+
let ior = mix(rH, rK, clamp(uN, 0.0, 1.0));
|
|
516
|
+
let kp = (
|
|
517
|
+
(ior + 1.0) * (ior + 1.0) * dY
|
|
514
518
|
- (ior - 1.0) * (ior - 1.0)
|
|
515
|
-
) / max(1.0 -
|
|
516
|
-
return vec2f(ior, sqrt(max(
|
|
519
|
+
) / max(1.0 - dY, 1e-9);
|
|
520
|
+
return vec2f(ior, sqrt(max(kp, 0.0)));
|
|
517
521
|
}
|
|
518
522
|
|
|
519
523
|
|
|
520
|
-
fn
|
|
521
|
-
return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0,
|
|
524
|
+
fn bS(ct: f32, weight: f32) -> f32 {
|
|
525
|
+
return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, ct);
|
|
522
526
|
}
|
|
523
527
|
|
|
524
528
|
|
|
525
529
|
|
|
526
|
-
fn
|
|
527
|
-
material:
|
|
530
|
+
fn bJ(
|
|
531
|
+
material: OpenPbrResolvedMaterial,
|
|
528
532
|
color: vec3f,
|
|
529
533
|
viewLocal: vec3f,
|
|
530
534
|
lightLocal: vec3f,
|
|
531
|
-
|
|
535
|
+
fJ: f32,
|
|
532
536
|
pdf: ptr<function, f32>
|
|
533
537
|
) -> vec3f {
|
|
534
538
|
*pdf = 0.0;
|
|
@@ -537,52 +541,52 @@ return vec3f(0.0);
|
|
|
537
541
|
}
|
|
538
542
|
|
|
539
543
|
let roughness = material.diffuseRoughness;
|
|
540
|
-
let
|
|
541
|
-
let
|
|
542
|
-
let
|
|
543
|
-
let
|
|
544
|
-
let
|
|
545
|
-
let
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
544
|
+
let hl = 0.5 - 2.0 / (3.0 * PI);
|
|
545
|
+
let pc = 2.0 / 3.0 - 28.0 / (15.0 * PI);
|
|
546
|
+
let pp = lightLocal.z;
|
|
547
|
+
let nt = viewLocal.z;
|
|
548
|
+
let directional = dot(lightLocal, viewLocal) - pp * nt;
|
|
549
|
+
let hh = select(
|
|
550
|
+
directional,
|
|
551
|
+
directional / max(max(pp, nt), 1e-7),
|
|
552
|
+
directional > 0.0
|
|
549
553
|
);
|
|
550
|
-
let
|
|
551
|
-
let
|
|
552
|
-
* (1.0 + roughness *
|
|
553
|
-
|
|
554
|
-
let
|
|
555
|
-
let
|
|
556
|
-
let
|
|
557
|
-
0.0571085289 +
|
|
558
|
-
0.491881867 +
|
|
559
|
-
-0.332181442 +
|
|
554
|
+
let iJ = 1.0 / (1.0 + hl * roughness);
|
|
555
|
+
let ot = color * INVPI * iJ
|
|
556
|
+
* (1.0 + roughness * hh);
|
|
557
|
+
|
|
558
|
+
let dr = 1.0 - pp;
|
|
559
|
+
let outputComplement = 1.0 - nt;
|
|
560
|
+
let ph = dr * (
|
|
561
|
+
0.0571085289 + dr * (
|
|
562
|
+
0.491881867 + dr * (
|
|
563
|
+
-0.332181442 + dr * 0.0714429953
|
|
560
564
|
)
|
|
561
565
|
)
|
|
562
566
|
);
|
|
563
|
-
let
|
|
564
|
-
0.0571085289 +
|
|
565
|
-
0.491881867 +
|
|
566
|
-
-0.332181442 +
|
|
567
|
+
let outputGOverPi = outputComplement * (
|
|
568
|
+
0.0571085289 + outputComplement * (
|
|
569
|
+
0.491881867 + outputComplement * (
|
|
570
|
+
-0.332181442 + outputComplement * 0.0714429953
|
|
567
571
|
)
|
|
568
572
|
)
|
|
569
573
|
);
|
|
570
|
-
let
|
|
571
|
-
/ (1.0 +
|
|
572
|
-
let
|
|
573
|
-
/ (1.0 +
|
|
574
|
-
let
|
|
575
|
-
let
|
|
576
|
-
/ max(vec3f(1e-7), vec3f(1.0) - color * (1.0 -
|
|
577
|
-
let
|
|
578
|
-
* max(1e-7, 1.0 -
|
|
579
|
-
* max(1e-7, 1.0 -
|
|
580
|
-
/ max(1e-7, 1.0 -
|
|
574
|
+
let qr = (1.0 + roughness * ph)
|
|
575
|
+
/ (1.0 + hl * roughness);
|
|
576
|
+
let outputAlbedo = (1.0 + roughness * outputGOverPi)
|
|
577
|
+
/ (1.0 + hl * roughness);
|
|
578
|
+
let gi = iJ * (1.0 + pc * roughness);
|
|
579
|
+
let hV = color * color * gi
|
|
580
|
+
/ max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - gi));
|
|
581
|
+
let mn = hV * INVPI
|
|
582
|
+
* max(1e-7, 1.0 - outputAlbedo)
|
|
583
|
+
* max(1e-7, 1.0 - qr)
|
|
584
|
+
/ max(1e-7, 1.0 - gi);
|
|
581
585
|
*pdf = lightLocal.z * INVPI;
|
|
582
|
-
return (
|
|
586
|
+
return (ot + mn) * fJ;
|
|
583
587
|
}
|
|
584
588
|
|
|
585
|
-
fn
|
|
589
|
+
fn aU(viewCosine: f32, roughness: f32) -> f32 {
|
|
586
590
|
let x = clamp(viewCosine, 0.0, 1.0);
|
|
587
591
|
let y = clamp(roughness, 0.01, 1.0);
|
|
588
592
|
let scale = y * (0.0206607 + 1.58491 * y)
|
|
@@ -596,17 +600,17 @@ let gaussian = exp(-0.5 * pow((x - mean) / scale, 2.0))
|
|
|
596
600
|
return max(gaussian + offset, 0.0);
|
|
597
601
|
}
|
|
598
602
|
|
|
599
|
-
fn
|
|
600
|
-
material:
|
|
603
|
+
fn kD(
|
|
604
|
+
material: OpenPbrResolvedMaterial,
|
|
601
605
|
viewLocal: vec3f,
|
|
602
606
|
lightLocal: vec3f,
|
|
603
607
|
pdf: ptr<function, f32>
|
|
604
608
|
) -> vec3f {
|
|
605
609
|
*pdf = 0.0;
|
|
606
|
-
if (viewLocal.z <= 0.0
|
|
610
|
+
if ((viewLocal.z <= 0.0) | (lightLocal.z <= 0.0)) {
|
|
607
611
|
return vec3f(0.0);
|
|
608
612
|
}
|
|
609
|
-
let albedo =
|
|
613
|
+
let albedo = aU(
|
|
610
614
|
viewLocal.z,
|
|
611
615
|
material.fuzzRoughness
|
|
612
616
|
);
|
|
@@ -614,12 +618,12 @@ material.fuzzRoughness
|
|
|
614
618
|
return material.fuzzColor * albedo * INVPI;
|
|
615
619
|
}
|
|
616
620
|
|
|
617
|
-
fn
|
|
618
|
-
material:
|
|
621
|
+
fn ao(
|
|
622
|
+
material: OpenPbrResolvedMaterial,
|
|
619
623
|
viewLocal: vec3f,
|
|
620
624
|
lightLocal: vec3f,
|
|
621
|
-
|
|
622
|
-
|
|
625
|
+
ad: vec3f,
|
|
626
|
+
bG: vec3f,
|
|
623
627
|
pdf: ptr<function, f32>
|
|
624
628
|
) -> vec3f {
|
|
625
629
|
*pdf = 0.0;
|
|
@@ -628,24 +632,24 @@ return vec3f(0.0);
|
|
|
628
632
|
}
|
|
629
633
|
|
|
630
634
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
631
|
-
let distribution =
|
|
632
|
-
let
|
|
633
|
-
let
|
|
634
|
-
*
|
|
635
|
+
let distribution = cW(ad, alpha);
|
|
636
|
+
let kz = aF(viewLocal, alpha);
|
|
637
|
+
let ep = kz
|
|
638
|
+
* aF(lightLocal, alpha);
|
|
635
639
|
|
|
636
|
-
*pdf =
|
|
637
|
-
return
|
|
640
|
+
*pdf = kz * distribution / (4.0 * max(viewLocal.z, 1e-8));
|
|
641
|
+
return bG * distribution * ep
|
|
638
642
|
/ (4.0 * max(lightLocal.z * viewLocal.z, 1e-8));
|
|
639
643
|
}
|
|
640
644
|
|
|
641
|
-
fn
|
|
642
|
-
material:
|
|
645
|
+
fn dE(
|
|
646
|
+
material: OpenPbrResolvedMaterial,
|
|
643
647
|
relativeIor: f32,
|
|
644
648
|
tint: vec3f,
|
|
645
649
|
viewLocal: vec3f,
|
|
646
650
|
lightLocal: vec3f,
|
|
647
|
-
|
|
648
|
-
|
|
651
|
+
ad: vec3f,
|
|
652
|
+
bG: vec3f,
|
|
649
653
|
pdf: ptr<function, f32>
|
|
650
654
|
) -> vec3f {
|
|
651
655
|
*pdf = 0.0;
|
|
@@ -653,179 +657,179 @@ if (lightLocal.z >= 0.0) {
|
|
|
653
657
|
return vec3f(0.0);
|
|
654
658
|
}
|
|
655
659
|
|
|
656
|
-
let
|
|
657
|
-
let
|
|
660
|
+
let ls = dot(lightLocal, ad);
|
|
661
|
+
let bm = dot(viewLocal, ad);
|
|
658
662
|
|
|
659
663
|
|
|
660
|
-
if (
|
|
664
|
+
if ((bm <= 0.0) | (ls >= 0.0)) {
|
|
661
665
|
return vec3f(0.0);
|
|
662
666
|
}
|
|
663
667
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
664
|
-
let distribution =
|
|
665
|
-
let
|
|
666
|
-
let
|
|
667
|
-
*
|
|
668
|
-
var
|
|
669
|
-
|
|
670
|
-
let
|
|
671
|
-
let
|
|
672
|
-
|
|
673
|
-
*pdf =
|
|
668
|
+
let distribution = cW(ad, alpha);
|
|
669
|
+
let kz = aF(viewLocal, alpha);
|
|
670
|
+
let ep = kz
|
|
671
|
+
* aF(lightLocal, alpha);
|
|
672
|
+
var aq = ls + bm * relativeIor;
|
|
673
|
+
aq *= aq;
|
|
674
|
+
let qw = abs(ls) / max(aq, 1e-8);
|
|
675
|
+
let jU = relativeIor * relativeIor;
|
|
676
|
+
|
|
677
|
+
*pdf = kz * max(0.0, bm) * distribution * qw
|
|
674
678
|
/ max(viewLocal.z, 1e-8);
|
|
675
|
-
return tint * (vec3f(1.0) -
|
|
676
|
-
* abs(
|
|
679
|
+
return tint * (vec3f(1.0) - bG) * distribution * ep
|
|
680
|
+
* abs(bm) * qw * jU
|
|
677
681
|
/ max(abs(lightLocal.z * viewLocal.z), 1e-8);
|
|
678
682
|
}
|
|
679
683
|
|
|
680
|
-
fn
|
|
681
|
-
if (HAS_MEDIUM
|
|
684
|
+
fn bh(material: OpenPbrResolvedMaterial) -> vec3f {
|
|
685
|
+
if (HAS_MEDIUM & (material.mediumType > 0)) {
|
|
682
686
|
return vec3f(1.0);
|
|
683
687
|
}
|
|
684
688
|
return material.transmissionColor;
|
|
685
689
|
}
|
|
686
690
|
|
|
687
|
-
fn
|
|
688
|
-
return 2.0 *
|
|
691
|
+
fn cZ(ai: f32) -> f32 {
|
|
692
|
+
return 2.0 * ai / (1.0 + ai);
|
|
689
693
|
}
|
|
690
694
|
|
|
691
|
-
fn
|
|
692
|
-
|
|
695
|
+
fn av(
|
|
696
|
+
ai: vec3f,
|
|
693
697
|
transmissionWeight: f32
|
|
694
698
|
) -> vec3f {
|
|
695
|
-
let
|
|
696
|
-
/ (vec3f(1.0) +
|
|
699
|
+
let gA = 2.0 * ai
|
|
700
|
+
/ (vec3f(1.0) + ai);
|
|
697
701
|
return mix(
|
|
698
|
-
|
|
699
|
-
|
|
702
|
+
ai,
|
|
703
|
+
gA,
|
|
700
704
|
clamp(transmissionWeight, 0.0, 1.0)
|
|
701
705
|
);
|
|
702
706
|
}
|
|
703
707
|
|
|
704
|
-
fn
|
|
705
|
-
material:
|
|
706
|
-
|
|
707
|
-
|
|
708
|
+
fn bN(
|
|
709
|
+
material: OpenPbrResolvedMaterial,
|
|
710
|
+
J: f32,
|
|
711
|
+
bE: f32
|
|
708
712
|
) -> vec3f {
|
|
709
|
-
let tint =
|
|
713
|
+
let tint = bh(material);
|
|
710
714
|
if (!material.thinWalled) {
|
|
711
715
|
return tint;
|
|
712
716
|
}
|
|
713
|
-
let
|
|
714
|
-
let
|
|
715
|
-
/ max(
|
|
716
|
-
if (
|
|
717
|
+
let jc = max(0.0, 1.0 - J * J);
|
|
718
|
+
let ea = jc
|
|
719
|
+
/ max(bE * bE, 1e-9);
|
|
720
|
+
if (ea >= 1.0) {
|
|
717
721
|
return vec3f(0.0);
|
|
718
722
|
}
|
|
719
|
-
let
|
|
720
|
-
return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(
|
|
723
|
+
let ae = sqrt(1.0 - ea);
|
|
724
|
+
return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(ae, 1e-5)));
|
|
721
725
|
}
|
|
722
726
|
|
|
723
|
-
fn
|
|
724
|
-
material:
|
|
727
|
+
fn dX(
|
|
728
|
+
material: OpenPbrResolvedMaterial,
|
|
725
729
|
viewLocal: vec3f,
|
|
726
730
|
lightLocal: vec3f,
|
|
727
731
|
pdf: ptr<function, f32>
|
|
728
732
|
) -> vec3f {
|
|
729
733
|
*pdf = 0.0;
|
|
730
|
-
if (viewLocal.z <= 0.0
|
|
734
|
+
if ((viewLocal.z <= 0.0) | (lightLocal.z >= 0.0)) {
|
|
731
735
|
return vec3f(0.0);
|
|
732
736
|
}
|
|
733
|
-
let
|
|
734
|
-
let
|
|
737
|
+
let ae = -lightLocal.z;
|
|
738
|
+
let oY = cC(
|
|
735
739
|
viewLocal.z,
|
|
736
740
|
material.relativeIor
|
|
737
741
|
);
|
|
738
|
-
*pdf =
|
|
739
|
-
return vec3f(1.0 -
|
|
742
|
+
*pdf = ae * INVPI;
|
|
743
|
+
return vec3f(1.0 - oY) * INVPI;
|
|
740
744
|
}
|
|
741
745
|
|
|
742
|
-
fn
|
|
746
|
+
fn eg(prepared: ptr<function, ag>) {
|
|
743
747
|
|
|
744
748
|
|
|
745
|
-
let
|
|
749
|
+
let sM = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
|
|
746
750
|
var total = (*prepared).probabilities[OPENPBR_LOBE_FUZZ];
|
|
747
|
-
for (var
|
|
748
|
-
total += (*prepared).probabilities[
|
|
751
|
+
for (var jT = 1; jT < sM; jT++) {
|
|
752
|
+
total += (*prepared).probabilities[jT];
|
|
749
753
|
}
|
|
750
754
|
if (total <= 1e-8) {
|
|
751
|
-
for (var
|
|
752
|
-
(*prepared).probabilities[
|
|
755
|
+
for (var jT = 0; jT < sM; jT++) {
|
|
756
|
+
(*prepared).probabilities[jT] = 0.0;
|
|
753
757
|
}
|
|
754
758
|
return;
|
|
755
759
|
}
|
|
756
|
-
let
|
|
757
|
-
for (var
|
|
758
|
-
(*prepared).probabilities[
|
|
760
|
+
let pk = 1.0 / total;
|
|
761
|
+
for (var jT = 0; jT < sM; jT++) {
|
|
762
|
+
(*prepared).probabilities[jT] *= pk;
|
|
759
763
|
}
|
|
760
764
|
}
|
|
761
765
|
|
|
762
766
|
|
|
763
767
|
|
|
764
|
-
fn
|
|
768
|
+
fn bR(eta: f32) -> f32 {
|
|
765
769
|
if (abs(eta - 1.0) < 1e-6) { return 0.0; }
|
|
766
770
|
if (eta > 1.0) { return (eta - 1.0) / (4.08567 + 1.00071 * eta); }
|
|
767
771
|
return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * eta;
|
|
768
772
|
}
|
|
769
773
|
|
|
770
|
-
fn
|
|
771
|
-
let
|
|
772
|
-
let
|
|
773
|
-
let b =
|
|
774
|
+
fn bU(f0: vec3f, tint: vec3f) -> vec3f {
|
|
775
|
+
let dD = 1.0 / 7.0;
|
|
776
|
+
let fX = mix(f0, vec3f(1.0), aI(dD));
|
|
777
|
+
let b = fX * (vec3f(1.0) - tint) / (dD * pow(1.0 - dD, 6.0));
|
|
774
778
|
return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
|
|
775
779
|
}
|
|
776
780
|
|
|
777
781
|
|
|
778
782
|
|
|
779
|
-
fn
|
|
780
|
-
if (
|
|
781
|
-
let
|
|
782
|
-
let
|
|
783
|
-
return mix(vec3f(1.0),
|
|
783
|
+
fn cN(material: OpenPbrResolvedMaterial, cosine: f32) -> vec3f {
|
|
784
|
+
if (cosine <= 0.0) { return vec3f(1.0); }
|
|
785
|
+
let mp = sqrt(max(0.0, 1.0 - (1.0 - cosine * cosine) / (material.coatIor * material.coatIor)));
|
|
786
|
+
let uT = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(mp, 1e-5)));
|
|
787
|
+
return mix(vec3f(1.0), uT, material.coatWeight);
|
|
784
788
|
}
|
|
785
789
|
|
|
786
|
-
fn
|
|
790
|
+
fn gF(material: OpenPbrResolvedMaterial, cosine: f32) -> f32 {
|
|
787
791
|
if (material.coatRoughness <= ROUGHNESS_MIN) {
|
|
788
|
-
return af(
|
|
792
|
+
return af(cosine, 1.0 / material.coatIor);
|
|
789
793
|
}
|
|
790
794
|
|
|
791
795
|
|
|
792
|
-
return clamp(1.0 -
|
|
793
|
-
material.coatRoughness * material.coatRoughness,
|
|
796
|
+
return clamp(1.0 - aw(material.coatIor,
|
|
797
|
+
material.coatRoughness * material.coatRoughness, cosine), 0.0, 1.0);
|
|
794
798
|
}
|
|
795
799
|
|
|
796
|
-
fn
|
|
800
|
+
fn hr(prepared: ag) -> vec3f {
|
|
797
801
|
let material = prepared.material;
|
|
798
802
|
let dielectric = 1.0 - material.baseMetalness;
|
|
799
803
|
let opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
|
|
800
804
|
let sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
|
|
801
|
-
let
|
|
802
|
-
let
|
|
803
|
-
let
|
|
804
|
-
let
|
|
805
|
-
let
|
|
806
|
-
let ks =
|
|
805
|
+
let vI = dielectric * material.transmissionWeight;
|
|
806
|
+
let gd = bR(prepared.specularEtaTOverEtaI);
|
|
807
|
+
let lE = bR(1.0 / prepared.transmissionReflectionIor);
|
|
808
|
+
let qI = clamp(opaque * gd + (sss + vI) * lE + material.baseMetalness, 0.0, 1.0);
|
|
809
|
+
let jM = mix(1.0, material.specularRoughness, qI);
|
|
810
|
+
let ks = bR(material.coatIor);
|
|
807
811
|
let kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
|
|
808
|
-
let k = mix(ks, kr,
|
|
809
|
-
let eb = material.baseMetalness * material.specularWeight *
|
|
810
|
-
+ opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0),
|
|
811
|
-
+ sss * material.subsurfaceColor + vec3f(
|
|
812
|
-
let
|
|
813
|
-
return mix(vec3f(1.0),
|
|
812
|
+
let k = mix(ks, kr, jM);
|
|
813
|
+
let eb = material.baseMetalness * material.specularWeight * bU(material.baseWeight * material.baseColor, material.specularColor)
|
|
814
|
+
+ opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), gd)
|
|
815
|
+
+ sss * material.subsurfaceColor + vec3f(vI);
|
|
816
|
+
let rZ = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
|
|
817
|
+
return mix(vec3f(1.0), rZ, material.coatWeight * material.coatDarkening);
|
|
814
818
|
}
|
|
815
819
|
|
|
816
|
-
fn
|
|
820
|
+
fn cF(prepared: ag, lU: f32) -> vec3f {
|
|
817
821
|
if (prepared.material.coatWeight <= 0.0) { return vec3f(1.0); }
|
|
818
822
|
if (prepared.material.inside) {
|
|
819
823
|
|
|
820
|
-
return
|
|
824
|
+
return cN(prepared.material, -lU);
|
|
821
825
|
}
|
|
822
826
|
|
|
823
|
-
return prepared.coatBaseScale *
|
|
827
|
+
return prepared.coatBaseScale * cN(prepared.material, lU);
|
|
824
828
|
}
|
|
825
829
|
|
|
826
830
|
|
|
827
831
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
828
|
-
fn
|
|
832
|
+
fn dM(fallback: bq, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> bq {
|
|
829
833
|
var t = tangent - fallback.normal * dot(fallback.normal, tangent);
|
|
830
834
|
if (dot(t, t) < 1e-8) { t = fallback.tangent; }
|
|
831
835
|
t = normalize(t);
|
|
@@ -840,15 +844,15 @@ return basis;
|
|
|
840
844
|
}
|
|
841
845
|
|
|
842
846
|
` : /* wgsl */ ``}
|
|
843
|
-
fn
|
|
847
|
+
fn ds(
|
|
844
848
|
tangent: vec3f,
|
|
845
|
-
material:
|
|
846
|
-
|
|
849
|
+
material: OpenPbrResolvedMaterial,
|
|
850
|
+
bM: vec3f,
|
|
847
851
|
normal: vec3f
|
|
848
852
|
) -> ag {
|
|
849
853
|
var prepared: ag;
|
|
850
854
|
prepared.material = material;
|
|
851
|
-
prepared.basis =
|
|
855
|
+
prepared.basis = fD(
|
|
852
856
|
tangent,
|
|
853
857
|
normal,
|
|
854
858
|
max(material.specularAnisotropy, material.coatAnisotropy)
|
|
@@ -860,39 +864,39 @@ ${hasCoatNormals ? /* wgsl */ `
|
|
|
860
864
|
|
|
861
865
|
|
|
862
866
|
if (material.coatNormalEnabled) {
|
|
863
|
-
prepared.coatBasis =
|
|
867
|
+
prepared.coatBasis = fD(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
|
|
864
868
|
prepared.directionFrames = true;
|
|
865
869
|
}
|
|
866
870
|
` : ''}
|
|
867
|
-
if (material.specularAnisotropy > 0.0
|
|
868
|
-
prepared.basis =
|
|
871
|
+
if ((material.specularAnisotropy > 0.0) & material.anisotropyDirectionEnabled) {
|
|
872
|
+
prepared.basis = dM(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
|
|
869
873
|
prepared.directionFrames = true;
|
|
870
874
|
}
|
|
871
|
-
if (material.coatAnisotropy > 0.0
|
|
872
|
-
prepared.coatBasis =
|
|
875
|
+
if ((material.coatAnisotropy > 0.0) & (material.coatAnisotropyRotation != 0.0)) {
|
|
876
|
+
prepared.coatBasis = dM(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
|
|
873
877
|
prepared.directionFrames = true;
|
|
874
878
|
}
|
|
875
879
|
` : /* wgsl */ ``}
|
|
876
|
-
prepared.viewLocal = openpbr_to_local(prepared.basis,
|
|
877
|
-
${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis,
|
|
880
|
+
prepared.viewLocal = openpbr_to_local(prepared.basis, bM);
|
|
881
|
+
${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bM);` : ''}
|
|
878
882
|
prepared.diffuseColor = material.baseColor;
|
|
879
883
|
|
|
880
|
-
let
|
|
881
|
-
let
|
|
884
|
+
let cK = 1.0 - material.baseMetalness;
|
|
885
|
+
let dW = cK
|
|
882
886
|
* (1.0 - material.transmissionWeight);
|
|
883
887
|
prepared.weights[OPENPBR_LOBE_FUZZ] = material.fuzzWeight;
|
|
884
888
|
prepared.weights[OPENPBR_LOBE_COAT] = material.coatWeight;
|
|
885
889
|
if (material.inside) { prepared.weights[OPENPBR_LOBE_COAT] = 0.0; }
|
|
886
890
|
prepared.weights[OPENPBR_LOBE_METAL] = material.baseMetalness;
|
|
887
|
-
prepared.weights[OPENPBR_LOBE_SPECULAR] =
|
|
888
|
-
prepared.weights[OPENPBR_LOBE_TRANSMISSION] =
|
|
891
|
+
prepared.weights[OPENPBR_LOBE_SPECULAR] = cK;
|
|
892
|
+
prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cK
|
|
889
893
|
* material.transmissionWeight;
|
|
890
|
-
prepared.weights[OPENPBR_LOBE_DIFFUSE] =
|
|
894
|
+
prepared.weights[OPENPBR_LOBE_DIFFUSE] = dW
|
|
891
895
|
* (1.0 - material.subsurfaceWeight) * material.baseWeight;
|
|
892
|
-
prepared.weights[OPENPBR_LOBE_SUBSURFACE] =
|
|
896
|
+
prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dW
|
|
893
897
|
* material.subsurfaceWeight;
|
|
894
898
|
|
|
895
|
-
prepared.specularEtaTOverEtaI =
|
|
899
|
+
prepared.specularEtaTOverEtaI = bi(
|
|
896
900
|
1.0 / material.relativeIor,
|
|
897
901
|
material.specularWeight
|
|
898
902
|
);
|
|
@@ -902,20 +906,20 @@ prepared.transmissionReflectionIor = prepared.material.relativeIor;
|
|
|
902
906
|
|
|
903
907
|
|
|
904
908
|
if (material.coatWeight > 0.0) {
|
|
905
|
-
var
|
|
906
|
-
if (!material.inside) {
|
|
907
|
-
let
|
|
908
|
-
material.specularIor /
|
|
909
|
-
var
|
|
910
|
-
if (
|
|
911
|
-
|
|
912
|
-
}
|
|
913
|
-
prepared.specularEtaTOverEtaI =
|
|
914
|
-
prepared.transmissionReflectionIor = 1.0 /
|
|
915
|
-
prepared.refractionEtaTOverEtaI =
|
|
909
|
+
var cm = 1.0;
|
|
910
|
+
if (!material.inside) { cm = mix(1.0, material.coatIor, material.coatWeight); }
|
|
911
|
+
let bB = cm * bi(
|
|
912
|
+
material.specularIor / cm, material.specularWeight);
|
|
913
|
+
var eF = bB / cm;
|
|
914
|
+
if ((cm > bB) & (bB >= 1.0)) {
|
|
915
|
+
eF = 1.0 / eF;
|
|
916
|
+
}
|
|
917
|
+
prepared.specularEtaTOverEtaI = eF;
|
|
918
|
+
prepared.transmissionReflectionIor = 1.0 / eF;
|
|
919
|
+
prepared.refractionEtaTOverEtaI = bB;
|
|
916
920
|
if (material.inside) {
|
|
917
|
-
prepared.refractionEtaTOverEtaI = 1.0 /
|
|
918
|
-
prepared.transmissionReflectionIor =
|
|
921
|
+
prepared.refractionEtaTOverEtaI = 1.0 / bB;
|
|
922
|
+
prepared.transmissionReflectionIor = bB;
|
|
919
923
|
}
|
|
920
924
|
prepared.material.relativeIor = 1.0 / prepared.refractionEtaTOverEtaI;
|
|
921
925
|
}
|
|
@@ -937,82 +941,82 @@ prepared.thinFilmBaseIor = prepared.refractionEtaTOverEtaI;
|
|
|
937
941
|
prepared.specularAlpha = material.specularRoughness
|
|
938
942
|
* material.specularRoughness;
|
|
939
943
|
let viewCosine = abs(prepared.viewLocal.z);
|
|
940
|
-
let
|
|
944
|
+
let ai = af(
|
|
941
945
|
viewCosine,
|
|
942
946
|
1.0 / prepared.specularEtaTOverEtaI
|
|
943
947
|
);
|
|
944
|
-
let
|
|
945
|
-
|
|
948
|
+
let fN = material.specularColor * select(
|
|
949
|
+
ai,
|
|
946
950
|
mix(
|
|
947
|
-
|
|
948
|
-
|
|
951
|
+
ai,
|
|
952
|
+
cZ(ai),
|
|
949
953
|
material.transmissionWeight
|
|
950
954
|
),
|
|
951
955
|
material.thinWalled
|
|
952
956
|
);
|
|
953
|
-
let
|
|
957
|
+
let iv = material.specularWeight * cw(
|
|
954
958
|
viewCosine,
|
|
955
959
|
material.baseWeight * material.baseColor,
|
|
956
960
|
material.specularColor
|
|
957
961
|
);
|
|
958
|
-
let
|
|
962
|
+
let eZ = select(
|
|
959
963
|
af(viewCosine, prepared.transmissionReflectionIor),
|
|
960
|
-
|
|
964
|
+
cZ(af(viewCosine, prepared.transmissionReflectionIor)),
|
|
961
965
|
material.thinWalled
|
|
962
966
|
);
|
|
963
|
-
let
|
|
967
|
+
let hb = bN(
|
|
964
968
|
material,
|
|
965
969
|
viewCosine,
|
|
966
970
|
prepared.refractionEtaTOverEtaI
|
|
967
971
|
);
|
|
968
|
-
let
|
|
972
|
+
let iM = aw(
|
|
969
973
|
prepared.specularEtaTOverEtaI,
|
|
970
974
|
prepared.specularAlpha,
|
|
971
975
|
viewCosine
|
|
972
976
|
);
|
|
973
|
-
let
|
|
977
|
+
let gH = cA(
|
|
974
978
|
prepared.specularEtaTOverEtaI,
|
|
975
979
|
prepared.specularAlpha
|
|
976
980
|
);
|
|
977
|
-
prepared.diffuseSpecularEnergyCompensation =
|
|
978
|
-
/ max(
|
|
981
|
+
prepared.diffuseSpecularEnergyCompensation = iM
|
|
982
|
+
/ max(gH, 1e-12);
|
|
979
983
|
|
|
980
984
|
prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
|
|
981
|
-
*
|
|
982
|
-
* max(
|
|
985
|
+
* aE(material.fuzzColor)
|
|
986
|
+
* max(aU(
|
|
983
987
|
viewCosine,
|
|
984
988
|
material.fuzzRoughness
|
|
985
989
|
), 0.02);
|
|
986
990
|
prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
|
|
987
991
|
prepared.coatBaseScale = vec3f(1.0);
|
|
988
|
-
if (material.coatWeight > 0.0
|
|
992
|
+
if ((material.coatWeight > 0.0) & !material.inside) {
|
|
989
993
|
${hasCoatNormals ? /* wgsl */ `let coatViewCosine = select(viewCosine, max(prepared.coatViewLocal.z, 0.0), material.coatNormalEnabled);` : ''}
|
|
990
|
-
let
|
|
991
|
-
prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] *
|
|
992
|
-
prepared.coatBaseScale =
|
|
993
|
-
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] *
|
|
994
|
+
let lf = gF(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
|
|
995
|
+
prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * lf;
|
|
996
|
+
prepared.coatBaseScale = cN(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
|
|
997
|
+
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * lf) * hr(prepared);
|
|
994
998
|
}
|
|
995
999
|
prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
|
|
996
|
-
*
|
|
1000
|
+
* aE(iv);
|
|
997
1001
|
prepared.metalMsScale = vec3f(0.0);
|
|
998
1002
|
prepared.metalMsFactor = 0.0;
|
|
999
1003
|
prepared.metalMsProbability = 0.0;
|
|
1000
1004
|
|
|
1001
1005
|
|
|
1002
|
-
if (material.specularRoughness >= 0.04
|
|
1003
|
-
let
|
|
1004
|
-
prepared.metalMsScale = material.specularWeight *
|
|
1005
|
-
let
|
|
1006
|
-
prepared.metalMsFactor =
|
|
1007
|
-
let
|
|
1008
|
-
prepared.probabilities[OPENPBR_LOBE_METAL] +=
|
|
1009
|
-
prepared.metalMsProbability =
|
|
1006
|
+
if ((material.specularRoughness >= 0.04) & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0)) {
|
|
1007
|
+
let ig = bU(material.baseWeight * material.baseColor, material.specularColor);
|
|
1008
|
+
prepared.metalMsScale = material.specularWeight * ig * ig;
|
|
1009
|
+
let qO = aV(prepared.specularAlpha, viewCosine);
|
|
1010
|
+
prepared.metalMsFactor = qO / max(cD(prepared.specularAlpha), 1e-12);
|
|
1011
|
+
let fC = prepared.weights[OPENPBR_LOBE_METAL] * aE(prepared.metalMsScale) * qO;
|
|
1012
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] += fC;
|
|
1013
|
+
prepared.metalMsProbability = fC / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1010
1014
|
}
|
|
1011
1015
|
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
|
|
1012
|
-
*
|
|
1016
|
+
* aE(fN);
|
|
1013
1017
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1014
|
-
* (1.0 -
|
|
1015
|
-
*
|
|
1018
|
+
* (1.0 - eZ)
|
|
1019
|
+
* aE(hb);
|
|
1016
1020
|
|
|
1017
1021
|
|
|
1018
1022
|
|
|
@@ -1024,62 +1028,62 @@ prepared.dielectricMsTransmissionScale = vec3f(0.0);
|
|
|
1024
1028
|
prepared.dielectricMsViewLoss = 0.0;
|
|
1025
1029
|
prepared.dielectricMsReflectionRatio = 0.0;
|
|
1026
1030
|
prepared.dielectricMsProbability = 0.0;
|
|
1027
|
-
if (!material.thinWalled
|
|
1028
|
-
prepared.specularAlpha >= 0.0016
|
|
1029
|
-
abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6) {
|
|
1030
|
-
let
|
|
1031
|
-
prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) *
|
|
1032
|
-
prepared.dielectricMsTransmissionScale =
|
|
1031
|
+
if (!material.thinWalled & (material.transmissionWeight > 0.0) &
|
|
1032
|
+
(prepared.specularAlpha >= 0.0016) & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) &
|
|
1033
|
+
(abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6)) {
|
|
1034
|
+
let mo = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
|
|
1035
|
+
prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * mo;
|
|
1036
|
+
prepared.dielectricMsTransmissionScale = hb * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1033
1037
|
+ vec3f(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
|
|
1034
|
-
prepared.dielectricMsReflectionRatio =
|
|
1035
|
-
prepared.dielectricMsViewLoss =
|
|
1036
|
-
let
|
|
1037
|
-
let
|
|
1038
|
-
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] +=
|
|
1039
|
-
prepared.dielectricMsProbability =
|
|
1038
|
+
prepared.dielectricMsReflectionRatio = ck(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
|
|
1039
|
+
prepared.dielectricMsViewLoss = bb(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
|
|
1040
|
+
let oR = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
|
|
1041
|
+
let fC = aE(oR) * prepared.dielectricMsViewLoss;
|
|
1042
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fC;
|
|
1043
|
+
prepared.dielectricMsProbability = fC / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1040
1044
|
}
|
|
1041
1045
|
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] = prepared.weights[OPENPBR_LOBE_DIFFUSE]
|
|
1042
|
-
*
|
|
1046
|
+
* aE(prepared.diffuseColor)
|
|
1043
1047
|
* prepared.diffuseSpecularEnergyCompensation;
|
|
1044
1048
|
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] = prepared.weights[OPENPBR_LOBE_SUBSURFACE]
|
|
1045
|
-
* (1.0 -
|
|
1046
|
-
*
|
|
1049
|
+
* (1.0 - eZ)
|
|
1050
|
+
* aE(material.subsurfaceColor)
|
|
1047
1051
|
* prepared.diffuseSpecularEnergyCompensation;
|
|
1048
1052
|
|
|
1049
1053
|
|
|
1050
|
-
if (material.coatWeight > 0.0
|
|
1051
|
-
let
|
|
1052
|
-
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] *
|
|
1053
|
-
prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight *
|
|
1054
|
+
if ((material.coatWeight > 0.0) & HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
|
|
1055
|
+
let lS = 0.02 * bS(material.thinFilmThickness, material.thinFilmWeight);
|
|
1056
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lS);
|
|
1057
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lS);
|
|
1054
1058
|
}
|
|
1055
|
-
if (material.coatWeight > 0.0
|
|
1056
|
-
let
|
|
1057
|
-
prepared.probabilities[OPENPBR_LOBE_METAL] *=
|
|
1058
|
-
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *=
|
|
1059
|
-
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *=
|
|
1060
|
-
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *=
|
|
1061
|
-
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *=
|
|
1059
|
+
if ((material.coatWeight > 0.0) & !material.inside) {
|
|
1060
|
+
let gI = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
|
|
1061
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] *= gI;
|
|
1062
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gI;
|
|
1063
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gI;
|
|
1064
|
+
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gI;
|
|
1065
|
+
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gI;
|
|
1062
1066
|
}
|
|
1063
|
-
|
|
1067
|
+
eg(&prepared);
|
|
1064
1068
|
return prepared;
|
|
1065
1069
|
}
|
|
1066
1070
|
|
|
1067
1071
|
|
|
1068
|
-
fn
|
|
1072
|
+
fn cY(prepared: ag, cosine: f32, reflection: bool) -> f32 {
|
|
1069
1073
|
if (prepared.material.coatWeight <= 0.0) {
|
|
1070
|
-
return af(
|
|
1074
|
+
return af(cosine, prepared.material.relativeIor);
|
|
1071
1075
|
}
|
|
1072
|
-
let
|
|
1073
|
-
if (!reflection) { return
|
|
1074
|
-
let
|
|
1075
|
-
let
|
|
1076
|
-
return mix(
|
|
1076
|
+
let kU = af(cosine, prepared.transmissionReflectionIor);
|
|
1077
|
+
if (!reflection) { return kU; }
|
|
1078
|
+
let oj = af(cosine, 1.0 / prepared.specularEtaTOverEtaI);
|
|
1079
|
+
let sQ = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
|
|
1080
|
+
return mix(oj, kU, sQ);
|
|
1077
1081
|
}
|
|
1078
1082
|
|
|
1079
|
-
fn
|
|
1083
|
+
fn nA(
|
|
1080
1084
|
prepared: ag,
|
|
1081
1085
|
lightDirection: vec3f,
|
|
1082
|
-
|
|
1086
|
+
hc: i32,
|
|
1083
1087
|
pdf: ptr<function, f32>
|
|
1084
1088
|
) -> vec3f {
|
|
1085
1089
|
let material = prepared.material;
|
|
@@ -1090,78 +1094,76 @@ ${hasCoatNormals ? /* wgsl */ `
|
|
|
1090
1094
|
let independentCoat = material.coatNormalEnabled;
|
|
1091
1095
|
let geometricReflection = dot(material.geometricNormal, lightDirection) > 0.0;
|
|
1092
1096
|
let coatLightCosine = dot(prepared.coatBasis.normal, lightDirection);
|
|
1093
|
-
let coatReflection = geometricReflection
|
|
1097
|
+
let coatReflection = geometricReflection & (prepared.coatViewLocal.z > 0.0) & (coatLightCosine > 0.0);
|
|
1094
1098
|
` : ''}
|
|
1095
1099
|
|
|
1096
|
-
var
|
|
1100
|
+
var ad: vec3f;
|
|
1097
1101
|
if (reflection) {
|
|
1098
|
-
|
|
1102
|
+
ad = normalize(lightLocal + viewLocal);
|
|
1099
1103
|
}
|
|
1100
1104
|
else {
|
|
1101
|
-
|
|
1105
|
+
ad = normalize(lightLocal + viewLocal * material.relativeIor);
|
|
1102
1106
|
}
|
|
1103
|
-
if (
|
|
1104
|
-
|
|
1107
|
+
if (ad.z < 0.0) {
|
|
1108
|
+
ad = -ad;
|
|
1105
1109
|
}
|
|
1106
1110
|
|
|
1107
1111
|
var response = vec3f(0.0);
|
|
1108
1112
|
*pdf = 0.0;
|
|
1109
|
-
var
|
|
1110
|
-
let
|
|
1111
|
-
let
|
|
1112
|
-
let
|
|
1113
|
-
let
|
|
1114
|
-
let
|
|
1115
|
-
let
|
|
1116
|
-
|
|
1117
|
-
let
|
|
1118
|
-
let
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
if (
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
}
|
|
1142
|
-
if (HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
|
|
1113
|
+
var aM = 0.0;
|
|
1114
|
+
let mO = hc < 0;
|
|
1115
|
+
let ws = mO | (hc == OPENPBR_LOBE_FUZZ);
|
|
1116
|
+
let uA = mO | (hc == OPENPBR_LOBE_COAT);
|
|
1117
|
+
let tn = mO | (hc == OPENPBR_LOBE_METAL);
|
|
1118
|
+
let rf = mO | (hc == OPENPBR_LOBE_SPECULAR);
|
|
1119
|
+
let kd = mO | (hc == OPENPBR_LOBE_TRANSMISSION);
|
|
1120
|
+
let uF = mO | (hc == OPENPBR_LOBE_DIFFUSE);
|
|
1121
|
+
let pP = mO | (hc == OPENPBR_LOBE_SUBSURFACE);
|
|
1122
|
+
let bm = abs(dot(viewLocal, ad));
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
var du = ad;
|
|
1127
|
+
var jK = bm;
|
|
1128
|
+
if (!reflection & material.thinWalled) {
|
|
1129
|
+
du = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
|
|
1130
|
+
if (du.z < 0.0) { du = -du; }
|
|
1131
|
+
jK = abs(dot(viewLocal, du));
|
|
1132
|
+
}
|
|
1133
|
+
let ne =
|
|
1134
|
+
(reflection & (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & rf) |
|
|
1135
|
+
(!reflection & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & kd);
|
|
1136
|
+
let rk = reflection & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn;
|
|
1137
|
+
var oA: array<vec3f, 2>;
|
|
1138
|
+
if (ne) {
|
|
1139
|
+
oA[0] = vec3f(cY(prepared, jK, reflection));
|
|
1140
|
+
}
|
|
1141
|
+
if (rk) {
|
|
1142
|
+
oA[1] = cw(bm, material.baseWeight * material.baseColor, material.specularColor);
|
|
1143
|
+
}
|
|
1144
|
+
if (HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
|
|
1143
1145
|
let wavelengths = vec3f(620.0, 540.0, 450.0);
|
|
1144
1146
|
|
|
1145
|
-
for (var
|
|
1146
|
-
if (!select(
|
|
1147
|
-
var
|
|
1148
|
-
let
|
|
1147
|
+
for (var lD = 0u; lD < (rtUniform.loopUnrollGuard >> 1u); lD++) {
|
|
1148
|
+
if (!select(ne, rk, lD == 1u)) { continue; }
|
|
1149
|
+
var yi = vec3f(0.0);
|
|
1150
|
+
let J = select(jK, bm, lD == 1u);
|
|
1149
1151
|
for (var channel = 0u; channel + 1u < rtUniform.loopUnrollGuard; channel++) {
|
|
1150
1152
|
var ior = vec2f(prepared.thinFilmBaseIor, 0.0);
|
|
1151
|
-
if (
|
|
1152
|
-
ior =
|
|
1153
|
+
if (lD == 1u) {
|
|
1154
|
+
ior = cX(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
|
|
1153
1155
|
}
|
|
1154
|
-
|
|
1156
|
+
yi[channel] = au(J,
|
|
1155
1157
|
wavelengths[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
|
|
1156
1158
|
}
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
+
oA[lD] = mix(oA[lD], yi,
|
|
1160
|
+
bS(material.thinFilmThickness, material.thinFilmWeight));
|
|
1159
1161
|
}
|
|
1160
1162
|
}
|
|
1161
|
-
let
|
|
1163
|
+
let ey = oA[0];
|
|
1162
1164
|
let diffuseSpecularEnergyCompensation =
|
|
1163
1165
|
prepared.diffuseSpecularEnergyCompensation
|
|
1164
|
-
*
|
|
1166
|
+
* aw(
|
|
1165
1167
|
prepared.specularEtaTOverEtaI,
|
|
1166
1168
|
prepared.specularAlpha,
|
|
1167
1169
|
abs(lightLocal.z)
|
|
@@ -1169,160 +1171,159 @@ abs(lightLocal.z)
|
|
|
1169
1171
|
|
|
1170
1172
|
${hasCoatNormals ? /* wgsl */ `
|
|
1171
1173
|
|
|
1172
|
-
if (!independentCoat
|
|
1174
|
+
if (!independentCoat | ((lightLocal.z != 0.0) & (reflection == geometricReflection))) {
|
|
1173
1175
|
` : ''}
|
|
1174
1176
|
if (reflection) {
|
|
1175
|
-
if (prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0
|
|
1176
|
-
response += prepared.weights[OPENPBR_LOBE_DIFFUSE] *
|
|
1177
|
+
if ((prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0) & uF) {
|
|
1178
|
+
response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * bJ(
|
|
1177
1179
|
material,
|
|
1178
1180
|
prepared.diffuseColor,
|
|
1179
1181
|
viewLocal,
|
|
1180
1182
|
lightLocal,
|
|
1181
1183
|
diffuseSpecularEnergyCompensation,
|
|
1182
|
-
&
|
|
1184
|
+
&aM
|
|
1183
1185
|
);
|
|
1184
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *
|
|
1186
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * aM;
|
|
1185
1187
|
}
|
|
1186
1188
|
|
|
1187
|
-
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0
|
|
1188
|
-
|
|
1189
|
-
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * cE(
|
|
1189
|
+
if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & material.thinWalled & pP) {
|
|
1190
|
+
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * bJ(
|
|
1190
1191
|
material,
|
|
1191
1192
|
material.subsurfaceColor,
|
|
1192
1193
|
viewLocal,
|
|
1193
1194
|
lightLocal,
|
|
1194
1195
|
diffuseSpecularEnergyCompensation,
|
|
1195
|
-
&
|
|
1196
|
+
&aM
|
|
1196
1197
|
);
|
|
1197
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 *
|
|
1198
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * aM;
|
|
1198
1199
|
}
|
|
1199
1200
|
|
|
1200
|
-
if (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0
|
|
1201
|
-
var
|
|
1201
|
+
if ((prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & rf) {
|
|
1202
|
+
var cB = ey;
|
|
1202
1203
|
if (material.thinWalled) {
|
|
1203
|
-
|
|
1204
|
-
|
|
1204
|
+
cB = av(
|
|
1205
|
+
cB,
|
|
1205
1206
|
material.transmissionWeight
|
|
1206
1207
|
);
|
|
1207
1208
|
}
|
|
1208
|
-
let
|
|
1209
|
-
response += prepared.weights[OPENPBR_LOBE_SPECULAR] *
|
|
1209
|
+
let bG = material.specularColor * cB;
|
|
1210
|
+
response += prepared.weights[OPENPBR_LOBE_SPECULAR] * ao(
|
|
1210
1211
|
material,
|
|
1211
1212
|
viewLocal,
|
|
1212
1213
|
lightLocal,
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
&
|
|
1214
|
+
ad,
|
|
1215
|
+
bG,
|
|
1216
|
+
&aM
|
|
1216
1217
|
);
|
|
1217
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] *
|
|
1218
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * aM;
|
|
1218
1219
|
}
|
|
1219
1220
|
|
|
1220
|
-
if (prepared.weights[OPENPBR_LOBE_METAL] > 0.0
|
|
1221
|
-
let
|
|
1222
|
-
response += prepared.weights[OPENPBR_LOBE_METAL] *
|
|
1221
|
+
if ((prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn) {
|
|
1222
|
+
let bG = material.specularWeight * oA[1];
|
|
1223
|
+
response += prepared.weights[OPENPBR_LOBE_METAL] * ao(
|
|
1223
1224
|
material,
|
|
1224
1225
|
viewLocal,
|
|
1225
1226
|
lightLocal,
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
&
|
|
1227
|
+
ad,
|
|
1228
|
+
bG,
|
|
1229
|
+
&aM
|
|
1229
1230
|
);
|
|
1230
1231
|
if (prepared.metalMsFactor > 0.0) {
|
|
1231
|
-
let
|
|
1232
|
-
response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale *
|
|
1233
|
-
|
|
1232
|
+
let cL = min(prepared.metalMsFactor * aV(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
|
|
1233
|
+
response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * cL * INVPI;
|
|
1234
|
+
aM = mix(aM, 0.5 * INVPI, prepared.metalMsProbability);
|
|
1234
1235
|
}
|
|
1235
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_METAL] *
|
|
1236
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * aM;
|
|
1236
1237
|
}
|
|
1237
1238
|
}
|
|
1238
1239
|
else {
|
|
1239
|
-
let
|
|
1240
|
-
if (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0
|
|
1240
|
+
let bG = ey;
|
|
1241
|
+
if ((prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & kd) {
|
|
1241
1242
|
if (material.thinWalled) {
|
|
1242
|
-
let
|
|
1243
|
-
let
|
|
1244
|
-
|
|
1243
|
+
let lI = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1244
|
+
let gA = av(
|
|
1245
|
+
ey,
|
|
1245
1246
|
1.0
|
|
1246
1247
|
);
|
|
1247
|
-
let tint =
|
|
1248
|
+
let tint = bN(
|
|
1248
1249
|
material,
|
|
1249
1250
|
abs(viewLocal.z),
|
|
1250
1251
|
prepared.refractionEtaTOverEtaI
|
|
1251
1252
|
);
|
|
1252
1253
|
response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1253
|
-
*
|
|
1254
|
+
* ao(
|
|
1254
1255
|
material,
|
|
1255
1256
|
viewLocal,
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
tint * (vec3f(1.0) -
|
|
1259
|
-
&
|
|
1257
|
+
lI,
|
|
1258
|
+
du,
|
|
1259
|
+
tint * (vec3f(1.0) - gA),
|
|
1260
|
+
&aM
|
|
1260
1261
|
);
|
|
1261
1262
|
}
|
|
1262
1263
|
else {
|
|
1263
1264
|
response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1264
|
-
*
|
|
1265
|
+
* dE(
|
|
1265
1266
|
material,
|
|
1266
1267
|
material.relativeIor,
|
|
1267
|
-
|
|
1268
|
+
bh(material),
|
|
1268
1269
|
viewLocal,
|
|
1269
1270
|
lightLocal,
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
&
|
|
1271
|
+
ad,
|
|
1272
|
+
bG,
|
|
1273
|
+
&aM
|
|
1273
1274
|
);
|
|
1274
1275
|
}
|
|
1275
1276
|
if (prepared.dielectricMsProbability > 0.0) {
|
|
1276
|
-
|
|
1277
|
+
aM *= 1.0 - prepared.dielectricMsProbability;
|
|
1277
1278
|
}
|
|
1278
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *
|
|
1279
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aM;
|
|
1279
1280
|
}
|
|
1280
|
-
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0
|
|
1281
|
+
if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & pP) {
|
|
1281
1282
|
if (material.thinWalled) {
|
|
1282
|
-
let
|
|
1283
|
+
let pb = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1283
1284
|
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
|
|
1284
|
-
*
|
|
1285
|
+
* bJ(
|
|
1285
1286
|
material,
|
|
1286
1287
|
material.subsurfaceColor,
|
|
1287
1288
|
viewLocal,
|
|
1288
|
-
|
|
1289
|
+
pb,
|
|
1289
1290
|
diffuseSpecularEnergyCompensation,
|
|
1290
|
-
&
|
|
1291
|
+
&aM
|
|
1291
1292
|
);
|
|
1292
|
-
|
|
1293
|
+
aM *= 0.5;
|
|
1293
1294
|
}
|
|
1294
1295
|
else {
|
|
1295
|
-
response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] *
|
|
1296
|
+
response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dX(
|
|
1296
1297
|
material,
|
|
1297
1298
|
viewLocal,
|
|
1298
1299
|
lightLocal,
|
|
1299
|
-
&
|
|
1300
|
+
&aM
|
|
1300
1301
|
);
|
|
1301
1302
|
}
|
|
1302
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *
|
|
1303
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * aM;
|
|
1303
1304
|
}
|
|
1304
1305
|
}
|
|
1305
1306
|
|
|
1306
1307
|
|
|
1307
1308
|
|
|
1308
1309
|
|
|
1309
|
-
if (prepared.dielectricMsProbability > 0.0
|
|
1310
|
-
let
|
|
1311
|
-
if (
|
|
1310
|
+
if ((prepared.dielectricMsProbability > 0.0) & kd) {
|
|
1311
|
+
let cosine = abs(lightLocal.z);
|
|
1312
|
+
if (cosine > 0.0) {
|
|
1312
1313
|
let ior = select(1.0 / prepared.refractionEtaTOverEtaI, prepared.refractionEtaTOverEtaI, reflection);
|
|
1313
|
-
let
|
|
1314
|
-
let
|
|
1315
|
-
/ max(
|
|
1316
|
-
let
|
|
1314
|
+
let ju = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
|
|
1315
|
+
let oZ = prepared.dielectricMsViewLoss * bb(ior, prepared.specularAlpha, cosine)
|
|
1316
|
+
/ max(bf(ior, prepared.specularAlpha), 1e-12);
|
|
1317
|
+
let cL = min(oZ * ju, 1.0 / cosine);
|
|
1317
1318
|
let scale = select(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, reflection);
|
|
1318
|
-
response += scale *
|
|
1319
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability *
|
|
1319
|
+
response += scale * cL * INVPI;
|
|
1320
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * ju * 0.5 * INVPI;
|
|
1320
1321
|
}
|
|
1321
1322
|
}
|
|
1322
1323
|
|
|
1323
1324
|
${hasCoatNormals ? /* wgsl */ ` } ` : ''}
|
|
1324
1325
|
if (material.coatWeight > 0.0) {
|
|
1325
|
-
response *=
|
|
1326
|
+
response *= cF(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
|
|
1326
1327
|
}
|
|
1327
1328
|
${hasCoatNormals ? /* wgsl */ `
|
|
1328
1329
|
|
|
@@ -1330,273 +1331,270 @@ if (independentCoat) { response *= abs(lightLocal.z); }
|
|
|
1330
1331
|
` : ''}
|
|
1331
1332
|
|
|
1332
1333
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1333
|
-
if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'}
|
|
1334
|
-
var
|
|
1335
|
-
var
|
|
1336
|
-
var
|
|
1337
|
-
var
|
|
1334
|
+
if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
|
|
1335
|
+
var dT = viewLocal;
|
|
1336
|
+
var lh = lightLocal;
|
|
1337
|
+
var gL = ad;
|
|
1338
|
+
var kk = bm;
|
|
1338
1339
|
if (prepared.directionFrames) {
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
if (
|
|
1343
|
-
|
|
1340
|
+
dT = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
|
|
1341
|
+
lh = openpbr_to_local(prepared.coatBasis, lightDirection);
|
|
1342
|
+
gL = normalize(lh + dT);
|
|
1343
|
+
if (gL.z < 0.0) { gL = -gL; }
|
|
1344
|
+
kk = abs(dot(dT, gL));
|
|
1344
1345
|
}
|
|
1345
1346
|
|
|
1346
|
-
let
|
|
1347
|
-
|
|
1347
|
+
let lQ = vec3f(af(
|
|
1348
|
+
kk,
|
|
1348
1349
|
1.0 / material.coatIor
|
|
1349
1350
|
));
|
|
1350
|
-
var
|
|
1351
|
-
let
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
if (
|
|
1355
|
-
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} *
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
&
|
|
1351
|
+
var dS = material;
|
|
1352
|
+
let jX = aN(material.coatRoughness, material.coatAnisotropy);
|
|
1353
|
+
dS.alphaX = jX.x;
|
|
1354
|
+
dS.alphaY = jX.y;
|
|
1355
|
+
if (uA) {
|
|
1356
|
+
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * ao(
|
|
1357
|
+
dS,
|
|
1358
|
+
dT,
|
|
1359
|
+
lh,
|
|
1360
|
+
gL,
|
|
1361
|
+
lQ,
|
|
1362
|
+
&aM
|
|
1362
1363
|
);
|
|
1363
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] *
|
|
1364
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aM;
|
|
1364
1365
|
}
|
|
1365
1366
|
}
|
|
1366
1367
|
` : /* wgsl */ `
|
|
1367
|
-
if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'}
|
|
1368
|
-
let
|
|
1369
|
-
|
|
1368
|
+
if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
|
|
1369
|
+
let lQ = vec3f(af(
|
|
1370
|
+
bm,
|
|
1370
1371
|
1.0 / material.coatIor
|
|
1371
1372
|
));
|
|
1372
|
-
var
|
|
1373
|
-
let
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
if (
|
|
1377
|
-
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} *
|
|
1378
|
-
|
|
1373
|
+
var dS = material;
|
|
1374
|
+
let jX = aN(material.coatRoughness, material.coatAnisotropy);
|
|
1375
|
+
dS.alphaX = jX.x;
|
|
1376
|
+
dS.alphaY = jX.y;
|
|
1377
|
+
if (uA) {
|
|
1378
|
+
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * ao(
|
|
1379
|
+
dS,
|
|
1379
1380
|
viewLocal,
|
|
1380
1381
|
lightLocal,
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
&
|
|
1382
|
+
ad,
|
|
1383
|
+
lQ,
|
|
1384
|
+
&aM
|
|
1384
1385
|
);
|
|
1385
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] *
|
|
1386
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aM;
|
|
1386
1387
|
}
|
|
1387
1388
|
}
|
|
1388
1389
|
`}
|
|
1389
1390
|
|
|
1390
|
-
if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'}
|
|
1391
|
-
let
|
|
1391
|
+
if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_FUZZ] > 0.0)) {
|
|
1392
|
+
let rC = aU(
|
|
1392
1393
|
abs(viewLocal.z),
|
|
1393
1394
|
material.fuzzRoughness
|
|
1394
1395
|
);
|
|
1395
1396
|
response *= max(
|
|
1396
1397
|
vec3f(0.0),
|
|
1397
|
-
vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] *
|
|
1398
|
+
vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * rC)
|
|
1398
1399
|
);
|
|
1399
|
-
if (
|
|
1400
|
-
response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} *
|
|
1400
|
+
if (ws) {
|
|
1401
|
+
response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * kD(
|
|
1401
1402
|
material,
|
|
1402
1403
|
viewLocal,
|
|
1403
1404
|
lightLocal,
|
|
1404
|
-
&
|
|
1405
|
+
&aM
|
|
1405
1406
|
);
|
|
1406
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] *
|
|
1407
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * aM;
|
|
1407
1408
|
}
|
|
1408
1409
|
}
|
|
1409
1410
|
|
|
1410
1411
|
return response * ${hasCoatNormals ? 'select(abs(lightLocal.z), 1.0, independentCoat)' : 'abs(lightLocal.z)'};
|
|
1411
1412
|
}
|
|
1412
1413
|
|
|
1413
|
-
fn
|
|
1414
|
+
fn bO(
|
|
1414
1415
|
prepared: ag,
|
|
1415
1416
|
lightDirection: vec3f,
|
|
1416
1417
|
pdf: ptr<function, f32>
|
|
1417
1418
|
) -> vec3f {
|
|
1418
|
-
return
|
|
1419
|
+
return nA(prepared, lightDirection, -1, pdf);
|
|
1419
1420
|
}
|
|
1420
1421
|
|
|
1421
1422
|
|
|
1422
1423
|
|
|
1423
1424
|
|
|
1424
1425
|
|
|
1425
|
-
fn
|
|
1426
|
+
fn sp(
|
|
1426
1427
|
tangent: vec3f,
|
|
1427
|
-
material:
|
|
1428
|
-
|
|
1428
|
+
material: OpenPbrResolvedMaterial,
|
|
1429
|
+
bM: vec3f,
|
|
1429
1430
|
normal: vec3f,
|
|
1430
1431
|
lightDirection: vec3f,
|
|
1431
1432
|
pdf: ptr<function, f32>
|
|
1432
1433
|
) -> vec3f {
|
|
1433
|
-
let prepared =
|
|
1434
|
+
let prepared = ds(
|
|
1434
1435
|
tangent,
|
|
1435
1436
|
material,
|
|
1436
|
-
|
|
1437
|
+
bM,
|
|
1437
1438
|
normal
|
|
1438
1439
|
);
|
|
1439
|
-
return
|
|
1440
|
+
return bO(prepared, lightDirection, pdf);
|
|
1440
1441
|
}
|
|
1441
1442
|
|
|
1442
1443
|
|
|
1443
1444
|
|
|
1444
1445
|
|
|
1445
1446
|
|
|
1446
|
-
fn
|
|
1447
|
-
prepared: ag,
|
|
1447
|
+
fn jq(
|
|
1448
|
+
prepared: ag, cq: vec3f,
|
|
1448
1449
|
lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
|
|
1449
|
-
|
|
1450
|
-
|
|
1450
|
+
aS: ptr<function, f32>, bu: ptr<function, bool>,
|
|
1451
|
+
cO: ptr<function, bool>, bn: ptr<function, u32>
|
|
1451
1452
|
) -> bool {
|
|
1452
1453
|
let material = prepared.material;
|
|
1453
1454
|
let viewLocal = prepared.viewLocal;
|
|
1454
|
-
var
|
|
1455
|
-
let
|
|
1456
|
-
let
|
|
1455
|
+
var cH = cq.x;
|
|
1456
|
+
let fL = cq.y;
|
|
1457
|
+
let bv = cq.z;
|
|
1457
1458
|
*isTransmissionEvent = false;
|
|
1458
|
-
*
|
|
1459
|
-
*
|
|
1460
|
-
*
|
|
1461
|
-
*
|
|
1459
|
+
*aS = 1.0;
|
|
1460
|
+
*bu = false;
|
|
1461
|
+
*cO = false;
|
|
1462
|
+
*bn = u32(OPENPBR_LOBE_DIFFUSE);
|
|
1462
1463
|
*lightDirection = prepared.basis.normal;
|
|
1463
1464
|
|
|
1464
1465
|
var cdf: array<f32, OPENPBR_LOBE_COUNT>;
|
|
1465
1466
|
cdf[OPENPBR_LOBE_FUZZ] = prepared.probabilities[OPENPBR_LOBE_FUZZ];
|
|
1466
|
-
|
|
1467
|
-
for (var hU = 1; hU < nI; hU++) {
|
|
1468
|
-
cdf[hU] = cdf[hU - 1] + prepared.probabilities[hU];
|
|
1469
|
-
}
|
|
1467
|
+
${LOBE_INDICES.slice(1).map(i => /* wgsl */ `cdf[${i}] = cdf[${i - 1}] + prepared.probabilities[${i}];`).join('\n ')}
|
|
1470
1468
|
if (cdf[OPENPBR_LOBE_SUBSURFACE] <= 0.0) {
|
|
1471
1469
|
return false;
|
|
1472
1470
|
}
|
|
1473
1471
|
|
|
1474
1472
|
var lightLocal: vec3f;
|
|
1475
|
-
if (
|
|
1476
|
-
|
|
1473
|
+
if ((bv < cdf[OPENPBR_LOBE_FUZZ]) | (
|
|
1474
|
+
(bv >= cdf[OPENPBR_LOBE_TRANSMISSION]) & (bv < cdf[OPENPBR_LOBE_DIFFUSE])
|
|
1477
1475
|
)) {
|
|
1478
|
-
let
|
|
1479
|
-
*
|
|
1476
|
+
let qG = bv < cdf[OPENPBR_LOBE_FUZZ];
|
|
1477
|
+
*aS = select(
|
|
1480
1478
|
1.0,
|
|
1481
1479
|
material.fuzzRoughness,
|
|
1482
|
-
|
|
1480
|
+
qG
|
|
1483
1481
|
);
|
|
1484
|
-
*
|
|
1485
|
-
*
|
|
1482
|
+
*cO = !qG;
|
|
1483
|
+
*bn = select(
|
|
1486
1484
|
u32(OPENPBR_LOBE_DIFFUSE),
|
|
1487
1485
|
u32(OPENPBR_LOBE_FUZZ),
|
|
1488
|
-
|
|
1486
|
+
qG
|
|
1489
1487
|
);
|
|
1490
|
-
lightLocal =
|
|
1488
|
+
lightLocal = aO(vec2f(cH, fL));
|
|
1491
1489
|
}
|
|
1492
1490
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1493
|
-
else if (
|
|
1494
|
-
*
|
|
1495
|
-
*
|
|
1496
|
-
*
|
|
1497
|
-
var
|
|
1498
|
-
if (prepared.directionFrames) {
|
|
1499
|
-
var
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
vec2f(
|
|
1491
|
+
else if (bv < cdf[OPENPBR_LOBE_COAT]) {
|
|
1492
|
+
*aS = material.coatRoughness;
|
|
1493
|
+
*bu = true;
|
|
1494
|
+
*bn = u32(OPENPBR_LOBE_COAT);
|
|
1495
|
+
var dT = viewLocal;
|
|
1496
|
+
if (prepared.directionFrames) { dT = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
|
|
1497
|
+
var ad = aD(
|
|
1498
|
+
dT,
|
|
1499
|
+
|
|
1500
|
+
aN(material.coatRoughness, material.coatAnisotropy),
|
|
1501
|
+
vec2f(cH, fL)
|
|
1504
1502
|
);
|
|
1505
|
-
if (
|
|
1506
|
-
|
|
1503
|
+
if (ad.z < 0.0) {
|
|
1504
|
+
ad = -ad;
|
|
1507
1505
|
}
|
|
1508
|
-
lightLocal = normalize(reflect(-
|
|
1506
|
+
lightLocal = normalize(reflect(-dT, ad));
|
|
1509
1507
|
${hasCoatNormals ? /* wgsl */ `
|
|
1510
1508
|
if (material.coatNormalEnabled) {
|
|
1511
1509
|
|
|
1512
1510
|
*lightDirection = openpbr_to_world(prepared.coatBasis, lightLocal);
|
|
1513
|
-
return lightLocal.z > 0.0
|
|
1511
|
+
return (lightLocal.z > 0.0) & (dot(material.geometricNormal, *lightDirection) > 0.0);
|
|
1514
1512
|
}
|
|
1515
1513
|
` : ''}
|
|
1516
1514
|
if (prepared.directionFrames) { lightLocal = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.coatBasis, lightLocal)); }
|
|
1517
1515
|
}
|
|
1518
1516
|
` : /* wgsl */ `
|
|
1519
|
-
else if (
|
|
1520
|
-
*
|
|
1521
|
-
*
|
|
1522
|
-
*
|
|
1523
|
-
var
|
|
1517
|
+
else if (bv < cdf[OPENPBR_LOBE_COAT]) {
|
|
1518
|
+
*aS = material.coatRoughness;
|
|
1519
|
+
*bu = true;
|
|
1520
|
+
*bn = u32(OPENPBR_LOBE_COAT);
|
|
1521
|
+
var ad = aD(
|
|
1524
1522
|
viewLocal,
|
|
1525
1523
|
|
|
1526
|
-
|
|
1527
|
-
vec2f(
|
|
1524
|
+
aN(material.coatRoughness, material.coatAnisotropy),
|
|
1525
|
+
vec2f(cH, fL)
|
|
1528
1526
|
);
|
|
1529
|
-
if (
|
|
1530
|
-
|
|
1527
|
+
if (ad.z < 0.0) {
|
|
1528
|
+
ad = -ad;
|
|
1531
1529
|
}
|
|
1532
|
-
lightLocal = normalize(reflect(-viewLocal,
|
|
1530
|
+
lightLocal = normalize(reflect(-viewLocal, ad));
|
|
1533
1531
|
}
|
|
1534
1532
|
`}
|
|
1535
|
-
else if (
|
|
1536
|
-
*
|
|
1537
|
-
*
|
|
1538
|
-
*
|
|
1533
|
+
else if (bv < cdf[OPENPBR_LOBE_SPECULAR]) {
|
|
1534
|
+
*aS = material.specularRoughness;
|
|
1535
|
+
*bu = true;
|
|
1536
|
+
*bn = select(
|
|
1539
1537
|
u32(OPENPBR_LOBE_SPECULAR),
|
|
1540
1538
|
u32(OPENPBR_LOBE_METAL),
|
|
1541
|
-
|
|
1539
|
+
bv < cdf[OPENPBR_LOBE_METAL]
|
|
1542
1540
|
);
|
|
1543
|
-
let
|
|
1544
|
-
let
|
|
1545
|
-
if (
|
|
1546
|
-
let z =
|
|
1547
|
-
let
|
|
1548
|
-
let
|
|
1549
|
-
lightLocal = vec3f(
|
|
1541
|
+
let uP = bv < cdf[OPENPBR_LOBE_METAL];
|
|
1542
|
+
let sN = (bv - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1543
|
+
if (uP & (sN < prepared.metalMsProbability)) {
|
|
1544
|
+
let z = cH;
|
|
1545
|
+
let ex = sqrt(max(0.0, 1.0 - z * z));
|
|
1546
|
+
let azimuth = TWOPI * fL;
|
|
1547
|
+
lightLocal = vec3f(ex * cos(azimuth), ex * sin(azimuth), z);
|
|
1550
1548
|
}
|
|
1551
1549
|
else {
|
|
1552
|
-
var
|
|
1550
|
+
var ad = aD(
|
|
1553
1551
|
viewLocal,
|
|
1554
1552
|
vec2f(material.alphaX, material.alphaY),
|
|
1555
|
-
vec2f(
|
|
1553
|
+
vec2f(cH, fL)
|
|
1556
1554
|
);
|
|
1557
|
-
if (
|
|
1558
|
-
|
|
1555
|
+
if (ad.z < 0.0) {
|
|
1556
|
+
ad = -ad;
|
|
1559
1557
|
}
|
|
1560
|
-
lightLocal = normalize(reflect(-viewLocal,
|
|
1558
|
+
lightLocal = normalize(reflect(-viewLocal, ad));
|
|
1561
1559
|
}
|
|
1562
1560
|
}
|
|
1563
|
-
else if (
|
|
1564
|
-
*
|
|
1565
|
-
*
|
|
1561
|
+
else if (bv < cdf[OPENPBR_LOBE_TRANSMISSION]) {
|
|
1562
|
+
*aS = material.specularRoughness;
|
|
1563
|
+
*bu = true;
|
|
1566
1564
|
*isTransmissionEvent = true;
|
|
1567
|
-
*
|
|
1565
|
+
*bn = u32(OPENPBR_LOBE_TRANSMISSION);
|
|
1568
1566
|
|
|
1569
1567
|
|
|
1570
|
-
let
|
|
1571
|
-
if (prepared.dielectricMsProbability > 0.0
|
|
1572
|
-
let
|
|
1573
|
-
let
|
|
1568
|
+
let vS = (bv - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1569
|
+
if ((prepared.dielectricMsProbability > 0.0) & (vS < prepared.dielectricMsProbability)) {
|
|
1570
|
+
let ju = prepared.dielectricMsReflectionRatio;
|
|
1571
|
+
let mJ = cH < ju;
|
|
1574
1572
|
var z: f32;
|
|
1575
|
-
if (
|
|
1576
|
-
else { z = -min((
|
|
1577
|
-
let
|
|
1578
|
-
let
|
|
1579
|
-
lightLocal = vec3f(
|
|
1580
|
-
*isTransmissionEvent = !
|
|
1581
|
-
*
|
|
1573
|
+
if (mJ) { z = min(cH / ju, 0.99999994); }
|
|
1574
|
+
else { z = -min((cH - ju) / (1.0 - ju), 0.99999994); }
|
|
1575
|
+
let ex = sqrt(max(0.0, 1.0 - z * z));
|
|
1576
|
+
let azimuth = TWOPI * fL;
|
|
1577
|
+
lightLocal = vec3f(ex * cos(azimuth), ex * sin(azimuth), z);
|
|
1578
|
+
*isTransmissionEvent = !mJ;
|
|
1579
|
+
*bn = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), mJ);
|
|
1582
1580
|
}
|
|
1583
1581
|
else {
|
|
1584
|
-
var
|
|
1582
|
+
var ad = aD(
|
|
1585
1583
|
viewLocal,
|
|
1586
1584
|
vec2f(material.alphaX, material.alphaY),
|
|
1587
|
-
vec2f(
|
|
1585
|
+
vec2f(cH, fL)
|
|
1588
1586
|
);
|
|
1589
|
-
if (
|
|
1590
|
-
|
|
1587
|
+
if (ad.z < 0.0) {
|
|
1588
|
+
ad = -ad;
|
|
1591
1589
|
}
|
|
1592
1590
|
if (material.thinWalled) {
|
|
1593
|
-
let
|
|
1594
|
-
lightLocal = vec3f(
|
|
1591
|
+
let iC = normalize(reflect(-viewLocal, ad));
|
|
1592
|
+
lightLocal = vec3f(iC.xy, -iC.z);
|
|
1595
1593
|
}
|
|
1596
1594
|
else {
|
|
1597
1595
|
lightLocal = refract(
|
|
1598
1596
|
-viewLocal,
|
|
1599
|
-
|
|
1597
|
+
ad,
|
|
1600
1598
|
prepared.material.relativeIor
|
|
1601
1599
|
);
|
|
1602
1600
|
if (dot(lightLocal, lightLocal) <= 1e-8) {
|
|
@@ -1608,20 +1606,20 @@ lightLocal = normalize(lightLocal);
|
|
|
1608
1606
|
}
|
|
1609
1607
|
}
|
|
1610
1608
|
else {
|
|
1611
|
-
*
|
|
1612
|
-
*
|
|
1609
|
+
*aS = 1.0;
|
|
1610
|
+
*cO = true;
|
|
1613
1611
|
*isTransmissionEvent = true;
|
|
1614
|
-
*
|
|
1612
|
+
*bn = u32(OPENPBR_LOBE_SUBSURFACE);
|
|
1615
1613
|
if (material.thinWalled) {
|
|
1616
|
-
let
|
|
1617
|
-
if (
|
|
1618
|
-
|
|
1614
|
+
let qL = cH >= 0.5;
|
|
1615
|
+
if (qL) {
|
|
1616
|
+
cH = (cH - 0.5) * 2.0;
|
|
1619
1617
|
}
|
|
1620
1618
|
else {
|
|
1621
|
-
|
|
1619
|
+
cH *= 2.0;
|
|
1622
1620
|
}
|
|
1623
|
-
lightLocal =
|
|
1624
|
-
if (
|
|
1621
|
+
lightLocal = aO(vec2f(cH, fL));
|
|
1622
|
+
if (qL) {
|
|
1625
1623
|
lightLocal.z = -lightLocal.z;
|
|
1626
1624
|
}
|
|
1627
1625
|
else {
|
|
@@ -1629,7 +1627,7 @@ else {
|
|
|
1629
1627
|
}
|
|
1630
1628
|
}
|
|
1631
1629
|
else {
|
|
1632
|
-
lightLocal =
|
|
1630
|
+
lightLocal = aO(vec2f(cH, fL));
|
|
1633
1631
|
lightLocal.z = -lightLocal.z;
|
|
1634
1632
|
}
|
|
1635
1633
|
}
|
|
@@ -1638,98 +1636,98 @@ lightLocal.z = -lightLocal.z;
|
|
|
1638
1636
|
|
|
1639
1637
|
|
|
1640
1638
|
|
|
1641
|
-
if (lightLocal.z == 0.0
|
|
1639
|
+
if ((lightLocal.z == 0.0) | ((lightLocal.z < 0.0) != *isTransmissionEvent)) {
|
|
1642
1640
|
return false;
|
|
1643
1641
|
}
|
|
1644
1642
|
${hasCoatNormals ? /* wgsl */ `
|
|
1645
|
-
if (material.coatNormalEnabled
|
|
1643
|
+
if (material.coatNormalEnabled &
|
|
1646
1644
|
((dot(material.geometricNormal, *lightDirection) <= 0.0) != *isTransmissionEvent)) { return false; }
|
|
1647
1645
|
` : ''}
|
|
1648
1646
|
return true;
|
|
1649
1647
|
}
|
|
1650
1648
|
|
|
1651
|
-
fn
|
|
1649
|
+
fn eN(
|
|
1652
1650
|
prepared: ag,
|
|
1653
|
-
|
|
1651
|
+
cq: vec3f,
|
|
1654
1652
|
lightDirection: ptr<function, vec3f>,
|
|
1655
1653
|
pdf: ptr<function, f32>,
|
|
1656
1654
|
isTransmissionEvent: ptr<function, bool>,
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1655
|
+
aS: ptr<function, f32>,
|
|
1656
|
+
bu: ptr<function, bool>,
|
|
1657
|
+
cO: ptr<function, bool>,
|
|
1658
|
+
bn: ptr<function, u32>,
|
|
1659
|
+
lW: ptr<function, f32>,
|
|
1660
|
+
kq: ptr<function, vec3f>
|
|
1663
1661
|
) -> vec3f {
|
|
1664
1662
|
*pdf = 0.0;
|
|
1665
|
-
*
|
|
1666
|
-
*
|
|
1663
|
+
*lW = 0.0;
|
|
1664
|
+
*kq = vec3f(0.0);
|
|
1667
1665
|
|
|
1668
1666
|
|
|
1669
1667
|
|
|
1670
1668
|
|
|
1671
|
-
if (!prepared.material.thinWalled
|
|
1672
|
-
abs(prepared.material.relativeIor - 1.0) <= 1e-6
|
|
1673
|
-
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6) {
|
|
1669
|
+
if (!prepared.material.thinWalled &
|
|
1670
|
+
(abs(prepared.material.relativeIor - 1.0) <= 1e-6) &
|
|
1671
|
+
(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6)) {
|
|
1674
1672
|
*lightDirection = openpbr_to_world(
|
|
1675
1673
|
prepared.basis,
|
|
1676
1674
|
-prepared.viewLocal
|
|
1677
1675
|
);
|
|
1678
|
-
let
|
|
1679
|
-
*
|
|
1676
|
+
let oF = bh(prepared.material)
|
|
1677
|
+
* cF(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
|
|
1680
1678
|
*pdf = 1.0;
|
|
1681
|
-
*
|
|
1682
|
-
*
|
|
1679
|
+
*lW = 1.0;
|
|
1680
|
+
*kq = oF;
|
|
1683
1681
|
*isTransmissionEvent = true;
|
|
1684
|
-
*
|
|
1685
|
-
*
|
|
1686
|
-
*
|
|
1687
|
-
*
|
|
1688
|
-
return
|
|
1689
|
-
}
|
|
1690
|
-
if (!
|
|
1691
|
-
isTransmissionEvent,
|
|
1692
|
-
|
|
1693
|
-
let response =
|
|
1694
|
-
*
|
|
1695
|
-
*
|
|
1682
|
+
*aS = 0.0;
|
|
1683
|
+
*bu = true;
|
|
1684
|
+
*cO = false;
|
|
1685
|
+
*bn = u32(OPENPBR_LOBE_TRANSMISSION);
|
|
1686
|
+
return oF;
|
|
1687
|
+
}
|
|
1688
|
+
if (!jq(prepared, cq, lightDirection,
|
|
1689
|
+
isTransmissionEvent, aS, bu,
|
|
1690
|
+
cO, bn)) { return vec3f(0.0); }
|
|
1691
|
+
let response = bO(prepared, *lightDirection, pdf);
|
|
1692
|
+
*lW = *pdf;
|
|
1693
|
+
*kq = response;
|
|
1696
1694
|
return response;
|
|
1697
1695
|
}
|
|
1698
1696
|
|
|
1699
|
-
fn
|
|
1697
|
+
fn tZ(
|
|
1700
1698
|
tangent: vec3f,
|
|
1701
|
-
material:
|
|
1702
|
-
|
|
1703
|
-
|
|
1699
|
+
material: OpenPbrResolvedMaterial,
|
|
1700
|
+
cq: vec3f,
|
|
1701
|
+
bM: vec3f,
|
|
1704
1702
|
normal: vec3f,
|
|
1705
1703
|
lightDirection: ptr<function, vec3f>,
|
|
1706
1704
|
pdf: ptr<function, f32>,
|
|
1707
1705
|
isTransmissionEvent: ptr<function, bool>,
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1706
|
+
aS: ptr<function, f32>,
|
|
1707
|
+
bu: ptr<function, bool>,
|
|
1708
|
+
cO: ptr<function, bool>,
|
|
1709
|
+
bn: ptr<function, u32>,
|
|
1710
|
+
lW: ptr<function, f32>
|
|
1713
1711
|
) -> vec3f {
|
|
1714
|
-
let prepared =
|
|
1712
|
+
let prepared = ds(
|
|
1715
1713
|
tangent,
|
|
1716
1714
|
material,
|
|
1717
|
-
|
|
1715
|
+
bM,
|
|
1718
1716
|
normal
|
|
1719
1717
|
);
|
|
1720
|
-
var
|
|
1721
|
-
return
|
|
1718
|
+
var kq = vec3f(0.0);
|
|
1719
|
+
return eN(
|
|
1722
1720
|
prepared,
|
|
1723
|
-
|
|
1721
|
+
cq,
|
|
1724
1722
|
lightDirection,
|
|
1725
1723
|
pdf,
|
|
1726
1724
|
isTransmissionEvent,
|
|
1727
|
-
aA,
|
|
1728
1725
|
aS,
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1726
|
+
bu,
|
|
1727
|
+
cO,
|
|
1728
|
+
bn,
|
|
1729
|
+
lW,
|
|
1730
|
+
&kq
|
|
1733
1731
|
);
|
|
1734
1732
|
}`;
|
|
1735
1733
|
}
|