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.
43 lines (35 loc) • 1.63 kB
JavaScript
//#region src/core/shaders/chunks/fragment/head/RE-indirect-specular.ts
/**
* WGSL functions to calculate the indirect specular and diffuse contributions of lights using multi-scattering.
*/
const REIndirectSpecular = `
// Indirect Specular RenderEquations
fn RE_IndirectSpecular(
radiance: vec3f,
irradiance: vec3f,
diffuseContribution: vec3f,
metallic: f32,
sheenEnergyComp: f32,
dielectricScattering: MultiScattering,
metallicScattering: MultiScattering,
ptr_reflectedLight: ptr<function, ReflectedLight>
) {
// Mix based on metalness
let singleScattering: vec3f = mix(dielectricScattering.singleScattering, metallicScattering.singleScattering, metallic);
let multiScattering: vec3f = mix(dielectricScattering.multiScattering, metallicScattering.multiScattering, metallic);
// Diffuse energy conservation uses dielectric path
let totalScatteringDielectric: vec3f = dielectricScattering.singleScattering + dielectricScattering.multiScattering;
let diffuse: vec3f = diffuseContribution * (1.0 - totalScatteringDielectric);
// we remove RECIPROCAL_PI multiplication since the LUT already ensures energy conservation
// let cosineWeightedIrradiance: vec3f = irradiance * RECIPROCAL_PI;
var indirectSpecular: vec3f = radiance * singleScattering;
indirectSpecular += multiScattering * irradiance;
var indirectDiffuse: vec3f = diffuse * irradiance;
indirectSpecular *= sheenEnergyComp;
indirectDiffuse *= sheenEnergyComp;
(*ptr_reflectedLight).indirectSpecular += indirectSpecular;
(*ptr_reflectedLight).indirectDiffuse += indirectDiffuse;
}
`;
//#endregion
export { REIndirectSpecular };