modelMatrix로 변환된 normal 얻기
varying vec3 vNormal; ... vNormal = mat3(transpose(inverse(modelMatrix))) * normal;
프레그먼트 쉐이더에서는 받은 vNormal을 반드시 정규화(normalize)해야 한다.
공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
varying vec3 vNormal; ... vNormal = mat3(transpose(inverse(modelMatrix))) * normal;
프레그먼트 쉐이더에서는 받은 vNormal을 반드시 정규화(normalize)해야 한다.
다음과 같은 결과를 프레그먼트 쉐이더로 작성한다면 … ? 즉, 화면의 반을 가르고 가른 영역의 중심을 원점으로 삼으며 원점을 기준으로 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); }