[DirectX11 3D] Tesellation

한창희·2024년 6월 10일

DirecX3D 엔진 만들기

목록 보기
11/14

📌Tessellation

테셀레이션은 우리가 만든 매쉬의 정점을 잘게 쪼개 더 정밀한 매쉬를 만들어내는 과정이다. 단계는 Hull Shader, Tessellation, Domain Shader 로 구성되어 있다.

📌 Setting

  • 특정 Primitive Topology를 사용해야 함(D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST 등등)
  • mesh가 대칭 구조가 아니라면 정점을 만들었을 때 서로 정점의 정보가 달라 어색하게 보일 수 있다.

📌Constant hull Shader

Constant hull Shader는 패치마다 실행되는 쉐이더 함수로서 테셀레이셔에서 패치를 얼마나 세분화 할것인지 결정한다.

struct PatchLevel
{
    float arrEdge[3] : SV_TessFactor;
    float Inside : SV_InsideTessFactor;
};

PatchLevel PatchConstFunc(InputPatch<VS_OUT, 3> _in, uint patchID : SV_PrimitiveID )
{
    PatchLevel output = (PatchLevel) 0.f;

    output.arrEdge[0] = g_vec4_0.x;
    output.arrEdge[1] = g_vec4_0.y;
    output.arrEdge[2] = g_vec4_0.z;
    output.Inside = g_vec4_0.w;
    
    return output;
}

📌Controll point hull shader

모든 제어점에 대해 한번씩 호출되는 쉐이더이다. 입력으로 패치와 호출된 제어점의 인덱스가 들어오기 때문에, SV_OutputControlPointID를 통해 인덱스 접근으로 현재 호출된 제어점을 알수 있다.
원한다면 제어점을 증가시키거나, 변환도 가능하다.

[patchconstantfunc("PatchConstFunc")]
[outputtopology("triangle_cw")]
[domain("tri")]
[maxtessfactor(64)]
[partitioning("integer")]
[outputcontrolpoints(3)]
HS_OUT HS_Tess(InputPatch<VS_OUT, 3> _in, uint _idx : SV_OutputControlPointID)
{
    HS_OUT output = (HS_OUT) 0.f;
    
    output.vPos = _in[_idx].vPos;
    output.vUV = _in[_idx].vUV;
    
    return output;
}

📌 Tessellation State

: 각 패치를 세분화 하는 단계

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

📌 Domain Shader

  • 원본 정점을 포함하여 모든 정점에 대해 호출되는 쉐이더로 정점에 대한 조작을 할 수 있다.
  • 기존 정점에 대한 가중치 값이 들어오기 때문에, 직접 가중치를 계산해서 값을 구해야한다.

0개의 댓글