shaders/segment/segment.tstypescript
import { AtmosphereParameters, DEFAULT_PARAMS } from "../atmos/atmos";
import { ShaderProgram } from "../../webgl/ShaderProgram";
import segment_screen_wl from "./segment_screen_wl.vert.glsl";
import segment_screen_wl_atmos_forward_frag from "./segment_screen_wl_atmos_forward.frag.glsl";
import segment_screen_wl_noatmos_forward_frag from "./segment_screen_wl_noatmos_forward.frag.glsl";
import segment_screen_deferred_frag from "./segment_screen_deferred.frag.glsl";
import segment_colorPicking_vert from "./segment_colorPicking.vert.glsl";
import segment_colorPicking_frag from "./segment_colorPicking.frag.glsl";
import segment_depth_vert from "./segment_depth.vert.glsl";
import segment_depth_frag from "./segment_depth.frag.glsl";
import { stringTemplate2 } from "../../utils/shared";
import { cascadeShadowUniforms, projectorUniforms, shadowMapUniforms } from "../common/uniforms";
// REMEMBER!
// src*(1)+dest*(1-src.alpha)
// glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// src*(src.alpha)+dest*(1-src.alpha)
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// const NIGHT = `const vec3 nightStep = 10.0 * vec3(0.58, 0.48, 0.25);`;
//
// const DEF_BLEND = `#define blend(DEST, SAMPLER, OFFSET, OPACITY) \
// src = texture( SAMPLER, OFFSET.xy + vTextureCoord.xy * OFFSET.zw );\
// DEST = DEST * (1.0 - src.a * OPACITY) + src * OPACITY;`;
//
// const SLICE_SIZE = 4;
export function segment_screen_deferred(): ShaderProgram {
return new ShaderProgram("segment_screen_deferred", {
uniforms: {
projectionMatrix: "mat4",
viewMatrix: "mat4",
cameraPosition: "vec3",
rtcEyePositionHigh: "vec3",
rtcEyePositionLow: "vec3",
height: "float",
uGlobalTextureCoord: "vec4",
uNormalMapBias: "vec3",
samplerCount: "int",
tileOffsetArr: "vec4",
layerOpacityArr: "float",
samplerArr: "sampler2darraylegacy",
defaultTexture: "sampler2d",
uNormalMap: "sampler2d",
nightTexture: "sampler2d",
specularTexture: "sampler2d",
lightPosition: "vec3",
shadeMode: "float",
camHeight: "float",
nightTextureCoefficient: "float"
},
attributes: {
aVertexPositionHigh: "vec3",
aVertexPositionLow: "vec3",
aTextureCoord: "vec2"
},
vertexShader: segment_screen_wl,
fragmentShader: segment_screen_deferred_frag
});
}
export function segment_screen_wl_forward_noatmos(): ShaderProgram {
return new ShaderProgram("segment_screen_wl_forward", {
uniforms: {
projectionMatrix: "mat4",
viewMatrix: "mat4",
cameraPosition: "vec3",
rtcEyePositionHigh: "vec3",
rtcEyePositionLow: "vec3",
height: "float",
uGlobalTextureCoord: "vec4",
uNormalMapBias: "vec3",
samplerCount: "int",
tileOffsetArr: "vec4",
layerOpacityArr: "float",
samplerArr: "sampler2darraylegacy",
defaultTexture: "sampler2d",
uNormalMap: "sampler2d",
nightTexture: "sampler2d",
specularTexture: "sampler2d",
lightPosition: "vec3",
diffuse: "vec3",
ambient: "vec3",
specular: "vec4",
camHeight: "float",
nightTextureCoefficient: "float",
transitionOpacity: "float",
shadeMode: "float",
frameOpacity: "float",
...projectorUniforms,
...shadowMapUniforms,
...cascadeShadowUniforms
},
attributes: {
aVertexPositionHigh: "vec3",
aVertexPositionLow: "vec3",
aTextureCoord: "vec2"
},
vertexShader: segment_screen_wl,
fragmentShader: segment_screen_wl_noatmos_forward_frag
});
}
export function segment_screen_wl_forward_atmos(atmosParams: AtmosphereParameters = DEFAULT_PARAMS): ShaderProgram {
return new ShaderProgram("segment_screen_wl_forward", {
uniforms: {
projectionMatrix: "mat4",
viewMatrix: "mat4",
cameraPosition: "vec3",
cameraForward: "vec3",
isOrthographic: "float",
rtcEyePositionHigh: "vec3",
rtcEyePositionLow: "vec3",
height: "float",
uGlobalTextureCoord: "vec4",
uNormalMapBias: "vec3",
samplerCount: "int",
tileOffsetArr: "vec4",
layerOpacityArr: "float",
samplerArr: "sampler2darraylegacy",
defaultTexture: "sampler2d",
uNormalMap: "sampler2d",
nightTexture: "sampler2d",
specularTexture: "sampler2d",
lightPosition: "vec3",
diffuse: "vec3",
ambient: "vec3",
specular: "vec4",
transmittanceTexture: "sampler2D",
scatteringTexture: "sampler2D",
atmosFadeDist: "vec2",
atmosMaxMinOpacity: "vec3",
camHeight: "float",
nightTextureCoefficient: "float",
transitionOpacity: "float",
shadeMode: "float",
frameOpacity: "float",
...projectorUniforms,
...shadowMapUniforms,
...cascadeShadowUniforms
},
attributes: {
aVertexPositionHigh: "vec3",
aVertexPositionLow: "vec3",
aTextureCoord: "vec2"
},
vertexShader: segment_screen_wl,
fragmentShader: stringTemplate2(segment_screen_wl_atmos_forward_frag, atmosParams)
});
}
export function segment_colorPicking(): ShaderProgram {
return new ShaderProgram("segment_colorPicking", {
uniforms: {
projectionMatrix: "mat4",
viewMatrix: "mat4",
cameraPosition: "vec3",
rtcEyePositionHigh: "vec3",
rtcEyePositionLow: "vec3",
samplerCount: "int",
tileOffsetArr: "vec4",
samplerArr: "sampler2darraylegacy",
pickingMaskArr: "sampler2darraylegacy",
pickingColorArr: "vec4",
height: "float"
},
attributes: {
aVertexPositionHigh: "vec3",
aVertexPositionLow: "vec3",
aTextureCoord: "vec2"
},
vertexShader: segment_colorPicking_vert,
fragmentShader: segment_colorPicking_frag
});
}
export function segment_depth(): ShaderProgram {
return new ShaderProgram("segment_depth", {
uniforms: {
projectionMatrix: "mat4",
viewMatrix: "mat4",
height: "float",
cameraPosition: "vec3",
rtcEyePositionHigh: "vec3",
rtcEyePositionLow: "vec3",
frustumPickingColor: "float"
},
attributes: {
aVertexPositionHigh: "vec3",
aVertexPositionLow: "vec3"
},
vertexShader: segment_depth_vert,
fragmentShader: segment_depth_frag
});
}