shaders/deferredShading/deferredShadingAtmos.tstypescript
import { ShaderProgram } from "../../webgl/ShaderProgram";
import { stringTemplate2 } from "../../utils/shared";
import { cascadeShadowUniforms, shadowMapUniforms } from "../common/uniforms";
import type { AtmosphereParameters } from "../atmos/atmos";
import { DEFAULT_PARAMS } from "../atmos/atmos";

import deferred_vert from "./deferredShading.vert.glsl";
import deferred_atmos_frag from "./deferredShadingAtmos.frag.glsl";

export function deferredShadingAtmos(atmosParams: AtmosphereParameters = DEFAULT_PARAMS): ShaderProgram {
    return new ShaderProgram("deferredShadingAtmos", {
        uniforms: {
            normalMatrix: "mat3",
            baseTexture: "sampler2d",
            materialsTexture: "sampler2d",
            normalTexture: "sampler2d",
            viewPositionTexture: "sampler2d",
            transmittanceTexture: "sampler2D",
            scatteringTexture: "sampler2D",
            lightPosition: "vec3",
            lightAmbient: "vec3",
            lightDiffuse: "vec3",
            lightSpecular: "vec4",
            cameraPosition: "vec3",
            cameraForward: "vec3",
            isOrthographic: "float",
            atmosFadeDist: "vec2",
            atmosMaxMinOpacity: "vec3",
            frameOpacity: "float",
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            corners: "vec3"
        },
        vertexShader: deferred_vert,
        fragmentShader: stringTemplate2(deferred_atmos_frag, {
            ...atmosParams
        })
    });
}