💡
Tesselation Stages
: DX11에서 처음 등장
GPU가 primitive 를 굉장히 작은 많은 것들로 decompose하는 것을 enable해주는 것
Hull Shader
Tesselator : hardware wired
- 엄청나게 빠르고 정해진 일을 한다.
- 프로그래밍 불가
- 앞뒤로 프로그래머가 후처리
Domain Shader
Tessellator가 어떻게 쪼개야 하는지 필요한 정보를 넘겨주는 단계
A programmable shader stage that produces a geometry patch (and patch constants) that correspond to each input patch (quad, triangle, or line).
더 세밀한 표현을 위해 더 작은 vertex를 생성하는 단계
A fixed function pipeline stage that creates a sampling pattern of the domain that represents the geometry patch and generates a set of smaller objects (triangles, points, or lines) that connect these samples.
→ inner tesslation level과 outer tesslation level을 이용
Tessellator에서 생성한 최종 vertex position을 생성하는 단계
A programmable shader stage that calculates the vertex position that corresponds to each domain sample.
The Domain shader takes vertex positions passed from the Hull shader, as the control points of a bilinear patch
💡
이 과정의 가장 큰 장점!
처음부터 cpu에서 high resolution으로 gpu에 올리려고 하면 병목 현상이 발생한다. 그러나 테셀레이션을 사용하면 데이터 버스에서 오는 병목현상을 줄이면서 고해상도로 구현이 가능한 것이다.
nomal mapping 의 단점을 보안하고자 등장했다.
The input is called a patch or base surface. It is either a triangle or a quad.
포장 도로 예시에서 Hull Shader 는 quad를 인풋으로 받는다. 그 다음에 Domain Shader 로 넘겨주는데 이과정에서 Tesslator 를 통과한다.
Hull Shader는 tessellation levels을 결정한다
Hull Shader ⇒테셀레이터를 컨트롤 하는 셰이더
테셀레이터는 그 명령을 받아 쪼갠다.
Domain Shader는 정점에 접근해 x, y 좌표를 정한 다음에 height map에 높이값대로 z값을 정한다.
그러면 울퉁불퉁함을 nomal mapping 보다 더욱 사실젇으로 위의 그림처럼 표현이 가능하다.
Vertex shader no longer handles the space change.
"VS → Hull Shader → PS" 에서는 space change를 하면 안 된다. VS 이후 단계에서 정점이 더 생기기 때문이다(?). 전부 배치를 한 다음에 Domain Shader를 통해서 스페이스 체인지까지 해버린다.
⇒ GPU Pipeline의 친구들이 역할이 정해져 있는 것이 아니다. 거기서 하는 것이 가장 효율적이라 거기에 있는 것이다. 만약에 다른 단계가 더 효율적이라 느껴지면 가차없이 옮겨 버린다. 이 파이프라인들이 어떤 맥략에서 이 일을 하는 것인지 판단해야 한다.
해당 포스트는 강형엽 교수님의 게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊
[Tesslation Stages]https://learn.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-tessellation