[Graphics] Shading

박민주·2022년 6월 19일
2

Computer Graphics

목록 보기
5/8
post-thumbnail

요약


순서대로 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에서의 문제

어떤 모서리의 꼭짓점의 노말벡터가 양쪽 면에 대한 노말벡터의 평균이면 모두 똑같은 노멀벡터를 가지게 됨
방향 광원이면 다 같은 색이 되서 음영이 생기지 않는 문제가 있음
모서리의 꼭짓점을 복사해서 왼쪽면에 대한 노말벡터와 오른쪽면에 대한 노말벡터를 따로 줌으로써 해결할 수 있음

profile
Game Programmer

0개의 댓글