You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
1.1 KiB
34 lines
1.1 KiB
2 years ago
|
import F_Schlick from './F_Schlick.js';
|
||
|
import V_GGX_SmithCorrelated from './V_GGX_SmithCorrelated.js';
|
||
|
import D_GGX from './D_GGX.js';
|
||
|
import {
|
||
|
ShaderNode, dotNV, add, mul, clamp, dot, pow2, normalize,
|
||
|
transformedNormalView, positionViewDirection
|
||
|
} from '../../shadernode/ShaderNodeBaseElements.js';
|
||
|
|
||
|
// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
|
||
|
const BRDF_GGX = new ShaderNode( ( inputs ) => {
|
||
|
|
||
|
const { lightDirection, f0, f90, roughness } = inputs;
|
||
|
|
||
|
const alpha = pow2( roughness ); // UE4's roughness
|
||
|
|
||
|
const halfDir = normalize( add( lightDirection, positionViewDirection ) );
|
||
|
|
||
|
const dotNL = clamp( dot( transformedNormalView, lightDirection ) );
|
||
|
//const dotNV = clamp( dot( transformedNormalView, positionViewDirection ) );
|
||
|
const dotNH = clamp( dot( transformedNormalView, halfDir ) );
|
||
|
const dotVH = clamp( dot( positionViewDirection, halfDir ) );
|
||
|
|
||
|
const F = F_Schlick.call( { f0, f90, dotVH } );
|
||
|
|
||
|
const V = V_GGX_SmithCorrelated.call( { alpha, dotNL, dotNV } );
|
||
|
|
||
|
const D = D_GGX.call( { alpha, dotNH } );
|
||
|
|
||
|
return mul( F, mul( V, D ) );
|
||
|
|
||
|
} ); // validated
|
||
|
|
||
|
export default BRDF_GGX;
|