UNPKG

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
//#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 };