gpu-curtains
Version:
gpu-curtains is a 3D WebGPU rendering engine. It can be used as a standalone 3D engine, but also includes extra classes focused on mapping 3d objects to DOM elements; It allows users to synchronize values such as position, sizing, or scale between them.
125 lines (122 loc) • 4.39 kB
JavaScript
//#region src/core/shaders/chunks/fragment/body/get-PBR-direct-contribution.ts
/**
* Get the PBR direct light contribution.
*
* @param parameters - Parameters used to create the shader chunk.
* @param parameters.extensionsUsed - {@link PBRFragmentShaderInputParams.extensionsUsed | extensionsUsed} to check if anisotropy is enabled.
* @returns - The PBR direct light contribution, accounting for anisotropy, sheen and clearcoat contributions.
*/
const getPBRDirectContribution = ({ extensionsUsed = [], environmentMap = null } = {}) => {
let pbrDirect = `
let NdotL: f32 = saturate(dot(normal, directLight.direction));
var irradiance: vec3f = NdotL * directLight.color;`;
if (extensionsUsed.includes("KHR_materials_clearcoat")) pbrDirect += `
clearcoatSpecularDirect += getPBRDirectClearcoat(clearcoatNormal, viewDirection, clearcoatF0, clearcoatF90, clearcoatRoughness, directLight);`;
if (extensionsUsed.includes("KHR_materials_sheen")) {
pbrDirect += `
sheenSpecularDirect += irradiance * BRDF_Sheen(directLight.direction, viewDirection, normal, sheenColor, sheenRoughness);`;
if (environmentMap && environmentMap.lutTexture) pbrDirect += `
let sheenAlbedoV: f32 = getBRDFCharlie(
normal,
viewDirection,
sheenRoughness,
${environmentMap.sampler.name},
${environmentMap.lutTexture.options.name}
);
let sheenAlbedoL: f32 = getBRDFCharlie(
normal,
directLight.direction,
sheenRoughness,
${environmentMap.sampler.name},
${environmentMap.lutTexture.options.name}
);`;
else pbrDirect += `
let sheenAlbedoV: f32 = getSheenAlbedoScaleApprox(
normal,
viewDirection,
sheenRoughness
);
let sheenAlbedoL: f32 = getSheenAlbedoScaleApprox(
normal,
directLight.direction,
sheenRoughness
);`;
pbrDirect += `
let sheenEnergyComp: f32 = 1.0 - max3( sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );
irradiance *= sheenEnergyComp;`;
}
if (environmentMap && environmentMap.lutTexture) pbrDirect += `
// Precomputed DFG values for view and light directions from LUT
let dfgDirect: DFGDirect = DFGDirectFromLUT(
normal,
viewDirection,
directLight.direction,
roughness,
${environmentMap.sampler.name},
${environmentMap.lutTexture.options.name},
);
`;
else pbrDirect += `
// Precomputed DFG values for view and light directions from approximation
let dfgDirect: DFGDirect = DFGDirectApprox(
normal,
viewDirection,
directLight.direction,
roughness,
);
`;
if (extensionsUsed.includes("KHR_materials_anisotropy")) pbrDirect += `
var lightContribution: LightContribution = getPBRDirectAnisotropic(
normal,
viewDirection,
NdotL,
irradiance,
dfgDirect,
diffuseContribution,
specularF90,
specularColorBlended,
roughness,
iridescenceFresnel,
iridescence,
alphaT,
anisotropyT,
anisotropyB,
directLight
);`;
else pbrDirect += `
var lightContribution: LightContribution = getPBRDirect(
normal,
viewDirection,
NdotL,
irradiance,
dfgDirect,
diffuseContribution,
specularF90,
specularColorBlended,
roughness,
iridescenceFresnel,
iridescence,
directLight
);`;
if (extensionsUsed.includes("KHR_materials_diffuse_transmission")) {
pbrDirect += `
lightContribution.diffuse = lightContribution.diffuse * (1.0 - diffuseTransmission);
let diffuseNdotL: f32 = saturate(dot(-1.0 * normal, directLight.direction));
var lightDiffuseTransmission: vec3f = directLight.color * diffuseNdotL * BRDF_Lambert(diffuseTransmissionContribution);`;
if (extensionsUsed.includes("KHR_materials_volume")) pbrDirect += `
lightDiffuseTransmission *= volumeAttenuation(diffuseTransmissionThickness, attenuationColor, attenuationDistance);
`;
pbrDirect += `
// lightDiffuseTransmission *= 1.0 - singleVolumeScatter;
lightDiffuseTransmission *= singleVolumeScatter;
lightContribution.diffuse += lightDiffuseTransmission * diffuseTransmission;
`;
}
pbrDirect += `
reflectedLight.directDiffuse += lightContribution.diffuse;
reflectedLight.directSpecular += lightContribution.specular;
`;
return pbrDirect;
};
//#endregion
export { getPBRDirectContribution };