본문 바로가기
컴터/OpenGL

[OpenGL] Flat Shading, Gouraud Shading

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

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

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

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

Phong reflection model을 구현할 수 있는 방법으로는 크게 3가지가 있다.

  1. Flat shading
  2. Gouraud shading
  3. 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 백낙훈 교수님

  1. 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을 계산하도록 설정한다.

 

728x90

'컴터 > 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