Tesselation
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Tesselation
Rendering Pipeline | Control Points |
---|---|
그래픽스에서 곡면을 다루는 방식은 오른쪽 그림과 같이 control point들로 이루어진 패치들을 이용한 방식이다. 이러한 패치들을 다루는 단계가 바로 껍데기라는 의미를 가진 Hull Shader 단계이다. Hull Shader를 사용하기 위해서는 primitive topology를 control_point_patchlist로 지정해주어야 한다.
🐥 Hull Shader
struct Hullout
{
float3 pos : POSITION;
}
struct PatchConstOutput
{
float edges[4] : SV_TessFactor;
float inside[2] : SV_InsideTessFactor;
}
PatchConstOutput MyPatchConstantFunc(InputPatch<VertexOut, 4> patch, uint patchID : SV_PrimitiveID)
{
PatchConstOutput pt;
// tesselation 단계
pt.edges[0] = 1;
pt.inside[0] = 1;
// ...
return pt
}
[domain("quad")]
[partitioning("Integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(4)]
[patchconstantfunc("MyPatchConstantFunc")]
[maxtessfactor(64.0f)]
HullOut main(InputPatch<VertexOut, 4> p, uint i : SV_OutputControlPointID, uint patchID : SV_PrimitiveID)
{
HullOut hout;
hout.pos = p[i].pos.xyz;
return hout;
}
- Hull Shader는 2개의 Output을 가짐
- control points / 패치 몇 단계로 나눌지 결정하는 함수
[domain("quad")]
: Patch 모양은 사각형이야[partitioning("Integer")]
: tesselation 단위는 integer야[outputtopology("triangle_cw")]
: output topology는 시계방향 삼각형이야[outputcontrolpoints(4)]
: 스레드당 출력되는 control point 갯수[patchconstantfunc("MyPatchConstantFunc")]
: 패치를 몇 단계로 나눌지 결정하는 함수의 이름은 “MyPatchConstantFunc”[maxtessfactor(64.0f)]
: tesselation 최대값은 64
🐥 Domain Shader
struct DomainOut
{
float4 pos : SV_POSITION;
}
[domain("quad")]
DomainOut main(PatchConstOutput patchConst, float2 uv : SV_DomainLocation, const OutputPatch<HullOut, 4> quad)
{
DomainOut dout;
// bilinear interpolation
float3 v1 = lerp(quad[0].pos, quad[1].pos, uv.x);
float3 v2 = lerp(quad[2].pos, quad[3].pos, uv.x);
float3 p = lerp(v1, v2, uv.y);
dout.pos = float4(p, 1.0);
dout.pos = mul(dout.pos, view);
dout.pos = mul(dout.pos, proj);
return dout;
}
- Domain Shader에서는 Hull Shader에서 받아온 control point와 constant function으로 pixel shader에 넘겨 줄 최종 vertex들을 구한다.
SV_DomainLocation
: 패치 내에서의 uv좌표- ex) x방향 edge를 2등분 했다면 uv.x = 0.5
🐥 Results
전체 box와의 거리에 따라 tesselation 단계 조절 (in Hull shader)
댓글 남기기