1. Writing advanced patterns with shader
Small Japanese flag
precision lowp float; varying vec2 vUv; float strength = step(0.5,distance(vUv,vec2(0.5)) + 0.25); gl_FragColor =vec4(strength,strength,strength,strength);
Draw a circle
precision lowp float; varying vec2 vUv; float strength = 1.0 - step(0.5,distance(vUv,vec2(0.5)) + 0.25); gl_FragColor =vec4(strength,strength,strength,strength);
Ring
precision lowp float; varying vec2 vUv; float strength = step(0.5,distance(vUv,vec2(0.5)) + 0.35); strength *= (1.0 - step(0.5,distance(vUv,vec2(0.5)) + 0.25)); gl_FragColor =vec4(strength,strength,strength,strength);
Gradient ring
precision lowp float; varying vec2 vUv; float strength = abs(distance(vUv,vec2(0.5))-0.25); gl_FragColor =vec4(strength,strength,strength,1);
Target practice
precision lowp float; varying vec2 vUv; float strength = step(0.1,abs(distance(vUv,vec2(0.5))-0.25)); gl_FragColor =vec4(strength,strength,strength,1);
Wave Ring
precision lowp float; vec2 waveUv = vec2( vUv.x, vUv.y + sin(vUv.x*30.0)*0.1 ); loat strength = 1.0 - step(0.01,abs(distance(waveUv,vec2(0.5))-0.25)); gl_FragColor =vec4(strength,strength,strength,1);
precision lowp float; vec2 waveUv = vec2( vUv.x + sin(vUv.y*30.0)*0.1, vUv.y + sin(vUv.x*30.0)*0.1 ); loat strength = 1.0 - step(0.01,abs(distance(waveUv,vec2(0.5))-0.25)); gl_FragColor =vec4(strength,strength,strength,1);
precision lowp float; vec2 waveUv = vec2( vUv.x + sin(vUv.y*100.0)*0.1, vUv.y + sin(vUv.x*100.0)*0.1 ); float strength = 1.0 - step(0.01,abs(distance(waveUv,vec2(0.5))-0.25)); gl_FragColor =vec4(strength,strength,strength,1);
Show view based on angle
precision lowp float; float angle = atan(vUv.x,vUv.y); float strength = angle; gl_FragColor =vec4(strength,strength,strength,1);
Realize spiral gradient radar scanning based on angle
precision lowp float; float angle = atan(vUv.x-0.5,vUv.y-0.5); float strength = (angle + 3.14)/6.28; gl_FragColor =vec4(strength,strength,strength,1);
Realize radar scanning – dynamic selection through time
precision lowp float; vec2 rotateUv = rotate(vUv,3.14*0.25,vec2(0.5)); vec2 rotateUv = rotate(vUv,-uTime*5.0,vec2(0.5)); float alpha = 1.0 - step(0.5,distance(vUv,vec2(0.5))); float angle = atan(rotateUv.x-0.5,rotateUv.y-0.5); float strength = (angle + 3.14)/6.28; gl_FragColor =vec4(strength,strength,strength,1);
Kaleidoscope
precision lowp float; float angle = atan(vUv.x-0.5,vUv.y-0.5)/PI; float strength = mod(angle*10.0,1.0); gl_FragColor =vec4(strength,strength,strength,1);
Radiant
precision lowp float; float angle = atan(vUv.x-0.5,vUv.y-0.5)/(2.0*PI); float strength = sin(angle*100.0); gl_FragColor =vec4(strength,strength,strength,1);
Use noise to achieve smoke and ripple effects
precision lowp float; // noise function float noise (in vec2 _st) {<!-- --> vec2 i = floor(_st); vec2 f = fract(_st); // Four corners in 2D of a tile float a = random(i); float b = random(i + vec2(1.0, 0.0)); float c = random(i + vec2(0.0, 1.0)); float d = random(i + vec2(1.0, 1.0)); vec2 u = f * f * (3.0 - 2.0 * f); return mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y; } float strength = noise(vUv); gl_FragColor =vec4(strength,strength,strength,1);
Set waveform by time
precision lowp float; // noise function float noise (in vec2 _st) {<!-- --> vec2 i = floor(_st); vec2 f = fract(_st); // Four corners in 2D of a tile float a = random(i); float b = random(i + vec2(1.0, 0.0)); float c = random(i + vec2(0.0, 1.0)); float d = random(i + vec2(1.0, 1.0)); vec2 u = f * f * (3.0 - 2.0 * f); return mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y; } float strength = step(0.5,noise(vUv * 100.0)); gl_FragColor =vec4(strength,strength,strength,1);
Debugging using gui
const params = {<!-- --> uFrequency: 10, uScale: 0.1, }; ... //Create shader material; const shaderMaterial = new THREE.ShaderMaterial({<!-- --> vertexShader: basicVertexShader, fragmentShader: basicFragmentShader, uniforms: {<!-- --> uColor: {<!-- --> value: new THREE.Color("purple"), }, // frequency of waves uFrequency: {<!-- --> value: params.uFrequency, }, // Amplitude of wave uScale: {<!-- --> value: params.uScale, }, // Animation time uTime: {<!-- --> value: 0, }, uTexture: {<!-- --> value: texture, }, }, side: THREE.DoubleSide, transparent: true, }); .... gui .add(params, "uFrequency") .min(0) .max(50) .step(0.1) .onChange((value) => {<!-- --> shaderMaterial.uniforms.uFrequency.value = value; }); gui .add(params, "uScale") .min(0) .max(1) .step(0.01) .onChange((value) => {<!-- --> shaderMaterial.uniforms.uScale.value = value; });
float strength = step(uScale,cnoise(vUv * 10.0 + uTime)) ; gl_FragColor =vec4(strength,strength,strength,1);
Glow path
float strength =1.0 - abs(cnoise(vUv * 10.0)) ; gl_FragColor =vec4(strength,strength,strength,1);
Use blending functions to mix colors
// Use blending function to mix colors vec3 purpleColor = vec3(1.0, 0.0, 1.0); vec3 greenColor = vec3(1.0, 1.0, 1.0); vec3 uvColor = vec3(vUv,1.0); float strength = step(0.9,sin(cnoise(vUv * 10.0)*20.0)); vec3 mixColor = mix(greenColor,uvColor,strength); // gl_FragColor =vec4(mixColor,1.0); gl_FragColor =vec4(mixColor,1.0);