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 생성법:
tesellation 개념 :
https://learn.microsoft.com/ko-kr/windows/win32/direct3d11/direct3d-11-advanced-stages-tessellation
'그래픽스 기술' 카테고리의 다른 글
[DepthStencil] 거울 반사의 원리와 구현 (0) | 2025.01.21 |
---|---|
[PBR] HDRI - postprocess (0) | 2025.01.15 |
[PBR] 텍스춰 노멀매핑 (1) | 2025.01.05 |
[Staging기법] Gpu텍스춰를 Cpu로 가져오기 (마우스피킹) (0) | 2024.12.23 |
[Rendering Pipeline] 후처리 시 스왑체인과 백버퍼에 대한 이해 (0) | 2024.12.12 |