그래픽스 기술

[Tessellation] quad tesselation순서 및 patch control point 계산

doyyy_0 2025. 1. 6. 18:53

Quad 그리는 코드는 다음과 같습니다.

context->IASetPrimitiveTopology(
	D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST);

 

텍스춰 좌표로 따졌을 때, (0,0) -> (1,0) - > (0,1) -> (1,1) 

CW(시계방향)이라도 이렇게 하지 않으면 왜곡이 생길 수 있습니다.

 

그리고 그릴 때 draw로 해도되고, drawIndexed로 해도 됩니다. index개수와 순서가 잘 맞기만 한다면요. 예를들어 사각형 3개를 가로로 나란히 그릴 때 vertex 8개, index 12개가 필요합니다. drawIndexed로 그려도 각 패치에 vertex들이 patch control point로서 잘 들어갑니다.

 

또한 Hull shader에서 테셀레이션 요소들을 계산할 수 있는데, constant patch함수에서는 각 패치마다 적용이 되는 코드를 적습니다. 여기서 실행 시 예상밖의 결과가 나온다면, model변환을 했는지 실수를 잡고 하는 것을 권유드립니다.

 

코드는 다음과 같습니다.

struct PatchConstOutput
{
    float edges[4] : SV_TessFactor;
    float inside[2] : SV_InsideTessFactor;
};

PatchConstOutput MyPatchConstantFunc(InputPatch<VertexOut, 4> patch,
                                     uint patchID : SV_PrimitiveID)
{
    
    float3 center = (patch[0].pos + patch[1].pos + patch[2].pos + patch[3].pos).xyz * 0.25;
    center = mul(float4(center, 1.0), modelWorld).xyz;
    float dist = length(center - eyeWorld);
    float distMin = 0.5;
    float distMax = 2.0;
    float tess = 64.0 * saturate((distMax - dist) / (distMax - distMin)) + 1.0;
    
    PatchConstOutput pt;
    
    pt.edges[0] = tess;
    pt.edges[1] = tess;
    pt.edges[2] = tess;
    pt.edges[3] = tess;

	
    pt.inside[0] = tess;
    pt.inside[1] = tess;


    return pt;
}

 

 

테셀레이션 생성에 대한 정확한 정보를 얻고싶다면 DirectX11 메뉴얼을 참고하면 좋겠습니다. 다른 어떤 것보다도 가장 정확하기 때문이지요.

hull shader 생성법:

https://learn.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-hull-shader-design

 

tesellation 개념 :

https://learn.microsoft.com/ko-kr/windows/win32/direct3d11/direct3d-11-advanced-stages-tessellation