요약
순서대로 Flat shading / Gouraud shading / Phong shading
Flat shading
- per polygon
- 하나의 삼각형마다 하나의 점만 계산
Gouraud shading
- per vertex
- 꼭짓점마다 하나씩 계산해서 색 보간
Phong shading
- per pixel
- 픽셀마다 계산하고, 꼭짓점의 노말을 픽셀의 노말로 보간
Phont Lighing Model을 더 단순화 하기 위한 전략
- Blinn-Phong
- Phong lighting 은 모든 픽셀에서 계산이 이루어져야 해서 Fragment processor에서 진행됨
Lighting Model에서 몇 개의 ray가 계산되어야 하는지?
- 기본적으로는 모든 점마다 하나씩 계산되어야 함
- 각 픽셀이 있으면 광원에서 들어오는 빛이 계속 반사됨. 여러 점의 색깔이 한 픽셀로 들어올 수도 있어서
하나의 픽셀마다 하나의 점이 아닌 여러 점의 빛을 계산해야하는 상황이 생김
-> 단순화 필요!
Shading Model
- 계산되어야 하는 점의 개수를 컨트롤하는 것
- 가장 심플한 경우는 각 다각형이 하나의 constant normal 를 갖게 하는 것
Flat Shading
- normal vector를 다각형마다 하나씩만 계산해서, 픽셀을 하나 집었을 때 여러 다각형 중 어느 면에 해당하는지 보고 그 색을 적용
- 오직 directional lights와 diffuse reflection에서만 정확함
(diffuse reflection는 모든 방향으로 가는 빛이 동일하다고 가정하기 때문에)
- 각진 물체를 그릴 때 효과적이지만, 방향광원이 아닌 점광원일 때 하나의 평면 상에 있음에도 light vector 가 달라지기 때문에 사실은 정확하지 않음
- 또한 specular reflection에서도 점의 위치가 달라지면 viewer vector가 달라져야하기 때문에, 다각형 마다 하나씩 계산하게 되면 정확한 표현은 어려움
- 다각형이 만들어진 후에 가능하기 때문에 Primitive Assembly 단계 후에 가능함!
Smooth Case에서는 어떻게 해야할까?
- flat shading에서는 엣지 부분에서 색이 확 바뀌어보여서 부드러워 보이지가 않음
Vertex normal
- 모서리에 있는 수직벡터를 의미 (면을 구성하는 꼭짓점들이 가지는 수직벡터)
어떤 식으로 하냐면,
- 모서리를 결정하는 꼭짓점마다 수직벡터를 하나만 줌
- 각진 면을 그릴 때에는 모서리의 수직벡터는 인접한 두면의 수직벡터의 평균으로 함
- 중간점들의 수직벡터는 모서리의 수직벡터를 보간, 예측해서 사용
Gouraud Shading
- vertex normal을 이용해서 버텍스들의 색을 계산
- 중간은 꼭짓점의 색을 보간함으로써 계산
- 3차원 모델링에서 가장 전통적인 그래픽스 방식
- Flat shading 에서는 면 마다 하나씩 계산했는데, Gouraud shading은 꼭짓점마다 계산
- 버텍스에 대한 계산이므로 Vertex processor에서 계산해야 함
- 색 보간은 Rasterizer 와 Fragment processor 사이에 있는 Interpolator에서 함
- 실제로는 Flat shading의 문제를 해결하는데 완벽하게 표현하지는 못함
Specular reflection 과 point lights에서의 문제
- point lights에서 보간이 잘 안되고 specular 표현에 한계가 있음
왜냐면 삼각형이 있을 때 중앙에 Highlight를 주어야 하는 만약 삼각형을 구성하는 세 점이 모두 어두우면,
어두운색을 아무리 보간해도 밝은 색이 안나오기 때문에 스페큘러 표현이 잘 안됨
계산하기 위해 알아야 하는 것
- Light position or direction (l벡터 계산을 위한 빛의 위치와 방향 필요)
- Vextex position (점마다 계산할 거니까)
- Vertex normal (꼭짓점의 수직벡터)
- Light color
- Vertex color (ambient, diffuse, specular)
Additional Issues
Mach banding
- 색깔 보간의 한계 때문에 발생
- 어느 한 사각형을 두 개의 삼각형이 이루고 있다고 했을 때, 중앙에 있는 두 삼각형의 교점을 중심으로 좌우에서 보간되는 점이 달라서 모서리 부분이 도드라져보이는 현상
왜 발생하는지?
- 각 꼭짓점들은 3차원 공간상에서 각을 가지는데 보간은 하나의 평면에서 이루어지기 때문에 발생
- 또한 꼭짓점의 색만 계산하기 때문에 발생. 다각형 내부도 계산해야 할 필요성이 생김
(근데 그럼 계산할 점이 너무 많아짐)
그럼 픽셀 당 한 점만 선택해서 계산하는 것은 어떨까?
(픽셀 내의 점은 평균내도 대부분 비슷할 것이라서)
Phong Shading
-
Phong Lighting 반사 모델과 헷갈리지 말자 (Phong lighting = Ambient + Diffuse + Specular)
-
Vertex normal을 선형 보간해서 각 픽셀에서 계산해주는 것
-
Gouraud Shading은 색깔을 보간하고, 픽셀이 아닌 꼭짓점마다 계산(Per-vertex shading)이었다면
Phong Shading은 노멀을 보간하고, 픽셀마다 계산!! (Per-pixel shading)
-
Specular reflection 문제와 Point light 문제를 해결했고, Mach banding 도 많이 줄였음
그러나 Polygonal silhouette라는 단점이 존재
좌측이 Gouraud이고 우측이 Phong 임
퐁쉐이딩에서의 하이라이트가 더 잘 보이고 부드러운데, 경계면은 여전히 울퉁불퉁함
Perspective Distortion
3차원 물체가 서있을 때 누울 수록 왜곡이 심해지는 현상
투영했을 때의 중간점과 실제 두 꼭짓점을 보간했을 때의 중간점이 다른 현상
해결방안?
- 거리비를 영상 면에서의 거리가 아닌 3차원 상에서의 거리를 따져서 중간점을 지정해야 함
- 혹은 더 촘촘하게 나누어서 투영하는 것도 방법임
Interpolation Probelm
물체는 바뀌지 않았는데, 회전 시켰을 때 어떤 점에 대한 두 꼭짓점 보간 시,
보간에 사용되는 꼭짓점이 바뀌어서 색이 달라지는 문제가 있음
해결방안?
- 삼각형으로 나누어서 회전을 해도 같은 세 개의 점들의 보간으로 이루어지도록 함
즉 삼각화(Triangulation)이라는 게 필요!
Interpolation key를 고정시킬 수 있게 됨
Vertex Normal에서의 문제
어떤 모서리의 꼭짓점의 노말벡터가 양쪽 면에 대한 노말벡터의 평균이면 모두 똑같은 노멀벡터를 가지게 됨
방향 광원이면 다 같은 색이 되서 음영이 생기지 않는 문제가 있음
모서리의 꼭짓점을 복사해서 왼쪽면에 대한 노말벡터와 오른쪽면에 대한 노말벡터를 따로 줌으로써 해결할 수 있음