UNPKG

cesium

Version:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.

147 lines (135 loc) 4.26 kB
import combine from "../../Core/combine.js"; import defined from "../../Core/defined.js"; import ImageBasedLightingStageFS from "../../Shaders/ModelExperimental/ImageBasedLightingStageFS.js"; import ShaderDestination from "../../Renderer/ShaderDestination.js"; import OctahedralProjectedCubeMap from "../OctahedralProjectedCubeMap.js"; const ImageBasedLightingPipelineStage = {}; ImageBasedLightingPipelineStage.name = "ImageBasedLightingPipelineStage"; // Helps with debugging ImageBasedLightingPipelineStage.process = function ( renderResources, model, frameState ) { const imageBasedLighting = model.imageBasedLighting; const shaderBuilder = renderResources.shaderBuilder; shaderBuilder.addDefine( "USE_IBL_LIGHTING", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "vec2", "model_iblFactor", ShaderDestination.FRAGMENT ); if (OctahedralProjectedCubeMap.isSupported(frameState.context)) { const addMatrix = imageBasedLighting.useSphericalHarmonics || imageBasedLighting.useSpecularEnvironmentMaps || imageBasedLighting.enabled; if (addMatrix) { shaderBuilder.addUniform( "mat3", "model_iblReferenceFrameMatrix", ShaderDestination.FRAGMENT ); } if (defined(imageBasedLighting.sphericalHarmonicCoefficients)) { shaderBuilder.addDefine( "DIFFUSE_IBL", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addDefine( "CUSTOM_SPHERICAL_HARMONICS", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "vec3", "model_sphericalHarmonicCoefficients[9]", ShaderDestination.FRAGMENT ); } else if (imageBasedLighting.useDefaultSphericalHarmonics) { shaderBuilder.addDefine( "DIFFUSE_IBL", undefined, ShaderDestination.FRAGMENT ); } if ( defined(imageBasedLighting.specularEnvironmentMapAtlas) && imageBasedLighting.specularEnvironmentMapAtlas.ready ) { shaderBuilder.addDefine( "SPECULAR_IBL", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addDefine( "CUSTOM_SPECULAR_IBL", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "sampler2D", "model_specularEnvironmentMaps", ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "vec2", "model_specularEnvironmentMapsSize", ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "float", "model_specularEnvironmentMapsMaximumLOD", ShaderDestination.FRAGMENT ); } else if (model.useDefaultSpecularMaps) { shaderBuilder.addDefine( "SPECULAR_IBL", undefined, ShaderDestination.FRAGMENT ); } } if (defined(imageBasedLighting.luminanceAtZenith)) { shaderBuilder.addDefine( "USE_SUN_LUMINANCE", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "float", "model_luminanceAtZenith", ShaderDestination.FRAGMENT ); } shaderBuilder.addFragmentLines([ImageBasedLightingStageFS]); const uniformMap = { model_iblFactor: function () { return imageBasedLighting.imageBasedLightingFactor; }, model_iblReferenceFrameMatrix: function () { return model._iblReferenceFrameMatrix; }, model_luminanceAtZenith: function () { return imageBasedLighting.luminanceAtZenith; }, model_sphericalHarmonicCoefficients: function () { return imageBasedLighting.sphericalHarmonicCoefficients; }, model_specularEnvironmentMaps: function () { return imageBasedLighting.specularEnvironmentMapAtlas.texture; }, model_specularEnvironmentMapsSize: function () { return imageBasedLighting.specularEnvironmentMapAtlas.texture.dimensions; }, model_specularEnvironmentMapsMaximumLOD: function () { return imageBasedLighting.specularEnvironmentMapAtlas.maximumMipmapLevel; }, }; renderResources.uniformMap = combine(uniformMap, renderResources.uniformMap); }; export default ImageBasedLightingPipelineStage;