Phong Reflection Model은 워낙 유명하고 관련 문서도 많으니, 간단하게 개요만 적으려 한다.
원래 3D 공간 상에서 빛과 쉐이딩을 표현하려면, 빛이 사물에 부딪혀 반사되는 것을 모두 시뮬레이션해야한다.
반사는 매우 많이 일어날 것이기 때문에, 리얼타임으로는 이러한 시뮬레이션이 힘들다.
Phong Reflection Model은 빛의 표현을 간단하게 근사하는 모델이다.
3가지 파트로 이루어진다.
- Ambient Lighting : 주변광을 의미한다.
- 빛이 외부로부터 들어올 때, 예를 들면 바깥에서 자연광이 창문 등으로 들어온다고 했을 때, 빛이 직접적으로 닿지 않는 곳도 어느정도 밝게 보인다.
- 일부 구역은 빛이 직접적으로 때리지 않더라도 환경과의 복잡한 난반사로 인해 어느정도의 밝기를 가지게 되기 때문이다.
- 이러한 난반사를 원래 계산해야 하는데, 그냥 계산하지 않고 주는 것이다.
- 즉, 기본적인 컬러를 깔아놓고 시작하는 것이다.
- Diffuse Lighting: 난반사광을 의미한다.
- 표면이 매우 잘게 거칠 때 빛이 들어오면 면에서 확률적으로, 거의 대부분의 방향에 대해 동일한 퍼센테이지로 반사가 일어난다.
- 여기서는 빛이 들어왔을 때 모든 방향으로 동일한 세기로 반사한다고 그냥 단순하게 생각하기로 한다.
- 빛이 비스듬하게 누워서 들어오면 빛의 세기가 약하다고 가정, 세워져서 꽂히면 빛이 강하다고 가정한다.
- 물체에 뽀샤시한 효과를 준다.
- Specular Lighting: 정반사광을 의미한다.
- 거울에 레이저를 쏘면, 정확한 반사각에 눈을 가져다댔을 때 레이저가 쨍하고 밝게 보이는데, 이를 나타낸 것이다.
- 정반사각에서 쳐다볼 수록 세기가 강하고, 정반사각에서 벗어날 수록 세기가 약하다.
- 물체에 metallic한 효과를 준다.
Diffuse와 Specular의 경우 빛의 세기를 정하는데 각도가 사용된다.
두 벡터 간 각도가 작을 수록 숫자가 커지도록, 식에 벡터의 내적을 사용하게 된다.
최종적으로 Phong Reflection Model의 식은 다음과 같이 나타내진다.
- K는 물체 본연의 계수, 즉 물체의 본래 컬러를 의미한다.
- 위의 식은 Ka, Kd, Ks로 ambient, diffuse, specular마다 각각 계수를 따로 두었다.
- 하지만 실제로 물체가 ambient 색 따로, diffuse 색 따로, specular 색 따로인 경우는 흔치 않다.
- 따라서 코딩할 때에는 Ka, Kd, Ks를 하나로 통일하기도 한다.
- i는 빛의 컬러를 의미한다.
- i_a, i_d, i_s는 각각 빛의 ambient, diffuse, specular 컬러를 나타낸다.
- 이것도 마찬가지로, 코딩할 때에는 하나로 통일하기도 한다.
- L은 표면->광원에 해당하는 벡터,
- N은 표면의 normal,
- R은 광원의 정반사 벡터,
- V는 표면->카메라에 해당하는 벡터이다.
- dot(Lm, N)은 빛이 표면을 얼마나 똑바로 때리는지를 나타내고(DiffuseFactor),
- dot(Rm, V)는 카메라가 정반사각에서 얼마나 떨어져있는지를 나타낸다(SpecularFactor).
그리고 Specular 파트의 경우 내적 결과값을 알파만큼 제곱하였는데, 알파는 shininess를 의미한다.
무슨 말이냐면, 내적의 결과값을 제곱하면 할 수록 그 값은 theta가 0에서 멀어질 수록 빠르게 떨어진다.
0~1 사이 값을 제곱하는 것이기 때문.
즉, 위 Specular 이미지에서 Light reflection과 Viewer 사이 각도가 조금만 벌어져도 빛의 세기가 빠르게 줄어든다는 것이다.
보시다시피, shininess가 클 수록 빛이 쨍해보이는 범위가 줄어든다.
쉐이더에서 이 식을 구현하면, Phong Reflection Model에 의거하여 쉐이딩을 표현할 수 있다.
'OpenGL > 공부' 카테고리의 다른 글
[OpenGL] Phong Reflection Model - 구현 (0) | 2024.06.19 |
---|---|
[OpenGL] Normal Transformation (Normal Matrix) (0) | 2024.06.15 |
[OpenGL] Textures (6) - 적용 (sampler2D) (+Instancing) (1) | 2024.06.13 |
[OpenGL] Textures (5) - 적용 (VAO 수정) (6) | 2024.06.13 |
[OpenGL] Textures (4) - 로드(stb_image), 생성, 바인딩(Texture Unit) (1) | 2024.06.13 |