FVF 코드를 Direct3D 9 선언에 매핑(Direct3D 9)
이 표는 FVF 코드를 D3DVERTEXELEMENT9 구조체에 매핑합니다.
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). 그리기 시 현재 설정된 선언에 (D3DUSAGE_POSITIONT, 0) 의미 체계가 있는 요소가 있는 경우 전체 꼭짓점 처리를 건너뜁니다(D3DFVF_XYZRHW 비트가 있는 FVF가 설정된 것처럼).
(D3DDECLUSAGE_POSITIONT, 0)을 사용하는 꼭짓점 선언에는 몇 가지 제한 사항이 있습니다.
- 이러한 선언에는 스트림 0만 사용할 수 있습니다.
- 꼭짓점 요소는 스트림 오프셋을 늘려 정렬해야 합니다.
- 스트림 오프셋은 DWORD 정렬이어야 합니다.
- 동일한(사용량, 사용량 인덱스) 쌍은 한 번만 나열되어야 합니다.
- D3DDECLMETHOD_DEFAULT 메서드만 사용할 수 있습니다.
- 다른 꼭짓점 요소에는 (D3DDECLUSAGE_POSITION, 0) 의미 체계가 있을 수 없습니다.
또한 디바이스 드라이버 버전과 관련된 이러한 선언에는 몇 가지 제한 사항이 있습니다. 이러한 제한은 Direct3D가 변환을 수행하지 않고 드라이버에 직접 이러한 선언을 보내기 때문에 적용됩니다.
D3DDECLUSAGE_POSITIONT 없는 꼭짓점 선언
런타임은 선언 만들기의 유효성을 검사합니다. 다음은 어떤 선언이 합법적인지에 대한 일반적인 규칙입니다.
- 스트림의 모든 꼭짓점 요소는 연속되고 오프셋별로 정렬되어야 합니다.
- 스트림 오프셋은 DWORD 정렬이어야 합니다.
- 동일한(사용량, 사용량 인덱스) 쌍은 한 번만 나열되어야 합니다.
- D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 설정된 경우
- 여러 꼭짓점 요소는 스트림에서 동일한 오프셋을 공유할 수 있습니다.
- 꼭짓점 요소는 모두 크기가 다를 수 있는 다양한 형식일 수 있습니다.
- 꼭짓점 요소는 임의로 겹칠 수 있습니다. 예를 들어 한 요소는 다른 요소의 중간에 있는 스트림의 위치에서 동시에 시작할 수 있습니다.
- 꼭짓점 요소는 순서에 따라 스트림 오프셋을 가질 수 있습니다.
- 꼭짓점 요소의 수는 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 메서드가 있는 요소가 하나만 있어야 합니다.
- 변위 매핑은 N 패치에 대해서만 수행되므로 D3DDECLMETHOD_LOOKUP 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 선언에는 D3DDECLMETHOD_DEFAULT 이외의 요소가 없어야 합니다.
- D3DDECLMETHOD_LOOKUP 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 있는 꼭짓점 요소는 (D3DDECLUSAGE_SAMPLE, n) 의미 체계에서만 사용할 수 있으며 그 반대의 경우도 마찬가지입니다.
- D3DDECLMETHOD_LOOKUP 메서드가 있는 꼭짓점 요소에 이미 존재하는 꼭짓점 요소의 스트림 인덱스 및 오프셋이 있는 경우 이 꼭짓점 요소는 동일한 데이터 형식을 가져야 합니다.
- D3DDECLMETHOD_LOOKUP 메서드가 있는 꼭짓점 요소에는 D3DDECLTYPE_FLOAT2/3/4 데이터 형식이 있어야 합니다.
- 형식이 D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU 및 D3DDECLMETHOD_PARTIALV 있는 꼭짓점 요소에는 호환되는 데이터 형식의 꼭짓점 요소 오프셋이 있어야 합니다.
- 메서드 D3DDECLMETHOD_UV 또는 D3DDECLMETHOD_LOOKUPPRESAMPLED 있는 꼭짓점 요소에는 형식 D3DDECLTYPE_UNUSED, 스트림 인덱스 0 및 스트림 오프셋 0이 있어야 합니다.
- D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU 및 D3DDECLMETHOD_PARTIALV 메서드가 있는 선언은 DrawRectPatch에서만 사용할 수 있습니다.
- 사용량 D3DDECLUSAGE_TESSFACTOR 데이터 형식 D3DDECLTYPE_FLOAT1 및 사용량 인덱스 0에서만 사용해야 합니다.
- 테셀레이션(DrawRectPatch, DrawTriPatch, N-patches)에 선언을 사용하는 경우 데이터 형식은 D3DDECLTYPE_SHORT4 보다 작거나 같아야 합니다.
- 특정 디바이스 기능(예: 변위 매핑, RT 패치)이 필요한 메서드를 포함하는 선언은 디바이스가 지원하는 경우에만 만들 수 있습니다.
- 점과 선을 그리는 데 사용되는 꼭짓점 선언에는 D3DDECLMETHOD_DEFAULT 이외의 메서드가 있을 수 없습니다.
- 만들 수 있는 선언도 드라이버 기능에 따라 달라집니다.
드라이버 고려 사항
Pre-Direct3D 9 드라이버
- 입력 선언은 유효한 FVF로 변환할 수 있어야 합니다(꼭짓점 요소와 해당 데이터 형식의 순서가 동일).
- 텍스처 좌표의 간격은 허용되지 않습니다. 즉( D3DDECLUSAGE_TEXCOORD, n)이 있는 꼭짓점 요소가 있는 경우 (D3DDECLUSAGE_TEXCOORD, n-1)가 있는 꼭짓점 요소도 있어야 합니다.
픽셀 셰이더 버전 3이 지원되는 Direct3D 9 드라이버
- 입력 선언은 유효한 FVF로 변환할 수 있어야 합니다(꼭짓점 요소와 해당 데이터 형식의 순서가 동일).
- 텍스처 좌표의 간격이 허용됩니다.
픽셀 셰이더 버전 3이 지원되는 Direct3D 9 드라이버
더 일반적인 선언이 허용됩니다.
- 꼭짓점 요소는 임의 순서일 수 있으며 모든 데이터 형식을 가질 수 있습니다.
- 여러 꼭짓점 요소는 동일한 스트림 오프셋을 공유할 수 있으며 디바이스에서 D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 설정된 경우 동시에 다른 형식일 수 있습니다.
프로그래밍 가능한 꼭짓점 파이프라인을 사용한 꼭짓점 선언 사용
- 그리기 시 Direct3D는 현재 꼭짓점 선언과 현재 꼭짓점 셰이더 함수에서 동일한 "사용량 - 사용량 인덱스" 조합을 찾습니다. 조합이 발견되면 셰이더 함수 DCL의 레지스터가 꼭짓점 요소의 대상으로 사용됩니다.
- 현재 꼭짓점 선언의 꼭짓점 요소에 현재 꼭짓점 셰이더에서 찾을 수 없는 사용법이 있는 경우 해당 꼭짓점 요소는 무시됩니다.
- 꼭짓점 셰이더 버전이 2.0 미만인 경우 셰이더 코드에 언급된 모든 의미 체계가 그리기 시 바인딩된 선언에 있어야 합니다. 꼭짓점 셰이더 2.0 이상을 사용하는 경우 애플리케이션이 동일한 꼭짓점 셰이더와 함께 다른 꼭짓점 선언을 사용할 수 있도록 하는 이 제한이 없습니다. 이는 꼭짓점 셰이더가 정적 조건에 따라 입력 데이터를 읽을 때 유용합니다. 이 때문에 초기화되지 않은 꼭짓점 셰이더 레지스터에는 정의되지 않은 값이 있습니다.
DirectX 8 드라이버에서 하드웨어 꼭짓점 처리와 함께 사용할 때는 다음과 같은 추가 제한 사항이 있습니다.
- 꼭짓점 요소는 동일한 오프셋을 겹치거나 공유할 수 없습니다.
- 데이터 형식은 DirectX 8 드라이버가 이해할 수 있는 것으로 제한됩니다.
제공된 선언을 DirectX 8 스타일 선언으로 변환할 수 없는 경우 CreateVertexDeclaration이 실패할 수 있습니다. 혼합 모드 디바이스의 경우 이 셰이더가 하드웨어 또는 소프트웨어 꼭짓점 처리에 사용되는지 여부를 알 수 있는 유일한 시간이므로 Draw* 시간에 이 오류가 발생합니다.
고정 함수 파이프라인을 사용하는 꼭짓점 선언 사용
다음 규칙을 준수하는 선언만 사용할 수 있습니다.
- 꼭짓점 요소 사이에 간격이 없어야 합니다(고정 함수 파이프라인에 사용되는 DirectX 8 선언에서는 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 드라이버에서 하드웨어 꼭짓점 처리와 함께 선언을 사용하는 경우 Direct3D 런타임은 다음 규칙을 사용하여 DirectX 8 스타일 선언으로 변환합니다.
- 꼭짓점 요소는 스트림에서 동일한 오프셋을 공유할 수 없으며 겹칠 수 없습니다.
- 데이터 형식은 D3DDECLTYPE_SHORT4 작거나 같아야 합니다.
- D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV 및 D3DDECLMETHOD_UV 메서드만 허용됩니다.
- Direct3D 9 선언과 Direct3D 8 선언(Direct3D 9) 간의 매핑 은 DirectX 8 스타일 선언으로 변환할 수 있는 Direct3D 9 의미 체계를 보여 줍니다. Usage 및 UsageIndex는 레지스터 값으로 변환됩니다.
- 선언에 n개의 꼭짓점 요소가 있고 0 -m(m < n)이 FVF( Direct3D 선언과 FVF 코드(Direct3D 9) 간의 매핑에 설명된 요소)에 매핑되지만 m + 1은 그렇지 않은 경우 다음을 수행합니다.
- m + 2에서 n까지 - 1개 꼭짓점 요소가 FVF/dx8decl에 매핑되는 경우 선언이 유효하지 않습니다.
- 0에서 m까지의 요소는 DirectX 8 및 이전 드라이버의 런타임에 의해 변환됩니다. Direct3D 선언과 FVF 코드(Direct3D 9), m + 1, m + 2에서 n -1까지의 매핑을 사용하는 Direct3D 9 드라이버가 연속 texcoord(k), texcoord(k+1)에 매핑됩니다.
- 매핑된 texcoord의 데이터 형식은 float[1234]로 간주되어 현재 요소에 포함된 데이터 형식(크기는 동일)을 대체합니다. 따라서 기존 데이터 형식은 Direct3D 선언과 FVF 코드(Direct3D 9) 간의 매핑에 없는 것일 수 있습니다.
- k가 8에 도달하면 FVF/dx8decl에 대한 선언이 유효하지 않습니다.
- texcoords에 대한 매핑이 발생한 경우 전체 선언에는 DEFAULT 이외의 생성 메서드가 있는 요소가 없거나 FVF/dx8decl에 대해 선언이 유효하지 않습니다.
ProcessVertices에서 꼭짓점 선언 사용
꼭짓점 선언을 사용하여 ProcessVertices의 출력을 설명할 수 있습니다. 이러한 선언은 다음 규칙을 준수해야 합니다.
- 스트림 0만 사용해야 합니다.
- D3DDECLMETHOD_DEFAULT 메서드만 허용됩니다.
- D3DDECLTYPE_FLOATn 또는 D3DDECLTYPE_D3DCOLOR 데이터 형식만 사용할 수 있습니다.
- 꼭짓점 요소는 동일한 오프셋을 공유하거나 서로 겹칠 수 없습니다.
- (D3DDECLUSAGE_POSITION, 0) 또는 (D3DDECLUSAGE_POSITIONT,0)이 있는 꼭짓점 요소는 필요하지 않습니다.
- (D3DDECLUSAGE_POSITION, 0) 및 (D3DDECLUSAGE_POSITIONT,0)이 있는 꼭짓점 요소는 동일한 선언에 있을 수 없습니다.
- 이러한 선언을 사용하는 경우 현재 꼭짓점 셰이더는 버전 3.0 이상이어야 합니다.
관련 항목