shaders/weightedOITResolve.tstypescript
import { ShaderProgram } from "../webgl/ShaderProgram";
export function weightedOITResolve() {
return new ShaderProgram("weightedOITResolve", {
uniforms: {
uAccumulate: "sampler2D",
uAccumulateAlpha: "sampler2D"
},
attributes: {
corners: "vec2"
},
vertexShader: `#version 300 es
in vec2 corners;
void main() {
gl_Position = vec4(corners, 0.0, 1.0);
}`,
fragmentShader: `#version 300 es
precision highp float;
uniform sampler2D uAccumulate;
uniform sampler2D uAccumulateAlpha;
out vec4 fragColor;
const float EPS = 0.00001;
void main() {
ivec2 fragCoord = ivec2(gl_FragCoord.xy);
vec4 accum = texelFetch(uAccumulate, fragCoord, 0);
float revealage = accum.a;
if (revealage >= 0.9999) {
discard;
}
float accumAlpha = texelFetch(uAccumulateAlpha, fragCoord, 0).r;
// prevent floating point precision bug
vec3 averageColor = accum.rgb / max(accumAlpha, EPS);
float a = 1.0 - revealage;
fragColor = vec4(averageColor * a, a);
}`
});
}