테셀레이션(Direct3D 9)
테셀레이터 단위
테셀레이터 단위가 향상되었습니다. 이제 다음을 수행할 수 있습니다.
- 모든 상위 순서 기본 형식의 적응형 테셀레이션을 수행합니다.
- 변위 맵에서 꼭짓점별 변위 값을 조회하고 꼭짓점 셰이더에 전달합니다.
- 사각형 패치 테셀레이션을 지원합니다. 이는 D3DDECLMETHOD_PARTIALU 또는 D3DDECLMETHOD_PARTIALV 사용하여 꼭짓점 선언을 통해 지정됩니다. 이러한 메서드를 포함하는 꼭짓점 선언을 사용하여 삼각형 패치를 그리면 IDirect3DDevice9::D rawTriPatch 가 실패합니다. 꼭짓점 선언에 대한 자세한 내용은 D3DVERTEXELEMENT9를 참조하세요.
DirectX 8.x에서는 ORDER라고 하는 것이 실제로 그 정도였습니다. Direct3D 9에서 도는 이제 D3DDEGREETYPE에 의해 지정됩니다.
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
도 형식의 변경은 다른 두 구조체에 영향을 미쳤습니다.
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
드라이버는 새 헤더로 컴파일할 때 이 변경으로 인해 발생하는 컴파일 오류를 수정해야 합니다. 기능을 변경할 필요가 없습니다.
적응형 테셀레이션
적응형 테셀레이션은 N 패치, 사각형 패치 및 삼각형 패치를 비롯한 상위 기본 형식에 적용할 수 있습니다. 이 기능은 D3DRS_ENABLEADAPTIVETESSELLATION 사용하도록 설정되며 눈 공간에서 컨트롤 꼭짓점의 깊이 값을 기반으로 패치를 적응적으로 테셀레이트합니다.
4-벡터로 점 제품을 수행하여 눈 공간(Zieye)으로 변환되는 제어 꼭짓점(Vi)의 z 좌표(Zi)가 깊이 값으로 사용됩니다. 4D 벡터(Mdm)는 네 가지 렌더링 상태(D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z 및 D3DRS_ADAPTIVETESS_W)를 사용하여 애플리케이션에 의해 지정됩니다. 이 4-벡터는 연결된 세계 및 뷰 행렬의 세 번째 열일 수 있습니다. 또한 Zieye에 배율을 적용하는 데 사용할 수도 있습니다.
Zieye에서 테셀레이션 수준 Ti를 계산하는 함수는 (MaxTessellationLevel/Zieye)로 간주됩니다. 즉, MaxTessellationLevel은 눈 공간에서 Z = 1의 공간 분할 수준입니다. MaxTessellationLevel은 N 패치의 경우 IDirect3DDevice9::SetNPatchMode 에서 설정한 값과 같으며 RT 패치의 경우 pNumSegs와 같습니다. 그런 다음, 테셀레이션 수준은 D3DRS_MINTESSELLATIONLEVEL 및 D3DRS_MAXTESSELLATIONLEVEL 두 개의 추가 렌더링 상태로 정의된 값으로 고정됩니다. 이 상태는 고정할 최소 및 최대 테셀레이션 수준을 정의합니다. 패치 가장자리를 따라 있는 각 꼭짓점의 Ti는 해당 에지에 대한 테셀레이션 수준을 얻기 위해 평균됩니다. 직사각형 패치, 삼각형 패치 및 N 패치에 대한 Ti를 계산하는 알고리즘은 테셀레이션 수준을 계산하는 데 사용되는 컨트롤 꼭짓점과 다릅니다.
B 스플라인 기반의 사각형 패치의 경우 가장 바깥쪽 컨트롤 꼭짓점 4개가 사용됩니다. 예를 들어 D3DORDER_CUBIC 순서로 꼭짓점(1,1) 및 (1,width-2)는 pNumSegs[0]과 함께 사용되며 꼭짓점(1,width-2) 및 (height-2,height-2)는 pNumSegs[1]에 사용됩니다. 꼭짓점(height-2,width-2) 및 (1,width-2)는 pNumSegs[2]와 함께 사용되며 꼭짓점(2,1) 및 (1,1)는 pNumSegs[3]와 함께 사용됩니다.
삼각형 패치의 경우 모서리 패치 꼭짓점이 사용됩니다. D3DORDER_CUBIC 순서: 꼭짓점(0) 및 (9)는 pNumSegs[0]과 함께 사용되며, 꼭짓점(9) 및 (6)은 pNumSegs[1]와 함께 사용되고 꼭짓점(6) 및 (0)은 pNumSegs[3]와 함께 사용됩니다.
N 패치의 경우 삼각형 꼭짓점이 사용됩니다.
베지어 기반의 사각형 및 삼각형 패치의 경우 코너 컨트롤 꼭짓점이 사용됩니다.
꼭짓점별 테셀레이션 속도 제어입니다. 애플리케이션은 필요에 따라 꼭짓점당 단일 양의 부동 소수점 값을 제공할 수 있으며, 이 값을 사용하여 테셀레이션 속도를 제어할 수 있습니다. 이는 사용량 인덱스가 0이어야 하고 입력 형식을 D3DDECLTYPE_FLOAT1 하는 D3DDECLUSAGE_TESSFACTOR 사용하여 제공됩니다. 꼭짓점당 테셀레이션 수준에 곱합니다.
수식
두 개의 컨트롤 꼭짓점(Ve1, Ve2)으로 표시되는 에지 e의 테셀레이션 수준(Te)은 아래와 같이 계산됩니다.
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)).
Ze1eye = Ve1 . Mdm
Ze2eye = Ve2 . Mdm
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye
Te = ( Te1 + Te2 ) / 2;
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
D3DRS_ENABLEADAPTIVETESSELLATION TRUE이면 삼각형 기본 형식(삼각형 목록, 팬, 스트립)이 N 패치로 그려집니다. IDirect3DDevice9::SetNPatchMode 는 값이 1.0보다 작습니다.
API 변경 내용
새 렌더링 상태:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL
D3DRS_MAXTESSELLATIONLEVEL // Float
D3DRS_MINTESSELLATIONLEVEL // Float
D3DRS_ADAPTIVETESS_X // Float
D3DRS_ADAPTIVETESS_Y // Float
D3DRS_ADAPTIVETESS_Z // Float
D3DRS_ADAPTIVETESS_W // Float
// D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL
// cannot be less than 1
기본값은 다음과 같습니다.
D3DRS_MAXTESSELLATIONLEVEL = 1.0f
D3DRS_MINTESSELLATIONLEVEL = 1.0f
D3DRS_ADAPTIVETESS_X = 0.0f
D3DRS_ADAPTIVETESS_Y = 0.0f
D3DRS_ADAPTIVETESS_Z = 1.0f
D3DRS_ADAPTIVETESS_W = 0.0f
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
새 하드웨어 캡:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
관련 항목