본문 바로가기
컴터/OpenGL

[OpenGL] Phong Reflection Model

by 나 진짜 못차마 2023. 6. 10.
728x90

경북대 '컴퓨터그래픽스' 강의 백낙훈 교수님의 강의를 듣고 복습하기 위한 게시글입니다.

게시글의 내용은 강의 또는 구글링을 통해 공부하였습니다.

이미지 자료는 출처를 밝히거나 직접 그려 사용하였습니다

Phong reflection model은 local illumination model이라는 특징을 가진다.

illumination model이란

물체 표면에 특정한 점을 잡으면 그 점, 그 부분에 설정되어 있는 것만 고려해 illumination 계산 하는 방법이다.

이 방법은 계산량이 적어져, 계산 속도가 빨라진다는 장점이 있다.

하지만,

해당 부분, 점만 고려하기 때문에 다른 물체의 간섭이나 반사를 고려하지 못한다.

그래서 그림자 계산은 불가능하다.

그래도 계산 속도가 빠르다는 이점 때문에

아직도 Phong reflection model을 사용하거나, 이것을 기반으로 응용해 많이 사용한다.

Phong reflection model 은 물체 표면에서의 반사를 고려한다.

크게 3가지 illumination model을 제시한다.

  1. ambient illumination

물체 전체가 희미하게 일단 보일 것이다 라는 것이다.

2. diffuse illumination

광원에서 빛이 들어오면 물체 표면에서 난반사가 일어나서 반사된 빛이 사방으로 퍼져나갈 것이다 라는 것이다.

물체 표면에서의 난반사를 고려한다.

3. specular illumination

광원에서 빛이 들어오면 특정한 방향으로 많은 빛이 간다는 것이다.

물체 표면에서의 정반사를 고려한다.

phong에서는 이 3가지 모델을 모두 합성해서 결과를 낸다.

illustration by 백낙훈 교수님 , illustration by biztripcru@gmail.com

이 3가지 illumination에 대해 알아보자.


Ambient Reflection

목적은

  1. 빛을 직접 받지 않아도 희미하게 물체를 보기 위함
  2. debug 목적 : (광원이 없어도) 물체가 보이도록 설정하는 경우

ambient reflection을 일부러 밝게 해서 debug하는 경우가 있다.

 

K는 엠비언트 반사 계수로 반사하는 비율을 의미한다.

0.0 ~ 1.0 사이의 실수로 constant 값이다.

1을 하면 전부 다 반사하는 것이고, 0에 가까워질수록 반사를 하지 않는다.

위의 식으로 간단하게 계산 가능하다.

Diffuse Reflection

물체의 난반사를 고려한다.

수학적 모델을 꾸리기 위해 모든 물체가 일단 램버트 표면이라고 가정한다.

램퍼트 표면(Lambertian surface)는 완벽한 난반사가 일어나는 표면이다.

빛의 입사각에 따라, intensity가 달라진다.

출처 : 이미지 내 워터마크

맨 오른쪽의 경우, 빛이 물체 표면에 90도로 들어오는 경우 100퍼센트 모든 빛이 다 들어오고,

중간의 경우, 좀 더 적은 빛이 들어오고,

맨 왼쪽의 경우 거의 안들어온다고 봐도 무방하다.

물체에 표면에서의 normal vector = n, 물체 표면 점 p에서 광원을 향하는 light direction = l

두 vector를 dot product 하면 cos θ 가 나온다.

두 개가 정확히 일치하면 1이 나오니 100퍼센트고, 기울여져있으면 점점 줄어들것이다.

90도가 되면 0이 되어 거의 안들어오는 게 된다.

그리고 계산할 때,

attenuation form 이 추가 된다.

이것은 거리에 따른 광원의 감쇠, 저하이다.

광원이 parallel light 일 때는 어느 위치에 있어도 빛이 들어오는 양이 별 차이가 없으니까 의미가 없고,

ambient light도 어디 있어도 빛이 들어오는게 균등하니까 의미가 없다.

point light source, spotlight source같은 경우에는 물체와 광원 사이의 거리 제곱에 반비례해서

광원의 밝기가 낮아진다.

원래

거리 제곱분의 일에 비례하지만,

실제 프로그램에서 이렇게 계산하면 생각보다 물체가 급격하게 어두워지는 문제가 발생했다.

광원이 어지간히 밝지않고서는 급격하게 어두워진다.

그래서 광원의 거리에 따른 저하 효과를 만들어내는 근사적인 방법으로 아래와 같은 식이 나온다.

a, b, c 모두 constant 값으로 잘 조정하면 빛의 멀어짐에 따라 밝기를 조절 할 수있다.

Specular Reflection

illustraion by 백낙훈 교수님

물체에 빛이 들어왔을 때 빛나는 부분(highlights)을 만들어 내는 것이다.

reflection 방향과 camera 방향이 일치 했을 때, 정반사가 일어난다.

근데 일반적인 물체에 highlight가 들어갔다고 그 부분만 정확히 빛나는게 아니라

주변도 빛이 퍼지면서 반사된다.

이걸 표현하기 위해 cosθ 함수를 사용한다.

출처 : 이미지 내 워터마크 ( 백낙훈 교수님)

illustration by 백낙훈 교수님 , illustration by biztripcru@gmail.com

기하학적으로 볼 때, 2차원 상에서의 반사가 일어나는 vector R을 구하는 것은 쉽지만,

3차원에서 할 때는 얘기가 달라진다.

N vector와 L vector해서 바로 R vector구하는 것이 아니고

S vector를 중간에 구한다.

L vector와 N vector가 이루는 각도가 θ 라고 했을 때,

N * cosθ를 하면 L vector의 N vector상의 projection이 나온다.

여기서 L vector 빼버리면 S vector 가 나온다.

이 S vector는 L vector에서 N vector로의 수직인 vector가 된다.

이 S vector가 한번 더 가면 R vector가 나온다.

그럼 Ncosθ 에 + S 를 하면 R vector가 나온다.

수식으로 표현하면 아래와 같이 표현된다.

 

반사 집중도 계산

: vector R 과 V 가 이루는 각도

cosΦ = R · V

이 값이 정반사 될 때, 어느 영역까지 밝게 빛날건지에 대해 결정하는 항이 된다.

α 는 정반사 영역을 퍼지게할 거냐 좁아지게 할거냐에 영향을 끼친다.

specular reflection 에도 attenuation form 계산을 해야한다.

( 식에서 (r v) α 에서 α 는 거듭제곱을 의미한다. α 가 단순 곱 처럼 출력되어 보인다. 제곱이다.)

shininess 값 α 는 꽤 높은 값을 사용한다. 값 차이에 따라 많은 차이를 보인다.


앞서

phong에서는 이 3가지 모델을 모두 합성해서 결과를 낸다고 했으니 합치면,

( 식에서 (r v) α 에서 α 는 거듭제곱을 의미한다. α 가 단순 곱 처럼 출력되어 보인다. 제곱이다.)

위와 같은 식이 나온다.

n, l, r, v 는 모두 unit vector이다.

728x90

'컴터 > OpenGL' 카테고리의 다른 글

[OpenGL] Phong shading, Blinn-Phong shading  (1) 2023.06.10
[OpenGL] Flat Shading, Gouraud Shading  (0) 2023.06.10
[OpenGL] Shading  (0) 2023.06.10
[OpenGL] View Frustum, FOV(field of view)  (2) 2023.06.10
[OpenGL] Look-At, Orthographic Projection  (2) 2023.06.10