smoothstep의 보간식
아래의 a와 b는 동일한 값이다.
float f = uv.x; float a = smoothstep(0., 1., f); float b = f * f * (3. - 2. * f);
위의 보간식을 cubic Hermite curve(큐빅 헤르미트 곡선)라고 한다. 0~1 사이의 영역에서 시작과 끝을 좀더 편평하게 만들어주는 quintic interpolation cuver(퀸틱 보간 곡선)에 대한 코드는 다음과 같다.
float f = uv.x; float b = f * f * f * (6. * f * f - 15. * f + 10.);
modelMatrix로 변환된 normal 얻기
varying vec3 vNormal; ... vNormal = mat3(transpose(inverse(modelMatrix))) * normal;
프레그먼트 쉐이더에서는 받은 vNormal을 반드시 정규화(normalize)해야 한다.
3초 주기로 0 ~ 1 사이의 연속된 값 얻기
uniform float u_time; // 0, 1, 2, ...의 값이며 각각 0초, 1초, 2초, ...를 나타냄 ... float period = 3.; // 3초 주기 float t = mod(u_time, period) / period; // 0 ~ 1 사이의 연속된 값 // sin 함수에 3.1415를 곱하는 이유는 sin 함수의 한 주기가 360도이기 때문임 vec3 color = mix(vec3(0), vec3(1), abs(sin(3.1415 * t))); // or vec3 color = mix(vec3(0), vec3(1), sin(3.1415 * t) * .5 + .5);
원하는 각도를 이루는 선
아래의 이미지는 45도를 이루는 선인데, 이처럼 원하는 각도를 이루는 선을 만들기 위한 코드이다.
uniform vec3 uResolution; uniform float uTime; uniform vec4 uMouse; #define PI (3.141592) void main() { vec2 st = gl_FragCoord.xy / uResolution.xy; st = (gl_FragCoord.xy - .5 * uResolution.xy) / uResolution.y; float w = fwidth(st.y); float a = (45.) * PI / 180.0; float d = dot(st, vec2(cos(a), sin(a))); d = smoothstep(-w, w, abs(d)); gl_FragColor = vec4(vec3(1. - d), 1.); }
다각형 그리기
uniform vec3 uResolution; uniform float uTime; uniform vec4 uMouse; #define PI 3.14159265359 #define TWO_PI 6.28318530718 void main(){ vec2 st = gl_FragCoord.xy/uResolution.xy * 2. - 1.; //-1-1 st.x *= uResolution.x/uResolution.y; vec3 color = vec3(0.0); float d = 0.0; // Number of sides of your shape int N = 6; // int N = int(floor(mod(uTime * 10., 20.))) + 3; // Angle and radius from the current pixel float a = atan(st.x,st.y)+PI; float r = TWO_PI/float(N); // Shaping function that modulate the distance d = cos(floor(.5+a/r)*r-a)*length(st); // color = vec3(d); // Distance Field color = vec3(1.0-step(.5, d)); // Fill // color = vec3(step(.5,d) * step(d,.51)); // Only outline gl_FragColor = vec4(color,1.0); }