Buckets:
| import F_Schlick from './F_Schlick.js'; | |
| import V_GGX_SmithCorrelated from './V_GGX_SmithCorrelated.js'; | |
| import V_GGX_SmithCorrelated_Anisotropic from './V_GGX_SmithCorrelated_Anisotropic.js'; | |
| import D_GGX from './D_GGX.js'; | |
| import D_GGX_Anisotropic from './D_GGX_Anisotropic.js'; | |
| import { transformedNormalView } from '../../accessors/Normal.js'; | |
| import { positionViewDirection } from '../../accessors/Position.js'; | |
| import { iridescence, alphaT, anisotropyT, anisotropyB } from '../../core/PropertyNode.js'; | |
| import { Fn, defined } from '../../tsl/TSLBase.js'; | |
| // GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility | |
| const BRDF_GGX = /*@__PURE__*/ Fn( ( inputs ) => { | |
| const { lightDirection, f0, f90, roughness, f, USE_IRIDESCENCE, USE_ANISOTROPY } = inputs; | |
| const normalView = inputs.normalView || transformedNormalView; | |
| const alpha = roughness.pow2(); // UE4's roughness | |
| const halfDir = lightDirection.add( positionViewDirection ).normalize(); | |
| const dotNL = normalView.dot( lightDirection ).clamp(); | |
| const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV | |
| const dotNH = normalView.dot( halfDir ).clamp(); | |
| const dotVH = positionViewDirection.dot( halfDir ).clamp(); | |
| let F = F_Schlick( { f0, f90, dotVH } ); | |
| let V, D; | |
| if ( defined( USE_IRIDESCENCE ) ) { | |
| F = iridescence.mix( F, f ); | |
| } | |
| if ( defined( USE_ANISOTROPY ) ) { | |
| const dotTL = anisotropyT.dot( lightDirection ); | |
| const dotTV = anisotropyT.dot( positionViewDirection ); | |
| const dotTH = anisotropyT.dot( halfDir ); | |
| const dotBL = anisotropyB.dot( lightDirection ); | |
| const dotBV = anisotropyB.dot( positionViewDirection ); | |
| const dotBH = anisotropyB.dot( halfDir ); | |
| V = V_GGX_SmithCorrelated_Anisotropic( { alphaT, alphaB: alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } ); | |
| D = D_GGX_Anisotropic( { alphaT, alphaB: alpha, dotNH, dotTH, dotBH } ); | |
| } else { | |
| V = V_GGX_SmithCorrelated( { alpha, dotNL, dotNV } ); | |
| D = D_GGX( { alpha, dotNH } ); | |
| } | |
| return F.mul( V ).mul( D ); | |
| } ); // validated | |
| export default BRDF_GGX; | |
Xet Storage Details
- Size:
- 2.07 kB
- Xet hash:
- 5dd0486ea6e8b1ebd7906df623aecb476e5de95be77663cf4055a7b059b47c20
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.