📌 Phong Lighting Model
Lighting (Illumination)
- 오브젝트와 라이트가 상호작용하는 것
- 옛날에 가장 많이 쓰이는 것은 Phong Model이 쓰이고 최근에는 Pixed Based Rendering 이 쓰인다.
상업 게임에서 많이 쓰이고 advanced lighting techniques에 많은 기초가 되었다.
Phone model을 이루는 term
Diffuse
: 표면이 알고보니 엄청 울퉁불퉁해서 난반사를 하는 것 같아
Specular
: 금속같은것은 난반사뿐만 아니라 번쩍 번쩍함이 있어, 특정 각도에서는 엄청 반사를 잘하는 것 같아
Ambient
: 주변에 있는 것이 영향을 주는 것 같아
Emissive
:형광 물질같은 자체발관
⇒ 이 네 개를 섞어서 그럴듯 하게 보이게 만든 것이 Phong Lighting Model이다.
✅ Light Sources
Point Light
- 하나의 포인트로부터 전 방향으로 빛을 뿜어내는 것
- 포인트로부터의 거리에따라 강도가 달라진다
- 광원으로부터의 거리에 따라 빛의 강도가 감소합니다.
The intensity of the light decreasing with distance.
Directional Light
- 보통 태양빛 같은 것
- 어디에 존재하다든 하나의 방향과 세기를 갖는다.
- 광원의 강도는 거리에 따라 변하지 않습니다.
The intensity of light does not change with distance.
Spotlight
- a cone shaped light, 형광등 백열등
- The intensity increases as closer to the center of the light cone and spotlight source.
광원의 중심에 가까워질수록 강도가 증가합니다.
Ambient
- 은은하게 밝혀주는 간접광을 constant c로 정의
✅ Diffuse Term
물테가 사실 되게 울퉁불퉁해서 난반사가 일어나는데…
What is diffuse light?
- the scattered light를 어떻게 모델링할까
- light가 주변으로 uniform하게 퍼진다.
Diffuse Term in Phong Lighting Model
- 유니폼하게 적당한 세기로 전체로 나아간다고 하자
- diffuse surfaces : 충분히 울퉁불퉁하여 난반사를 일으키는 표면
→ diffuse surfaces이 아닌 것 : 금속
- independent of the view direction, 빛이 얼마나 세게 들어오냐와 관심이 있다.
- amount of incoming light : 입사각에 영향을 받는다.
Diffuse computation
- the light vector (l) and surface normal (n)
→ 보통 두 벡터는 다 nomal vecter이다.
→ 그렇기 때문에 두 벡터의 dot product는 대부분 두 벡터가 이루는 갹도만 고려한다는 이야기
- sd : the RGB color of the light source
- md : the diffuse reflectance of the object material
- x : 그냥 벡터 곱한 것 생각하기 component-wise multiplication.
- md : The material parameter
메테리얼의 색
- (1,1,0)의 의 백색광을 쐈는데 오브젝트가 노란색으로 보인다면 이것은 R G는 반사하고 B는 흡수하는 것이다
- 물리적으로 100퍼 맞진 않아 그냥 적당히 잘 되도록 approximation한 것이기 때문에
✅ Specular Term
The specular term is used to make a surface look shiny via highlights, and it requires view vector (v) and reflection vector (r) in addition to light vector (l).
카메라가 어디에 위치해 있는지가 중요해진다.
- r 벡터에 가까울 수록 잘 보이고 멀어질수록 잘 안보이며 일정 거리 이상으로 나가면 아얘 안 보인다
Whereas the diffuse term is view-independent, the specular term is highly view-dependent.
- perfectly shiny surface : 완전히 정반사만 함.
- surface that is not perfectly shiny :
⇒ 로가 0일 때 최대 0가 증가해가면서 서서히 감소하도록 모델링한다.
- sh : shiness term, 승수
- 조금만 벗어나도 눈이 안 부시게 만들고 싶어 승수를 사용한다.
- sh는 반사광을 볼 수 있는 각도를 조절해주는 1 이하의 수
✅ Ambient Term
What is ambient light?
- 간접광 : 주변에 튕겨 내 눈에 들어오는 값
- 다 계산하기 너무 힘드니까 그냥 적당히 C 정도로 나온다고 생각하자
✅ Emissive Term
What is emissive term?
- 자체발광하는 거에 많이 쓴다.
- 애도 그냥 constant value로 조절한다.
The Phong model sums the four terms
- 과연 전부 다 더하면 태양으로부터 나온 빛P(light source)가 될까?
- 전부 난반사를 일으킨다고 했는데 과연 그럴가?
- 결이 있는 오브젝트는 좀 어색해..
⇒ 그래서 이걸 다 지켜 만든것이 BPR이다.
Per-pixel Lighting
Per-vertex lighting vs. per-pixel lighting
- Per-vertex lightin
픽셀마다 해주려면 너무 크니까 vertex shaser에서 light로 칼라 계산한 다음에 resterizer가 분산해주는 색깔 입힌다.
→ 최근에는 이런거 없다 gpu가 그냥 알아서 해준다.
Consider two points on an object's surface, each of which makes up a distinct pixel.
- The pixel shader computes lighting using l, n, r, and v.
- 계산 상의 편의를 위해 directional light vecter는 같은 값이라 설정
- 오브젝트의 표면에 따라 n r v가 달라져야 한다
- r: r = 2n(n·l)-l. → 을 하는 이유는 그냥 vertex shader에서 ps로 넘겨주는 파라미터를 하나 줄이기 위해서이가
✔ Normal for each pixel
- l : world-space vector
→ cpu에서 넣은 것이다. (space change 되기 전)
→ n을 world space로 넘김
- VS에서 n을 넘길 때 Mw를 곱해 n을 구한것을 pixel shader로 넘겨주어야 한다는 것을 의미
✔ View vector for each pixel
- VS에서 v vecter를 world spave로 보내주고 camera position EYE를 이용해 view vecter를 구해주고 이것을 resterizer로 넘겨 interpolation 시켜서 vavb를 구한다.
⇒ 구한 것들로 최종적으로 구한다
Blinn-Phong Reflection Model
BPR이 나오기 전에 퐁의 단점을 고치기 위해 시도한 발악
- 이후 PBR에서도 사용이된다.
- h라는 halfway vecter를 정의한다.
🖇 Reference
해당 포스트는 강형엽 교수님의 게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊