[DirectX11 Pipeline] 3. Hull Shader, Tessellator, Domain Shader

SYiee·2023년 8월 14일
1
post-thumbnail

Hardware Tessellation

💡 Tesselation Stages
: DX11에서 처음 등장

  • GPU가 primitive 를 굉장히 작은 많은 것들로 decompose하는 것을 enable해주는 것

  • Hull Shader

  • Tesselator : hardware wired

    • 엄청나게 빠르고 정해진 일을 한다.
    • 프로그래밍 불가
    • 앞뒤로 프로그래머가 후처리
  • Domain Shader

🖤 Hull Shader

Tessellator가 어떻게 쪼개야 하는지 필요한 정보를 넘겨주는 단계

A programmable shader stage that produces a geometry patch (and patch constants) that correspond to each input patch (quad, triangle, or line).

🖤 Tessellator

더 세밀한 표현을 위해 더 작은 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.

  • Tessellator는 패치를 세분화하고 barycentric coordinates로 나타낸 작은 점, 선, 삼각형 등의 요소들을 생성한다.
  • Tessellator는 항상 하나의 입력(barycentric coordinates)과 하나의 출력(정점)을 가지므로, Vertex Shader 와 유사한 역할을 한다.

→ inner tesslation level과 outer tesslation level을 이용

🖤 Domain Shader

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


Why we add Tesselation Stages?

💡 이 과정의 가장 큰 장점!

처음부터 cpu에서 high resolution으로 gpu에 올리려고 하면 병목 현상이 발생한다. 그러나 테셀레이션을 사용하면 데이터 버스에서 오는 병목현상을 줄이면서 고해상도로 구현이 가능한 것이다.

Displacement(정점의 이동) Mapping

nomal mapping 의 단점을 보안하고자 등장했다.

  • nomal mapping에서는 실제로 geometry를 바꾸는 것이 아니라 fake를 쓰는 것이었다. 그렇기 때문에 결과가 드라마틱하게 좋아지진 않았는데 이런 문제를 해결할 수 있다.
  • 텔레이션을 이용해 base surfaces를 잘게 쪼갠다
    → 삼각형이 잘라져 나온다. 정점들이 생성된다. 정점을 위로 올려 디테일을 표현하게 된다.
  • Tesslation으로 정점을 만들고 Displacement 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을 결정한다

  • tessellation levels : 쪼갤 레벨

Hull Shader ⇒테셀레이터를 컨트롤 하는 셰이더

테셀레이터는 그 명령을 받아 쪼갠다.

Domain Shader는 정점에 접근해 x, y 좌표를 정한 다음에 height map에 높이값대로 z값을 정한다.

그러면 울퉁불퉁함을 nomal mapping 보다 더욱 사실젇으로 위의 그림처럼 표현이 가능하다.


Vertex Shader and Hull Shader

Vertex shader no longer handles the space change.

"VS → Hull Shader → PS" 에서는 space change를 하면 안 된다. VS 이후 단계에서 정점이 더 생기기 때문이다(?). 전부 배치를 한 다음에 Domain Shader를 통해서 스페이스 체인지까지 해버린다.

⇒ GPU Pipeline의 친구들이 역할이 정해져 있는 것이 아니다. 거기서 하는 것이 가장 효율적이라 거기에 있는 것이다. 만약에 다른 단계가 더 효율적이라 느껴지면 가차없이 옮겨 버린다. 이 파이프라인들이 어떤 맥략에서 이 일을 하는 것인지 판단해야 한다.


🖇 Reference

해당 포스트는 강형엽 교수님게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊

[Tesslation Stages]https://learn.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-tessellation

profile
게임 개발자

0개의 댓글