
하드웨어 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)
Height map to Normal map
- Height map으로 normal map 만든다


- normal의 구성요소는 [-1,1] 범위에서 (nx,ny,nz) 를 얻음
- normal을 texture에 저장하기 위해 각 RGB 구성요소를 [0, 1] 범위로 표현해야됨 -> 범위 변환
사용 방법
- polygon mesh가 rasterized 되고 텍스쳐 좌표 (s, t)는 normal에 접근한다.
- (s, t)에서의 normal은 normal map 필터링을 통해 얻음
- Diffuse Light: max(n⋅l,0)sd∗md
- normal n은 normal map에서 추출
- md는 image texture에서 추출
Tangent space

- q(sq,tq)의 텍스쳐 좌표를 이용해 normal map에서 normal을 뽑아냄 = n(sq,tq) 로 정의
- normal mapping 안 하면, Nq 라이팅에 사용
- normal mapping시, Nq 대신에 n(sq,tq)를 사용한다.
- 표면에 있는 점이 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에서 정의됨(l)
- 반면에, normal에서 추출한 n은 tangent space에서 정의
- 이 불일치성을 해결하기 위해 n이나 l의 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 좌표는 같은 방법으로 보간됨