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.
37 lines (36 loc) • 2.06 kB
JavaScript
//#region src/core/shaders/chunks/fragment/body/get-emissive-occlusion.ts
/**
* Set the `emissive` (`vec3f`) and `occlusion` (`f32`) values to use in our shader.
* @param parameters - Parameters to use to set the emissive and occlusion values.
* @param parameters.emissiveTexture - {@link ShaderTextureDescriptor | Emissive texture descriptor} to use if any.
* @param parameters.occlusionTexture - {@link ShaderTextureDescriptor | Occlusion texture descriptor} to use if any.
* @returns - A string with `emissive` (`vec3f`) and `occlusion` (`f32`) values set.
*/
const getEmissiveOcclusion = ({ emissiveTexture = null, occlusionTexture = null } = {}) => {
let emissiveOcclusion = `
var occlusion: f32 = 1.0;`;
if (emissiveTexture) {
emissiveOcclusion += `
var emissiveUV: vec2f = ${emissiveTexture.texCoordAttributeName ?? "uv"};`;
if ("useTransform" in emissiveTexture.texture.options && emissiveTexture.texture.options.useTransform) emissiveOcclusion += `
emissiveUV = (texturesMatrices.${emissiveTexture.texture.options.name}.matrix * vec3(emissiveUV, 1.0)).xy;`;
emissiveOcclusion += `
let emissiveSample: vec3f = textureSample(${emissiveTexture.texture.options.name}, ${emissiveTexture.sampler?.name ?? "defaultSampler"}, emissiveUV).rgb;
emissive *= emissiveSample;`;
}
emissiveOcclusion += `
emissive *= emissiveStrength;`;
if (occlusionTexture) {
emissiveOcclusion += `
var occlusionUV: vec2f = ${occlusionTexture.texCoordAttributeName ?? "uv"};`;
if ("useTransform" in occlusionTexture.texture.options && occlusionTexture.texture.options.useTransform) emissiveOcclusion += `
occlusionUV = (texturesMatrices.${occlusionTexture.texture.options.name}.matrix * vec3(occlusionUV, 1.0)).xy;`;
emissiveOcclusion += `
occlusion = textureSample(${occlusionTexture.texture.options.name}, ${occlusionTexture.sampler?.name ?? "defaultSampler"}, occlusionUV).r;`;
}
emissiveOcclusion += `
occlusion = 1.0 + occlusionIntensity * (occlusion - 1.0);`;
return emissiveOcclusion;
};
//#endregion
export { getEmissiveOcclusion };