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.

200 lines (187 loc) 8.55 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 { applyToneMapping } from "../../chunks/fragment/body/apply-tone-mapping.mjs"; import { REIndirectSpecular } from "../../chunks/fragment/head/RE-indirect-specular.mjs"; import { getIBLTransmission } from "../../chunks/fragment/head/get-IBL-transmission.mjs"; import { getPBRDirect } from "../../chunks/fragment/head/get-PBR-direct.mjs"; import { getPBRShading } from "../../chunks/fragment/body/get-PBR-shading.mjs"; import { BRDF_GGX } from "../../chunks/utils/BRDF_GGX.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"; import { getMetallicRoughness } from "../../chunks/fragment/body/get-metallic-roughness.mjs"; import { getSpecular } from "../../chunks/fragment/body/get-specular.mjs"; import { getDiffuse } from "../../chunks/fragment/body/get-diffuse.mjs"; import { computeMultiScattering } from "../../chunks/fragment/head/compute-multi-scattering.mjs"; import { getIBLIndirectIrradiance } from "../../chunks/fragment/head/get-IBL-indirect-irradiance.mjs"; import { getIBLIndirectRadiance } from "../../chunks/fragment/head/get-IBL-indirect-radiance.mjs"; import { getIBLSheen } from "../../chunks/fragment/head/get-IBL-sheen.mjs"; import { getTransmissionThickness } from "../../chunks/fragment/body/get-transmission-thickness.mjs"; import { getPBRDirectSheen } from "../../chunks/fragment/head/get-PBR-direct-sheen.mjs"; import { getSheen } from "../../chunks/fragment/body/get-sheen.mjs"; import { getClearcoat, getClearcoatNormal } from "../../chunks/fragment/body/get-clearcoat.mjs"; import { getPBRDirectClearcoat } from "../../chunks/fragment/head/get-PBR-direct-clearcoat.mjs"; import { getIridescence } from "../../chunks/fragment/body/get-iridescence.mjs"; import { getPBRIridescence } from "../../chunks/fragment/head/get-PBR-iridescence.mjs"; import { getPBRDirectAnisotropic } from "../../chunks/fragment/head/get-PBR-direct-anisotropic.mjs"; import { getAnisotropy } from "../../chunks/fragment/body/get-anisotropy.mjs"; import { getIBLIndirectAnisotropyRadiance } from "../../chunks/fragment/head/get-IBL-indirect-anisotropy-radiance.mjs"; import { BRDFCharlie } from "../../chunks/utils/BRDF-Charlie.mjs"; import { getDiffuseTransmission } from "../../chunks/fragment/body/get-diffuse-transmission.mjs"; import { getVolumeMultiToSingleScatter } from "../../chunks/fragment/head/get-volume-multi-to-single-scatter.mjs"; import { getVolumeMultiScatter } from "../../chunks/fragment/body/get-volume-multi-scatter.mjs"; //#region src/core/shaders/full/fragment/get-PBR-fragment-shader-code.ts /** * Build a PBR fragment shader using the provided options. * @param parameters - {@link PBRFragmentShaderInputParams} used to build the PBR fragment shader. * @returns - The PBR fragment shader generated based on the provided parameters. */ const getPBRFragmentShaderCode = ({ chunks = null, toneMapping = "Khronos", outputColorSpace = "srgb", transmissiveInputColorSpace = "srgb", transmissiveInputToneMapping = "Khronos", 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", extensionsUsed = [], receiveShadows = false, baseColorTexture = null, normalTexture = null, emissiveTexture = null, occlusionTexture = null, metallicRoughnessTexture = null, specularTexture = null, specularFactorTexture = null, specularColorTexture = null, transmissionThicknessTexture = null, transmissionTexture = null, thicknessTexture = null, sheenTexture = null, sheenColorTexture = null, sheenRoughnessTexture = null, anisotropyTexture = null, clearcoatTexture = null, clearcoatFactorTexture = null, clearcoatRoughnessTexture = null, clearcoatNormalTexture = null, iridescenceTexture = null, iridescenceFactorTexture = null, iridescenceThicknessTexture = null, diffuseTransmissionTexture = null, diffuseTransmissionFactorTexture = null, diffuseTransmissionColorTexture = null, transmissionBackgroundTexture = null, environmentMap = null }) => { chunks = patchAdditionalChunks(chunks); return ` ${chunks.additionalHead} ${constants} ${common} ${toneMappingUtils} ${generateTBN} ${getLightsInfos} ${BRDF_GGX} ${getPBRDirect} ${extensionsUsed.includes("KHR_materials_sheen") ? BRDFCharlie : ""} ${extensionsUsed.includes("KHR_materials_sheen") ? getPBRDirectSheen : ""} ${extensionsUsed.includes("KHR_materials_clearcoat") ? getPBRDirectClearcoat : ""} ${extensionsUsed.includes("KHR_materials_iridescence") ? getPBRIridescence : ""} ${extensionsUsed.includes("KHR_materials_anisotropy") ? getPBRDirectAnisotropic : ""} ${REIndirectDiffuse} ${REIndirectSpecular} ${computeMultiScattering} ${getIBLIndirectIrradiance} ${getIBLIndirectRadiance} ${getIBLTransmission} ${extensionsUsed.includes("KHR_materials_sheen") ? getIBLSheen : ""} ${extensionsUsed.includes("KHR_materials_anisotropy") ? getIBLIndirectAnisotropyRadiance : ""} ${extensionsUsed.includes("KHR_materials_volume_scatter") ? getVolumeMultiToSingleScatter : ""} ${getFragmentInputStruct({ geometry, additionalVaryings })} ${getFragmentOutputStruct({ struct: fragmentOutput.struct })} @fragment fn main(fsInput: FSInput) -> FSOutput { var outputColor: vec4f = vec4(); ${declareAttributesVars({ geometry, additionalVaryings })} ${declareMaterialVars({ materialUniform, materialUniformName, shadingModel: "PBR", environmentMap })} ${getBaseColor({ geometry, baseColorTexture })} // user defined preliminary contribution ${chunks.preliminaryContribution} // material infos ${getTangentBitangent({ extensionsUsed, geometry, cullMode, flatShading, normalTexture, clearcoatNormalTexture })} ${getNormal({ normalTexture })} ${getMetallicRoughness({ metallicRoughnessTexture })} ${getDiffuse} ${getSpecular({ specularTexture, specularFactorTexture, specularColorTexture })} ${getTransmissionThickness({ transmissionThicknessTexture, transmissionTexture, thicknessTexture })} ${getEmissiveOcclusion({ emissiveTexture, occlusionTexture })} ${getSheen({ extensionsUsed, sheenTexture, sheenColorTexture, sheenRoughnessTexture })} ${getClearcoat({ extensionsUsed, clearcoatTexture, clearcoatFactorTexture, clearcoatRoughnessTexture })} ${getClearcoatNormal({ extensionsUsed, normalTexture, clearcoatNormalTexture })} ${getIridescence({ extensionsUsed, iridescenceTexture, iridescenceFactorTexture, iridescenceThicknessTexture })} ${getAnisotropy({ extensionsUsed, anisotropyTexture })} ${getDiffuseTransmission({ extensionsUsed, diffuseTransmissionTexture, diffuseTransmissionFactorTexture, diffuseTransmissionColorTexture })} ${getVolumeMultiScatter({ extensionsUsed })} // shading ${getPBRShading({ receiveShadows, environmentMap, transmissionBackgroundTexture, transmissiveInputColorSpace, transmissiveInputToneMapping, extensionsUsed })} 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 { getPBRFragmentShaderCode };