다음과 같은 결과를 프레그먼트 쉐이더로 작성한다면 … ? 즉, 화면의 반을 가르고 가른 영역의 중심을 원점으로 삼으며 원점을 기준으로 gl_FragCoord 지점에 대한 좌표(x,y)에 대한 각도(atan(y,x)
)에 대해 왼쪽 영역은 cos 값으로, 오른쪽 영역은 sin 값으로 채움.
방식은 여러가지겠지만 여기서는 2가지 구현 코드를 언급함. 첫번째는 제시된 문제를 그대로 해석해 풀이한 것.
uniform vec2 iResolution; void main2() { vec2 uv = gl_FragCoord.xy / iResolution; vec2 origin = uv.x < 0.5 ? vec2(0.25, 0.5) : vec2(0.75, 0.5); vec2 v = uv - origin; float angle = atan(v.y, v.x); float c = cos(angle); float s = sin(angle); vec3 color = uv.x < 0.5 ? vec3(c) : vec3(s); gl_FragColor = vec4(color, 1.0); }
두번째는 삼각함수의 원리를 이해하고 상황에 맞게 최적화해 구현한 것.
uniform vec2 iResolution; void main() { vec2 uv = gl_FragCoord.xy / iResolution.xy; vec2 normal = uv.x > .5 ? normalize(uv - vec2(0.75, 0.5)) : normalize(uv - vec2(0.25, 0.5)); float t = uv.x > .5 ? normal.y : normal.x; gl_FragColor = vec4(vec3(t), 1.0); }