128 lines
3.0 KiB
GLSL
128 lines
3.0 KiB
GLSL
|
|
uniform sampler2DMS depthMulti;
|
|
uniform sampler2DMS colorMulti;
|
|
|
|
out vec4 fragColor;
|
|
|
|
#if SAMPLES > 16
|
|
#error "Too many samples"
|
|
#endif
|
|
|
|
void main()
|
|
{
|
|
ivec2 texel = ivec2(gl_FragCoord.xy);
|
|
|
|
bvec4 b1, b2, b3, b4;
|
|
vec4 w1, w2, w3, w4;
|
|
vec4 d1, d2, d3, d4;
|
|
vec4 c1, c2, c3, c4, c5, c6, c7, c8;
|
|
vec4 c9, c10, c11, c12, c13, c14, c15, c16;
|
|
d1 = d2 = d3 = d4 = vec4(0.5);
|
|
w1 = w2 = w3 = w4 = vec4(0.0);
|
|
c1 = c2 = c3 = c4 = c5 = c6 = c7 = c8 = vec4(0.0);
|
|
c9 = c10 = c11 = c12 = c13 = c14 = c15 = c16 = vec4(0.0);
|
|
|
|
#ifdef USE_DEPTH
|
|
/* Depth */
|
|
d1.x = texelFetch(depthMulti, texel, 0).r;
|
|
d1.y = texelFetch(depthMulti, texel, 1).r;
|
|
# if SAMPLES > 2
|
|
d1.z = texelFetch(depthMulti, texel, 2).r;
|
|
d1.w = texelFetch(depthMulti, texel, 3).r;
|
|
# endif
|
|
# if SAMPLES > 4
|
|
d2.x = texelFetch(depthMulti, texel, 4).r;
|
|
d2.y = texelFetch(depthMulti, texel, 5).r;
|
|
d2.z = texelFetch(depthMulti, texel, 6).r;
|
|
d2.w = texelFetch(depthMulti, texel, 7).r;
|
|
# endif
|
|
# if SAMPLES > 8
|
|
d3.x = texelFetch(depthMulti, texel, 8).r;
|
|
d3.y = texelFetch(depthMulti, texel, 9).r;
|
|
d3.z = texelFetch(depthMulti, texel, 10).r;
|
|
d3.w = texelFetch(depthMulti, texel, 11).r;
|
|
d4.x = texelFetch(depthMulti, texel, 12).r;
|
|
d4.y = texelFetch(depthMulti, texel, 13).r;
|
|
d4.z = texelFetch(depthMulti, texel, 14).r;
|
|
d4.w = texelFetch(depthMulti, texel, 15).r;
|
|
# endif
|
|
#endif
|
|
|
|
/* COLOR */
|
|
b1 = notEqual(d1, vec4(1.0));
|
|
if (any(b1)) {
|
|
c1 = texelFetch(colorMulti, texel, 0);
|
|
c2 = texelFetch(colorMulti, texel, 1);
|
|
#if SAMPLES > 2
|
|
c3 = texelFetch(colorMulti, texel, 2);
|
|
c4 = texelFetch(colorMulti, texel, 3);
|
|
#endif
|
|
w1 = vec4(b1);
|
|
}
|
|
#if SAMPLES > 4
|
|
b2 = notEqual(d2, vec4(1.0));
|
|
if (any(b2)) {
|
|
c5 = texelFetch(colorMulti, texel, 4);
|
|
c6 = texelFetch(colorMulti, texel, 5);
|
|
c7 = texelFetch(colorMulti, texel, 6);
|
|
c8 = texelFetch(colorMulti, texel, 7);
|
|
w2 = vec4(b2);
|
|
}
|
|
#endif
|
|
#if SAMPLES > 8
|
|
b3 = notEqual(d3, vec4(1.0));
|
|
if (any(b3)) {
|
|
c9 = texelFetch(colorMulti, texel, 8);
|
|
c10 = texelFetch(colorMulti, texel, 9);
|
|
c11 = texelFetch(colorMulti, texel, 10);
|
|
c12 = texelFetch(colorMulti, texel, 11);
|
|
w3 = vec4(b3);
|
|
}
|
|
b4 = notEqual(d4, vec4(1.0));
|
|
if (any(b4)) {
|
|
c13 = texelFetch(colorMulti, texel, 12);
|
|
c14 = texelFetch(colorMulti, texel, 13);
|
|
c15 = texelFetch(colorMulti, texel, 14);
|
|
c16 = texelFetch(colorMulti, texel, 15);
|
|
w4 = vec4(b4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef USE_DEPTH
|
|
d1 *= 1.0 - step(1.0, d1); /* make far plane depth = 0 */
|
|
# if SAMPLES > 8
|
|
d4 *= 1.0 - step(1.0, d4);
|
|
d3 *= 1.0 - step(1.0, d3);
|
|
d1 = max(d1, max(d3, d4));
|
|
# endif
|
|
# if SAMPLES > 4
|
|
d2 *= 1.0 - step(1.0, d2);
|
|
d1 = max(d1, d2);
|
|
d1 = max(d1, d2);
|
|
# endif
|
|
# if SAMPLES > 2
|
|
d1.xy = max(d1.xy, d1.zw);
|
|
# endif
|
|
gl_FragDepth = max(d1.x, d1.y);
|
|
/* Don't let the 0.0 farplane occlude other things */
|
|
if (gl_FragDepth == 0.0) {
|
|
gl_FragDepth = 1.0;
|
|
}
|
|
#endif
|
|
|
|
c1 = c1 + c2;
|
|
#if SAMPLES > 2
|
|
c1 += c3 + c4;
|
|
#endif
|
|
#if SAMPLES > 4
|
|
c1 += c5 + c6 + c7 + c8;
|
|
#endif
|
|
#if SAMPLES > 8
|
|
c1 += c9 + c10 + c11 + c12 + c13 + c14 + c15 + c16;
|
|
#endif
|
|
|
|
const float inv_samples = 1.0 / float(SAMPLES);
|
|
|
|
fragColor = c1 * inv_samples;
|
|
}
|