The Code Therapy

2D Game Shaders

The visuals of a 2d game called TriangleGame which I made a few years ago and never finished, reimagined with shaders cause why not

Created by jupahe64 on Thu, 01 Dec 2022 23:22:45 GMT.


#version 300 es
precision highp float;

uniform vec2 resolution;
uniform float time;
out vec4 fragColor;

float TAU = 6.283185307179586;

float rand(vec2 co){
    return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}

float aaStep(float edge, float value) {
    return smoothstep(edge, edge-fwidth(value), value);
}

vec2 clampUnderLine(vec2 p, vec2 nrm, vec2 origin) {
  float dist = dot(p-origin, nrm);
  return (dist<0.0)?p:p-nrm*dist;
}

void main()
{
    fragColor = vec4(0.0,0.0,0.2,1.0);

    // Normalized pixel coordinates (from -1 to 1)
    vec2 uv = (gl_FragCoord.xy-resolution.xy/2.0)/min(resolution.x,resolution.y)*2.0;
    
    
    uv*=6.0;
    
    {
        vec4 objFragColor = vec4(0.0);
    
        vec3 col = vec3(
        0.1 + 0.2 * cos(time+uv.y+1.0),
        0.0,
        0.6 + 0.3 * cos(time+uv.x));

        objFragColor += vec4(col,1.0)*aaStep(0.3,length(uv));

        float d = length(uv)+time*0.3;

        float a = min(floor(d/0.2)-time*0.3/0.2, 3.1415);

        objFragColor += vec4(0.5,0.6,1.0,1.0)*pow(abs(sin(a)),2.0)*aaStep(0.05,abs(mod(d,0.2)-0.1));

        for(int i=0; i<12;i++) {
            float offsetTime = time*4.0-float(i)*0.4;
            float t = fract(offsetTime);
            float angle = TAU*rand(vec2(float(i),floor(offsetTime)));
            d = 0.8-t*0.7;
            objFragColor += aaStep(0.04,distance(vec2(sin(angle),cos(angle))*d, normalize(uv)*pow(length(uv),0.8)));
        }
        
        fragColor = mix(fragColor, objFragColor, objFragColor.a);
    }
    
    
    vec2 cell = floor(uv+.5);
    
    bool isRedSphere = (max(abs(cell.x), abs(cell.y))==5.0);
    
    uv = mod(uv+.5, 1.0)-0.5;
    
    {
        vec3 col = vec3(
        0.8 + 0.2 * cos(time+uv.x),
        0.1 * cos(time+uv.y+1.0),
        0.1 * cos(time+uv.y+1.0)
        );

        vec4 objFragColor = vec4(0.0);

        objFragColor += vec4(col+pow(length(uv)/0.4,5.0),1.0)*aaStep(0.35, length(uv));

        float d = length(uv)-time*0.3;

        float a = min(floor(d/0.15)+time*0.3/0.15, 3.1415);
        
        float alpha = pow(abs(sin(a)),2.0);

        objFragColor += vec4(alpha)*aaStep(0.05,abs(mod(d,0.2)-0.1))*0.5;
        
        fragColor = mix(fragColor, objFragColor, float(isRedSphere)*objFragColor.a);
    }
}