Shading 방법 - Phong, Gouraud, Flat

 

우리는 illumination 모델을 사용하여 투영된 각 픽셀 위치에서 표면에서 빛의 세기를 결정할 수 있다.

그 예시로 fragment shader는 모든 픽셀마다 phong illumination 모델의 색깔을 적용할 수 있었다.

 

https://guhonga.tistory.com/227

 

illumination renderer - lighting 계산하기 (phong illumination)

illumination geometry 단계에선 vertex와 관련된 연산을 했다. 주로 vertex의 position, color를 결정했는데,rasterization 단계에서는 pixel의 fragment 연산을 한다.  여기서는 주로 pixel의 색을 결정하는데,image에

guhonga.tistory.com

 

하지만 모든 pixel의 색을 계산하기에는 계산량이 너무 많아지다 보니, 몇개의 포인터만 선택하여 계산했다.

그런데 이와 같은 방법에서는 모든 surface를 볼 수는 없다.

이와 같은 상황에서는 각 픽셀의 색깔을 어떻게 결정해야 할까? 아니면 어떤 포인터를 샘플링해야 할까?

 

 

 

 

Ray casting

 

 


모델의 surface를 계산하는 방법인 ray casting은 가상 카메라를 상정하고, 그 앞에 view frame 둔다.

 

 

view frame을 통해 눈(카메라)으로부터 각각의 픽셀에 빛을 쏴서 그 빛이 모델에 도달할 때의 경로를 역추적하여

빛이 어떻게 눈으로 오는지 계산하는 방법이다.

 

역추적한 경로에서 물체의 평면에 illumination color를 계산한다.

 

 

 

 

 

ray casting은 정확한 픽셀을 계산할 수 있을 뿐, 주변 물체를 보간하지 못하기 때문에

우리가 눈으로 보는 것과 정확히 일치하지는 않는다.

 

그래서 이를 위한 방법이 폴리곤 shading이다. (지금까지 배웠던 raster graphics 파이프라인의 shader )

 

 

 

 

 

 

 

 

 


 

 

 

 

shading의 방법에는 3가지가 있다.

flat, gouraud, phong shading

 

 

 

 

 

 

Flat Shading

 

폴리곤마다 하나의 illumination color를 계산한다.

 

 

하나의 조명을 계산하기 때문에 폴리곤 내부의 모든 색깔은 같은 색을 갖는다.

그래서 폴리곤마다 노말 벡터 N 하나를 계산한다.

 

 

 

 

 

 

폴리곤마다 색깔이 같기 때문에 각진 모양새가 나온다. 그래서 flat shading 방법은 각진 물체에 좋다.

 

 

 

 

 

Gouraud Shading

 

부드럽게 변하는 곡선을 갖는 물체는 고로 쉐이딩이 어울린다.

 

 

이 방법은 vertex마다 illuminaton을 계산한다.

즉, vertex마다 normal vector를 계산한다는 말이다.

 

 

 

가장 많이 사용되는 방법은 인접 vertex들의 평균을 내서 구하는 것이다.

하나의 vertex에 인접한 4개의 triangle들의 평균으로 계산한다.

 

 

 

 

각각의 삼각형 노말벡터를 구할 때는

vertex ordering이 반시계 방향으로 일정해야 한다.

이를 통해 v1 v2 v3의 위치를 저장한 데이터에서 항상 우리가 원하는 방향으로의 벡터를 구할 수 있다.

 

 

 

삼각형 내부에 나눠지는 각 픽셀의 색깔은 세 개의 vertex에 저장되어 있는 color data를 보간해서 구한다.

 

 

 

 

 

 

보간하는 방법은 rasterization 단계에서 수행된다.

이 방법은 scan conversion 방식으로 처리한다.

 

 

가로 선과 세로 선 두 뱡향으로 스캔하여 보간하기 때문에 bilinear interpolate이라고 한다.

 

 

이와 같은 방식은 vertex에서 illumination을 이미 계산한 것으로 가정하기 때문에 가능한 방법이다.

 

 

 

 

 

 

Phong Shading

 


Gouraud Shading의 단점은 삼각형이 크면 specular highlight에서 문제가 생길 수도 있다는 점이다.

그래서 나온 방법이 Phong Shading이다.

 

 

Phong Shading은 각각의 픽셀에서 illumination을 계산한다.

 

illumination 계산하기 위해서는 normal vector가 필요하기 때문에 fragment shader에서 노말벡터 받아야 한다.

(고로에서는 vertex마다 illumination을 보간하기 위해서 normal vector를 가지고 있었음)

 

이렇게 phong shading에서는 각 픽셀마다 노말벡터를 갖게 된다.

 

 

 

 

 

 

픽셀마다 노말 벡터를 갖기 위해선, vectex의 노말 벡터를 interpolation해야 한다.

 

물론 픽셀이 많다 보니 삼각형보다 시간은 더 많이 걸릴 것이다.

자연스럽게 illumination을 계산하는 양도 많아질테고.