Selected Student Works
This is a small selection of student works from the 2023 class “Advanced Computer Graphics”. The objective was to create an image of a sea slug using a single fragment shader. You can see the full homework description if interested.
// Naoki Nishigawa uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; float cro( in vec2 a, in vec2 b ) { return a.x*b.y - a.y*b.x; } float sdUnevenCapsule( in vec2 p, in vec2 pa, in vec2 pb, in float ra, in float rb ){ p -= pa; pb -= pa; float h = dot(pb,pb); vec2 q = vec2( dot(p,vec2(pb.y,-pb.x)), dot(p,pb) )/h; q.x = abs(q.x); float b = ra-rb; vec2 c = vec2(sqrt(h-b*b),b); float k = cro(c,q); float m = dot(c,q); float n = dot(q,q); if( k < 0.0 ) return sqrt(h*(n )) - ra; else if( k > c.x ) return sqrt(h*(n+1.0-2.0*q.y)) - rb; return m - ra; } float sdBox( in vec2 p, in vec2 b ){ vec2 d = abs(p)-b; return length(max(d,0.0)) + min(max(d.x,d.y),0.0); } vec3 capsuleColor ( float d, vec3 b, vec3 c1, vec3 c2, float g ){ return sign(d) < 0.0 ? mix(c1, c2, abs(d) * g) : b; } void main() { vec2 coord = gl_FragCoord.xy; float base_mask = 1.0; vec3 base_color = vec3(0.0); float d = 0.0; base_color = capsuleColor( sdUnevenCapsule(coord, vec2(0, 0.6), vec2(0, 0), 0.35, 0.34), base_color, vec3(1.0), vec3(1.0), 30.0); base_color = capsuleColor( sdUnevenCapsule(coord, vec2(0, 0.15), vec2(0, -0.2), 0.3, 0.37), base_color, vec3(1.0), vec3(1.0), 30.0); base_mask = 1.0; base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(-0.095, -0.55), vec2(-0.15, -0.93), 0.03, 0.01)); base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(-0.05, -0.55), vec2(-0.05, -0.95), 0.03, 0.01)); base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(0.0, -0.55), vec2(0.0, -0.95), 0.03, 0.01)); base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(0.05, -0.55), vec2(0.05, -0.95), 0.03, 0.01)); base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(0.085, -0.55), vec2(0.20, -0.9), 0.03, 0.01)); float a = -0.9, b = -0.3; float t = (clamp(coord.y, a, b) - a) / (b - a); float e = 1.0 - pow(1.0 - t, 3.0); base_color = base_mask > 0.0 ? base_color : mix(vec3(0.2, 0.2, 0.5), vec3(0.3, 0.9, 1.0), e); base_color = capsuleColor( sdBox(coord + vec2(0.0, 0.4), vec2(0.13, 0.2)), base_color, vec3(0.0, 0.5, 1.0), vec3(0.0, 0.5, 1.0), 1.0); base_color = capsuleColor( sdUnevenCapsule(coord, vec2(0, 0.61), vec2(0, -0.2), 0.24, 0.28), base_color, vec3(0.0, 0.5, 1.0), vec3(1.0, 0.2, 0.7), 3.0); base_mask = 1.0; base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(-0.1, 0.6), vec2(-0.15, 0.75), 0.05, 0.03)); base_mask *= step(0.0, sdUnevenCapsule(coord, vec2(0.1, 0.6), vec2(0.15, 0.75), 0.05, 0.03)); base_color = base_mask > 0.0 ? base_color : vec3(1.0, 0.5, 0.2); colour_out = vec4(base_color, 1.0); }
unknown by Naoki
Nishigawa
More Student Works
The rest of the student works from 2023 are shown below. Note that some are very computationally expensive and may potentially cause issues with your browser. Show Other Student Works