Source: modules/render/MagoEdge.js

import * as Cesium from "cesium";
import {ShaderLoader} from "../ShaderLoader.js";

/**
 * MagoEdge is a class that creates a post-process effect to render edges of 3D models.
 * @class
 * @param {Cesium.Viewer} viewer - Cesium Viewer instance
 * @example
 * const magoEdge = new MagoEdge(viewer);
 * magoEdge.on();
 */
export class MagoEdge {
    constructor(viewer) {
        this.viewer = viewer;
        this.composite = null;
        this.customShaderLoader = new ShaderLoader("/src/customShaders/render");
        this.init();
    }

    /**
     * Initializes the post-process effect to render edges of 3D models.
     * @function
     * @returns {void}
     * @example
     * const outlineRender = new MagoEdge(viewer);
     * outlineRender.init();
     * outlineRender.on();
     */
    async init() {
        /* DepthTexture 생성 */
        const depthFragmentShader = await this.customShaderLoader.getShaderSource(
            "depth-fragment-shader.frag");
        const depthProcess = new Cesium.PostProcessStage({
            fragmentShader: depthFragmentShader,
            inputPreviousStageTexture: true,
            name: "highDepthTexture",
        });

        /* NormalTexture 생성 */
        const normalFragmentShader = await this.customShaderLoader.getShaderSource(
            "normal-fragment-shader.frag");
        const normalProcess = new Cesium.PostProcessStage({
            fragmentShader: normalFragmentShader,
            inputPreviousStageTexture: true,
            name: "normalTexture",
        });

        /* EdgeTexture 생성 */
        const edgeFragmentShader = await this.customShaderLoader.getShaderSource(
            "edge-fragment-shader.frag");
        const edgeProcess = new Cesium.PostProcessStage({
            fragmentShader: edgeFragmentShader,
            uniforms: {
                normalTexture: "normalTexture",
                highDepthTexture: "highDepthTexture",
                edgeWidth: 1.0,
            },
        });
        this.composite = new Cesium.PostProcessStageComposite({
            inputPreviousStageTexture: false,
            stages: [depthProcess, normalProcess, edgeProcess],
        });

        this.viewer.scene.postProcessStages.add(this.composite);
        this.off();
    }

    /**
     * Turns on the post-process effect to render edges of 3D models.
     * @function
     * @returns {void}
     */
    on() {
        if (this.composite) {
            this.composite.enabled = true;
        }
    }

    /**
     * Turns off the post-process effect to render edges of 3D models.
     * @function
     * @returns {void}
     */
    off() {
        if (this.composite) {
            this.composite.enabled = false;
        }
    }
}