control/depthCamera/depth_camera.tstypescript
import { ShaderProgram } from "../../webgl";
import computeShadowMoments from "../../shaders/common/computeShadowMoments.glsl";
import shadowDefines from "../../shaders/common/shadowDefines.glsl";

export function depth_camera() {
    return new ShaderProgram("depth_camera", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            height: "float",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3"
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3"
        },

        vertexShader: `#version 300 es

            precision highp float;

            in vec3 aVertexPositionHigh;
            in vec3 aVertexPositionLow;

            uniform mat4 projectionMatrix;
            uniform mat4 viewMatrix;
            uniform vec3 rtcEyePositionHigh;
            uniform vec3 rtcEyePositionLow;
            uniform float height;

            void main(void) {

                mat4 viewMatrixRTE = viewMatrix;
                viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);

                mat4 m = projectionMatrix * viewMatrixRTE;

                vec3 nh = height * normalize(aVertexPositionHigh + aVertexPositionLow);

                vec3 highDiff = aVertexPositionHigh - rtcEyePositionHigh;
                vec3 lowDiff = aVertexPositionLow - rtcEyePositionLow + nh;

                gl_Position =  m * vec4(highDiff * step(1.0, length(highDiff)) + lowDiff, 1.0);
            }`,

        fragmentShader: `#version 300 es

            precision highp float;

            layout(location = 0) out vec4 depthColor;

            ${shadowDefines}
            ${computeShadowMoments}

            void main(void) {
                #if VARIANCE_SHADOW_ENABLED == 1
                    vec2 moments = computeShadowMoments(gl_FragCoord.z);
                    depthColor = vec4(moments, 0.0, 1.0);
                #else
                    depthColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1.0);
                #endif
            }`
    });
}