@meimu/mutracer 0.1.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +36 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +6 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +36 -3
- package/lib/settings/render.js +4 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +20 -7
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -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 OpenPbrBasis {
|
|
30
34
|
tangent: vec3f,
|
|
31
35
|
bitangent: vec3f,
|
|
32
36
|
normal: vec3f,
|
|
33
37
|
};
|
|
34
38
|
|
|
35
|
-
struct
|
|
36
|
-
material:
|
|
37
|
-
basis:
|
|
39
|
+
struct OpenPbrPreparedBsdf {
|
|
40
|
+
material: OpenPbrResolvedMaterial,
|
|
41
|
+
basis: OpenPbrBasis,
|
|
38
42
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
39
|
-
coatBasis:
|
|
43
|
+
coatBasis: OpenPbrBasis,
|
|
40
44
|
directionFrames: bool,
|
|
41
45
|
` : /* wgsl */ ``}
|
|
42
46
|
${hasCoatNormals ? /* wgsl */ ` coatViewLocal: vec3f,` : ''}
|
|
@@ -64,208 +68,208 @@ weights: array<f32, OPENPBR_LOBE_COUNT>,
|
|
|
64
68
|
probabilities: array<f32, OPENPBR_LOBE_COUNT>,
|
|
65
69
|
};
|
|
66
70
|
|
|
67
|
-
fn
|
|
71
|
+
fn aB(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 cO(bq: f32) -> f32 {
|
|
76
|
+
let value = (bq - 1.0) / (bq + 1.0);
|
|
73
77
|
return value * value;
|
|
74
78
|
}
|
|
75
79
|
|
|
76
|
-
fn
|
|
77
|
-
|
|
80
|
+
fn bb(
|
|
81
|
+
bq: f32,
|
|
78
82
|
specularWeight: f32
|
|
79
83
|
) -> f32 {
|
|
80
|
-
let
|
|
81
|
-
|
|
84
|
+
let uj = min(
|
|
85
|
+
cO(bq) * specularWeight,
|
|
82
86
|
0.9999
|
|
83
87
|
);
|
|
84
|
-
let
|
|
85
|
-
let
|
|
86
|
-
return select(
|
|
88
|
+
let ul = sqrt(uj);
|
|
89
|
+
let lC = (1.0 + ul) / (1.0 - ul);
|
|
90
|
+
return select(lC, 1.0 / lC, bq < 1.0);
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
fn
|
|
93
|
+
fn ae(ct: f32, relativeIor: f32) -> f32 {
|
|
90
94
|
if (abs(relativeIor - 1.0) < 1e-6) {
|
|
91
95
|
return 0.0;
|
|
92
96
|
}
|
|
93
|
-
return
|
|
97
|
+
return sampling_dielectric_fresnel(ct, relativeIor);
|
|
94
98
|
}
|
|
95
99
|
|
|
96
|
-
fn
|
|
100
|
+
fn aE(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(tC: i32, row: i32) -> f32 {
|
|
108
|
+
return textureLoad(openPbrEnergyLut, vec2i(tC, row), 0).r;
|
|
105
109
|
}
|
|
106
110
|
|
|
107
|
-
fn
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
fn gd(
|
|
112
|
+
dH: f32,
|
|
113
|
+
bM: f32,
|
|
114
|
+
hN: 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 br = clamp(dH, 0.0, 31.0);
|
|
117
|
+
let aK = clamp(bM, 0.0, 31.0);
|
|
118
|
+
let bp = clamp(hN, 0.0, 31.0);
|
|
119
|
+
let dP = i32(floor(br));
|
|
120
|
+
let aP = i32(floor(aK));
|
|
121
|
+
let cD = i32(floor(bp));
|
|
122
|
+
let hB = min(dP + 1, 31);
|
|
123
|
+
let ch = min(aP + 1, 31);
|
|
124
|
+
let eK = min(cD + 1, 31);
|
|
125
|
+
let ci = br - f32(dP);
|
|
126
|
+
let cq = aK - f32(aP);
|
|
127
|
+
let kR = bp - f32(cD);
|
|
128
|
+
|
|
129
|
+
let wv = F(cD, dP * 32 + aP);
|
|
130
|
+
let ww = F(eK, dP * 32 + aP);
|
|
131
|
+
let wx = F(cD, dP * 32 + ch);
|
|
132
|
+
let wy = F(eK, dP * 32 + ch);
|
|
133
|
+
let wB = F(cD, hB * 32 + aP);
|
|
134
|
+
let wC = F(eK, hB * 32 + aP);
|
|
135
|
+
let wE = F(cD, hB * 32 + ch);
|
|
136
|
+
let wF = F(eK, hB * 32 + ch);
|
|
137
|
+
let v00 = mix(wv, wB, ci);
|
|
138
|
+
let v01 = mix(ww, wC, ci);
|
|
139
|
+
let v10 = mix(wx, wE, ci);
|
|
140
|
+
let v11 = mix(wy, wF, ci);
|
|
137
141
|
return mix(
|
|
138
|
-
mix(v00, v10,
|
|
139
|
-
mix(v01, v11,
|
|
140
|
-
|
|
142
|
+
mix(v00, v10, cq),
|
|
143
|
+
mix(v01, v11, cq),
|
|
144
|
+
kR
|
|
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 gA(dH: f32, bM: f32) -> f32 {
|
|
149
|
+
let br = clamp(dH, 0.0, 31.0);
|
|
150
|
+
let aK = clamp(bM, 0.0, 31.0);
|
|
151
|
+
let dP = i32(floor(br));
|
|
152
|
+
let aP = i32(floor(aK));
|
|
153
|
+
let hB = min(dP + 1, 31);
|
|
154
|
+
let ch = min(aP + 1, 31);
|
|
155
|
+
let ci = br - f32(dP);
|
|
156
|
+
let cq = aK - f32(aP);
|
|
157
|
+
let v00 = F(aP, 1024 + dP);
|
|
158
|
+
let v01 = F(ch, 1024 + dP);
|
|
159
|
+
let v10 = F(aP, 1024 + hB);
|
|
160
|
+
let v11 = F(ch, 1024 + hB);
|
|
157
161
|
return mix(
|
|
158
|
-
mix(v00, v10,
|
|
159
|
-
mix(v01, v11,
|
|
160
|
-
|
|
162
|
+
mix(v00, v10, ci),
|
|
163
|
+
mix(v01, v11, ci),
|
|
164
|
+
cq
|
|
161
165
|
);
|
|
162
166
|
}
|
|
163
167
|
|
|
164
168
|
|
|
165
169
|
|
|
166
|
-
fn
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
+
fn ee(
|
|
171
|
+
dH: f32,
|
|
172
|
+
bM: f32,
|
|
173
|
+
hN: 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 br = clamp(dH, 0.0, 31.0);
|
|
176
|
+
let aK = clamp(bM, 0.0, 31.0);
|
|
177
|
+
let bp = clamp(hN, 0.0, 31.0);
|
|
178
|
+
let dP = i32(floor(br));
|
|
179
|
+
let aP = i32(floor(aK));
|
|
180
|
+
let cD = i32(floor(bp));
|
|
181
|
+
let hB = min(dP + 1, 31);
|
|
182
|
+
let ch = min(aP + 1, 31);
|
|
183
|
+
let eK = min(cD + 1, 31);
|
|
184
|
+
let ci = br - f32(dP);
|
|
185
|
+
let cq = aK - f32(aP);
|
|
186
|
+
let kR = bp - f32(cD);
|
|
187
|
+
|
|
188
|
+
let wv = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
|
|
189
|
+
let ww = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
|
|
190
|
+
let wx = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
|
|
191
|
+
let wy = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
|
|
192
|
+
let wB = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
|
|
193
|
+
let wC = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
|
|
194
|
+
let wE = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
|
|
195
|
+
let wF = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
|
|
196
|
+
let v00 = mix(wv, wB, ci);
|
|
197
|
+
let v01 = mix(ww, wC, ci);
|
|
198
|
+
let v10 = mix(wx, wE, ci);
|
|
199
|
+
let v11 = mix(wy, wF, ci);
|
|
196
200
|
return mix(
|
|
197
|
-
mix(v00, v10,
|
|
198
|
-
mix(v01, v11,
|
|
199
|
-
|
|
201
|
+
mix(v00, v10, cq),
|
|
202
|
+
mix(v01, v11, cq),
|
|
203
|
+
kR
|
|
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 ec(dH: f32, bM: f32) -> f32 {
|
|
208
|
+
let br = clamp(dH, 0.0, 31.0);
|
|
209
|
+
let aK = clamp(bM, 0.0, 31.0);
|
|
210
|
+
let dP = i32(floor(br));
|
|
211
|
+
let aP = i32(floor(aK));
|
|
212
|
+
let hB = min(dP + 1, 31);
|
|
213
|
+
let ch = min(aP + 1, 31);
|
|
214
|
+
let ci = br - f32(dP);
|
|
215
|
+
let cq = aK - f32(aP);
|
|
216
|
+
let v00 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
|
|
217
|
+
let v01 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
|
|
218
|
+
let v10 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
|
|
219
|
+
let v11 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
|
|
216
220
|
return mix(
|
|
217
|
-
mix(v00, v10,
|
|
218
|
-
mix(v01, v11,
|
|
219
|
-
|
|
221
|
+
mix(v00, v10, ci),
|
|
222
|
+
mix(v01, v11, ci),
|
|
223
|
+
cq
|
|
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 eC(dH: f32, bM: f32) -> f32 {
|
|
228
|
+
let br = clamp(dH, 0.0, 31.0);
|
|
229
|
+
let aK = clamp(bM, 0.0, 31.0);
|
|
230
|
+
let dP = i32(floor(br));
|
|
231
|
+
let aP = i32(floor(aK));
|
|
232
|
+
let hB = min(dP + 1, 31);
|
|
233
|
+
let ch = min(aP + 1, 31);
|
|
234
|
+
let ci = br - f32(dP);
|
|
235
|
+
let cq = aK - f32(aP);
|
|
236
|
+
let v00 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
|
|
237
|
+
let v01 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
|
|
238
|
+
let v10 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
|
|
239
|
+
let v11 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
|
|
236
240
|
return mix(
|
|
237
|
-
mix(v00, v10,
|
|
238
|
-
mix(v01, v11,
|
|
239
|
-
|
|
241
|
+
mix(v00, v10, ci),
|
|
242
|
+
mix(v01, v11, ci),
|
|
243
|
+
cq
|
|
240
244
|
);
|
|
241
245
|
}
|
|
242
246
|
|
|
243
|
-
fn
|
|
244
|
-
return
|
|
247
|
+
fn aV(ior: f32, alpha: f32, cosine: f32) -> f32 {
|
|
248
|
+
return ee(aE(ior), sqrt(alpha) * 31.0, cosine * 31.0);
|
|
245
249
|
}
|
|
246
|
-
fn
|
|
247
|
-
return
|
|
250
|
+
fn aY(ior: f32, alpha: f32) -> f32 {
|
|
251
|
+
return ec(aE(ior), sqrt(alpha) * 31.0);
|
|
248
252
|
}
|
|
249
|
-
fn
|
|
250
|
-
return
|
|
253
|
+
fn bU(ior: f32, alpha: f32) -> f32 {
|
|
254
|
+
return eC(aE(ior), sqrt(alpha) * 31.0);
|
|
251
255
|
}
|
|
252
256
|
|
|
253
257
|
|
|
254
258
|
|
|
255
|
-
fn
|
|
259
|
+
fn aR(alpha: f32, cosine: f32) -> f32 {
|
|
256
260
|
let ie = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
|
|
257
|
-
let
|
|
261
|
+
let bp = clamp(cosine * 31.0, 0.0, 31.0);
|
|
258
262
|
let r0 = i32(floor(ie));
|
|
259
|
-
let c0 = i32(floor(
|
|
263
|
+
let c0 = i32(floor(bp));
|
|
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(
|
|
267
|
+
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bp)),
|
|
268
|
+
mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bp)),
|
|
265
269
|
fract(ie));
|
|
266
270
|
}
|
|
267
271
|
|
|
268
|
-
fn
|
|
272
|
+
fn cl(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}),
|
|
@@ -273,42 +277,42 @@ F(min(i0 + 1, 31), ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}), fract(index));
|
|
|
273
277
|
}
|
|
274
278
|
|
|
275
279
|
fn aX(value: f32, ior: f32) -> f32 {
|
|
276
|
-
if (ior > 2.5
|
|
277
|
-
let
|
|
278
|
-
let progress = (
|
|
280
|
+
if ((ior > 2.5) | (ior < 0.4)) {
|
|
281
|
+
let vH = cO(2.5);
|
|
282
|
+
let progress = (cO(ior) - vH) / (1.0 - vH);
|
|
279
283
|
return (1.0 - progress) * value;
|
|
280
284
|
}
|
|
281
285
|
return value;
|
|
282
286
|
}
|
|
283
287
|
|
|
284
|
-
fn
|
|
288
|
+
fn ar(
|
|
285
289
|
ior: f32,
|
|
286
290
|
alpha: f32,
|
|
287
|
-
|
|
291
|
+
cosine: f32
|
|
288
292
|
) -> f32 {
|
|
289
|
-
let value =
|
|
290
|
-
|
|
293
|
+
let value = gd(
|
|
294
|
+
aE(ior),
|
|
291
295
|
sqrt(alpha) * 31.0,
|
|
292
|
-
|
|
296
|
+
cosine * 31.0
|
|
293
297
|
);
|
|
294
298
|
return aX(value, ior);
|
|
295
299
|
}
|
|
296
300
|
|
|
297
|
-
fn
|
|
298
|
-
let value =
|
|
299
|
-
|
|
301
|
+
fn cj(ior: f32, alpha: f32) -> f32 {
|
|
302
|
+
let value = gA(
|
|
303
|
+
aE(ior),
|
|
300
304
|
sqrt(alpha) * 31.0
|
|
301
305
|
);
|
|
302
306
|
return aX(value, ior);
|
|
303
307
|
}
|
|
304
308
|
|
|
305
|
-
fn openpbr_to_world(basis:
|
|
309
|
+
fn openpbr_to_world(basis: OpenPbrBasis, 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: OpenPbrBasis, 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 ff(
|
|
324
|
+
aS: vec3f,
|
|
321
325
|
normal: vec3f,
|
|
322
326
|
anisotropy: f32
|
|
323
|
-
) ->
|
|
324
|
-
var basis:
|
|
327
|
+
) -> OpenPbrBasis {
|
|
328
|
+
var basis: OpenPbrBasis;
|
|
325
329
|
basis.normal = normal;
|
|
326
|
-
var tangent =
|
|
330
|
+
var tangent = aS;
|
|
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
|
+
sampling_orthonormal_basis(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
|
|
344
|
+
fn ki(
|
|
341
345
|
av: f32,
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
346
|
+
ai: f32,
|
|
347
|
+
J: f32,
|
|
348
|
+
ad: f32
|
|
345
349
|
) -> f32 {
|
|
346
|
-
return (av *
|
|
347
|
-
/ (av *
|
|
350
|
+
return (av * J - ai * ad)
|
|
351
|
+
/ (av * J + ai * ad);
|
|
348
352
|
}
|
|
349
353
|
|
|
350
|
-
fn
|
|
354
|
+
fn kh(
|
|
351
355
|
av: f32,
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
356
|
+
ai: f32,
|
|
357
|
+
J: f32,
|
|
358
|
+
ad: f32
|
|
355
359
|
) -> f32 {
|
|
356
|
-
return (
|
|
357
|
-
/ (av *
|
|
360
|
+
return (ai * J - av * ad)
|
|
361
|
+
/ (av * ad + ai * J);
|
|
358
362
|
}
|
|
359
363
|
|
|
360
|
-
fn
|
|
364
|
+
fn gZ(
|
|
361
365
|
av: f32,
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
366
|
+
ai: f32,
|
|
367
|
+
J: f32,
|
|
368
|
+
ad: f32
|
|
365
369
|
) -> f32 {
|
|
366
|
-
return 2.0 * av *
|
|
367
|
-
/ (av *
|
|
370
|
+
return 2.0 * av * J
|
|
371
|
+
/ (av * J + ai * ad);
|
|
368
372
|
}
|
|
369
373
|
|
|
370
|
-
fn
|
|
374
|
+
fn gY(
|
|
371
375
|
av: f32,
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
376
|
+
ai: f32,
|
|
377
|
+
J: f32,
|
|
378
|
+
ad: f32
|
|
375
379
|
) -> f32 {
|
|
376
|
-
return 2.0 * av *
|
|
377
|
-
/ (av *
|
|
380
|
+
return 2.0 * av * J
|
|
381
|
+
/ (av * ad + ai * J);
|
|
378
382
|
}
|
|
379
383
|
|
|
380
|
-
fn
|
|
384
|
+
fn aT(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 bc(a: vec2f, b: vec2f) -> vec2f {
|
|
389
|
+
let ah = 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) / ah,
|
|
392
|
+
(a.y * b.x - a.x * b.y) / ah
|
|
389
393
|
);
|
|
390
394
|
}
|
|
391
395
|
|
|
392
|
-
fn
|
|
393
|
-
let
|
|
394
|
-
let
|
|
395
|
-
let
|
|
396
|
-
return vec2f(
|
|
396
|
+
fn hV(value: vec2f) -> vec2f {
|
|
397
|
+
let gz = length(value);
|
|
398
|
+
let ui = sqrt(max(0.0, 0.5 * (gz + value.x)));
|
|
399
|
+
let fc = sqrt(max(0.0, 0.5 * (gz - value.x)));
|
|
400
|
+
return vec2f(ui, select(-fc, fc, value.y >= 0.0));
|
|
397
401
|
}
|
|
398
402
|
|
|
399
|
-
fn
|
|
400
|
-
|
|
403
|
+
fn bR(
|
|
404
|
+
J: f32,
|
|
401
405
|
av: f32,
|
|
402
|
-
|
|
403
|
-
|
|
406
|
+
ai: vec2f,
|
|
407
|
+
rH: bool
|
|
404
408
|
) -> vec2f {
|
|
405
|
-
let
|
|
406
|
-
let
|
|
407
|
-
let
|
|
408
|
-
var
|
|
409
|
-
vec2f(1.0, 0.0) -
|
|
409
|
+
let oV = sqrt(max(0.0, 1.0 - J * J));
|
|
410
|
+
let tR = bc(vec2f(av, 0.0), ai);
|
|
411
|
+
let hx = tR * oV;
|
|
412
|
+
var ad = hV(
|
|
413
|
+
vec2f(1.0, 0.0) - aT(hx, hx)
|
|
410
414
|
);
|
|
411
|
-
if (
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
let fL = vec2f(av *
|
|
416
|
-
let
|
|
417
|
-
if (
|
|
418
|
-
let
|
|
419
|
-
let
|
|
420
|
-
return
|
|
421
|
-
|
|
422
|
-
|
|
415
|
+
if (aT(ai, ad).y < 0.0) {
|
|
416
|
+
ad = -ad;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
let fL = vec2f(av * J, 0.0);
|
|
420
|
+
let eu = aT(ai, ad);
|
|
421
|
+
if (rH) {
|
|
422
|
+
let bW = ai * J;
|
|
423
|
+
let bT = ad * av;
|
|
424
|
+
return bc(
|
|
425
|
+
bW - bT,
|
|
426
|
+
bW + bT
|
|
423
427
|
);
|
|
424
428
|
}
|
|
425
|
-
return
|
|
426
|
-
fL -
|
|
427
|
-
fL +
|
|
429
|
+
return bc(
|
|
430
|
+
fL - eu,
|
|
431
|
+
fL + eu
|
|
428
432
|
);
|
|
429
433
|
}
|
|
430
434
|
|
|
431
|
-
fn
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
435
|
+
fn em(
|
|
436
|
+
iI: f32,
|
|
437
|
+
gJ: f32,
|
|
438
|
+
pk: f32,
|
|
439
|
+
nA: f32,
|
|
440
|
+
ko: vec2f,
|
|
437
441
|
phase: f32
|
|
438
442
|
) -> f32 {
|
|
439
|
-
let
|
|
440
|
-
let
|
|
441
|
-
let
|
|
442
|
-
let
|
|
443
|
-
let
|
|
444
|
-
+
|
|
445
|
-
return dot(
|
|
443
|
+
let nZ = vec2f(cos(phase), sin(phase));
|
|
444
|
+
let hY = aT(ko, nZ);
|
|
445
|
+
let iF = hY * (gJ * nA);
|
|
446
|
+
let ah = vec2f(1.0, 0.0) - hY * pk;
|
|
447
|
+
let hw = vec2f(iI, 0.0)
|
|
448
|
+
+ bc(iF, ah);
|
|
449
|
+
return dot(hw, hw);
|
|
446
450
|
}
|
|
447
451
|
|
|
448
|
-
fn
|
|
449
|
-
|
|
452
|
+
fn ap(
|
|
453
|
+
J: f32,
|
|
450
454
|
wavelength: f32,
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
+
cf: f32,
|
|
456
|
+
aN: f32,
|
|
457
|
+
bY: f32,
|
|
458
|
+
ep: vec2f
|
|
455
459
|
) -> f32 {
|
|
456
|
-
let
|
|
457
|
-
let
|
|
458
|
-
* (1.0 -
|
|
459
|
-
if (
|
|
460
|
+
let dd = clamp(abs(J), 1e-5, 1.0);
|
|
461
|
+
let hp = pow(aN / bY, 2.0)
|
|
462
|
+
* (1.0 - dd * dd);
|
|
463
|
+
if (hp >= 1.0) {
|
|
460
464
|
return 1.0;
|
|
461
465
|
}
|
|
462
|
-
let
|
|
463
|
-
let
|
|
464
|
-
|
|
466
|
+
let cN = sqrt(1.0 - hp);
|
|
467
|
+
let lq = ki(
|
|
468
|
+
aN, bY, dd, cN
|
|
465
469
|
);
|
|
466
|
-
let
|
|
467
|
-
|
|
470
|
+
let lp = kh(
|
|
471
|
+
aN, bY, dd, cN
|
|
468
472
|
);
|
|
469
|
-
let
|
|
470
|
-
|
|
473
|
+
let jm = gZ(
|
|
474
|
+
aN, bY, dd, cN
|
|
471
475
|
);
|
|
472
|
-
let
|
|
473
|
-
|
|
476
|
+
let jl = gY(
|
|
477
|
+
aN, bY, dd, cN
|
|
474
478
|
);
|
|
475
|
-
let
|
|
476
|
-
/ max(
|
|
477
|
-
let phase = 2.0 * PI * (2.0 *
|
|
478
|
-
var
|
|
479
|
+
let gp = bY * cN
|
|
480
|
+
/ max(aN * dd, 1e-9);
|
|
481
|
+
let phase = 2.0 * PI * (2.0 * bY * cf * cN) / wavelength;
|
|
482
|
+
var reflectance = 0.0;
|
|
479
483
|
|
|
480
|
-
for (var
|
|
481
|
-
let
|
|
482
|
-
let
|
|
483
|
-
let
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
-
|
|
484
|
+
for (var kn = 0u; kn < (rtUniform.loopUnrollGuard >> 1u); kn++) {
|
|
485
|
+
let iI = select(lq, lp, kn == 1u);
|
|
486
|
+
let gJ = select(jm, jl, kn == 1u);
|
|
487
|
+
let ko = bR(
|
|
488
|
+
cN, bY, ep, kn == 1u);
|
|
489
|
+
reflectance += em(iI, gJ,
|
|
490
|
+
-iI, gJ * gp, ko, 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 fJ = mix(f0, vec3f(1.0),
|
|
500
|
-
let
|
|
501
|
-
let
|
|
502
|
-
/ (
|
|
503
|
-
return clamp(
|
|
498
|
+
fn openpbr_metal_fresnel(cosine: f32, f0: vec3f, tint: vec3f) -> vec3f {
|
|
499
|
+
let sl = mix(f0, vec3f(1.0), aH(cosine));
|
|
500
|
+
if (all(tint == vec3f(1.0))) { return sl; }
|
|
501
|
+
let da = 1.0 / 7.0;
|
|
502
|
+
let mK = 1.0 - da;
|
|
503
|
+
let fJ = mix(f0, vec3f(1.0), aH(da));
|
|
504
|
+
let cY = 1.0 - cosine;
|
|
505
|
+
let rp = cosine * aH(cosine) * cY
|
|
506
|
+
/ (da * pow(mK, 6.0));
|
|
507
|
+
return clamp(sl - rp * (fJ - tint * fJ), 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 cJ(f0: f32, uS: f32) -> vec2f {
|
|
511
|
+
let dL = clamp(f0, 0.0, 0.99);
|
|
512
|
+
let gI = sqrt(dL);
|
|
513
|
+
let rF = (1.0 - dL) / (1.0 + dL);
|
|
514
|
+
let rC = (1.0 + gI) / max(1.0 - gI, 1e-9);
|
|
515
|
+
let ior = mix(rC, rF, clamp(uS, 0.0, 1.0));
|
|
516
|
+
let jT = (
|
|
517
|
+
(ior + 1.0) * (ior + 1.0) * dL
|
|
514
518
|
- (ior - 1.0) * (ior - 1.0)
|
|
515
|
-
) / max(1.0 -
|
|
516
|
-
return vec2f(ior, sqrt(max(
|
|
519
|
+
) / max(1.0 - dL, 1e-9);
|
|
520
|
+
return vec2f(ior, sqrt(max(jT, 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 bJ(cf: f32, weight: f32) -> f32 {
|
|
525
|
+
return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, cf);
|
|
522
526
|
}
|
|
523
527
|
|
|
524
528
|
|
|
525
529
|
|
|
526
|
-
fn
|
|
527
|
-
material:
|
|
530
|
+
fn bw(
|
|
531
|
+
material: OpenPbrResolvedMaterial,
|
|
528
532
|
color: vec3f,
|
|
529
533
|
viewLocal: vec3f,
|
|
530
534
|
lightLocal: vec3f,
|
|
531
|
-
|
|
535
|
+
fl: 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 gS = 0.5 - 2.0 / (3.0 * PI);
|
|
545
|
+
let oR = 2.0 / 3.0 - 28.0 / (15.0 * PI);
|
|
546
|
+
let pe = lightLocal.z;
|
|
547
|
+
let nd = viewLocal.z;
|
|
548
|
+
let directional = dot(lightLocal, viewLocal) - pe * nd;
|
|
549
|
+
let gP = select(
|
|
550
|
+
directional,
|
|
551
|
+
directional / max(max(pe, nd), 1e-7),
|
|
552
|
+
directional > 0.0
|
|
549
553
|
);
|
|
550
|
-
let il = 1.0 / (1.0 +
|
|
551
|
-
let
|
|
552
|
-
* (1.0 + roughness *
|
|
553
|
-
|
|
554
|
-
let
|
|
555
|
-
let
|
|
556
|
-
let
|
|
557
|
-
0.0571085289 +
|
|
558
|
-
0.491881867 +
|
|
559
|
-
-0.332181442 +
|
|
554
|
+
let il = 1.0 / (1.0 + gS * roughness);
|
|
555
|
+
let oe = color * INVPI * il
|
|
556
|
+
* (1.0 + roughness * gP);
|
|
557
|
+
|
|
558
|
+
let cW = 1.0 - pe;
|
|
559
|
+
let outputComplement = 1.0 - nd;
|
|
560
|
+
let oW = cW * (
|
|
561
|
+
0.0571085289 + cW * (
|
|
562
|
+
0.491881867 + cW * (
|
|
563
|
+
-0.332181442 + cW * 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 qj = (1.0 + roughness * oW)
|
|
575
|
+
/ (1.0 + gS * roughness);
|
|
576
|
+
let outputAlbedo = (1.0 + roughness * outputGOverPi)
|
|
577
|
+
/ (1.0 + gS * roughness);
|
|
578
|
+
let fU = il * (1.0 + oR * roughness);
|
|
579
|
+
let hC = color * color * fU
|
|
580
|
+
/ max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fU));
|
|
581
|
+
let lT = hC * INVPI
|
|
582
|
+
* max(1e-7, 1.0 - outputAlbedo)
|
|
583
|
+
* max(1e-7, 1.0 - qj)
|
|
584
|
+
/ max(1e-7, 1.0 - fU);
|
|
581
585
|
*pdf = lightLocal.z * INVPI;
|
|
582
|
-
return (
|
|
586
|
+
return (oe + lT) * fl;
|
|
583
587
|
}
|
|
584
588
|
|
|
585
|
-
fn
|
|
589
|
+
fn aQ(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 kg(
|
|
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 = aQ(
|
|
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 aj(
|
|
622
|
+
material: OpenPbrResolvedMaterial,
|
|
619
623
|
viewLocal: vec3f,
|
|
620
624
|
lightLocal: vec3f,
|
|
621
|
-
|
|
622
|
-
|
|
625
|
+
aa: vec3f,
|
|
626
|
+
fresnel: 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 = sampling_ggx_ndf(aa, alpha);
|
|
636
|
+
let kc = aD(viewLocal, alpha);
|
|
637
|
+
let dY = kc
|
|
638
|
+
* aD(lightLocal, alpha);
|
|
635
639
|
|
|
636
|
-
*pdf =
|
|
637
|
-
return
|
|
640
|
+
*pdf = kc * distribution / (4.0 * max(viewLocal.z, 1e-8));
|
|
641
|
+
return fresnel * distribution * dY
|
|
638
642
|
/ (4.0 * max(lightLocal.z * viewLocal.z, 1e-8));
|
|
639
643
|
}
|
|
640
644
|
|
|
641
|
-
fn
|
|
642
|
-
material:
|
|
645
|
+
fn dc(
|
|
646
|
+
material: OpenPbrResolvedMaterial,
|
|
643
647
|
relativeIor: f32,
|
|
644
648
|
tint: vec3f,
|
|
645
649
|
viewLocal: vec3f,
|
|
646
650
|
lightLocal: vec3f,
|
|
647
|
-
|
|
648
|
-
|
|
651
|
+
aa: vec3f,
|
|
652
|
+
fresnel: 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 lightHalf = dot(lightLocal, aa);
|
|
661
|
+
let viewHalf = dot(viewLocal, aa);
|
|
658
662
|
|
|
659
663
|
|
|
660
|
-
if (
|
|
664
|
+
if ((viewHalf <= 0.0) | (lightHalf >= 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 = sampling_ggx_ndf(aa, alpha);
|
|
669
|
+
let kc = aD(viewLocal, alpha);
|
|
670
|
+
let dY = kc
|
|
671
|
+
* aD(lightLocal, alpha);
|
|
672
|
+
var ah = lightHalf + viewHalf * relativeIor;
|
|
673
|
+
ah *= ah;
|
|
674
|
+
let qo = abs(lightHalf) / max(ah, 1e-8);
|
|
675
|
+
let jB = relativeIor * relativeIor;
|
|
676
|
+
|
|
677
|
+
*pdf = kc * max(0.0, viewHalf) * distribution * qo
|
|
674
678
|
/ max(viewLocal.z, 1e-8);
|
|
675
|
-
return tint * (vec3f(1.0) -
|
|
676
|
-
* abs(
|
|
679
|
+
return tint * (vec3f(1.0) - fresnel) * distribution * dY
|
|
680
|
+
* abs(viewHalf) * qo * jB
|
|
677
681
|
/ max(abs(lightLocal.z * viewLocal.z), 1e-8);
|
|
678
682
|
}
|
|
679
683
|
|
|
680
|
-
fn
|
|
681
|
-
if (HAS_MEDIUM
|
|
684
|
+
fn ba(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 cL(ag: f32) -> f32 {
|
|
692
|
+
return 2.0 * ag / (1.0 + ag);
|
|
689
693
|
}
|
|
690
694
|
|
|
691
|
-
fn
|
|
692
|
-
|
|
695
|
+
fn aq(
|
|
696
|
+
ag: vec3f,
|
|
693
697
|
transmissionWeight: f32
|
|
694
698
|
) -> vec3f {
|
|
695
|
-
let
|
|
696
|
-
/ (vec3f(1.0) +
|
|
699
|
+
let gk = 2.0 * ag
|
|
700
|
+
/ (vec3f(1.0) + ag);
|
|
697
701
|
return mix(
|
|
698
|
-
|
|
699
|
-
|
|
702
|
+
ag,
|
|
703
|
+
gk,
|
|
700
704
|
clamp(transmissionWeight, 0.0, 1.0)
|
|
701
705
|
);
|
|
702
706
|
}
|
|
703
707
|
|
|
704
|
-
fn
|
|
705
|
-
material:
|
|
706
|
-
|
|
707
|
-
|
|
708
|
+
fn bF(
|
|
709
|
+
material: OpenPbrResolvedMaterial,
|
|
710
|
+
J: f32,
|
|
711
|
+
bq: f32
|
|
708
712
|
) -> vec3f {
|
|
709
|
-
let tint =
|
|
713
|
+
let tint = ba(material);
|
|
710
714
|
if (!material.thinWalled) {
|
|
711
715
|
return tint;
|
|
712
716
|
}
|
|
713
|
-
let
|
|
714
|
-
let
|
|
715
|
-
/ max(
|
|
716
|
-
if (
|
|
717
|
+
let iK = max(0.0, 1.0 - J * J);
|
|
718
|
+
let dM = iK
|
|
719
|
+
/ max(bq * bq, 1e-9);
|
|
720
|
+
if (dM >= 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 ad = sqrt(1.0 - dM);
|
|
724
|
+
return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(ad, 1e-5)));
|
|
721
725
|
}
|
|
722
726
|
|
|
723
|
-
fn
|
|
724
|
-
material:
|
|
727
|
+
fn dK(
|
|
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 ad = -lightLocal.z;
|
|
738
|
+
let oO = sampling_dielectric_fresnel(
|
|
735
739
|
viewLocal.z,
|
|
736
740
|
material.relativeIor
|
|
737
741
|
);
|
|
738
|
-
*pdf =
|
|
739
|
-
return vec3f(1.0 -
|
|
742
|
+
*pdf = ad * INVPI;
|
|
743
|
+
return vec3f(1.0 - oO) * INVPI;
|
|
740
744
|
}
|
|
741
745
|
|
|
742
|
-
fn
|
|
746
|
+
fn dQ(prepared: ptr<function, OpenPbrPreparedBsdf>) {
|
|
743
747
|
|
|
744
748
|
|
|
745
|
-
let
|
|
749
|
+
let sJ = 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 lobe = 1; lobe < sJ; lobe++) {
|
|
752
|
+
total += (*prepared).probabilities[lobe];
|
|
749
753
|
}
|
|
750
754
|
if (total <= 1e-8) {
|
|
751
|
-
for (var
|
|
752
|
-
(*prepared).probabilities[
|
|
755
|
+
for (var lobe = 0; lobe < sJ; lobe++) {
|
|
756
|
+
(*prepared).probabilities[lobe] = 0.0;
|
|
753
757
|
}
|
|
754
758
|
return;
|
|
755
759
|
}
|
|
756
|
-
let
|
|
757
|
-
for (var
|
|
758
|
-
(*prepared).probabilities[
|
|
760
|
+
let oZ = 1.0 / total;
|
|
761
|
+
for (var lobe = 0; lobe < sJ; lobe++) {
|
|
762
|
+
(*prepared).probabilities[lobe] *= oZ;
|
|
759
763
|
}
|
|
760
764
|
}
|
|
761
765
|
|
|
762
766
|
|
|
763
767
|
|
|
764
|
-
fn
|
|
768
|
+
fn bI(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 fJ = mix(f0, vec3f(1.0),
|
|
773
|
-
let b = fJ * (vec3f(1.0) - tint) / (
|
|
774
|
+
fn bL(f0: vec3f, tint: vec3f) -> vec3f {
|
|
775
|
+
let da = 1.0 / 7.0;
|
|
776
|
+
let fJ = mix(f0, vec3f(1.0), aH(da));
|
|
777
|
+
let b = fJ * (vec3f(1.0) - tint) / (da * pow(1.0 - da, 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 cA(material: OpenPbrResolvedMaterial, cosine: f32) -> vec3f {
|
|
784
|
+
if (cosine <= 0.0) { return vec3f(1.0); }
|
|
785
|
+
let lV = sqrt(max(0.0, 1.0 - (1.0 - cosine * cosine) / (material.coatIor * material.coatIor)));
|
|
786
|
+
let uZ = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lV, 1e-5)));
|
|
787
|
+
return mix(vec3f(1.0), uZ, material.coatWeight);
|
|
784
788
|
}
|
|
785
789
|
|
|
786
|
-
fn
|
|
790
|
+
fn gn(material: OpenPbrResolvedMaterial, cosine: f32) -> f32 {
|
|
787
791
|
if (material.coatRoughness <= ROUGHNESS_MIN) {
|
|
788
|
-
return
|
|
792
|
+
return ae(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 - ar(material.coatIor,
|
|
797
|
+
material.coatRoughness * material.coatRoughness, cosine), 0.0, 1.0);
|
|
794
798
|
}
|
|
795
799
|
|
|
796
|
-
fn
|
|
800
|
+
fn gX(prepared: OpenPbrPreparedBsdf) -> 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 fP =
|
|
803
|
-
let
|
|
804
|
-
let
|
|
805
|
-
let
|
|
806
|
-
let ks =
|
|
805
|
+
let vU = dielectric * material.transmissionWeight;
|
|
806
|
+
let fP = bI(prepared.specularEtaTOverEtaI);
|
|
807
|
+
let lg = bI(1.0 / prepared.transmissionReflectionIor);
|
|
808
|
+
let qA = clamp(opaque * fP + (sss + vU) * lg + material.baseMetalness, 0.0, 1.0);
|
|
809
|
+
let jt = mix(1.0, material.specularRoughness, qA);
|
|
810
|
+
let ks = bI(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 *
|
|
812
|
+
let k = mix(ks, kr, jt);
|
|
813
|
+
let eb = material.baseMetalness * material.specularWeight * bL(material.baseWeight * material.baseColor, material.specularColor)
|
|
810
814
|
+ opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), fP)
|
|
811
|
-
+ sss * material.subsurfaceColor + vec3f(
|
|
812
|
-
let
|
|
813
|
-
return mix(vec3f(1.0),
|
|
815
|
+
+ sss * material.subsurfaceColor + vec3f(vU);
|
|
816
|
+
let rV = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
|
|
817
|
+
return mix(vec3f(1.0), rV, material.coatWeight * material.coatDarkening);
|
|
814
818
|
}
|
|
815
819
|
|
|
816
|
-
fn
|
|
820
|
+
fn cm(prepared: OpenPbrPreparedBsdf, lF: 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 cA(prepared.material, -lF);
|
|
821
825
|
}
|
|
822
826
|
|
|
823
|
-
return prepared.coatBaseScale *
|
|
827
|
+
return prepared.coatBaseScale * cA(prepared.material, lF);
|
|
824
828
|
}
|
|
825
829
|
|
|
826
830
|
|
|
827
831
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
828
|
-
fn
|
|
832
|
+
fn dk(fallback: OpenPbrBasis, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> OpenPbrBasis {
|
|
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 bV(
|
|
844
848
|
tangent: vec3f,
|
|
845
|
-
material:
|
|
846
|
-
|
|
849
|
+
material: OpenPbrResolvedMaterial,
|
|
850
|
+
bD: vec3f,
|
|
847
851
|
normal: vec3f
|
|
848
|
-
) ->
|
|
849
|
-
var prepared:
|
|
852
|
+
) -> OpenPbrPreparedBsdf {
|
|
853
|
+
var prepared: OpenPbrPreparedBsdf;
|
|
850
854
|
prepared.material = material;
|
|
851
|
-
prepared.basis =
|
|
855
|
+
prepared.basis = ff(
|
|
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 = ff(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 = dk(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 = dk(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, bD);
|
|
881
|
+
${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bD);` : ''}
|
|
878
882
|
prepared.diffuseColor = material.baseColor;
|
|
879
883
|
|
|
880
|
-
let
|
|
881
|
-
let
|
|
884
|
+
let cu = 1.0 - material.baseMetalness;
|
|
885
|
+
let dJ = cu
|
|
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] = cu;
|
|
892
|
+
prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cu
|
|
889
893
|
* material.transmissionWeight;
|
|
890
|
-
prepared.weights[OPENPBR_LOBE_DIFFUSE] =
|
|
894
|
+
prepared.weights[OPENPBR_LOBE_DIFFUSE] = dJ
|
|
891
895
|
* (1.0 - material.subsurfaceWeight) * material.baseWeight;
|
|
892
|
-
prepared.weights[OPENPBR_LOBE_SUBSURFACE] =
|
|
896
|
+
prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dJ
|
|
893
897
|
* material.subsurfaceWeight;
|
|
894
898
|
|
|
895
|
-
prepared.specularEtaTOverEtaI =
|
|
899
|
+
prepared.specularEtaTOverEtaI = bb(
|
|
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 bX = 1.0;
|
|
910
|
+
if (!material.inside) { bX = mix(1.0, material.coatIor, material.coatWeight); }
|
|
911
|
+
let bn = bX * bb(
|
|
912
|
+
material.specularIor / bX, material.specularWeight);
|
|
913
|
+
var eo = bn / bX;
|
|
914
|
+
if ((bX > bn) & (bn >= 1.0)) {
|
|
915
|
+
eo = 1.0 / eo;
|
|
916
|
+
}
|
|
917
|
+
prepared.specularEtaTOverEtaI = eo;
|
|
918
|
+
prepared.transmissionReflectionIor = 1.0 / eo;
|
|
919
|
+
prepared.refractionEtaTOverEtaI = bn;
|
|
916
920
|
if (material.inside) {
|
|
917
|
-
prepared.refractionEtaTOverEtaI = 1.0 /
|
|
918
|
-
prepared.transmissionReflectionIor =
|
|
921
|
+
prepared.refractionEtaTOverEtaI = 1.0 / bn;
|
|
922
|
+
prepared.transmissionReflectionIor = bn;
|
|
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 ag = ae(
|
|
941
945
|
viewCosine,
|
|
942
946
|
1.0 / prepared.specularEtaTOverEtaI
|
|
943
947
|
);
|
|
944
|
-
let
|
|
945
|
-
|
|
948
|
+
let fu = material.specularColor * select(
|
|
949
|
+
ag,
|
|
946
950
|
mix(
|
|
947
|
-
|
|
948
|
-
|
|
951
|
+
ag,
|
|
952
|
+
cL(ag),
|
|
949
953
|
material.transmissionWeight
|
|
950
954
|
),
|
|
951
955
|
material.thinWalled
|
|
952
956
|
);
|
|
953
|
-
let
|
|
957
|
+
let hS = material.specularWeight * openpbr_metal_fresnel(
|
|
954
958
|
viewCosine,
|
|
955
959
|
material.baseWeight * material.baseColor,
|
|
956
960
|
material.specularColor
|
|
957
961
|
);
|
|
958
|
-
let
|
|
959
|
-
|
|
960
|
-
|
|
962
|
+
let eI = select(
|
|
963
|
+
ae(viewCosine, prepared.transmissionReflectionIor),
|
|
964
|
+
cL(ae(viewCosine, prepared.transmissionReflectionIor)),
|
|
961
965
|
material.thinWalled
|
|
962
966
|
);
|
|
963
|
-
let
|
|
967
|
+
let gK = bF(
|
|
964
968
|
material,
|
|
965
969
|
viewCosine,
|
|
966
970
|
prepared.refractionEtaTOverEtaI
|
|
967
971
|
);
|
|
968
|
-
let
|
|
972
|
+
let ir = ar(
|
|
969
973
|
prepared.specularEtaTOverEtaI,
|
|
970
974
|
prepared.specularAlpha,
|
|
971
975
|
viewCosine
|
|
972
976
|
);
|
|
973
|
-
let
|
|
977
|
+
let gq = cj(
|
|
974
978
|
prepared.specularEtaTOverEtaI,
|
|
975
979
|
prepared.specularAlpha
|
|
976
980
|
);
|
|
977
|
-
prepared.diffuseSpecularEnergyCompensation =
|
|
978
|
-
/ max(
|
|
981
|
+
prepared.diffuseSpecularEnergyCompensation = ir
|
|
982
|
+
/ max(gq, 1e-12);
|
|
979
983
|
|
|
980
984
|
prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
|
|
981
|
-
*
|
|
982
|
-
* max(
|
|
985
|
+
* aB(material.fuzzColor)
|
|
986
|
+
* max(aQ(
|
|
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 kO = gn(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
|
|
995
|
+
prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kO;
|
|
996
|
+
prepared.coatBaseScale = cA(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
|
|
997
|
+
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kO) * gX(prepared);
|
|
994
998
|
}
|
|
995
999
|
prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
|
|
996
|
-
*
|
|
1000
|
+
* aB(hS);
|
|
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 hI = bL(material.baseWeight * material.baseColor, material.specularColor);
|
|
1008
|
+
prepared.metalMsScale = material.specularWeight * hI * hI;
|
|
1009
|
+
let qF = aR(prepared.specularAlpha, viewCosine);
|
|
1010
|
+
prepared.metalMsFactor = qF / max(cl(prepared.specularAlpha), 1e-12);
|
|
1011
|
+
let fe = prepared.weights[OPENPBR_LOBE_METAL] * aB(prepared.metalMsScale) * qF;
|
|
1012
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] += fe;
|
|
1013
|
+
prepared.metalMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1010
1014
|
}
|
|
1011
1015
|
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
|
|
1012
|
-
*
|
|
1016
|
+
* aB(fu);
|
|
1013
1017
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1014
|
-
* (1.0 -
|
|
1015
|
-
*
|
|
1018
|
+
* (1.0 - eI)
|
|
1019
|
+
* aB(gK);
|
|
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 lU = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
|
|
1035
|
+
prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lU;
|
|
1036
|
+
prepared.dielectricMsTransmissionScale = gK * 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 = bU(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
|
|
1039
|
+
prepared.dielectricMsViewLoss = aV(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
|
|
1040
|
+
let oG = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
|
|
1041
|
+
let fe = aB(oG) * prepared.dielectricMsViewLoss;
|
|
1042
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fe;
|
|
1043
|
+
prepared.dielectricMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1040
1044
|
}
|
|
1041
1045
|
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] = prepared.weights[OPENPBR_LOBE_DIFFUSE]
|
|
1042
|
-
*
|
|
1046
|
+
* aB(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 - eI)
|
|
1050
|
+
* aB(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 lD = 0.02 * bJ(material.thinFilmThickness, material.thinFilmWeight);
|
|
1056
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lD);
|
|
1057
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lD);
|
|
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 gr = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
|
|
1061
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] *= gr;
|
|
1062
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gr;
|
|
1063
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gr;
|
|
1064
|
+
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gr;
|
|
1065
|
+
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gr;
|
|
1062
1066
|
}
|
|
1063
|
-
|
|
1067
|
+
dQ(&prepared);
|
|
1064
1068
|
return prepared;
|
|
1065
1069
|
}
|
|
1066
1070
|
|
|
1067
1071
|
|
|
1068
|
-
fn
|
|
1072
|
+
fn cK(prepared: OpenPbrPreparedBsdf, cosine: f32, reflection: bool) -> f32 {
|
|
1069
1073
|
if (prepared.material.coatWeight <= 0.0) {
|
|
1070
|
-
return
|
|
1074
|
+
return ae(cosine, prepared.material.relativeIor);
|
|
1071
1075
|
}
|
|
1072
|
-
let
|
|
1073
|
-
if (!reflection) { return
|
|
1074
|
-
let
|
|
1075
|
-
let
|
|
1076
|
-
return mix(
|
|
1076
|
+
let kA = ae(cosine, prepared.transmissionReflectionIor);
|
|
1077
|
+
if (!reflection) { return kA; }
|
|
1078
|
+
let nY = ae(cosine, 1.0 / prepared.specularEtaTOverEtaI);
|
|
1079
|
+
let sN = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
|
|
1080
|
+
return mix(nY, kA, sN);
|
|
1077
1081
|
}
|
|
1078
1082
|
|
|
1079
|
-
fn
|
|
1080
|
-
prepared:
|
|
1083
|
+
fn nh(
|
|
1084
|
+
prepared: OpenPbrPreparedBsdf,
|
|
1081
1085
|
lightDirection: vec3f,
|
|
1082
|
-
|
|
1086
|
+
gL: 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 aa: vec3f;
|
|
1097
1101
|
if (reflection) {
|
|
1098
|
-
|
|
1102
|
+
aa = normalize(lightLocal + viewLocal);
|
|
1099
1103
|
}
|
|
1100
1104
|
else {
|
|
1101
|
-
|
|
1105
|
+
aa = normalize(lightLocal + viewLocal * material.relativeIor);
|
|
1102
1106
|
}
|
|
1103
|
-
if (
|
|
1104
|
-
|
|
1107
|
+
if (aa.z < 0.0) {
|
|
1108
|
+
aa = -aa;
|
|
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
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
var wp = vec3f(0.0);
|
|
1148
|
-
let L = select(jn, bQ, kT == 1u);
|
|
1113
|
+
var lobePdf = 0.0;
|
|
1114
|
+
let mA = gL < 0;
|
|
1115
|
+
let wP = mA | (gL == OPENPBR_LOBE_FUZZ);
|
|
1116
|
+
let uE = mA | (gL == OPENPBR_LOBE_COAT);
|
|
1117
|
+
let tn = mA | (gL == OPENPBR_LOBE_METAL);
|
|
1118
|
+
let qW = mA | (gL == OPENPBR_LOBE_SPECULAR);
|
|
1119
|
+
let jJ = mA | (gL == OPENPBR_LOBE_TRANSMISSION);
|
|
1120
|
+
let uJ = mA | (gL == OPENPBR_LOBE_DIFFUSE);
|
|
1121
|
+
let pG = mA | (gL == OPENPBR_LOBE_SUBSURFACE);
|
|
1122
|
+
let viewHalf = abs(dot(viewLocal, aa));
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
var thinWallHalf = aa;
|
|
1127
|
+
var dielectricViewHalf = viewHalf;
|
|
1128
|
+
if (!reflection & material.thinWalled) {
|
|
1129
|
+
thinWallHalf = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
|
|
1130
|
+
if (thinWallHalf.z < 0.0) { thinWallHalf = -thinWallHalf; }
|
|
1131
|
+
dielectricViewHalf = abs(dot(viewLocal, thinWallHalf));
|
|
1132
|
+
}
|
|
1133
|
+
let mP =
|
|
1134
|
+
(reflection & (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) |
|
|
1135
|
+
(!reflection & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ);
|
|
1136
|
+
let ra = reflection & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn;
|
|
1137
|
+
var oq: array<vec3f, 2>;
|
|
1138
|
+
if (mP) {
|
|
1139
|
+
oq[0] = vec3f(cK(prepared, dielectricViewHalf, reflection));
|
|
1140
|
+
}
|
|
1141
|
+
if (ra) {
|
|
1142
|
+
oq[1] = openpbr_metal_fresnel(viewHalf, material.baseWeight * material.baseColor, material.specularColor);
|
|
1143
|
+
}
|
|
1144
|
+
if (HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
|
|
1145
|
+
let vV = vec3f(620.0, 540.0, 450.0);
|
|
1146
|
+
|
|
1147
|
+
for (var lf = 0u; lf < (rtUniform.loopUnrollGuard >> 1u); lf++) {
|
|
1148
|
+
if (!select(mP, ra, lf == 1u)) { continue; }
|
|
1149
|
+
var wY = vec3f(0.0);
|
|
1150
|
+
let J = select(dielectricViewHalf, viewHalf, lf == 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 (lf == 1u) {
|
|
1154
|
+
ior = cJ(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
|
|
1153
1155
|
}
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
+
wY[channel] = ap(J,
|
|
1157
|
+
vV[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
|
|
1156
1158
|
}
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
+
oq[lf] = mix(oq[lf], wY,
|
|
1160
|
+
bJ(material.thinFilmThickness, material.thinFilmWeight));
|
|
1159
1161
|
}
|
|
1160
1162
|
}
|
|
1161
|
-
let
|
|
1163
|
+
let ef = oq[0];
|
|
1162
1164
|
let diffuseSpecularEnergyCompensation =
|
|
1163
1165
|
prepared.diffuseSpecularEnergyCompensation
|
|
1164
|
-
*
|
|
1166
|
+
* ar(
|
|
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) & uJ) {
|
|
1178
|
+
response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * bw(
|
|
1177
1179
|
material,
|
|
1178
1180
|
prepared.diffuseColor,
|
|
1179
1181
|
viewLocal,
|
|
1180
1182
|
lightLocal,
|
|
1181
1183
|
diffuseSpecularEnergyCompensation,
|
|
1182
|
-
&
|
|
1184
|
+
&lobePdf
|
|
1183
1185
|
);
|
|
1184
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *
|
|
1186
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * lobePdf;
|
|
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 & pG) {
|
|
1190
|
+
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * bw(
|
|
1190
1191
|
material,
|
|
1191
1192
|
material.subsurfaceColor,
|
|
1192
1193
|
viewLocal,
|
|
1193
1194
|
lightLocal,
|
|
1194
1195
|
diffuseSpecularEnergyCompensation,
|
|
1195
|
-
&
|
|
1196
|
+
&lobePdf
|
|
1196
1197
|
);
|
|
1197
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 *
|
|
1198
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * lobePdf;
|
|
1198
1199
|
}
|
|
1199
1200
|
|
|
1200
|
-
if (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0
|
|
1201
|
-
var
|
|
1201
|
+
if ((prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) {
|
|
1202
|
+
var ck = ef;
|
|
1202
1203
|
if (material.thinWalled) {
|
|
1203
|
-
|
|
1204
|
-
|
|
1204
|
+
ck = aq(
|
|
1205
|
+
ck,
|
|
1205
1206
|
material.transmissionWeight
|
|
1206
1207
|
);
|
|
1207
1208
|
}
|
|
1208
|
-
let
|
|
1209
|
-
response += prepared.weights[OPENPBR_LOBE_SPECULAR] *
|
|
1209
|
+
let fresnel = material.specularColor * ck;
|
|
1210
|
+
response += prepared.weights[OPENPBR_LOBE_SPECULAR] * aj(
|
|
1210
1211
|
material,
|
|
1211
1212
|
viewLocal,
|
|
1212
1213
|
lightLocal,
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
&
|
|
1214
|
+
aa,
|
|
1215
|
+
fresnel,
|
|
1216
|
+
&lobePdf
|
|
1216
1217
|
);
|
|
1217
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] *
|
|
1218
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * lobePdf;
|
|
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 fresnel = material.specularWeight * oq[1];
|
|
1223
|
+
response += prepared.weights[OPENPBR_LOBE_METAL] * aj(
|
|
1223
1224
|
material,
|
|
1224
1225
|
viewLocal,
|
|
1225
1226
|
lightLocal,
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
&
|
|
1227
|
+
aa,
|
|
1228
|
+
fresnel,
|
|
1229
|
+
&lobePdf
|
|
1229
1230
|
);
|
|
1230
1231
|
if (prepared.metalMsFactor > 0.0) {
|
|
1231
|
-
let
|
|
1232
|
-
response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale *
|
|
1233
|
-
|
|
1232
|
+
let cv = min(prepared.metalMsFactor * aR(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
|
|
1233
|
+
response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * cv * INVPI;
|
|
1234
|
+
lobePdf = mix(lobePdf, 0.5 * INVPI, prepared.metalMsProbability);
|
|
1234
1235
|
}
|
|
1235
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_METAL] *
|
|
1236
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * lobePdf;
|
|
1236
1237
|
}
|
|
1237
1238
|
}
|
|
1238
1239
|
else {
|
|
1239
|
-
let
|
|
1240
|
-
if (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0
|
|
1240
|
+
let fresnel = ef;
|
|
1241
|
+
if ((prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ) {
|
|
1241
1242
|
if (material.thinWalled) {
|
|
1242
|
-
let
|
|
1243
|
-
let
|
|
1244
|
-
|
|
1243
|
+
let lm = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1244
|
+
let gk = aq(
|
|
1245
|
+
ef,
|
|
1245
1246
|
1.0
|
|
1246
1247
|
);
|
|
1247
|
-
let tint =
|
|
1248
|
+
let tint = bF(
|
|
1248
1249
|
material,
|
|
1249
1250
|
abs(viewLocal.z),
|
|
1250
1251
|
prepared.refractionEtaTOverEtaI
|
|
1251
1252
|
);
|
|
1252
1253
|
response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1253
|
-
*
|
|
1254
|
+
* aj(
|
|
1254
1255
|
material,
|
|
1255
1256
|
viewLocal,
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
tint * (vec3f(1.0) -
|
|
1259
|
-
&
|
|
1257
|
+
lm,
|
|
1258
|
+
thinWallHalf,
|
|
1259
|
+
tint * (vec3f(1.0) - gk),
|
|
1260
|
+
&lobePdf
|
|
1260
1261
|
);
|
|
1261
1262
|
}
|
|
1262
1263
|
else {
|
|
1263
1264
|
response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1264
|
-
*
|
|
1265
|
+
* dc(
|
|
1265
1266
|
material,
|
|
1266
1267
|
material.relativeIor,
|
|
1267
|
-
|
|
1268
|
+
ba(material),
|
|
1268
1269
|
viewLocal,
|
|
1269
1270
|
lightLocal,
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
&
|
|
1271
|
+
aa,
|
|
1272
|
+
fresnel,
|
|
1273
|
+
&lobePdf
|
|
1273
1274
|
);
|
|
1274
1275
|
}
|
|
1275
1276
|
if (prepared.dielectricMsProbability > 0.0) {
|
|
1276
|
-
|
|
1277
|
+
lobePdf *= 1.0 - prepared.dielectricMsProbability;
|
|
1277
1278
|
}
|
|
1278
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *
|
|
1279
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * lobePdf;
|
|
1279
1280
|
}
|
|
1280
|
-
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0
|
|
1281
|
+
if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & pG) {
|
|
1281
1282
|
if (material.thinWalled) {
|
|
1282
|
-
let
|
|
1283
|
+
let oQ = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1283
1284
|
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
|
|
1284
|
-
*
|
|
1285
|
+
* bw(
|
|
1285
1286
|
material,
|
|
1286
1287
|
material.subsurfaceColor,
|
|
1287
1288
|
viewLocal,
|
|
1288
|
-
|
|
1289
|
+
oQ,
|
|
1289
1290
|
diffuseSpecularEnergyCompensation,
|
|
1290
|
-
&
|
|
1291
|
+
&lobePdf
|
|
1291
1292
|
);
|
|
1292
|
-
|
|
1293
|
+
lobePdf *= 0.5;
|
|
1293
1294
|
}
|
|
1294
1295
|
else {
|
|
1295
|
-
response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] *
|
|
1296
|
+
response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dK(
|
|
1296
1297
|
material,
|
|
1297
1298
|
viewLocal,
|
|
1298
1299
|
lightLocal,
|
|
1299
|
-
&
|
|
1300
|
+
&lobePdf
|
|
1300
1301
|
);
|
|
1301
1302
|
}
|
|
1302
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *
|
|
1303
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * lobePdf;
|
|
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) & jJ) {
|
|
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 iZ = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
|
|
1315
|
+
let oP = prepared.dielectricMsViewLoss * aV(ior, prepared.specularAlpha, cosine)
|
|
1316
|
+
/ max(aY(ior, prepared.specularAlpha), 1e-12);
|
|
1317
|
+
let cv = min(oP * iZ, 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 * cv * INVPI;
|
|
1320
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * iZ * 0.5 * INVPI;
|
|
1320
1321
|
}
|
|
1321
1322
|
}
|
|
1322
1323
|
|
|
1323
1324
|
${hasCoatNormals ? /* wgsl */ ` } ` : ''}
|
|
1324
1325
|
if (material.coatWeight > 0.0) {
|
|
1325
|
-
response *=
|
|
1326
|
+
response *= cm(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 dG = viewLocal;
|
|
1336
|
+
var kQ = lightLocal;
|
|
1337
|
+
var coatHalf = aa;
|
|
1338
|
+
var coatViewHalf = viewHalf;
|
|
1338
1339
|
if (prepared.directionFrames) {
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
if (
|
|
1343
|
-
|
|
1340
|
+
dG = ${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
|
+
kQ = openpbr_to_local(prepared.coatBasis, lightDirection);
|
|
1342
|
+
coatHalf = normalize(kQ + dG);
|
|
1343
|
+
if (coatHalf.z < 0.0) { coatHalf = -coatHalf; }
|
|
1344
|
+
coatViewHalf = abs(dot(dG, coatHalf));
|
|
1344
1345
|
}
|
|
1345
1346
|
|
|
1346
|
-
let
|
|
1347
|
-
|
|
1347
|
+
let lB = vec3f(ae(
|
|
1348
|
+
coatViewHalf,
|
|
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 dF = material;
|
|
1352
|
+
let jD = aL(material.coatRoughness, material.coatAnisotropy);
|
|
1353
|
+
dF.alphaX = jD.x;
|
|
1354
|
+
dF.alphaY = jD.y;
|
|
1355
|
+
if (uE) {
|
|
1356
|
+
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
|
|
1357
|
+
dF,
|
|
1358
|
+
dG,
|
|
1359
|
+
kQ,
|
|
1360
|
+
coatHalf,
|
|
1361
|
+
lB,
|
|
1362
|
+
&lobePdf
|
|
1362
1363
|
);
|
|
1363
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] *
|
|
1364
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
|
|
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 lB = vec3f(ae(
|
|
1370
|
+
viewHalf,
|
|
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 dF = material;
|
|
1374
|
+
let jD = aL(material.coatRoughness, material.coatAnisotropy);
|
|
1375
|
+
dF.alphaX = jD.x;
|
|
1376
|
+
dF.alphaY = jD.y;
|
|
1377
|
+
if (uE) {
|
|
1378
|
+
response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
|
|
1379
|
+
dF,
|
|
1379
1380
|
viewLocal,
|
|
1380
1381
|
lightLocal,
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
&
|
|
1382
|
+
aa,
|
|
1383
|
+
lB,
|
|
1384
|
+
&lobePdf
|
|
1384
1385
|
);
|
|
1385
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] *
|
|
1386
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
|
|
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 rt = aQ(
|
|
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] * rt)
|
|
1398
1399
|
);
|
|
1399
|
-
if (
|
|
1400
|
-
response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} *
|
|
1400
|
+
if (wP) {
|
|
1401
|
+
response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * kg(
|
|
1401
1402
|
material,
|
|
1402
1403
|
viewLocal,
|
|
1403
1404
|
lightLocal,
|
|
1404
|
-
&
|
|
1405
|
+
&lobePdf
|
|
1405
1406
|
);
|
|
1406
|
-
*pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] *
|
|
1407
|
+
*pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * lobePdf;
|
|
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
|
-
prepared:
|
|
1414
|
+
fn openpbr_eval_prepared(
|
|
1415
|
+
prepared: OpenPbrPreparedBsdf,
|
|
1415
1416
|
lightDirection: vec3f,
|
|
1416
1417
|
pdf: ptr<function, f32>
|
|
1417
1418
|
) -> vec3f {
|
|
1418
|
-
return
|
|
1419
|
+
return nh(prepared, lightDirection, -1, pdf);
|
|
1419
1420
|
}
|
|
1420
1421
|
|
|
1421
1422
|
|
|
1422
1423
|
|
|
1423
1424
|
|
|
1424
1425
|
|
|
1425
|
-
fn
|
|
1426
|
+
fn sj(
|
|
1426
1427
|
tangent: vec3f,
|
|
1427
|
-
material:
|
|
1428
|
-
|
|
1428
|
+
material: OpenPbrResolvedMaterial,
|
|
1429
|
+
bD: vec3f,
|
|
1429
1430
|
normal: vec3f,
|
|
1430
1431
|
lightDirection: vec3f,
|
|
1431
1432
|
pdf: ptr<function, f32>
|
|
1432
1433
|
) -> vec3f {
|
|
1433
|
-
let prepared =
|
|
1434
|
+
let prepared = bV(
|
|
1434
1435
|
tangent,
|
|
1435
1436
|
material,
|
|
1436
|
-
|
|
1437
|
+
bD,
|
|
1437
1438
|
normal
|
|
1438
1439
|
);
|
|
1439
|
-
return
|
|
1440
|
+
return openpbr_eval_prepared(prepared, lightDirection, pdf);
|
|
1440
1441
|
}
|
|
1441
1442
|
|
|
1442
1443
|
|
|
1443
1444
|
|
|
1444
1445
|
|
|
1445
1446
|
|
|
1446
|
-
fn
|
|
1447
|
-
prepared:
|
|
1447
|
+
fn iW(
|
|
1448
|
+
prepared: OpenPbrPreparedBsdf, cc: vec3f,
|
|
1448
1449
|
lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
|
|
1449
|
-
|
|
1450
|
-
|
|
1450
|
+
aO: ptr<function, f32>, bk: ptr<function, bool>,
|
|
1451
|
+
cC: ptr<function, bool>, bh: 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 cp = cc.x;
|
|
1456
|
+
let fp = cc.y;
|
|
1457
|
+
let bl = cc.z;
|
|
1457
1458
|
*isTransmissionEvent = false;
|
|
1458
|
-
*
|
|
1459
|
-
*
|
|
1460
|
-
*
|
|
1461
|
-
*
|
|
1459
|
+
*aO = 1.0;
|
|
1460
|
+
*bk = false;
|
|
1461
|
+
*cC = false;
|
|
1462
|
+
*bh = 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 ((bl < cdf[OPENPBR_LOBE_FUZZ]) | (
|
|
1474
|
+
(bl >= cdf[OPENPBR_LOBE_TRANSMISSION]) & (bl < cdf[OPENPBR_LOBE_DIFFUSE])
|
|
1477
1475
|
)) {
|
|
1478
|
-
let
|
|
1479
|
-
*
|
|
1476
|
+
let qy = bl < cdf[OPENPBR_LOBE_FUZZ];
|
|
1477
|
+
*aO = select(
|
|
1480
1478
|
1.0,
|
|
1481
1479
|
material.fuzzRoughness,
|
|
1482
|
-
|
|
1480
|
+
qy
|
|
1483
1481
|
);
|
|
1484
|
-
*
|
|
1485
|
-
*
|
|
1482
|
+
*cC = !qy;
|
|
1483
|
+
*bh = select(
|
|
1486
1484
|
u32(OPENPBR_LOBE_DIFFUSE),
|
|
1487
1485
|
u32(OPENPBR_LOBE_FUZZ),
|
|
1488
|
-
|
|
1486
|
+
qy
|
|
1489
1487
|
);
|
|
1490
|
-
lightLocal =
|
|
1488
|
+
lightLocal = aM(vec2f(cp, fp));
|
|
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 (bl < cdf[OPENPBR_LOBE_COAT]) {
|
|
1492
|
+
*aO = material.coatRoughness;
|
|
1493
|
+
*bk = true;
|
|
1494
|
+
*bh = u32(OPENPBR_LOBE_COAT);
|
|
1495
|
+
var dG = viewLocal;
|
|
1496
|
+
if (prepared.directionFrames) { dG = ${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 aa = aA(
|
|
1498
|
+
dG,
|
|
1499
|
+
|
|
1500
|
+
aL(material.coatRoughness, material.coatAnisotropy),
|
|
1501
|
+
vec2f(cp, fp)
|
|
1504
1502
|
);
|
|
1505
|
-
if (
|
|
1506
|
-
|
|
1503
|
+
if (aa.z < 0.0) {
|
|
1504
|
+
aa = -aa;
|
|
1507
1505
|
}
|
|
1508
|
-
lightLocal = normalize(reflect(-
|
|
1506
|
+
lightLocal = normalize(reflect(-dG, aa));
|
|
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 (bl < cdf[OPENPBR_LOBE_COAT]) {
|
|
1518
|
+
*aO = material.coatRoughness;
|
|
1519
|
+
*bk = true;
|
|
1520
|
+
*bh = u32(OPENPBR_LOBE_COAT);
|
|
1521
|
+
var aa = aA(
|
|
1524
1522
|
viewLocal,
|
|
1525
1523
|
|
|
1526
|
-
|
|
1527
|
-
vec2f(
|
|
1524
|
+
aL(material.coatRoughness, material.coatAnisotropy),
|
|
1525
|
+
vec2f(cp, fp)
|
|
1528
1526
|
);
|
|
1529
|
-
if (
|
|
1530
|
-
|
|
1527
|
+
if (aa.z < 0.0) {
|
|
1528
|
+
aa = -aa;
|
|
1531
1529
|
}
|
|
1532
|
-
lightLocal = normalize(reflect(-viewLocal,
|
|
1530
|
+
lightLocal = normalize(reflect(-viewLocal, aa));
|
|
1533
1531
|
}
|
|
1534
1532
|
`}
|
|
1535
|
-
else if (
|
|
1536
|
-
*
|
|
1537
|
-
*
|
|
1538
|
-
*
|
|
1533
|
+
else if (bl < cdf[OPENPBR_LOBE_SPECULAR]) {
|
|
1534
|
+
*aO = material.specularRoughness;
|
|
1535
|
+
*bk = true;
|
|
1536
|
+
*bh = select(
|
|
1539
1537
|
u32(OPENPBR_LOBE_SPECULAR),
|
|
1540
1538
|
u32(OPENPBR_LOBE_METAL),
|
|
1541
|
-
|
|
1539
|
+
bl < cdf[OPENPBR_LOBE_METAL]
|
|
1542
1540
|
);
|
|
1543
|
-
let
|
|
1544
|
-
let
|
|
1545
|
-
if (
|
|
1546
|
-
let z =
|
|
1547
|
-
let
|
|
1548
|
-
let
|
|
1549
|
-
lightLocal = vec3f(
|
|
1541
|
+
let uU = bl < cdf[OPENPBR_LOBE_METAL];
|
|
1542
|
+
let sK = (bl - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1543
|
+
if (uU & (sK < prepared.metalMsProbability)) {
|
|
1544
|
+
let z = cp;
|
|
1545
|
+
let dr = sqrt(max(0.0, 1.0 - z * z));
|
|
1546
|
+
let azimuth = TWOPI * fp;
|
|
1547
|
+
lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
|
|
1550
1548
|
}
|
|
1551
1549
|
else {
|
|
1552
|
-
var
|
|
1550
|
+
var aa = aA(
|
|
1553
1551
|
viewLocal,
|
|
1554
1552
|
vec2f(material.alphaX, material.alphaY),
|
|
1555
|
-
vec2f(
|
|
1553
|
+
vec2f(cp, fp)
|
|
1556
1554
|
);
|
|
1557
|
-
if (
|
|
1558
|
-
|
|
1555
|
+
if (aa.z < 0.0) {
|
|
1556
|
+
aa = -aa;
|
|
1559
1557
|
}
|
|
1560
|
-
lightLocal = normalize(reflect(-viewLocal,
|
|
1558
|
+
lightLocal = normalize(reflect(-viewLocal, aa));
|
|
1561
1559
|
}
|
|
1562
1560
|
}
|
|
1563
|
-
else if (
|
|
1564
|
-
*
|
|
1565
|
-
*
|
|
1561
|
+
else if (bl < cdf[OPENPBR_LOBE_TRANSMISSION]) {
|
|
1562
|
+
*aO = material.specularRoughness;
|
|
1563
|
+
*bk = true;
|
|
1566
1564
|
*isTransmissionEvent = true;
|
|
1567
|
-
*
|
|
1565
|
+
*bh = u32(OPENPBR_LOBE_TRANSMISSION);
|
|
1568
1566
|
|
|
1569
1567
|
|
|
1570
|
-
let
|
|
1571
|
-
if (prepared.dielectricMsProbability > 0.0
|
|
1572
|
-
let
|
|
1573
|
-
let
|
|
1568
|
+
let wk = (bl - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1569
|
+
if ((prepared.dielectricMsProbability > 0.0) & (wk < prepared.dielectricMsProbability)) {
|
|
1570
|
+
let iZ = prepared.dielectricMsReflectionRatio;
|
|
1571
|
+
let mv = cp < iZ;
|
|
1574
1572
|
var z: f32;
|
|
1575
|
-
if (
|
|
1576
|
-
else { z = -min((
|
|
1577
|
-
let
|
|
1578
|
-
let
|
|
1579
|
-
lightLocal = vec3f(
|
|
1580
|
-
*isTransmissionEvent = !
|
|
1581
|
-
*
|
|
1573
|
+
if (mv) { z = min(cp / iZ, 0.99999994); }
|
|
1574
|
+
else { z = -min((cp - iZ) / (1.0 - iZ), 0.99999994); }
|
|
1575
|
+
let dr = sqrt(max(0.0, 1.0 - z * z));
|
|
1576
|
+
let azimuth = TWOPI * fp;
|
|
1577
|
+
lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
|
|
1578
|
+
*isTransmissionEvent = !mv;
|
|
1579
|
+
*bh = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), mv);
|
|
1582
1580
|
}
|
|
1583
1581
|
else {
|
|
1584
|
-
var
|
|
1582
|
+
var aa = aA(
|
|
1585
1583
|
viewLocal,
|
|
1586
1584
|
vec2f(material.alphaX, material.alphaY),
|
|
1587
|
-
vec2f(
|
|
1585
|
+
vec2f(cp, fp)
|
|
1588
1586
|
);
|
|
1589
|
-
if (
|
|
1590
|
-
|
|
1587
|
+
if (aa.z < 0.0) {
|
|
1588
|
+
aa = -aa;
|
|
1591
1589
|
}
|
|
1592
1590
|
if (material.thinWalled) {
|
|
1593
|
-
let
|
|
1594
|
-
lightLocal = vec3f(
|
|
1591
|
+
let hX = normalize(reflect(-viewLocal, aa));
|
|
1592
|
+
lightLocal = vec3f(hX.xy, -hX.z);
|
|
1595
1593
|
}
|
|
1596
1594
|
else {
|
|
1597
1595
|
lightLocal = refract(
|
|
1598
1596
|
-viewLocal,
|
|
1599
|
-
|
|
1597
|
+
aa,
|
|
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
|
+
*aO = 1.0;
|
|
1610
|
+
*cC = true;
|
|
1613
1611
|
*isTransmissionEvent = true;
|
|
1614
|
-
*
|
|
1612
|
+
*bh = u32(OPENPBR_LOBE_SUBSURFACE);
|
|
1615
1613
|
if (material.thinWalled) {
|
|
1616
|
-
let
|
|
1617
|
-
if (
|
|
1618
|
-
|
|
1614
|
+
let qD = cp >= 0.5;
|
|
1615
|
+
if (qD) {
|
|
1616
|
+
cp = (cp - 0.5) * 2.0;
|
|
1619
1617
|
}
|
|
1620
1618
|
else {
|
|
1621
|
-
|
|
1619
|
+
cp *= 2.0;
|
|
1622
1620
|
}
|
|
1623
|
-
lightLocal =
|
|
1624
|
-
if (
|
|
1621
|
+
lightLocal = aM(vec2f(cp, fp));
|
|
1622
|
+
if (qD) {
|
|
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 = aM(vec2f(cp, fp));
|
|
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
|
|
1652
|
-
prepared:
|
|
1653
|
-
|
|
1649
|
+
fn dl(
|
|
1650
|
+
prepared: OpenPbrPreparedBsdf,
|
|
1651
|
+
cc: 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
|
+
aO: ptr<function, f32>,
|
|
1656
|
+
bk: ptr<function, bool>,
|
|
1657
|
+
cC: ptr<function, bool>,
|
|
1658
|
+
bh: ptr<function, u32>,
|
|
1659
|
+
marginalPdf: ptr<function, f32>,
|
|
1660
|
+
jU: ptr<function, vec3f>
|
|
1663
1661
|
) -> vec3f {
|
|
1664
1662
|
*pdf = 0.0;
|
|
1665
|
-
*
|
|
1666
|
-
*
|
|
1663
|
+
*marginalPdf = 0.0;
|
|
1664
|
+
*jU = 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 ov = ba(prepared.material)
|
|
1677
|
+
* cm(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
|
+
*marginalPdf = 1.0;
|
|
1680
|
+
*jU = ov;
|
|
1683
1681
|
*isTransmissionEvent = true;
|
|
1684
|
-
*
|
|
1685
|
-
*
|
|
1686
|
-
*
|
|
1687
|
-
*
|
|
1688
|
-
return
|
|
1689
|
-
}
|
|
1690
|
-
if (!
|
|
1691
|
-
isTransmissionEvent,
|
|
1692
|
-
|
|
1693
|
-
let response =
|
|
1694
|
-
*
|
|
1695
|
-
*
|
|
1682
|
+
*aO = 0.0;
|
|
1683
|
+
*bk = true;
|
|
1684
|
+
*cC = false;
|
|
1685
|
+
*bh = u32(OPENPBR_LOBE_TRANSMISSION);
|
|
1686
|
+
return ov;
|
|
1687
|
+
}
|
|
1688
|
+
if (!iW(prepared, cc, lightDirection,
|
|
1689
|
+
isTransmissionEvent, aO, bk,
|
|
1690
|
+
cC, bh)) { return vec3f(0.0); }
|
|
1691
|
+
let response = openpbr_eval_prepared(prepared, *lightDirection, pdf);
|
|
1692
|
+
*marginalPdf = *pdf;
|
|
1693
|
+
*jU = response;
|
|
1696
1694
|
return response;
|
|
1697
1695
|
}
|
|
1698
1696
|
|
|
1699
|
-
fn
|
|
1697
|
+
fn uc(
|
|
1700
1698
|
tangent: vec3f,
|
|
1701
|
-
material:
|
|
1702
|
-
|
|
1703
|
-
|
|
1699
|
+
material: OpenPbrResolvedMaterial,
|
|
1700
|
+
cc: vec3f,
|
|
1701
|
+
bD: 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
|
+
aO: ptr<function, f32>,
|
|
1707
|
+
bk: ptr<function, bool>,
|
|
1708
|
+
cC: ptr<function, bool>,
|
|
1709
|
+
bh: ptr<function, u32>,
|
|
1710
|
+
marginalPdf: ptr<function, f32>
|
|
1713
1711
|
) -> vec3f {
|
|
1714
|
-
let prepared =
|
|
1712
|
+
let prepared = bV(
|
|
1715
1713
|
tangent,
|
|
1716
1714
|
material,
|
|
1717
|
-
|
|
1715
|
+
bD,
|
|
1718
1716
|
normal
|
|
1719
1717
|
);
|
|
1720
|
-
var
|
|
1721
|
-
return
|
|
1718
|
+
var jU = vec3f(0.0);
|
|
1719
|
+
return dl(
|
|
1722
1720
|
prepared,
|
|
1723
|
-
|
|
1721
|
+
cc,
|
|
1724
1722
|
lightDirection,
|
|
1725
1723
|
pdf,
|
|
1726
1724
|
isTransmissionEvent,
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
&
|
|
1725
|
+
aO,
|
|
1726
|
+
bk,
|
|
1727
|
+
cC,
|
|
1728
|
+
bh,
|
|
1729
|
+
marginalPdf,
|
|
1730
|
+
&jU
|
|
1733
1731
|
);
|
|
1734
1732
|
}`;
|
|
1735
1733
|
}
|