다음을 통해 공유


테셀레이션(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 

꼭짓점 파이프라인