Variable getPBRDirectAnisotropicConst
getPBRDirectAnisotropic: "\nfn GeometrySmith_Anisotropic(\n alphaT: f32, \n alphaB: f32,\n TdotV: f32,\n BdotV: f32,\n TdotL: f32,\n BdotL: f32,\n NdotV: f32,\n NdotL: f32\n) -> f32 {\n let gv: f32 = NdotL * length( vec3( alphaT * TdotV, alphaB * BdotV, NdotV ) );\n let gl: f32 = NdotV * length( vec3( alphaT * TdotL, alphaB * BdotL, NdotL ) );\n let v: f32 = 0.5 / ( gv + gl );\n\n return saturate(v);\n}\n\nfn DistributionGGX_Anisotropic(\n alphaT: f32,\n alphaB: f32,\n NdotH: f32,\n TdotH: f32,\n BdotH: f32\n) -> f32 {\n let a2: f32 = alphaT * alphaB;\n let v: vec3f = vec3( alphaB * TdotH, alphaT * BdotH, a2 * NdotH );\n let v2: f32 = dot( v, v );\n let w2: f32 = a2 / v2;\n\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n}\n\nfn BRDF_GGX_Anisotropic(\n normal: vec3f,\n viewDirection: vec3f,\n NdotL: f32,\n NdotV: f32,\n roughness: f32,\n specularF90: f32,\n specularColorBlended: vec3f,\n iridescenceFresnel: vec3f,\n iridescence: f32,\n alphaT: f32,\n anisotropyT: vec3f,\n anisotropyB: vec3f,\n directLight: DirectLight,\n) -> vec3f {\n let alpha: f32 = pow2(roughness); // UE4's roughness\n\n let H: vec3f = normalize(viewDirection + directLight.direction);\n let VdotH: f32 = saturate(dot(viewDirection, H));\n let NdotH: f32 = saturate(dot(normal, H));\n\n // cook-torrance brdf\n var F: vec3f = F_Schlick(specularColorBlended, specularF90, VdotH);\n F = mix( F, iridescenceFresnel, iridescence );\n\n let TdotL: f32 = dot( anisotropyT, directLight.direction );\n let TdotV: f32 = dot( anisotropyT, viewDirection );\n let TdotH: f32 = dot( anisotropyT, H );\n let BdotL: f32 = dot( anisotropyB, directLight.direction );\n let BdotV: f32 = dot( anisotropyB, viewDirection );\n let BdotH: f32 = dot( anisotropyB, H );\n\n let G: f32 = GeometrySmith_Anisotropic( alphaT, alpha, TdotV, BdotV, TdotL, BdotL, NdotV, NdotL );\n let D: f32 = DistributionGGX_Anisotropic( alphaT, alpha, NdotH, TdotH, BdotH );\n \n return G * D * F;\n}\n\nfn getPBRDirectAnisotropic(\n normal: vec3f,\n viewDirection: vec3f,\n NdotL: f32,\n irradiance: vec3f,\n dfgDirect: DFGDirect,\n diffuseContribution: vec3f,\n specularF90: f32,\n specularColorBlended: vec3f,\n roughness: f32,\n iridescenceFresnel: vec3f,\n iridescence: f32,\n alphaT: f32,\n anisotropyT: vec3f,\n anisotropyB: vec3f,\n directLight: DirectLight\n) -> LightContribution {\n var lightContribution: LightContribution;\n\n let NdotV: f32 = saturate(dot(normal, viewDirection));\n\n let ggxSingleScatter: vec3f = BRDF_GGX_Anisotropic(\n normal,\n viewDirection,\n NdotL,\n NdotV,\n roughness,\n specularF90,\n specularColorBlended,\n iridescenceFresnel,\n iridescence,\n alphaT,\n anisotropyT,\n anisotropyB,\n directLight\n );\n\n let ggxMultiScatter: vec3f = BRDF_GGX_Multiscatter(\n dfgDirect,\n specularF90,\n specularColorBlended\n );\n\n let ggx: vec3f = ggxSingleScatter + ggxMultiScatter;\n\n lightContribution.diffuse += irradiance * BRDF_Lambert(diffuseContribution);\n lightContribution.specular += irradiance * ggx;\n\n return lightContribution;\n}\n" = ...
Helper WGSL functions to get the PBR direct anisotropic contribution.