Spaces:
Build error
Build error
uniform sampler2D MainSampler; | |
uniform sampler2D MainDepthSampler; | |
uniform sampler2D TranslucentSampler; | |
uniform sampler2D TranslucentDepthSampler; | |
uniform sampler2D ItemEntitySampler; | |
uniform sampler2D ItemEntityDepthSampler; | |
uniform sampler2D ParticlesSampler; | |
uniform sampler2D ParticlesDepthSampler; | |
uniform sampler2D WeatherSampler; | |
uniform sampler2D WeatherDepthSampler; | |
uniform sampler2D CloudsSampler; | |
uniform sampler2D CloudsDepthSampler; | |
in vec2 texCoord; | |
vec4 color_layers[NUM_LAYERS]; | |
float depth_layers[NUM_LAYERS]; | |
int active_layers = 0; | |
out vec4 fragColor; | |
void try_insert( vec4 color, float depth ) { | |
if ( color.a == 0.0 ) { | |
return; | |
} | |
color_layers[active_layers] = color; | |
depth_layers[active_layers] = depth; | |
int jj = active_layers++; | |
int ii = jj - 1; | |
while ( jj > 0 && depth_layers[jj] > depth_layers[ii] ) { | |
float depthTemp = depth_layers[ii]; | |
depth_layers[ii] = depth_layers[jj]; | |
depth_layers[jj] = depthTemp; | |
vec4 colorTemp = color_layers[ii]; | |
color_layers[ii] = color_layers[jj]; | |
color_layers[jj] = colorTemp; | |
jj = ii--; | |
} | |
} | |
vec3 blend( vec3 dst, vec4 src ) { | |
return ( dst * ( 1.0 - src.a ) ) + src.rgb; | |
} | |
void main() { | |
color_layers[0] = vec4( texture( MainSampler, texCoord ).rgb, 1.0 ); | |
depth_layers[0] = texture( MainDepthSampler, texCoord ).r; | |
active_layers = 1; | |
try_insert( texture( TranslucentSampler, texCoord ), texture( TranslucentDepthSampler, texCoord ).r ); | |
try_insert( texture( ItemEntitySampler, texCoord ), texture( ItemEntityDepthSampler, texCoord ).r ); | |
try_insert( texture( ParticlesSampler, texCoord ), texture( ParticlesDepthSampler, texCoord ).r ); | |
try_insert( texture( WeatherSampler, texCoord ), texture( WeatherDepthSampler, texCoord ).r ); | |
try_insert( texture( CloudsSampler, texCoord ), texture( CloudsDepthSampler, texCoord ).r ); | |
vec3 texelAccum = color_layers[0].rgb; | |
for ( int ii = 1; ii < active_layers; ++ii ) { | |
texelAccum = blend( texelAccum, color_layers[ii] ); | |
} | |
fragColor = vec4( texelAccum.rgb, 1.0 ); | |
} | |