Tessellation

CuriHuS·2024년 6월 7일

Game Graphics

목록 보기
8/9


하드웨어 Tessellation
: GPU가 하나의 작은 것에서 여러 개로 쪼개는 과정

  • GPU 테셀레이션은 두 개의 프로그래밍 가능한 스테이지(Hull shader, Domain shader)와 하나의 고정된 스테이지를 가짐(Tessellator)

Normal Mapping

  • normal map이라는 특별한 texture 안에 고해상도의 texture의 normal을 미리 계산하고 저장해둠
  • normal map은 저해상도 texture(base surface)의 런타임 동안 lighting을 위해 사용됨.
    • 장점: vertex의 수가 늘지 않고 고퀄 표현

Image to Height map

  • 간단한 이미지 편집 연산은 이미지 텍스쳐를 회색으로 바꾸는 것(Height map)
    • 0은 완전 블랙, 255는 하얀색

Height map to Normal map

  • Height map으로 normal map 만든다

  • normal의 구성요소는 [-1,1] 범위에서 (nx,ny,nz)(n_x, n_y, n_z) 를 얻음
  • normal을 texture에 저장하기 위해 각 RGB 구성요소를 [0, 1] 범위로 표현해야됨 -> 범위 변환

사용 방법

  • polygon mesh가 rasterized 되고 텍스쳐 좌표 (s, t)는 normal에 접근한다.
    • (s, t)에서의 normal은 normal map 필터링을 통해 얻음
  • Diffuse Light: max(nl,0)sdmdmax(n·l, 0)s_d * m_d
    • normal nn은 normal map에서 추출
    • mdm_d는 image texture에서 추출

Tangent space

  • q(sq,tqs_q, t_q)의 텍스쳐 좌표를 이용해 normal map에서 normal을 뽑아냄 = n(sq,tq)n(s_q, t_q) 로 정의
    • normal mapping 안 하면, NqN_q 라이팅에 사용
    • normal mapping시, NqN_q 대신에 n(sq,tq)n(s_q, t_q)를 사용한다.
  • 표면에 있는 점이 normal mapping 여부에 관계없이, normal map에서 추출된 normal은 tangent space의 해당 지점에서 정의됨.
  • normal은 tangent space인데 light는 world space에 있음
  • 그래서 light를 tangent space로 바꿔 계산하거나 normal을 world space로 바꿔 계산하는 2가지 옵션있음

    Normal -> world space

  • 장점: 라이팅 계산은 보통 world space에서 계산되므로 shader 구현의 측면에서 간단함.
    Light -> tangent space
  • 장점: tangent space는 이미 계산되어 있고 vertex 당 요소이므로 light는 vertex shader에서 변환될 수 있음. 계산 소모를 줄일 수 있음.

Phong lighting model에서 diffuse 고려

  • 광원은 world space에서 정의됨(ll)
  • 반면에, normal에서 추출한 nn은 tangent space에서 정의
  • 이 불일치성을 해결하기 위해 nn이나 ll의 space를 변환해야됨
  • 보통 vertex 별 TBN이 미리 게산되어 있고 vertex 안에 저장되어 있고 vertex shader로 전달한다.
  • vertex shader는 처음 T,B,N을 world space로 변환하고 world space T,B,N을 가지고 matrix를 만든다.
  • world space의 light를 per-vertex tangent space로 회전함

Normal map 구현
장점

  • 물체 독립적인 normal map임, 다양한 물체에 걸쳐 재사용 될 수 있음, world에서 물체의 위치에 의존하지 않는다는 의미
  • asset library를 생성할 때나 다른 위치에서 물체의 다른 인스턴스들을 표현할 때 유용함
  • tange space normal map은 표면을 만들 때 좋음(캐릭터 피부 등), 왜냐면 normal은 world가 아니라 물체 자체와 관련되어 계산되기 때문임.
    단점
  • 계산이 필요하고 tangent space를 일관되게 유지하고 모델 생성 과정과 shading 계산 둘 복잡해짐
  • UV 좌표 분리나 거울 모드에서 문제가 있는 것처럼 보임.

Displacement Mapping

  • normal 매핑에서는 base surface의 형상이 변경되지 않는다.
  • displacement 매핑과 tessellation 기술을 이용하면 문제를 해결 할 수 있다.
    • Tessellation 하드웨어는 base surface를 먼저 잘개 나눈다
    • 쪼개진 vertex들은 displacement 벡터에 따라 배치된다
  • 인풋으로 삼각형 혹은 사각형이 들어옴(base surface or patch)
  • Hull shader에서 base surface로 quad를 받고 Domain shader로 넘겨줌
  • Hull shader는 tesellation level을 정하고 Tessellator로 전달해준다.
  • Tessellator는 2D 삼각형 안으로 quad의 영역을 쪼개준다
  • 2D mesh의 각 vertex는 한번씩 실행되며, Domain shader는 bilinear patch로서 quad를 받고 (u, v)점을 평가하고 height map에 배치한다.

GPU Tessellator

Vertex shader(not Tessellate)

  • 이제 space transform 관여 안 함
    • clip space vertex부터는 Domain shader에서 대신 함

Hull Shader

  • tessellator에서 필요한 state를 선언한다
    • 상태(state)는 tessellating 할 때, 조절할 점의 수, patch의 유형과 구분 유형 같은 정보를 포함함
    • Tessellation factor도 HS에서 정의

Tessellator

  • patch를 나누고 barycentric 좌표에 의해 작게 쪼갬
  • VS와 비슷한데 하나의 input(barycentric 좌표)과 하나의 output(vertex)을 가짐
  • 한 번의 실행 당 하나의 vertex를 생성하거나 drop 할 수 없음

Domain shader

  • Hull shader에 의해 vertex 위치를 받음(bilinear patch의 조절 점으로서)
  • (u, v, w)를 이용하여 3D 점을 반환
  • texture 좌표는 같은 방법으로 보간됨
profile
공부 노트

0개의 댓글