경북대 '컴퓨터그래픽스' 강의 백낙훈 교수님의 강의를 듣고 복습하기 위한 게시글입니다.
게시글의 내용은 강의 또는 구글링을 통해 공부하였습니다.
이미지 자료는 출처를 밝히거나 직접 그려 사용하였습니다
Phong reflection model을 구현할 수 있는 방법으로는 크게 3가지가 있다.
- Flat shading
- Gouraud shading
- Phong shading
이 중
Flat shading 과 Gouraoud shading을 다룰 것이다.
Flat Shading
Phong reflection model의 구현 방법 중 하나로,
face 단위로 진행한다.
내부적으로 상당히 많은 부분에서 변수들을 상수라고 가정해서 계산 과정을 단순하게 하였다.
변수들 중 많은 부분을 상수라고 가정했기 때문에 이것을 constant shading이라 부르기도 한다.

* 가정 1. flat polygon(평면)
원래의 phong reflection model은 부드러운 곡면에 대해서 적용 가능한데 반해서,
flat shading은 물체가 flat한 polygon, 평면이라고 가정한다.
그럼 평면이니까 평면 내의 모든 점들에 대한 normal vector는 같은 값일 수 밖에 없다.
동일하게 된다. 그래서 normal vector = N 을 상수라고 가정한다.
* 가정 2. 멀리 떨어진 viewer(camera)
현재 물체에서 카메라까지의 거리는 상당히 멀다고 가정한다.
이렇게 되면 flat polygon 내에 있는 모든 점들에서 view direction = V 벡터가 크게 변하지 않는다.
그 말은 모든 점들에서 v 벡터의 차이가 무시할 수 있을 정도이고,
그 값은 결국 같다고 가정해, view direction = V 을 상수라고 가정한다.
* 가정 3. 멀리 떨어진 light source
가정 2와 비슷하게 light source가 polygon에서 너무 멀리 있어서
light direction = L 도 polygon내 어느 점에서 방향을 잡더라도 평행하다 보아도 문제가 없다 가정한다.
light direction에서 반사해서 나오는 reflection = R 벡터도 normal vector가 다 동일하고,
L 벡터도 다 동일한 평행한 벡터이니 polygon내 모든 R 벡터도 동일한 값이 나온다.
결과적으로 phong reflection model을 계산하기 위한
N, V, L, R
4개의 벡터가 각각 동일, 평행하기 때문에
polygon 전체에서 phong equation 결과값이 동일하다.

polygon 전체에서 phong equation 계산 결과가 동일하다면,
polygon에서 점 1개를 잡은 후에 phong equation의 계산 결과 값(색상)을
polygon 전체에 적용시킬 수 있다.
3차원 물체를 구성하는 모든 polygon에서 하나의 색상을 가지고 전체를 칠하는 거니까,
계산이 매우 빠르다는 장점이 있다.
하지만,
붙어있는 polygon 사이에 색상 변화가 있을 때,
경계 부분에서 계단 효과가 생긴다.
인접한 두 색상 사이에서 경계에서의 색 변화가 더 극단적으로 느껴지는 착시효과가 생긴다.
Mach bands effect(마하 밴드 효과)라고 한다.
실제 밝기 차이는 크게 나지 않지만,
밝은 부분에서는 더 밝게 느껴지고, 어두운 부분에서는 더 어둡게 느껴지는
우리가 인식하는 밝기의 차이가 되게 크다고 생각되는 일종의 착시 현상이다.
그래서 전체적으로 보면 부드럽지 않고 거칠게 느껴진다.
flat shading의 계산 과정은

polygon(opengl에서는 triangle이 될 것이다)에서 점 하나를 잡아서 phong equation을 계산하는데
삼각형 3개의 꼭지점의 평균을 잡아서 계산한다.
normal vector도 동일하다.

이렇게 구한 중심점 p에 phong equation을 계산 후 나온 color 값을
전체 polygon에 동일하게 적용시킨다.
vertex shader에서 모든 꼭지점에 동일한 색상을 부여하면
bi-linear interpolation이 되더라도 내부의 색상이 동일하게 된다.
vertex shader에 계산 결과값을 부여해야되기 때문에,
gpu가 아닌 cpu, c++프로그램 내에서 계산 후 결과값을 전달한다.
이 flat shading은 계산량이 적기 때문에
개발 중간, test 과정에서 주로 사용한다.
Gouraud Shading
Phong reflection model의 또다른 구현 방법으로
이전의 flat shading이 face 단위의 처리였다면,
gouraud shading은 vertex 단위로 진행한다.
* 교수님이 알려주신 약간의 tmi
Gouraud shading을 읽으면 그라우드 쉐이딩 같은데
'구로 쉐이딩' 이다.
이유는 이것을 개발한 Henri Gouraud(앙리 구로) 프랑스 박사님의 이름 따라가다 보니까
'구로' 라고 읽는다.
다시 돌아와서 이 shading의 목적은
flat shading의 Mach bands effect를 제거하기 위해 개발하였다.
polygon 하나하나 마다 똑같은 색상을 부여해서 부드럽게 변하는 부분이 없었기 때문에 이런 문제가 발생했다.
진행은
1. 각 vertex마다 phong equation을 계산해서,
2. vertex 값을 가지고 polygon 내부를 bi-linear interpolation한다.
그래서 interpolative shading(보간방식 쉐이딩)이라 불리기도 한다.

illustration by 백낙훈 교수님
- normal vector를 구하는 방법으로는
여러 개의 face가 하나의 vertex에 맞물려 있는 상황이 생긴다.
이때 normal vector가 다른 normal vector로 부드럽게 변화되기 위해
중간에 공유되는 vertex에서는 각 face의 normal vector를 평균해서 사용한다.
즉, 각 face의 normal vector가 서로 다른 방향을 보고 있더라도 vertex에서는 이 normal vector들의 평균값을 사용하므로, 어느 쪽(normal vector)로 가도 부드럽게 변화하게 된다.

4개의 normal vector를 더한 다음에 normalize 하여 사용한다.
2. vertex에서 phong equation을 계산한다.
각 vertex마다 다른 계산을 하니까 다른 색상 값이 나온다.
이 다른 값들을 이용해서 내부를 보간해준다.
opengl rasterizer가 polygon 내부의 모든 점들을 bi-linear interpolation으로 부드럽게 변하게 해준다.
그 말은 flat shading과는 다르게 vertex shader에서 phong equation을 계산하도록 설정한다.
'컴터 > OpenGL' 카테고리의 다른 글
| [OpenGL] Phong shading, Blinn-Phong shading (1) | 2023.06.10 |
|---|---|
| [OpenGL] Phong Reflection Model (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 |


