import defaultValue from "../../Core/defaultValue.js"; import ShaderDestination from "../../Renderer/ShaderDestination.js"; import AlphaMode from "../AlphaMode.js"; import BlendingState from "../BlendingState.js"; import Pass from "../../Renderer/Pass.js"; /** * A pipeline stage for configuring the alpha options for handling translucency. * * @namespace MaterialPipelineStage * * @private */ var AlphaPipelineStage = {}; AlphaPipelineStage.name = "AlphaPipelineStage"; // Helps with debugging AlphaPipelineStage.process = function (renderResources, primitive, frameState) { var alphaOptions = renderResources.alphaOptions; // Ensure the pass is defined var model = renderResources.model; alphaOptions.pass = defaultValue(alphaOptions.pass, model.opaquePass); var renderStateOptions = renderResources.renderStateOptions; if (alphaOptions.pass === Pass.TRANSLUCENT) { renderStateOptions.blending = BlendingState.ALPHA_BLEND; } else { renderStateOptions.blending = BlendingState.DISABLED; } var shaderBuilder = renderResources.shaderBuilder; var uniformMap = renderResources.uniformMap; var alphaMode = alphaOptions.alphaMode; if (alphaMode === AlphaMode.MASK) { shaderBuilder.addDefine( "ALPHA_MODE_MASK", undefined, ShaderDestination.FRAGMENT ); shaderBuilder.addUniform( "float", "u_alphaCutoff", ShaderDestination.FRAGMENT ); uniformMap.u_alphaCutoff = function () { return alphaOptions.alphaCutoff; }; } else if (alphaMode === AlphaMode.BLEND) { shaderBuilder.addDefine( "ALPHA_MODE_BLEND", undefined, ShaderDestination.FRAGMENT ); } else { shaderBuilder.addDefine( "ALPHA_MODE_OPAQUE", undefined, ShaderDestination.FRAGMENT ); } }; export default AlphaPipelineStage;