/* Inputs from the vertex shader */ varying vec4 frag_color; varying vec2 tex_coord; varying float fog_amount; /* Texturing options */ uniform bool texture_2d_enabled; uniform sampler2D texture_unit; uniform bool alpha_only; /* Fogging options */ uniform bool fog_enabled; uniform vec4 fog_color; /* Alpha test options */ uniform bool alpha_test_enabled; uniform int alpha_test_func; uniform float alpha_test_ref; /* Alpha test functions */ const int GL_NEVER = 0x0200; const int GL_LESS = 0x0201; const int GL_EQUAL = 0x0202; const int GL_LEQUAL = 0x0203; const int GL_GREATER = 0x0204; const int GL_NOTEQUAL = 0x0205; const int GL_GEQUAL = 0x0206; void main (void) { if (texture_2d_enabled) { if (alpha_only) { /* If the texture only has an alpha channel (eg, with the textures from the pango renderer) then the RGB components will be black. We want to use the RGB from the current color in that case */ gl_FragColor = frag_color; gl_FragColor.a *= texture2D (texture_unit, tex_coord).a; } else gl_FragColor = frag_color * texture2D (texture_unit, tex_coord); } else gl_FragColor = frag_color; if (fog_enabled) /* Mix the calculated color with the fog color */ gl_FragColor.rgb = mix (fog_color.rgb, gl_FragColor.rgb, fog_amount); /* Alpha testing */ if (alpha_test_enabled) { if (alpha_test_func == GL_NEVER) discard; else if (alpha_test_func == GL_LESS) { if (gl_FragColor.a >= alpha_test_ref) discard; } else if (alpha_test_func == GL_EQUAL) { if (gl_FragColor.a != alpha_test_ref) discard; } else if (alpha_test_func == GL_LEQUAL) { if (gl_FragColor.a > alpha_test_ref) discard; } else if (alpha_test_func == GL_GREATER) { if (gl_FragColor.a <= alpha_test_ref) discard; } else if (alpha_test_func == GL_NOTEQUAL) { if (gl_FragColor.a == alpha_test_ref) discard; } else if (alpha_test_func == GL_GEQUAL) { if (gl_FragColor.a < alpha_test_ref) discard; } } }