// Author: TapiocaFox // Title: Default attribute vec3 position; void main() { gl_Position = vec4(position, 1.); }
// Author: TapiocaFox // Title: Fiber #ifdef GL_ES precision mediump float; #endif #define PI 3.14159265358979 #define gap 0.1 #define half_stroke_size 0.0075 #define deg_r 0.4125 #define size_unit 1200.*1. #define time_ratio_distort 0.25 #define time_ratio_noise 0.25 #define time_delay .5 #define time_fade_in .5 // #define opacity 0.25 uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 permute(vec4 x) { return mod289(((x*34.0)+10.0)*x); } vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; } float snoise(vec3 v) { const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); // First corner vec3 i = floor(v + dot(v, C.yyy) ); vec3 x0 = v - i + dot(i, C.xxx) ; // Other corners vec3 g = step(x0.yzx, x0.xyz); vec3 l = 1.0 - g; vec3 i1 = min( g.xyz, l.zxy ); vec3 i2 = max( g.xyz, l.zxy ); // x0 = x0 - 0.0 + 0.0 * C.xxx; // x1 = x0 - i1 + 1.0 * C.xxx; // x2 = x0 - i2 + 2.0 * C.xxx; // x3 = x0 - 1.0 + 3.0 * C.xxx; vec3 x1 = x0 - i1 + C.xxx; vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y // Permutations i = mod289(i); vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); // Gradients: 7x7 points over a square, mapped onto an octahedron. // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) float n_ = 0.142857142857; // 1.0/7.0 vec3 ns = n_ * D.wyz - D.xzx; vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7) vec4 x_ = floor(j * ns.z); vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) vec4 x = x_ *ns.x + ns.yyyy; vec4 y = y_ *ns.x + ns.yyyy; vec4 h = 1.0 - abs(x) - abs(y); vec4 b0 = vec4( x.xy, y.xy ); vec4 b1 = vec4( x.zw, y.zw ); // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; vec4 s0 = floor(b0)*2.0 + 1.0; vec4 s1 = floor(b1)*2.0 + 1.0; vec4 sh = -step(h, vec4(0.0)); vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; vec3 p0 = vec3(a0.xy,h.x); vec3 p1 = vec3(a0.zw,h.y); vec3 p2 = vec3(a1.xy,h.z); vec3 p3 = vec3(a1.zw,h.w); // Normalise gradients vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; // Mix final noise value vec4 m = max(0.5 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); m = m * m; return 105.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) ); } float calc_bg(vec2 st) { vec2 mod_st = mod(st, gap); vec2 pct_st = smoothstep(gap-half_stroke_size, gap, mod_st) + smoothstep(-half_stroke_size, 0., -mod_st); return max(pct_st.x, pct_st.y); } void main() { vec2 st = gl_FragCoord.xy/size_unit*2.-1.; mat2 rot; rot[0] = vec2(cos(deg_r), -sin(deg_r)); rot[1] = vec2(sin(deg_r), cos(deg_r)); st = st*rot; float pct_noise = .795*snoise(vec3(.25*st-vec2(.05*u_time, .025*u_time), time_ratio_noise*u_time))+.33; st.x -= sin(3.*st.x-PI*time_ratio_distort*u_time); st.x -= sin(3.*st.y-PI*time_ratio_distort*u_time); st.y -= sin(3.*st.y+PI*time_ratio_distort*u_time); st.y -= sin(3.*st.x+PI*time_ratio_distort*u_time); vec4 color = vec4(0., 0., 0., .0375); // color = vec4(0.298, 0.318, 0.427, .35); // color = vec4(0., 0., 0., .5); // color = vec3(abs(.25*sin(st.x+.95*PI*u_time)+.75),abs(.25*sin(st.y+.75*PI*u_time)+.75),abs(.25*sin(.5*PI*u_time)+.75)); float pct = calc_bg(st); color = mix(vec4(0., 0., 0., 0.), color, pct); color = mix(vec4(0., 0., 0., 0.), color, pct_noise); color = mix(vec4(0., 0., 0., 0.), color, step(time_delay, u_time)*smoothstep(time_delay, time_delay+time_fade_in, u_time)); gl_FragColor = color; // gl_FragColor = vec4(1.,1,.1,.1.); }
Please visit GitHub. If you are interested for more.
Personal practice of WebGL with the online editor written with CodeMirror by myself. GLSL is a special OpenGL Shading Language with syntax similar to C. Learn more.
// Author: TapiocaFox // Title: Default attribute vec3 position; void main() { gl_Position = vec4(position, 1.); }
// Author: TapiocaFox // Title: Adhesive #ifdef GL_ES precision mediump float; #endif #define PI 3.14159265358979 #define radius 0.75 uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; void main() { vec2 st = gl_FragCoord.xy/u_resolution.xy * 2. - 1.; st.x *= u_resolution.x/u_resolution.y; float r = radius; vec3 light = vec3(1., 1., 2.); st.x += sin(5.*st.x+PI*u_time); st.x += sin(5.*st.y-PI*u_time); st.y += sin(5.*st.y+PI*u_time); st.y += sin(5.*st.x+PI*u_time); float z = sqrt(r*r - st.x*st.x - st.y*st.y); vec3 stp = vec3(st, z); if(stp.p>0.) { vec3 color = vec3(0.); color = vec3(st.x,st.y,abs(sin(u_time))); float diffuse = step(abs(sin(u_time)),dot(stp, light)); gl_FragColor = vec4(vec3(diffuse)+color,1.0); } else { gl_FragColor = vec4(0.,0.,0.,1.0); } }
// Author: TapiocaFox // Title: Default attribute vec3 position; void main() { gl_Position = vec4(position, 1.); }
// Author: TapiocaFox // Title: Balls #ifdef GL_ES precision mediump float; #endif #define p_radius 0.2 #define t_delay 0.05 #define num_balls 16 #define PI 3.1415926535897932 uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; vec3 l_directional = normalize(vec3(1., 1., 2.)); vec3 l_ambient = vec3(0.7,0.78,0.92); void main() { vec4 color = vec4(0., 0., 0., 1.); for(int i=0; i<num_balls; i++) { vec2 st = gl_FragCoord.xy/u_resolution*2.-1.; st.x *= u_resolution.x/u_resolution.y; for(int j=0; j<3; j++) { float u_time_ch = u_time+(.5*sin(u_time+3.*float(i+1)))-float(3-j)*t_delay; // float u_time_ch = u_time-float(j)*t_delay; vec2 st_ch = st; st_ch.x -= sin(.5*u_time_ch+float(i)); st_ch.y -= sin(2.*u_time_ch+float(i)); float z = sqrt(p_radius*p_radius-st_ch.x*st_ch.x-st_ch.y*st_ch.y); vec3 stp = vec3(st_ch, z); if(z>0.) { float diffuse = dot(normalize(stp), l_directional); color[j] = l_ambient[j]+diffuse; color[3] = 1.; } } } gl_FragColor = color; }
// Author: TapiocaFox // Title: Default attribute vec3 position; void main() { gl_Position = vec4(position, 1.); }
// Author: TapiocaFox // Title: Radiant #ifdef GL_ES precision mediump float; #endif #define PI 3.1415926535897932 #define size_shrink 2. #define size_shrink_mouse 1. #define freq_polar 5. #define freq_rotate 0.4 #define t_delay .075 #define d_shift .2 uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; float random (vec2 st) { return fract(sin(dot(st.xy, vec2(12.9898,78.233)))* 43758.5453123); } void main() { vec2 st = gl_FragCoord.xy/u_resolution.xy*2. -1.; st.x *= u_resolution.x/u_resolution.y; vec2 st_mouse = u_mouse/u_resolution.xy *2. - 1.; st_mouse.x *= u_resolution.x/u_resolution.y; float atan_mouse = atan(st_mouse.x, st_mouse.y); float shrink_mouse = 1./(size_shrink_mouse*distance(st_mouse, vec2(0.))); vec3 color = vec3(1.); for(int i=0; i<3; i++) { float x = u_time; float tremor = d_shift*mix(sin(x), mix(sin(5.*x), mix(sin(5.*x), sin(12.*x), .9), .5), .2); float u_time_ch = u_time+tremor*float(i); // float u_time_ch = u_time; float d = distance(st, vec2(0.)); mat2 rot; float r = sin(freq_rotate*PI*(d-u_time))-atan_mouse; rot[0] = vec2(cos(r), -sin(r)); rot[1] = vec2(sin(r), cos(r)); vec2 st_new = rot*st; // d -= 1.*tremor; float pct = sin(freq_polar*atan(st_new.x, st_new.y))*sin((size_shrink)*PI*(shrink_mouse*d-u_time_ch))*.5+.5; pct = mix(0., pct, .5*random(st_new)+.5); color[i] = pct; } gl_FragColor = vec4(color,1.0); }
Daijishō is an android launcher that let you manage your retro games libraries. The App is written in Kotlin, Room database, Jsoup, Javet and various other tools. Designed with responsiveness, modularity and tight integration in mind.
Features included multi-language, meta data fetching, items synchronization, Google Drive backup, RetroAchievements and a rather simple theming system. Daijishō has 1M+ accumalated downloads on Google Play Store. And a community with 2k+ members on
Discord.
A full stack chatting software. Written in React.js with a microservice that provide realtime chat, channel management, permission control, user authentication and other features. The service is built on top of "NoService", a content management system (CMS) written from scratch.
It was used by my university's radio station "goto&Play". Embeded as a chatting bubble binded to a channel. Admins have fine-grained control through the interface as shown. Users can login to access the interface, but only with the channels where the permissions are given.
A simple rhythm game console made with Arduino UNO. You can edit your music sheet in browser and upload it to Arduino via bluetooth BLE. The editor also support the importation from the Open Music XML format through conversion.
A reversi game stack that can be controlled by various IoT devices, and can be displayed on the webpage. The AI agent uses CNN model, and the library was written purely in NumPy. It was my second year undergrad project.
Copyright © 2025 TapiocaFox.