라이팅(lighting 또는 illumination)
- 빛과 물체 간 상호작용을 처리하는 기술
9.1 퐁 모델
광원(light source)
- 점 광원(point light source)
- 간단한 광원
- 3차원 공간의 한 점으로부터 전방위로 빛이 발산되는 것
- 점 광원으로부터 멀리 떨어진 물체일수록 빛을 덜 받게 되는데, 이는 빛이 물체까지 이동하는 동안 점차 희석되기 때문
- 방향성 광원(directional light source)
- 물체 표면의 여러 점에 입사하는 빛의 방향이 서로 평행한 것. ex) 태양
- 물체 표면의 각 점들로부터 광원까지의 거리를 무시하고, 광원의 색상과 단일한 입사 방향만 고려하면 된다.
BRDF(bidirectional reflectance distribution function, 양방향 반사율 분포 함수)
- 물체 표면으로 들어오는 빛과 카메라를 향해 나가는 빛 사이의 관계
퐁 모델(pong lighting model)
- 실시간 렌더링을 위해서 BRDF를 극단적으로 단순화한 것
- 물체 표면에서 감지되는 색상을 디퓨즈(diffuse), 스페큘러(specular), 앰비언트(ambient) 반사와 발산광(emissive light) 네 가지 항목으로 분리해서 처리
- 디퓨즈, 스페큘러 항은 광원으로부터 물체 표면에 직접 들어오는 빛인 직접 조명을 다룬다.
- 앰비언트 항은 다른 물체가 반사하는 빛인 간접 조명을 다룬다.
- 발산광은 물체 스스로 빛을 발산하는 경우에 사용
9.1.1 디퓨즈 항 - 난반사
디퓨즈 항은 램버트의 법칙(Lambert's law)에 따라 정의된다.
난반사
- 램버시안 표면(Lambertian surface) 혹은 디퓨즈 표면이라 불리는 이상적인 표면으로 들어온 빛은 모든 방향을 따라 같은 강도로 반사된다.
- 카메라에 의해 감지되는 빛은 카메라의 시선에 무관하며 오로지 물체 표면에 들어오는 빛의 양에 비례하게 된다.
물체 표면으로 들어오는 빛의 방향은 이른바 빛 벡터(light vector)에 의해 정의된다.
방향성 광원을 사용하면, 라이팅을 수행할 장면의 모든 지점은 동일한 빛 벡터를 가진다.
빛 벡터는 $l$로 표기하고, 계산 상 편의를 위해 실제 빛이 들어오는 방향과 반대로 정의하자.
물체 표면의 점 p의 노멀(normal)과 빛 벡터 l 사이의 각도 θ를 입사각(incident angle)이라고 한다.
θ가 작을수록 p는 더 많은 빛을 받는다. n과 l이 정규화되어 단위 벡터로 표현되어 있다면, n과 l의 내적을 사용하여 p에 들어오는 빛의 양을 결정할 수 있다.
$n\cdot l = \left\| n \right\| \left\| l \right\| \cos{\theta} = \cos{\theta}$
$\theta = 0^{\circ}$일 경우, 즉 n과 l이 같다면 $n \cdot l = 1$이 되어 p는 최대의 빛을 받는다.
$\theta = 90^{\circ}$일 경우, $n \cdot l = 0$이 되어 p는 빛을 받지 않는다.
$\theta > 90^{\circ} $일 경우, p는 빛을 받지 않는다. 이 경우에는 $n \cdot l$은 음수가 된다.
음수가 되는 문제를 해결하기 위해 다음과 같이 쓸 수 있다.
$max \left(n \cdot l, 0 \right)$
이 식은 p에 들어오는 빛의 '강도'만을 결정한다.
위 식은 백색광에서 빨간색 물체를 비추는 것이다. 반사되는 색상은 빨간색이다. 식은 우측과 같다.
$s_d$는 광원의 RGB 색상을, $m_d$는 물체의 디퓨즈 계수(diffuse reflectance)를 나타낸다(s는 광원(light source)을, m은 재질(material)을 의미한다).
퐁 모델의 디퓨즈 항은 빛의 '강도'를 구하는 식과 반사되는 빛의 '색상'을 결합하여 다음과 같이 정의된다.
$max \left( n \cdot l, 0 \right) s_d \otimes m_d$
9.1.2 스페큘러 항 - 정반사
퐁 모델의 스페큘러 항은 물체 표면에 하이라이트(highlight)를 만드는 데 사용
이를 위해 시선 벡터(view vector)와 반사 벡터(reflection vector)가 필요
시선 벡터는 물체 표면의 점 $p$와 카메라를 연결하는 것으로 $v$로 표기된다.
빛 벡터 $l$과 마찬가지로 $v$도 계산 편의를 위해 실제 카메라 시선과 반대 방향으로 정의
정반사
- $p$에 들어온 빛이 입사각 θ와 동일한 각도를 이루며 반사되는 것
반사되는 빛의 방향을 따른 벡터가 반사 벡터이며 $r$로 표기한다.
$n$과 $l$이 이루는 입사각 θ 는 $n$과 $r$이 이루는 반사각과 같다.
디퓨즈 텀은 카메라 위치에 독립적이지만, 스페큘러 텀은 의존적이다.
완벽하게 매끄러운 표면이라면 $p$에서의 하이라이트는 $\rho = 0$일 경우에만 즉 $r$과 $v$가 일치할 경우에만 카메라에 포착된다.
완벽하게 미끄러운 표면이 아닌 경우, $\rho$가 정확히 0이 아니더라도 0에 가깝다면 카메라는 하이라이트를 볼 수 있게 된다. 반사광이 퍼지기 때문이다.
즉, $\rho = 0$ 일 때 최대의 하이라이트를 보게 되고, $\rho$가 커짐에 따라 하이라이트의 밝기는 빠르게 감소한다.
하이라이트를 볼 수 있는 영역은 $r$을 중심으로 한 원뿔 모양으로 묘사할 수 있다.
원뿔 속에서 하이라이트가 감소되는 정도는 다음과 같이 근사적으로 계산된다.
$\left(r \cdot v\right)^{sh}$
$sh$는 shininess의 앞 글자로 표면의 매끈함 정도를 나타낸다.
$r$과 $v$가 같으면 sh값에 관계 없이 $ \left(r \cdot v\right)^{sh} = 1 $이 되고 최대의 하이라이트가 카메라에 보인다.
$r$과 $v$가 다르면 sh가 커질수록 하이라이트는 급격히 감소하게 된다.
퐁 모델의 스페큘러 항은 다음과 같이 정의된다.
$s_s$는 광원의 색상, $m_s$는 물체의 스페큘러 계수(specular reflectance)이다.
일반적으로 $s_s$는 디퓨즈 항에서 사용한 $s_d$(광원의 색상)와 동일한 값을 가진다.
하지만 $m_d$(디퓨즈 계수, 텍스처로부터 가져옴)와 달리 $m_s$는 $\left(0.9, 0.9, 0.9\right)$, $\left(0.8, 0.8, 0.8\right)$ 등과 같은 회색조(gray-scale)로 표현되는데, 이는 물체 표면의 하이라이트가 광원의 색을 반영하도록 하기 위함이다. ex) 빨간색 금속 물체에 흰색 광원이 비치는 경우에 물체가 빨간색이더라도 하이라이트 영역은 흰색으로 빛난다.
-> 정반사의 특징인 물체 고유의 색은 죽이고 광원 색상을 내보내준다. 다만 물체 특성에 따라 전부 안내보내기 때문에 회색조를 적용해서 내보냄
따라서 $m_s$는 회색조로 설정되어, $s_s$가 반사되는 정도를 조절하게 된다.
9.1.3 앰비언트 항
앰비언트 빛(ambient light)
- 장면의 모든 지점에서 반사된 빛이 어우러진 것
앰비언트 빛은 장면의 모든 지점에서 반사된 빛이 어우러진 것이므로 어떤 특정한 방향이 아닌 '모든 방향을 따라' $p$점에 들엉온다.
따라서 $p$에서 '모든 방향을 따라' 반사된다.
$p$에 들어오는 앰비언트 빛의 양은 $p$의 노멀에 무관하고, $p$에서 반사되는 빛의 양은 카메라 시선에 무관하다.
따라서 앰비언트 반사는 다음과 같이 간단하게 정의된다.
$s_a \otimes m_a$
$s_a$는 앰비언트 빛의 RGB 색상이고, $m_a$는 물체의 앰비언트 계수(ambient reflectance)
위의 렌더링된 사진은 2차원 물체처럼 보이는데, 표면 노멀 및 카메라 시선에 무관한 식이기 때문에 주전자 표면에 음영 차이를 만들 수 없기 때문이다.
간접 조명을 표현하는 앰비언트 항으로 인해 광원으로부터 빛이 직접 닿지 않는 부분에도 조명 효과를 줄 수 있게 된다.
예를 들어, 디퓨즈 항으로만 렌더링 한 주전자와 스페큘러 항으로만 렌더링 한 주전자의 오른족 아래 부분은 완벽한 검은색이다. 하지만 앰비언트 항으로만 렌더링한 주전자에서 이 부분은 다른 주전자의 다른 부분과 마찬가지로 약간의 조명을 받는다. 그 이유는 앰비언트 항이 실세계 간접 조명의 디테일을 잡아내기에는 너무 단순화되어 있기 때문이다. 그래서 모두 검은색으로 안 나오는 것이다.
9.1.4 발산광
퐁 모델의 발산광 항은 물체 자신이 빛을 발산하는 경우에 사용된다.
이때 RGB 색상은 $m_e$로 표기된다.
앰비언트 항의 경우와 같은 이유로, 2차원처럼 보인다.
퐁 모델은 발산광을 가진 물체를 광원으로 취급하지 않는 한계가 있다. 따라서 같은 공간의 다른 물체를 라이팅하는 데 기여하지 못한다.
퐁 모델 수식
마지막 그림은 네 개의 항에서 산출된 RGB 값들을 산술적으로 더한 결과를 보여준다.
빛을 발산하지 않는 물체의 경우, 발산광 $m_e$를 삭제하면 된다.
물체가 램버시안 표면에 가깝다면 $m_d$는 크게, $m_s$를 작게 설정한다.
반짝이는 금속성 물체를 표현하기 위해서는 $m_s$를 크게 설정한다.
9.2 퐁 라이팅을 위한 쉐이더
위 사진은 한 물체 표면의 두 점을 보여주고, 한 점마다 하나의 프래그먼트가 생성된다고 가정한다.
프래그먼트 쉐이더는 각 점마다 퐁 모델의 수식을 이용해 라이팅을 수행한다.
이를 위해 빛 벡터 $l$, 노멀 $n$, 반사 벡터 $r$, 시선 벡터 $v$가 필요하다.
여기서는 방향성 광원만 다루므로, 두 점에서 $l$은 동일한 방향을 가진다. 따라서 프래그먼트 쉐이더에게 유니폼으로 젝공된다.
반면, 나머지 $n, r, v$는 두 점에서 모두 다른데, 프래그먼트 쉐이더에게 실제로 입력되는 것은 $n$과 $v$이다. $r$은 자체적으로 계산한 후, 퐁 모델 수식을 구현한다.
광원이 월드 공간에 있으므로 빛 벡터 $l$은 월드 공간에서 정의된다.
따라서 퐁 모델 디퓨즈 항에서 $l$과 결합될 $n$ 역시 월드 공간 벡터여야 한다.
이를 위해 정점 쉐이더는 오브젝트 공간에서 정의된 정점 노멀을 월드 공간으로 변환한 뒤 이를 래스터라이저에게 넘겨줘야 한다.
래스터 라이저는 이를 보간하여 각 프래그먼트마다 월드 공간 노멀 $n$을 할당한다.
위 사진에서 두 정점 $p_1$과 $p_2$ 각각의 월드 공간 노멀인 $n_1$과 $n_2$를 보여준다.
$p_1$과 $p_2$를 잇는 선분 상의 두 점 a와 b가 각각 프래그먼트를 생성한다고 가정한다. 그러면 래스터라이저는 $n_1$과 $n_2$를 보간하여 a의 노멀 $n_a$와 b의 노멀 $n_b$를 계산한다.
위 사진엥서 두 프래그먼트 a와 b는 시선 벡터를 필요로 한다. 이를 $v_a$, $v_b$로 표기한다. 월드 공간에서 정의되어야 한다. (라이팅 할 때 월드 공간에서 하므로)
이를 위해 정점 쉐이더는 각 정점의 오브젝트 공간 좌표를 월드 공간으로 변홯한 후 이를 카메라(EYE)와 연결하여, 위 사진처럼 정점의 월드 공간 시선 벡터 $v_1$, $v_2$를 계산한다.
래스터라이저는 이들을 보간하여 프래그먼트별 월드 공간 시선 벡터 $v_a$와 $v_b$를 계산한다.
$n$, $v$는 래스터라이저가 제공하고, $l$은 GL 프로그램이 유니폼으로 제공한다.
프래그먼트 쉐이더는 $r = 2n\left(n \cdot l\right) - l$ 수식을 이용해 $r$을 계산한 후, 최종적으로 퐁 모델을 구현한다.
프래그먼트 쉐이더가 퐁 모델 구현을 위해 사용하는 $l, n, r, v$는 모두 월드 공간 벡터이다.
스크린 공간 프랙그먼트의 색상 계산을 위하여 월드 공간 데이터를 이용하는 것이다.
퐁 라이팅을 위한 정점 쉐이더
v_view는 정점별 월드 공간 시선 벡터이다.
월드 공간 정점 노멀을 계산해서 출력 변수 v_normal에 할당한다.
월드 공간 시선 벡터를 계산해서 v_view에 할당한다.
텍스처 좌표는 v_texCoord로 복사된다.
출력 변수인 v_normal, v_view, v_texCoord는 래스터라이저가 보간에 사용한다.
마지막으로 클립 공간 정점 좌표 gl_Position을 출력한다.
퐁 라이팅을 위한 프래그먼트 쉐이더
출처
[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용
'공부 > 컴퓨터 그래픽스' 카테고리의 다른 글
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 11 오일러 변환 및 쿼터니언 (0) | 2024.07.12 |
---|---|
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 10 출력 병합기 (0) | 2024.07.12 |
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 08 이미지 텍스처링 (0) | 2024.07.07 |
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 07 래스터라이저 (0) | 2024.07.07 |
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 06 OpenGL ES와 쉐이더 (0) | 2024.07.07 |