Reference Source

src/viewer/scene/model/layer/programs/ShadowProgram.js

export const ShadowProgram = function(programVariables, logarithmicDepthBufferEnabled) {
    // VBOBatchingPointsShadowRenderer has been implemented by 14e973df6268369b00baef60e468939e062ac320,
    // but never used (and probably not maintained), as opposed to VBOInstancingPointsShadowRenderer in the same commit
    const outColor = programVariables.createOutput("vec4", "outColor");
    const encodeFloat = programVariables.createFragmentDefinition(
        "encodeFloat",
        (name, src) => {
            src.push(`vec4 ${name}(const in float v) {`);
            src.push("  const vec4 bitShift = vec4(256 * 256 * 256, 256 * 256, 256, 1.0);");
            src.push("  const vec4 bitMask = vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);");
            src.push("  vec4 comp = fract(v * bitShift);");
            src.push("  comp -= comp.xxyz * bitMask;");
            src.push("  return comp;");
            src.push("}");
        });
    return {
        programName: "Shadow",
        getLogDepth: logarithmicDepthBufferEnabled && (vFragDepth => vFragDepth),
        renderPassFlag: 0,
        isShadowProgram: true,
        appendFragmentOutputs: (src, getGammaOutputExpression, gl_FragCoord) => src.push(`${outColor} = ${encodeFloat}(${gl_FragCoord}.z);`)
    };
};