Lighting
Lighting은 lights와 objects의 상호작용을 관리하는 기술이다
대표적이었던 방식 중 하나는 Phong Model 방식이다
최근에는 PBR(Physically Based Rendering) 방식이 대중화되었다
하지만 이론적으로 배우기 쉽지 않기에 Phong Model 방식으로
Lighting의 개념을 배우는 것이 추천된다
Light source
광원에는 총 4가지 종류의 광원이 있다
이 글에서는 Directional light를 기준으로 Phong Model을 설명한다
Directional light는 태양과 같은 light이고
light의 방향은 물체의 위치와 관련 없이 동일하게 방사된다는 점을 기반으로 한다
- Directional light : 태양과 같은 light
- Point light : 사방으로 방사되는 전구와 같은 light
- Spot light : 손전등과 같은 light
- Area light : 한쪽으로 방사되는 조명과 같은 light
Phong Model
Phong Model 방식은 4가지 용어로 구성된다
- diffuse : 고르게 반사되는 형태
- specular : 한 방향으로 반사되는 형태
- ambient : 간접적인 빛들이 들어와서 보이는 형태
- emissive : 스스로 빛을 내뿜는 형태
Diffuse Term
Diffuse는 고르게 반사 되기 때문에
어떠한 위치에서 물체를 바라보더라도 색상의 변화는 존재하지 않는다
Diffuse의 핵심은 l(light vector)과 n(surface normal)이다
l과 n의 각도에 따라서 cos 그래프의 형태를 나타내지만
90도 이상부터는 0으로 빛의 반사가 없어지고 검게 표현된다
그리고 이를 수식으로 나타내면 max( n * l, 0)으로 표현할 수 있다
계산을 하는 방법은
component-wise multiplication을 통해서 계산되고
s는 light source, m은 material, d는 diffuse term으로
light source를 max를 통해 계산 한 diffuse 색상 값과 material의 diffuse 색상 값을 곱하면 된다
또한, md는 텍스쳐로부터 얻어오는 것이 일반적이다
Specular Term
Specular는 한 방향으로만 반사되기 때문에
위치에 따라 색상 및 하이라이트 되는 부분이 달라진다
Specular의 핵심은 r(reflection vector), v(view vector)이다
l과 n을 통해 r을 구할 수 있으며
카메라의 시점에 따라 v를 구할 수 있다
"fall off"는 이러한 반사된 광선의 강도 변화를 설명하는 요소 중 하나이다
r과 v 사이의 각도가 커질수록 광선의 강도가 감소하고
fall off 값을 작게 할수록, 하이라이트를 볼 수 있는 각도가 커진다
fall off 값을 크게 할수록, 하이라이트를 볼 수 있는 각도가 작아진다
이러한 fall off는 r과 v의 곱에 shininess 값을 의미한다
shininess 값을 주지 않은 경우와 shininess 값을 2와 64로 준 경우가 위의 그래프이다
shininess 값이 증가할수록, 하이라이트가 빨리 없어진다
계산하는 방법은 위와 같고
s는 light source, m은 material, 작은 s는 specular term으로
r과 v의 각도에 따른 max를 통해 shineness를 계산 한 light source의 specular 색상 값과
material의 specular 색상 값을 곱하면 된다
material의 diffuse 색상 값과는 달리,
material의 specular 색상 값은
하이라이트 되는 부분이 일반적으로 특정한 RGB 색상이 아닌
gray-scale value를 일반적으로 사용한다
'게임 그래픽스 > [전북대] OpenGL' 카테고리의 다른 글
[OpenGL Note] Output Merger - Z buffering (0) | 2024.04.20 |
---|---|
[OpenGL Note] Lighting - Ambient, Emmisive (0) | 2024.04.19 |
[OpenGL Note] Fragment Shader (0) | 2024.04.18 |
[OpenGL Note] Texture Wrapping과 Texture Filtering (0) | 2024.04.18 |
[OpenGL Note] Image Texturing (0) | 2024.04.17 |