정점 선언
개념상, 정점 선언은, 정점 DMA (Direct Memory Access)나 그래픽스 파이프의 테설레이터 엔진을 프로그래밍 하는 방법의 1 개이다. 정점 선언은, 데이터 레이아웃과 테셀레이트의 처리를 간결하게 표현한다. Microsoft® DirectX® 8. x 에서의 선언의 복잡함과 확장성에 대응하기 위해(때문에), 이 정점 스트림의 새로운 표현 형식을 도입했다.
정점 셰이더와 정점 선언은, CreateVertexShader 시에 서로 바인드 되지 않는다. 셰이더의 평가는 2 개의 부분으로 나누어졌다. 1개는 정점 셰이더의 생성시에 실행되어 이제 1개는 DrawPrimitive 시에 실행된다. 정점 셰이더와 정점 선언은 개체에 의해 표현된다.
선언은, DWORD 의 스트림으로서는 표현되지 않게 되었다. D3DVERTEXELEMENT9 구조체의 배열로서 표현된다. 배열의 각 요소로, 1 개의 정점 요소를 기술한다.
게다가 애플리케이션 프로그래밍 인터페이스 (API)의 가용성의 문제를 해결하기 위해서, SetVertexDeclaration 호출해에 상당하는 개별의 SetFVF 호출이 있다. 이것은 편리한 함수이다. 이 호출을 실시하면, 현재 설정되어 있는 선언은 무효가 되어, 새로운 선언이 유효하게 된다. DirectX 8.0 이전의 드라이버 (NumStreams 가 0 으로 설정된다)에서는, 선언을 유연한 정점 포맷 (FVF)으로 변환할 수 없기 위해(때문에), SetVertexDeclaration 가 실패하는 경우가 있다. SetFVF 는, 고정 기능 및 프로그래밍할 수 있는 정점 파이프라인으로서 사용할 수 있다. 내부적으로는, FVF 는 FVF 로부터 DirectX 9.0 선언에의 맵핑을 사용해, 정점 셰이더 선언에 변환된다. 정점 셰이더 기능의 DCL 커멘드는, 이것을 근거로 해 생성 할 필요가 있다. 이 변환을 위해서(때문에), 이하에서는 정점 선언에 대한 보고 설명한다.
D3DVERTEXELEMENT9 구조체
이하에서는, D3DVERTEXELEMENT9 구조 체내의 필드와 그 설명을 나타낸다.
- Stream - 이 필드를 읽어내는 스트림 번호.
- Offset - 이 필드를 읽어내는, 바이트 단위의 오프셋(offset).
- Type - 입력 데이터의 형태와 그 데이터를 정점 셰이더 레지스터 (float1, float2, short2n 등)에 저장 할 때의 데이터 변환 방법. 출력의 형태는 메서드에 의해 결정한다. 메서드에 따라서는 형태가 정해져 있는 경우가 있다.
- Method - 지정한 입력에 대해서 테설레이터 (또는 수속형 지오메트리 루틴)가 실행한다, 미리 정의되고 있는 처리.
- D3DDECLMETHOD_DEFAULT :테설레이터를 사용하고 있는 경우, 이 요소는, 보간 되는지, 정점 프로세서의 입력 레지스터내에 복사 된다. 이 처리의 입력형은 임의이다. 이 처리의 출력형은 입력형과 같다.
- D3DDECLMETHOD_PARTIALU :직사각형 패치 (R 패치) 위에의 포인트에 있어서의 U 방향에의 접선을 요구한다. 이 처리의 입력형은, D3DDECLTYPE_FLOAT[43], D3DDECLTYPE_D3DCOLOR, D3DDECLTYPE_UBYTE4, 또는 D3DDECLTYPE_SHORT4 이다. 이 처리의 출력형은 항상 D3DDECLTYPE_FLOAT3 이다.
- D3DDECLMETHOD_PARTIALV :R 패치 위에의점의 V 방향의 접선을 계산한다. 이 처리의 입력형은, D3DDECLTYPE_FLOAT[43], D3DDECLTYPE_D3DCOLOR, D3DDECLTYPE_UBYTE4, 또는 D3DDECLTYPE_SHORT4 이다. 이 처리의 출력형은 항상 D3DDECLTYPE_FLOAT3 이다.
- D3DDECLMETHOD_CROSSUV :Rect/Tri 패치(RT 패치)의 점에서 법선은 두 접선의 외적을 취해 계산한다. 이 처리의 입력형은, D3DDECLTYPE_FLOAT[43], D3DDECLTYPE_D3DCOLOR, D3DDECLTYPE_UBYTE4, 또는 D3DDECLTYPE_SHORT4 이다. 이 처리의 출력형은 항상 D3DDECLTYPE_FLOAT3 이다.
- D3DDECLMETHOD_UV :R 패치 위에의점의 U 값 및 V 값을 복사 한다. 2D float 를 생성한다. 이 처리의 입력 타입은 D3DDECLTYPE_UNUSED 로 설정한다. 출력 데이터의 형태는, 항상 D3DDECLTYPE_FLOAT2 이다. 입력 스트림 및 오프셋(offset)도 사용하지 않는다 (다만 0 을 설정할 필요가 있다).
- D3DDECLMETHOD_LOOKUP :디스플레이스먼트 맵을 참조한다. 입력형에는 D3DDECLTYPE_FLOAT[234] 를 사용할 수 있다. 텍스처 맵 참조에는 . x 및 . y 의 성분만을 사용한다. 이 조작의 출력형은 항상 D3DDECLTYPE_FLOAT4 이다. 장치가 디스플레이스먼트 맵핑을 지원 하고 있는 경우만 사용할 수 있다. 이 메서드를 사용할 수 있는 것은, D3DDECLUSAGE_SAMPLE 뿐이다.
- D3DDECLMETHOD_LOOKUPPRESAMPLED :프리샘플링 한 디스플레이스먼트 맵을 참조한다. 입력 타입, 스트림 인덱스, 스트림 오프셋(offset)는 모두 사용하지 않는다. 타입은 D3DDECLTYPE_UNUSED 로 설정해, 스트림과 오프셋(offset)는 0 으로 설정해야 한다. 이 조작의 출력형은 항상 D3DDECLTYPE_FLOAT4 이다. 장치가 디스플레이스먼트 맵핑을 지원 하고 있는 경우만 사용할 수 있다. 이 메서드를 사용할 수 있는 것은, D3DDECLUSAGE_SAMPLE 뿐이다.
- Semantic type - 법선인지 아닌지 등, 요소의 사용법. N 패치에 사용하면 편리해, 다양한 데이터 레이아웃이나 정점 셰이더의 사이의 상호 조작성이 향상한다. 사용자 정의 필드 (Microsoft Direct3D® 로 정의한 기존의 의미들을 가지지 않는 필드)에는 TEXCOORDS 의미들을 사용할 수 있다. 보통, 시멘틱스는, 정점 선언과 정점 셰이더간의 바인드메카니즘이다. 그러나, 경우에 따라서는, 특별한 해석을 가지는 일이 있다. 예를 들어, NORMAL 또는 POSITION 시멘틱스를 가지는 요소는, 테설레이션을 설정하기 위해서 N 패치 테설레이터가 사용한다.
다음의 것이 허가된다.
시멘틱스, 사용법인덱스 | 특별한 해석 |
---|
(D3DDECLUSAGE_POSITION, 0 ) | 고정 기능 정점 셰이더와 N 패치 테설레이터의 변환 되지 않은 위치. |
(D3DDECLUSAGE_POSITION, 1) | 스키닝을 위한, 고정 기능 정점 셰이더의 변환 되지 않은 위치. |
(D3DDECLUSAGE_BLENDWEIGHT, 0) | 고정 기능 정점 셰이더의 블렌드의 중량감. |
(D3DDECLUSAGE_BLENDINDICES, 0) | 정점 셰이더에 의해 인덱스를 붙일 수 있던, 팔레트의 스키닝용의 행렬 인덱스.
|
(D3DDECLUSAGE_NORMAL, 0) | 고정 기능 정점 셰이더와 N 패치 테설레이터의 정점 법선. |
(D3DDECLUSAGE_NORMAL, 1) | 스키닝을 위한, 고정 기능 정점 셰이더의 정점 법선. |
(D3DDECLUSAGE_PSIZE, 0) | 포인트 스프라이트 기능의 사각형에 포인트를 확대하기 위해서(때문에), 래스터라이저의 셋업 엔진이 사용하는, 포인트 사이즈 속성. |
(D3DDECLUSAGE_TEXCOORD, n) | 고정 기능 정점 셰이더 및 3_0 이전의 픽셀 셰이더의 텍스처 좌표. 이것들은, 사용자 정의 데이터를 건네주기 위해서(때문에) 사용할 수 있다. |
(D3DDECLUSAGE_TANGENT, n) | 접선. 특별한 해석은 없다. |
(D3DDECLUSAGE_BINORMAL, n) | 종법선. 특별한 해석은 없다. |
(D3DDECLUSAGE_TESSFACTOR, 0) | 테설레이션의 레이트를 제어하기 위해서, 테설레이션 유니트로 사용되는 테설레이션 계수. |
(D3DDECLUSAGE_POSITIONT, 0) | 변환 후의 위치. 이것을 포함한 선언이 설정되면 정점 처리를 우회도로 한다. |
(D3DDECLUSAGE_COLOR, 0) | 고정 기능 정점 셰이더 및 3_0 이전의 픽셀 셰이더의 디퓨즈색. |
(D3DDECLUSAGE_COLOR, 1) | 고정 기능 정점 셰이더 및 3_0 이전의 픽셀 셰이더의 스펙큐러색. |
(D3DDECLUSAGE_FOG, 0) | 3_0 이전의 픽셀 셰이더가 설정되었을 때에, 픽셀 셰이더 후에 사용하는 포그(안개:fog) 블렌드값. |
(D3DDECLUSAGE_DEPTH, n) | 깊이. 특별한 해석은 없다. |
(D3DDECLUSAGE_SAMPLE, n) | 참조한 디스플레이스먼트값. D3DDECLMETHOD_LOOKUPPRESAMPLED 또는 D3DDECLMETHOD_LOOKUP 만으로 사용할 수 있다. |
정점 요소내의 특별한 값을, 정점 셰이더 선언의 마지막이라고 본다. 이 값은, #define D3DDECL_END() {0xFF, 0,0,0,0,0} 이다.
정점 요소의 의미들을 지정하려면 , UsageIndex 를 Usage 와 함께 사용한다. DirectX 8. x 때와 같이 D3DVSDE_POSITION2 를 사용하는 것이 아니라, Usage 로서 D3DDECLUSAGE_POSITION 를 지정해, 한층 더 UsageIndex = 1 을 지정할 수 있다.
선언은, 테설레이터 엔진에의 (또는, 테설레이터를 사용하지 않은 경우는 정점 처리 엔진에의 직접적인) 입력과 출력을 지정한다. 정점 요소내의 Type 필드는, 선언에 입력 데이터의 형태를 지정한다. 출력형은 메서드에 의해 정해진다.
정점 셰이더에는,{semantic, semantic index, register number} 라고 하는 형식의 프리안불이 있다. 런타임은 선언의 의미들과 셰이더의 의미들 정보를 조합해, 입력 레지스터와 바이트 오프셋(offset)를 조합해 1 개의 스트림에 넣는다.
FVF 로부터 DirectX 9.0 선언에의 맵핑
FVF | 데이터 타입 | 사용법 | 사용법인덱스 |
---|
D3DFVF_XYZ | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZRHW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 |
D3DFVF_XYZW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_UBYTE4 | D3DVSDT_FLOAT3 D3DVSDT_FLOAT4 D3DVSDT_UBYTE4
| D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_D3DCOLOR | D3DVSDT_FLOAT3 D3DVSDT_FLOAT4 D3DVSDT_D3DCOLOR
| D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5 | D3DDECLTYPE_FLOAT3 D3DDECLTYPE_FLOAT4 D3DDECLTYPE_FLOAT1
| D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) | D3DDECLTYPE_FLOAT3 D3DDECLTYPE_FLOATn | D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT | 0 |
D3DFVF_XYZBn (n=1..4) 및 D3DFVF_LASTBETA_UBYTE4 | D3DDECLTYPE_FLOAT3 D3DDECLTYPE_FLOAT(n-1) D3DDECLTYPE_UBYTE4 | D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) 및 D3DFVF_LASTBETA_D3DCOLOR | D3DDECLTYPE_FLOAT3 D3DDECLTYPE_FLOAT(n-1) D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_POSITION D3DDECLUSAGE_BLENDWEIGHT D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_NORMAL | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 0 |
D3DFVF_PSIZE | D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_PSIZE | 0 |
D3DFVF_DIFFUSE | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 0 |
D3DFVF_SPECULAR | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 1 |
D3DFVF_TEXCOORDSIZEm(n) | D3DDECLTYPE_FLOATm | D3DDECLUSAGE_TEXCOORD | n |
D3DDECLUSAGE_POSITIONT 에 의한 정점 선언
(D3DUSAGE_POSITIONT, 0)의 정점 요소의 존재는, 유입하는 정점 데이터 (D3DFVF_XYZRHW 비트를 설정한 FVF 등)가, 이미 정점 처리를 종료하고 있는 것을, 장치에 대해서 알리기 위해서(때문에) 사용된다. 드로잉(Drawing)시에는, 현재 설정된 선언에 (D3DUSAGE_POSITIONT, 0) 시멘틱스를 가지는 요소가 있는 경우, D3DFVF_XYZRHW 비트를 가지는 FVF 가 설정되었는지와 같이, 정점 처리 전체가 스킵 된다.
(D3DDECLUSAGE_POSITIONT, 0)에 의한 정점 선언에는, 다음과 같은 몇개의 제한이 있다.
- 이러한 선언에서는, 스트림 제로만이 사용할 수 있다.
- 정점 요소는, 증가하는 스트림 오프셋(offset)로 소트 할 필요가 있다.
- 스트림 오프셋(offset)는, alignment 된 DWORD 일 필요가 있다.
- 같은 (사용법, 사용법인덱스) 페어는, 1 회만 리스트 한다.
- D3DDECLMETHOD_DEFAULT 메서드만 사용할 수 있다.
- 다른 정점 요소는, (D3DDECLUSAGE_POSITION, 0) 시멘틱스를 가질 수 없다.
게다가 장치 드라이버의 버전에 관련해, 이러한 선언에는 몇개의 제한이 있다. 이러한 제한이 유효하게 되는 것은, Direct3D 가 변환을 실행하지 않고 , 선언을 직접 드라이버에 보내기 때문에 있다.
DirectX 9.0 이전의 드라이버
- 입력 선언은, 유효한 FVF 로 번역 가능해야 한다. 즉, 같은 순서의 정점 요소와 그 데이터형을 가지고 있을 필요가 있다.
- 텍스처 좌표에 틈새가 있어서는 안 된다. 이것은, (D3DDECLUSAGE_TEXCOORD, n)를 가지는 정점 요소가 있는 경우, (D3DDECLUSAGE_TEXCOORD, n-1)의 정점 요소도 없으면 안 된다.
픽셀 셰이더 버전 3 의 지원이 없는 DirectX 9.0 드라이버
- 입력 선언은, 유효한 FVF 로 번역 가능해야 한다. 즉, 같은 순서의 정점 요소와 그 데이터형을 가지고 있을 필요가 있다.
- 텍스처 좌표에 틈새가 있어도 괜찮다.
픽셀 셰이더 버전 3 의 지원이 있는 DirectX 9.0 드라이버
보다 일반적인 선언이 허가된다.
- 정점 요소는 무순으로, 임의의 데이터형을 가질 수가 있다.
- 장치가 D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 를 설정하는 경우, 복수의 정점 요소는 같은 스트림 오프셋(offset)를 공유할 수 있어 동시에 다른 타입으로 할 수 있다.
D3DDECLUSAGE_POSITIONT 가 없는 정점 선언
런타임은, 선언의 생성을 검증한다. 이하에서는, 유효한 선언에 관한 일반적인 규칙을 나타낸다.
- 1 개의 스트림내의 정점 요소는 모든 것이 연속해, 오프셋(offset)에 의해 분류되지 않으면 안 된다.
- 스트림 오프셋(offset)는, alignment 된 DWORD 일 필요가 있다.
- 같은(사용법, 사용법인덱스) 페어는, 1 회만 리스트 한다.
- D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 가 설정되어 있는 경우, 정점 요소에서는 다음 일이 가능하다.
- 복수의 정점 요소는, 스트림의 같은 오프셋(offset)를 공유할 수 있다.
- 이것들은, 모두 다른 타입으로 할 수 있어 각 타입은 다른 사이즈로 할 수 있다.
- 또, 임의에 오버랩 할 수 있다. 예를 들어, 1 개의 요소가 스트림의 장소에서 시작 해, 동시에 다른 요소가 중앙의 장소에서 시작 할 수 있다.
- 정점 요소는, 임의의 순서로 스트림 오프셋(offset)를 가질 수가 있다.
- 정점 요소의 수는 64 개를 넘어서는 안 된다.
- UsageIndex 는 [0-15] 의 범위가 아니면 안된다.
- DrawPrimitive API 와 함께 사용하는 선언은, D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED, 또는 D3DDECLMETHOD_LOOKUP 이외의 정점 요소를 가질 수 없다.
- D3DDECLMETHOD_LOOKUP 또는 LOOKUPPRESAMPLED 를 포함한 선언과 함께 사용할 수 있는 것은, 프로그래밍 가능한 정점 파이프라인 뿐이다.
- DrawRectPatch/DrawTriPatch API 와 함께 사용하는 선언은, D3DDECLMETHOD_LOOKUPPRESAMPLED 또는 D3DDECLMETHOD_LOOKUP 를 포함한 정점 요소를 가질 수 없다.
- 선언은, D3DDECLMETHOD_LOOKUP 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 메서드를 포함한 1 개의 요소만을 가질 수가 있다.
- D3DDECLMETHOD_LOOKUP 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 를 포함한 선언에, D3DDECLMETHOD_DEFAULT 이외의 요소는 지정할 수 없다. 디스플레이스먼트 맵핑은 N 패치 에 대해서만 실행되기 때문이다.
- D3DDECLMETHOD_LOOKUP 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 를 포함한 정점 요소는, (D3DDECLUSAGE_SAMPLE, n) 시멘틱스와 함께 밖에 사용할 수 없다. 역의 경우도 마찬가지이다.
- D3DDECLMETHOD_LOOKUP 메서드를 포함한 정점 요소가 기존의 정점 요소의 스트림 인덱스 및 오프셋(offset)를 가지는 경우, 이 정점 요소는 같은 데이터형이 아니면 안된다.
- D3DDECLMETHOD_LOOKUP 메서드를 포함한 정점 요소에는, 데이터형 D3DDECLTYPE_FLOAT2/3/4 가 필요하다.
- 형태가 D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU, 및 D3DDECLMETHOD_PARTIALV 의 정점 요소는, 호환성이 있는 데이터형의 정점 요소의 오프셋(offset)를 가지지 않으면 안 된다.
- D3DDECLMETHOD_UV 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 메서드를 포함한 정점 요소는, D3DDECLTYPE_UNUSED 형, 스트림 인덱스 제로, 및 스트림 오프셋(offset) 제로를 가지지 않으면 안 된다.
- D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU, 및 D3DDECLMETHOD_PARTIALV 메서드를 포함한 선언은, DrawRectPatch 만으로 사용할 수 있다.
- 사용법 D3DDECLUSAGE_TESSFACTOR 와 함께 사용할 수 있는 것은, 데이터형 D3DDECLTYPE_FLOAT1 및 사용법인덱스 0 뿐인다.
- 테설레이션 (DrawRectPatch, DrawTriPatch, N-patches)에 선언을 사용하는 경우, 데이터형은 D3DDECLTYPE_SHORT4 이하가 아니면 안 된다.
- 특정의 장치 능력을 필요로 하는 메서드를 포함한 선언 (예를 들어, 디스플레이스먼트 맵핑이나 RT 패치)은, 장치가 그것들을 지원 하고 있는 경우에 한정해 생성 할 수 있다.
- 점과선을 드로잉(Drawing) 하기 위해서 사용하는 정점 선언은, D3DDECLMETHOD_DEFAULT 이외의 메서드를 가질 수 없다.
- 생성 할 수 있는 선언은, 드라이버의 능력에 따라서 다르다.
프로그래밍 가능한 정점 파이프라인에서의 사용 방법
- Direct3D 는 드로잉(Drawing)시에, 현재의 정점 선언과 현재의 정점 셰이더 기능안에 같은 "사용법 - 사용법인덱스" 의 편성을 찾는다. 이 편성이 발견되었을 경우, 셰이더 기능의 DCL 의 레지스터가 정점 요소의 선언으로서 사용된다.
- 현재의 정점 선언내의 정점 요소가 가지는 사용법이 현재의 정점 셰이더내에 없으면 그 정점 요소는 무시된다.
- 2.0 보다 전의 정점 셰이더를 사용하는 경우, 모든 시멘틱스 (셰이더 코드로 말했다)는, 드로잉(Drawing)시에 바인드 된 선언에 존재하고 있을 필요가 있다. 정점 셰이더 2.0 이후를 사용하는 경우, 이 제한은 존재하지 않고, 이것에 의해, 애플리케이션은 같은 정점 셰이더를 포함한 다른 정점 선언을 사용할 수 있다. 이것은, 정점 셰이더가 정적인 조건에 근거해 입력 데이터를 읽어내는 경우에 편리하다. 이 이유로써 초기화되지 않는 정점 셰이더 레지스터는, 미정도리의 값을 갖는다.
DirectX 8. x 드라이버로 하드웨어 정점 처리와 함께 사용하는 경우, 한층 더 다음과 같은 제한이 있다.
- 정점 요소는 오버랩 하거나 같은 오프셋(offset)를 공유하거나 할 수 없다.
- 데이터형은, DirectX 8. x 드라이버를 이해할 수 있는 범위에 제한된다.
지정한 선언이 DirectX 8. x 형식의 선언으로 변환할 수 없는 경우, CreateVertexDeclaration 는 실패할 가능성이 있다. 믹스 모드 장치의 경우, 드로잉(Drawing)시에 이 실패가 일어난다. 이 셰이더가 하드웨어 정점 처리로 사용되고 있는지, 소프트웨어 정점 처리로 사용되고 있을지를 아는 것은 이 때 뿐이다.
고정 정점 파이프라인에서의 사용 방법
다음의 규칙에 따르는 선언만이 사용할 수 있다.
- 정점 요소간에 틈새가 있어서는 안 된다. DirectX 8. x 선언에서는, SKIP 는 사용할 수 없지만, 고정 기능 파이프라인에서는 사용된다.
- 시멘틱스 (D3DDECLUSAGE_POSITION, 0)를 지정하지 않으면 안되어, 이것은 D3DDECLTYPE_FLOAT3 데이터형을 가질 필요가 있다.
- D3DDECLMETHOD_UV 메서드를 포함한 정점 요소는, 사용법 D3DDECLUSAGE_TEXCOORD 또는 D3DDECLUSAGE_BLENDWEIGHT 를 지정해야 한다.
- D3DDECLMETHOD_PARTIALU, _PARTIALV, 또는 _CROSSUV 메서드를 포함한 정점 요소는, D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT, 또는 _TEXCOORD 사용법만으로 사용할 수 있다. 또, 입력 타입 D3DDECLTYPE_FLOAT3 를 사용해야 한다.
DirectX 8. x 드라이버로 하드웨어 정점 처리와 함께 선언을 사용하는 경우, Direct3D 런타임은 다음의 규칙을 사용해, 그것을 DirectX 8. x 형식의 선언으로 변환한다.
- 복수의 정점 요소가 1 개의 스트림내의 같은 오프셋(offset)를 공유하거나 오버랩 할 수 없다.
- 데이터 타입은, D3DDECLTYPE_SHORT4 이하가 아니면 안된다.
- D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_UV 의 각 메서드만이 사용할 수 있다.
- 사용법과 사용법인덱스는,Mapping DirectX 9.0 선언으로부터 DirectX 8. x 에의 맵핑에 따라 레지스터값에 변환된다.
- Mapping DirectX 9.0 선언으로부터 DirectX 8. x 에의 맵핑에서는,DirectX 8. x 형식의 선언으로 변환할 수 있는, DirectX 9.0 의 시멘틱스를 나타내고 있다.
- 선언에 n 개의 정점 요소가 있어, 0 - m (m < n)는 FVF 에 맵 하지만 (요소는 DirectX 9.0 선언으로부터 FVF 비트에의 맵핑으로 설명하고 있다),m+1 인 경우, 다음 일이 들어맞는다.
- m+2 로부터 n-1 정점 요소의 어느쪽이든을 FVF/dx8decl 에 맵핑 하는 경우, 선언은 무효이다.
- 요소 0 ~ m 는, DirectX 8.0 이전의 드라이버의 런타임과 DirectX 9.0 드라이버에 의해,DirectX 9.0 선언으로부터 FVF 비트에의 맵핑을 사용해 변환된다. m+1, m+2 ~ n-1 는, 요소 0 ~ m 의 임의의 texcoord 로부터, 연속하는 texcoord(k), texcoord(k+1)에 맵핑 된다.
- 맵핑 된 texcoord 의 데이터형은 float[1234] 이라고 가정되어 현재의 요소에 포함되어 있는 데이터형과 옮겨놓을 수 있지만, 사이즈는 같다. 그 때문에, 기존의 데이터형을DirectX 9.0 선언으로부터 FVF 비트에의 맵핑에 없는 데이터형으로 해도 상관없다.
- k 가 8 이상 때, FVF/dx8dec 에 대한 선언은 무효가 된다.
- texcoords 에의 맵핑이 발생했을 경우, 선언 전체가, 디폴트 이외의 생성 메서드를 가지는 요소를 포함해서는 안 된다. 그렇지 않은 경우, FVF/dx8decl 에 대한 선언은 무효가 된다.
Mapping DirectX 9.0 선언으로부터 DirectX 8. x 에의 맵핑
DirectX 9.0 사용법 | DirectX 9.0 사용법인덱스 | DirectX 8.0 |
---|
D3DDECLUSAGE_POSITION | 0 | D3DVSDE_POSITION |
D3DDECLUSAGE_POSITION | 1 | D3DVSDE_POSITION2 |
D3DDECLUSAGE_NORMAL | 0 | D3DVSDE_NORMAL |
D3DDECLUSAGE_NORMAL | 1 | D3DVSDE_NORMAL2 |
D3DDECLUSAGE_BLENDWEIGHT | 0 | D3DVSDE_BLENDWEIGHT |
D3DDECLUSAGE_BLENDINDICES | 0 | D3DVSDE_BLENDINDICES |
D3DDECLUSAGE_PSIZE | 0 | D3DVSDE_PSIZE |
D3DDECLUSAGE_COLOR | 0 | D3DVSDE_DIFFUSE |
D3DDECLUSAGE_COLOR | 1 | D3DVSDE_SPECULAR |
D3DDECLUSAGE_TEXCOORD | n | D3DVSDE_TEXCOORDn |
DirectX 7.0.x 드라이버로 하드웨어 정점 처리와 함께 선언을 사용하는 경우, Direct3D 런타임은 다음의 규칙을 사용해, 그것을 FVF 로 변환한다.
- 사용할 수 있는 것은 스트림 0 뿐이다 (MaxStreams 능력으로부터 아키라등인가).
- 정점 요소의 순서는, FVF 비트의 순서와 같은 필요가 있다.
- 텍스처 좌표에 틈새가 있어서는 안 된다.
- DirectX 9.0 선언으로부터 FVF 비트에의 맵핑으로 설명되지 않은 정점 요소는,DirectX 8.0 이전의 모든 유효한 드라이버에는 변환하지 못하고, 그 때문에(위해), 이러한 드라이버에서는 사용하지 않는다.
- 장치가, D3DPTEXTURECAPS_PROJECTED 또는 D3DPTEXTURECAPS_CUBEMAP 능력의 모두 설정하지 않는 경우, D3DDECLUSAGE_TEXCOORD 를 포함한 정점 요소에는, D3DDECLTYPE_FLOAT2 만이 허가된다.
DirectX 9.0 선언으로부터 FVF 비트에의 맵핑
데이터 타입 | 사용법 | 사용법인덱스 | FVF |
---|
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 | D3DFVF_XYZ |
D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 | D3DFVF_XYZRHW |
D3DDECLTYPE_FLOATn | D3DDECLUSAGE_BLENDWEIGHT | 0 | D3DFVF_XYZBn |
D3DDECLTYPE_UBYTE4 | D3DDECLUSAGE_BLENDINDICES | 0 | D3DFVF_XYZB (nWeights+1) |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 0 | D3DFVF_NORMAL |
D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_PSIZE | 0 | D3DFVF_PSIZE |
D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 0 | D3DFVF_DIFFUSE |
D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 1 | D3DFVF_SPECULAR |
D3DDECLTYPE_FLOATm | D3DDECLUSAGE_TEXCOORD | n | D3DFVF_TEXCOORDSIZEm(n) |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 1 | 부적당용 |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 1 | 부적당용 |
ProcessVertices 를 포함한 정점 선언의 사용법
ProcessVertices 의 출력을 기술하려면 , 정점 선언을 사용할 수 있다. 이러한 선언은, 다음의 규칙에 따를 필요가 있다.
- 스트림 제로만이 사용할 수 있다.
- 정점 요소는 같은 오프셋(offset)를 공유하거나 서로 오버랩 하거나 할 수 없다.
- D3DDECLMETHOD_DEFAULT 메서드만이 허가된다.
- D3DDECLTYPE_FLOATn 또는 D3DDECLTYPE_D3DCOLOR 데이터형만이 사용할 수 있다.
- (D3DDECLUSAGE_POSITION, 0) 또는 (D3DDECLUSAGE_POSITIONT, 0)을 포함한 정점 요소는 불필요하다.
- (D3DDECLUSAGE_POSITION, 0) 및 (D3DDECLUSAGE_POSITIONT, 0)을 포함한 정점 요소는, 같은 선언에 존재할 수 없다.
- 이러한 선언을 사용하는 경우, 현재의 정점 셰이더는 버전 3.0 이후가 아니면 안 된다.