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.

105 lines (92 loc) 3.68 kB
import { constants } from "../../chunks/utils/constants.mjs"; import { common } from "../../chunks/utils/common.mjs"; import { toneMappingUtils } from "../../chunks/utils/tone-mapping-utils.mjs"; import { getLightsInfos } from "../../chunks/fragment/head/get-lights-infos.mjs"; import { REIndirectDiffuse } from "../../chunks/fragment/head/RE-indirect-diffuse.mjs"; import { getLambertDirect } from "../../chunks/fragment/head/get-lambert-direct.mjs"; import { getLambertShading } from "../../chunks/fragment/body/get-lambert-shading.mjs"; import { applyToneMapping } from "../../chunks/fragment/body/apply-tone-mapping.mjs"; import { patchAdditionalChunks } from "../../default-material-helpers.mjs"; import { getFragmentInputStruct } from "../../chunks/fragment/head/get-fragment-input-struct.mjs"; import { getFragmentOutputStruct } from "../../chunks/fragment/head/get-fragment-output-struct.mjs"; import { declareAttributesVars } from "../../chunks/fragment/body/declare-attributes-vars.mjs"; import { declareMaterialVars } from "../../chunks/fragment/body/declare-material-vars.mjs"; import { getBaseColor } from "../../chunks/fragment/body/get-base-color.mjs"; import { getEmissiveOcclusion } from "../../chunks/fragment/body/get-emissive-occlusion.mjs"; import { getNormal } from "../../chunks/fragment/body/get-normal.mjs"; import { generateTBN } from "../../chunks/utils/generate-TBN.mjs"; import { getTangentBitangent } from "../../chunks/fragment/body/get-tangent-bitangent.mjs"; //#region src/core/shaders/full/fragment/get-lambert-fragment-shader-code.ts /** * Build a Lambert fragment shader using the provided options. * @param parameters - {@link LambertFragmentShaderInputParams} used to build the Lambert fragment shader. * @returns - The Lambert fragment shader generated based on the provided parameters. */ const getLambertFragmentShaderCode = ({ chunks = null, toneMapping = "Khronos", outputColorSpace = "srgb", fragmentOutput = { struct: [{ type: "vec4f", name: "color" }], output: ` var output: FSOutput; output.color = outputColor; return output;` }, geometry, cullMode = "back", flatShading = false, additionalVaryings = [], materialUniform = null, materialUniformName = "material", receiveShadows = false, baseColorTexture = null, normalTexture = null, emissiveTexture = null, occlusionTexture = null }) => { chunks = patchAdditionalChunks(chunks); return ` ${chunks.additionalHead} ${constants} ${common} ${toneMappingUtils} ${generateTBN} ${getLightsInfos} ${REIndirectDiffuse} ${getLambertDirect} ${getFragmentInputStruct({ geometry, additionalVaryings })} ${getFragmentOutputStruct({ struct: fragmentOutput.struct })} @fragment fn main(fsInput: FSInput) -> FSOutput { var outputColor: vec4f = vec4(); ${declareAttributesVars({ geometry, additionalVaryings })} ${declareMaterialVars({ materialUniform, materialUniformName, shadingModel: "Lambert" })} ${getBaseColor({ geometry, baseColorTexture })} // user defined preliminary contribution ${chunks.preliminaryContribution} ${getTangentBitangent({ geometry, cullMode, flatShading, normalTexture })} ${getNormal({ normalTexture })} ${getEmissiveOcclusion({ emissiveTexture, occlusionTexture })} // lights ${getLambertShading({ receiveShadows })} outputColor = vec4(outgoingLight, outputColor.a); outputColor = vec4(outputColor.rgb + emissive, outputColor.a); // user defined additional contribution ${chunks.additionalContribution} ${applyToneMapping({ toneMapping, outputColorSpace })} ${fragmentOutput.output} }`; }; //#endregion export { getLambertFragmentShaderCode };