mirror of
https://github.com/brl/mutter.git
synced 2024-12-29 14:22:13 +00:00
d4da3a3e2a
* clutter/cogl/gles/cogl-gles2-wrapper.c: All of the settings and uniforms are now proxied into COGL variables instead of setting the GL uniforms directly. Just before glDrawArrays is executed a shader is generated using the given settings to avoid using 'if' statements. The shaders are cached. * clutter/cogl/gles/cogl-fixed-vertex-shader.glsl: * clutter/cogl/gles/cogl-fixed-fragment-shader.glsl: The shaders are now split into parts using comments instead of 'if' statements so that the simplest shader can be generated on the fly. * clutter/cogl/gles/stringify.sh: Now splits up the shader sources into separate C strings where deliminated by special comments. * clutter/cogl/gles/cogl-program.h: * clutter/cogl/gles/cogl-program.c: A custom shader can no longer be directly linked with the fixed-functionality replacement because the replacement changes depending on the settings. Instead the bound shader is linked with the appropriate replacement shader just before glDrawArrays is executed. The custom uniform variables must also be proxied through COGL variables because their location can change when relinked.
74 lines
2.1 KiB
GLSL
74 lines
2.1 KiB
GLSL
/*** cogl_fixed_fragment_shader_start ***/
|
|
|
|
/* There is no default precision for floats in fragment shaders in
|
|
GLES 2 so we need to define one */
|
|
precision mediump float;
|
|
|
|
/* Inputs from the vertex shader */
|
|
varying vec4 frag_color;
|
|
varying vec2 tex_coord;
|
|
varying float fog_amount;
|
|
|
|
/* Texturing options */
|
|
uniform sampler2D texture_unit;
|
|
|
|
/* Fogging options */
|
|
uniform vec4 fog_color;
|
|
|
|
/* Alpha test options */
|
|
uniform float alpha_test_ref;
|
|
|
|
void
|
|
main (void)
|
|
{
|
|
/*** cogl_fixed_fragment_shader_texture_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;
|
|
|
|
/*** cogl_fixed_fragment_shader_texture ***/
|
|
|
|
/* This pointless extra variable is needed to work around an
|
|
apparent bug in the PowerVR drivers. Without it the alpha
|
|
blending seems to stop working */
|
|
vec4 frag_color_copy = frag_color;
|
|
gl_FragColor = frag_color_copy * texture2D (texture_unit, tex_coord);
|
|
|
|
/*** cogl_fixed_fragment_shader_solid_color ***/
|
|
gl_FragColor = frag_color;
|
|
|
|
/*** cogl_fixed_fragment_shader_fog ***/
|
|
|
|
/* Mix the calculated color with the fog color */
|
|
gl_FragColor.rgb = mix (fog_color.rgb, gl_FragColor.rgb, fog_amount);
|
|
|
|
/* Alpha testing */
|
|
|
|
/*** cogl_fixed_fragment_shader_alpha_never ***/
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_less ***/
|
|
if (gl_FragColor.a >= alpha_test_ref)
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_equal ***/
|
|
if (gl_FragColor.a != alpha_test_ref)
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_lequal ***/
|
|
if (gl_FragColor.a > alpha_test_ref)
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_greater ***/
|
|
if (gl_FragColor.a <= alpha_test_ref)
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_notequal ***/
|
|
if (gl_FragColor.a == alpha_test_ref)
|
|
discard;
|
|
/*** cogl_fixed_fragment_shader_alpha_gequal ***/
|
|
if (gl_FragColor.a < alpha_test_ref)
|
|
discard;
|
|
|
|
/*** cogl_fixed_fragment_shader_end ***/
|
|
}
|