[vert.glsl]

#version 120

attribute vec2 in_Position;

varying vec4 pass_Position;

void main(void)
{
    pass_Position = vec4(0.5 * in_Position + 0.5, 0.0, 1.0);
    gl_Position = vec4(in_Position, 0.5, 1.0);
}

[frag.glsl]

#version 120

uniform sampler2D u_Texture;

varying vec4 pass_Position;

float rand(in vec2 p, in float v)
{
    return fract(v * sin(dot(p, vec2(1298.9837, 7823.33145))));
}

void main(void)
{
    vec2 t = pass_Position.xy;
    vec4 c0 = texture2D(u_Texture, t);
    float f = rand(pass_Position.xy, 12345.67);

    if (t.y > c0.x)
    {
        /* Sky */
        float val = min(t.y * 2.0, 1.0);
        if (f > 0.999)
            gl_FragColor = vec4(1.0);
        else
            gl_FragColor = vec4(0.4, t.y, val, 1.0);
    }
    else if (t.y > c0.x - 0.03)
    {
        /* Grass */
        if (f > 0.99)
            gl_FragColor = vec4(0.4, 0.7, 0.3, 1.0);
        else if (f > 0.9)
            gl_FragColor = vec4(0.3, 0.6, 0.2, 1.0);
        else
            gl_FragColor = vec4(0.2, 0.5, 0.1, 1.0);
    }
    else
    {
        /* Earth */
        if (f > 0.99)
            gl_FragColor = vec4(0.7, 0.4, 0.3, 1.0);
        else if (f > 0.9)
            gl_FragColor = vec4(0.6, 0.3, 0.2, 1.0);
        else
            gl_FragColor = vec4(0.5, 0.2, 0.1, 1.0);
    }
}