[miniRT] 핵심개념 - 퐁 조명 모델

sham·2022년 5월 20일
0

[miniRT]

목록 보기
18/19

퐁 조명 모델은 OpenGL에서 가장 널리 사용되는 조명 모델로, Ambient, Diffuse, Specular, emissive light, 이 네 가지 항목만을 고려하여 빛을 결정한다.

주변광 - Ambient

https://blog.kakaocdn.net/dn/RLCbG/btqLhPe2JBp/GyFkNukIBOVzANQdiYskoK/img.png

위 그림에서 B면은 직접적으로 빛에 노출되지 않지만 주변의 다른 물체면으로 부터 반사되어온 빛에 의해 밝기가 생긴다. 이렇게 주변 반사에 의해 우리 눈으로 반사되는 빛을 주변광(Ambient light)이라고 한다.

https://blog.kakaocdn.net/dn/7r5lx/btqyEUTgukK/Z8ZRfSAfxjX12XKpnKnPe0/img.png

간접조명을 의미하고, 광원과 상관없이 주변으로부터 들어오는 빛이다. 광원에 직접 노출되지 않는 면에 밝기를 부여하기 위해 사용된다. 지역 조명 모델에서 전역 조명 모델 효과를 근사적으로 부여하기 위해 사용한다.

주변 반사에 의해 물체면으로 입사되는 빛은 거의 모든 방향으로부터 날아들기 때문에 어디서 얼마만 한 세기로 날아오는지 계산하기가 매우 복잡하다.

주변광은 시점의 위치에 무관하게 모든 물체면에 대해 일정 크기로 밝기를 증가시키는 것으로 대신하기도 한다.

수식

모든 source로부터 모든 방향을 따라서 P로 들어오므로 normal(법선 벡터)이나 camera(ray 벡터)와는 전혀 상관이 없는 독립적인 값들이다. 따라서 아래의 식처럼 정의된다.

KaIaK_aI_a

Ka - 주변광 계수

Ia - 광원에서 물체면에 입사되는 입사광의 세기, 광원에 세기에 비례한다.

난반사 - Diffuse

주변 반사만 사용하면 물체의 모든 부분은 동일한 밝기로 보인다. 즉, 광원의 위치에 따른 명암 차이가 전혀 드러나지 않기 때문에 물체의 3차원적인 입체감을 부여하기 어렵다. 물체의 명암을 부여하기 위한 것이 확산 반사이다.

확산 반사는 광원에서 나온 빛이 직접 물체면에 부딪쳐 여러방향으로 확산되는 난반사에 해당된다.

완벽 확산체

https://blog.kakaocdn.net/dn/b8G1DA/btqK8kt0w8I/GZnrs9IoIvLEoOaBjK1nD1/img.png

위의 그림처럼 거친 면으로부터 반사되는 빛은 거의 모든 방향을 향한다. 이러한 물체를 완벽 확산체
(Perfect Diffuser)라 한다.

방향성 확산체

https://blog.kakaocdn.net/dn/C06Vt/btqLbl67A6f/k8vGaMFUXEjZHhyJ6H5ju0/img.png

위의 그림처럼 부드러운 표면으로부터 반사되는 빛은 거의 일정한 방향을 향하며, 이러한 물체를 방향성 확산체
(Directional Diffuser)라고 한다.

https://blog.kakaocdn.net/dn/cxGOw4/btqK83llAJo/aeLVkHrQuV4eFSqVg6bbu1/img.png

대부분의 물체면은 위의 그림처럼 반 원구 형태로 완벽 확산체이거나 방향성 확산체 이 두 가지 사이에 존재한다.

지역 조명모델에서는 그래픽 처리를 단순화하기 위해서 해당 물체가 반 원구 형태의 완벽 확산체임을 가정한다.

https://blog.kakaocdn.net/dn/bAZ4rm/btqyDDraryY/2KHxrb9nGeoZZ1ErPSu051/img.png

난반사를 의미하며, 광원으로부터 점P까지의 벡터를 l, 점 P의 normal을 n으로 표현한다. 두 벡터 사이의 각이 작으면 작을수록 점 P는 더 많은 조명을 받게 될 것이다. 0도라면 빛을 수직에서 다이렉트로 받고 있다는 말이 된다.

벡터 l과 n이 정규화 되어있다면 점 P로 들어오는 빛의 양은 두 벡터의 내적값이라고 정의할 수 있다.

  • 표준 벡터끼리의 내적 → cos세타 * 두 벡터의 길이, 표준 벡터의 길이는 1이므로 두 벡터가 이루는 사이각을 의미하게 된다.

수식

KdId(NL)K_dI_d(\vec N \cdot \vec L)

Kd - 확산광 계수

Id - 광선에서 물체면에 입사되는 입사광의 세기, 광원에 세기에 비례한다.

벡터 N - 표면 법선 벡터 (교점 법선 벡터)

벡터 L - 광원 벡터(ray 벡터)

정반사 - Specular

유리 공예, 윤기나는 물체처럼 어떤방향에서 바라볼 때에 광택이 나는 반질반질한 표면에서 반사되는 빛을 경면광(Specular light)이라 하고, 경면광에 의해 물체면에 형성된 반짝이는 이미지를 하이라이트(Highlight)라 한다.

경면광에 의한 물체면의 색은 물체 자체의 색(물체가 흡수해서 반사하는 색)이 아니라 광원 그 자체의 색이 그대로 우리 눈에 들어온다.

https://blog.kakaocdn.net/dn/CbQGx/btqLcUnWIXq/RJ7G1r8lxlkmrl9KEuRk51/img.png

그림과 같이 경면 반사는 빛의 정반사에 의한 것이다. 확산광이 공간상의 모든 방향으로 반사되는데 비해 경면광은 하나의 평면을 따라서 반사된다, 즉, 시점이 정확히 반사광의 진행방향에 놓여 있을 때만 반사광을 볼 수 있다.

https://blog.kakaocdn.net/dn/bQf8Sh/btqLeqGUy7D/Hnxsp8XZyczRBnbusLZP21/img.png

일반적으로 어떤 물체면이 완벽하게 매끄러울 수는 없으므로 경면광도 약간은 다른 방향으로 흩어진다. 그림처럼 시점이 약간 비껴 나 있어도 반사광 일부가 시점에 도달한다. 왼쪽의 경우 경면광의 세기를 그림으로 표현한 것으로, 반사광을 중심으로 하는 로우브(Lobe)는 시점과 반사 벡터가 일치할 때 가장 크다.

https://blog.kakaocdn.net/dn/mFXl5/btqyEzBOqVY/MYiA1eRzY5UcJ1wJb1Dozk/img.png

수식

KsIs(RV)nK_sI_s(\vec R \cdot \vec V)^n

Ks - 경면광 계수 (교점 법선 벡터)

Is - 광원에서 물체면에 입사되는 입사광의 세기

n - 광택 계수

벡터 R - 반사광 벡터

벡터 V - 카메라 벡터

벡터 R과 벡터 V 사이의 각이 0이 되면 하이라이트는 최대가 된다.

자체 발산광 - emissive light

다른 블로그에는 자체 발산광을 제외한 3가지 요소로만 정의하고 있는데, 무엇이 진짜지?

자체 발산광이다. 즉 순수하게 material에 의해서만 결정이 된다.


레퍼런스

Phong reflection model(Phong lighting model)

#7 Lighting - 조명효과, 퐁 조명 모델(Phong lighting model)

[Learn OpenGL 번역] 3-5. 조명 - Light casters

profile
씨앗 개발자

0개의 댓글