09. Tesellation

DV·2024년 5월 19일

DirectX_3D

목록 보기
10/13

📒Tesellation


: Hull & Domain Shader

  • DX11부터 추가된 pipeline 단계
  • 정점을 추가해 폴리곤을 세분화하고 쪼갬

📌Setting

  • Topology
    • Vtx를 분석하는 위상
    • Tesselation 전용 Topology 사용
    • D3D11_PRIMITIVE_TOPOLOGY_N_CONTROL_POINT_PATCHLISHT
      • ex, N==3 이라면 제어점 3개짜리 patch list
  • edge
    • edge idx: idxed Vtx가 마주보는 변
  • mesh: 대칭구조 필요

📌Control Point & Patch

[Control Point]
: 삼각형을 넘겨준다고 가정할 때, 각 정점에 해당하는 점

  • 내부를 제어하는 점
  • 제어점은 중간의 다른 정점을 생성하기 위한 기준점임

[Patch]
: 삼각형을 넘겨준다고 가정할 때, Control Point 세 개가 모인 set 자체

  • control point의 그룹

📒PipeLine


📌Tesellation Pipeline

[Vertex Shader]
: 원본 Vertex의 input - output

  • Tesellation에서는 Domain Shader가 진짜 vertex 처리
    • 즉 VS는 딱히 하는 일 없음
  • ex, 사각형 그리기위해 2개 삼각형 구성하는 상황) : 6개 output

[Hull Shader]
: 원본 Vertex를 n개씩 묶어 patch라는 하나의 조각으로 묶음

  • n: 사용자가 설정, 대체로 3(삼각형) 사용
  • ex, 사각형 그리기위해 2개 삼각형 구성하는 상황) : 2개 output

[Tesellation Stage]
: 추가적인 정점 생성함

  • DX 내부적으로 수행, 직접 건드릴 수 없음
  • patch constant function만 정의 가능
  • patch constant function:
    • 패치당 한 번씩 호출되는 함수
    • 원하는 정점 개수 세팅

[Domian Shader]
: 새로 생긴 Vtx까지 포함해서, 모든 Vtx에 대해 호출 후 전처리

  • 원래 VS에서 하던 일 담당

📌Tesellation vs Geometry

[(복습) Geometry Shader]
: 추가적인 분할 진행

: Tesellation과 Geometry 모두 정점을 분할하는 기능을 가지므로, 보통 함께 사용하진 않음

  • 정점 대량 생산의 경우: Tesellation 활용
    • ex, 지형생성
  • 정점 소량 생산의 경우: Geometry Shader 활용
    • ex, billboard 효과

📒Hull Shader State


: 각 입력 패치(사각형, 삼각형 또는 선)에 해당하는 기하 도형 패치(및 패치 상수)를 생성하는 단계

  • 각 패치(SV_PrimitiveID)에 대해 출력 제어점(SV_OutputControlPointID) 당 한 번 호출

📌HullShader 실행단계

: 크게 두 단계로 나뉨

  • 제어점 단계
    • 각 제어점에 대해 한 번 작동
    • 패치를 위한 제어점을 읽고, 하나의 출력 제어점 생성
      • 출력 제어점은 ControlPointID로 식별됨
  • 패치 상수 단계
    • 패치당 한 번씩 작동
    • 가장자리 공간 분할 요인 및 기타 패치별 상수 생성

📌HullShader Func Define

[description]
: 컴파일에 필요한 description 필요

[paramater]
: 같이 소속된 patch의 정점들이 함께 들어옴

  • InputPatch: patch의 원본 정점들 (VS return type)
  • SV_OutputControlPointID: patch 내 호출된 idx

[TIP] Sementics
SV_Position은 rasterizer에서 사용하는 sementic이기 때문에, HS에선 사용 불가능함

📌patch constant function

: 어떻게 분할할지 설정하는 함수

  • 실행: Tesselation Stage
    • Hull Shader > Tesselation Stage > Domain Shader
  • 패치 당 한 번씩 호출
    • 즉 Vtx의 idx가 필요하지 않음

[paramater]

  • InputPatch: patch의 원본 정점들 (VS return type)
  • SV_PrimitiveID: patch의 ID

[retun type]
: patch의 분할 레벨

  • SV_TessFactor: edge당 control 갯수
  • SV_InsideTessFactor: 내부 control 갯수

📒Tesselation State


: 더 세밀한 표현을 위해 공간 분할 요소를 사용하여 각 패치를 세분화하는 단계

  • 패치당 한 번 작동
  • 프로그래밍 불가

📒Domain Shader


: 원본 정점 포함 모든 정점에 대해 호출해 세분화된 위치 계산하는 단계

  • 출력 지점당 한 번 실행

📌보간

: 보간된 값이 들어오지 않고, 대신 가중치값이 들어오므로 직접 보간해서 값 구해야 함

  • 원본 정점: 패치의 원본 정점 먼저 들어옴
  • 가중치: 보간된 값이 아닌, 원본 정점에 대한 가중치 값이 들어옴
    • 가중치를 사용해서 정점 계산해야 함

(복습) Pixel Shader
: 호출된 픽셀의 값이 알아서 보간되어 들어왔음

📌DomainShader Func Define

[description]
: 컴파일에 필요한 description 필요

  • domain : 들어오는 단위
    • ex, 3개 정점을 가진 삼각형을 단위로 들어옴 명시

[paramater]

  • patch Level: HullShader에서 설계한 각 패치의 분할 레벨
  • OutputPach : 원본 정점들
  • SV_DomainLocation : 해당 Vtx에서 사용할 가중치

📒Tesellation의 이점


📌성능 개선

  • GPU를 통해 low-detail subdivision surface를 high-detail subdivision surface로 변환
  • CPU에서 high-resolution 모델을 올리는 방식: 엄청난 부하 발생

📌Displacement Mapping

  • nomal mapping: 근본적으로 geometry를 조작하지 못함
  • tesellation: surfaces를 쪼개 만든 정점의 위치를 조작할 수 있음

References
[1] Hull Shader MS Doc: https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/hull-shader-stage--hs-
[2] Domain Shader MS Doc: https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/domain-shader-stage--ds-
[3] Tessellation: https://develop-4-art.tistory.com/11
[4] Tessellation: https://song-ift.tistory.com/450

0개의 댓글