DirectX Graphics 프로그래밍 가이드 Direct3D 의 기초지식 정점 선언   [목차열람] [주소복사] [슬롯비우기]
정점 선언
 
Microsoft DirectX 9.0

정점 선언


개념상, 정점 선언은, 정점 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 구조 체내의 필드와 그 설명을 나타낸다.

정점 요소내의 특별한 값을, 정점 셰이더 선언의 마지막이라고 본다. 이 값은, #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_XYZD3DDECLTYPE_FLOAT3D3DDECLUSAGE_POSITION0
D3DFVF_XYZRHWD3DDECLTYPE_FLOAT4D3DDECLUSAGE_POSITIONT0
D3DFVF_XYZWD3DDECLTYPE_FLOAT4D3DDECLUSAGE_POSITION0
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_UBYTE4D3DVSDT_FLOAT3

D3DVSDT_FLOAT4

D3DVSDT_UBYTE4

D3DDECLUSAGE_POSITION

D3DDECLUSAGE_BLENDWEIGHT

D3DDECLUSAGE_BLENDINDICES
0
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_D3DCOLORD3DVSDT_FLOAT3

D3DVSDT_FLOAT4

D3DVSDT_D3DCOLOR

D3DDECLUSAGE_POSITION

D3DDECLUSAGE_BLENDWEIGHT

D3DDECLUSAGE_BLENDINDICES
0
D3DFVF_XYZB5D3DDECLTYPE_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_UBYTE4D3DDECLTYPE_FLOAT3

D3DDECLTYPE_FLOAT(n-1)

D3DDECLTYPE_UBYTE4
D3DDECLUSAGE_POSITION

D3DDECLUSAGE_BLENDWEIGHT

D3DDECLUSAGE_BLENDINDICES
0
D3DFVF_XYZBn (n=1..4) 및 D3DFVF_LASTBETA_D3DCOLORD3DDECLTYPE_FLOAT3

D3DDECLTYPE_FLOAT(n-1)

D3DDECLTYPE_D3DCOLOR
D3DDECLUSAGE_POSITION

D3DDECLUSAGE_BLENDWEIGHT

D3DDECLUSAGE_BLENDINDICES
0
D3DFVF_NORMALD3DDECLTYPE_FLOAT3D3DDECLUSAGE_NORMAL0
D3DFVF_PSIZED3DDECLTYPE_FLOAT1D3DDECLUSAGE_PSIZE0
D3DFVF_DIFFUSED3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR0
D3DFVF_SPECULARD3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR1
D3DFVF_TEXCOORDSIZEm(n)D3DDECLTYPE_FLOATmD3DDECLUSAGE_TEXCOORDn

D3DDECLUSAGE_POSITIONT 에 의한 정점 선언

(D3DUSAGE_POSITIONT, 0)의 정점 요소의 존재는, 유입하는 정점 데이터 (D3DFVF_XYZRHW 비트를 설정한 FVF 등)가, 이미 정점 처리를 종료하고 있는 것을, 장치에 대해서 알리기 위해서(때문에) 사용된다. 드로잉(Drawing)시에는, 현재 설정된 선언에 (D3DUSAGE_POSITIONT, 0) 시멘틱스를 가지는 요소가 있는 경우, D3DFVF_XYZRHW 비트를 가지는 FVF 가 설정되었는지와 같이, 정점 처리 전체가 스킵 된다.

(D3DDECLUSAGE_POSITIONT, 0)에 의한 정점 선언에는, 다음과 같은 몇개의 제한이 있다.

게다가 장치 드라이버의 버전에 관련해, 이러한 선언에는 몇개의 제한이 있다. 이러한 제한이 유효하게 되는 것은, Direct3D 가 변환을 실행하지 않고 , 선언을 직접 드라이버에 보내기 때문에 있다.

DirectX 9.0 이전의 드라이버

픽셀 셰이더 버전 3 의 지원이 없는 DirectX 9.0 드라이버

픽셀 셰이더 버전 3 의 지원이 있는 DirectX 9.0 드라이버

보다 일반적인 선언이 허가된다.

D3DDECLUSAGE_POSITIONT 가 없는 정점 선언

런타임은, 선언의 생성을 검증한다. 이하에서는, 유효한 선언에 관한 일반적인 규칙을 나타낸다.

프로그래밍 가능한 정점 파이프라인에서의 사용 방법

DirectX 8. x 드라이버로 하드웨어 정점 처리와 함께 사용하는 경우, 한층 더 다음과 같은 제한이 있다.

지정한 선언이 DirectX 8. x 형식의 선언으로 변환할 수 없는 경우, CreateVertexDeclaration 는 실패할 가능성이 있다. 믹스 모드 장치의 경우, 드로잉(Drawing)시에 이 실패가 일어난다. 이 셰이더가 하드웨어 정점 처리로 사용되고 있는지, 소프트웨어 정점 처리로 사용되고 있을지를 아는 것은 이 때 뿐이다.

고정 정점 파이프라인에서의 사용 방법

다음의 규칙에 따르는 선언만이 사용할 수 있다.

DirectX 8. x 드라이버로 하드웨어 정점 처리와 함께 선언을 사용하는 경우, Direct3D 런타임은 다음의 규칙을 사용해, 그것을 DirectX 8. x 형식의 선언으로 변환한다.

Mapping DirectX 9.0 선언으로부터 DirectX 8. x 에의 맵핑

DirectX 9.0 사용법DirectX 9.0 사용법인덱스DirectX 8.0
D3DDECLUSAGE_POSITION0D3DVSDE_POSITION
D3DDECLUSAGE_POSITION1D3DVSDE_POSITION2
D3DDECLUSAGE_NORMAL0D3DVSDE_NORMAL
D3DDECLUSAGE_NORMAL1D3DVSDE_NORMAL2
D3DDECLUSAGE_BLENDWEIGHT0D3DVSDE_BLENDWEIGHT
D3DDECLUSAGE_BLENDINDICES0D3DVSDE_BLENDINDICES
D3DDECLUSAGE_PSIZE0D3DVSDE_PSIZE
D3DDECLUSAGE_COLOR0D3DVSDE_DIFFUSE
D3DDECLUSAGE_COLOR1D3DVSDE_SPECULAR
D3DDECLUSAGE_TEXCOORDnD3DVSDE_TEXCOORDn

DirectX 7.0.x 드라이버로 하드웨어 정점 처리와 함께 선언을 사용하는 경우, Direct3D 런타임은 다음의 규칙을 사용해, 그것을 FVF 로 변환한다.

DirectX 9.0 선언으로부터 FVF 비트에의 맵핑

데이터 타입사용법사용법인덱스FVF
D3DDECLTYPE_FLOAT3D3DDECLUSAGE_POSITION0D3DFVF_XYZ
D3DDECLTYPE_FLOAT4D3DDECLUSAGE_POSITIONT0D3DFVF_XYZRHW
D3DDECLTYPE_FLOATnD3DDECLUSAGE_BLENDWEIGHT0D3DFVF_XYZBn
D3DDECLTYPE_UBYTE4D3DDECLUSAGE_BLENDINDICES0D3DFVF_XYZB (nWeights+1)
D3DDECLTYPE_FLOAT3D3DDECLUSAGE_NORMAL0D3DFVF_NORMAL
D3DDECLTYPE_FLOAT1D3DDECLUSAGE_PSIZE0D3DFVF_PSIZE
D3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR0D3DFVF_DIFFUSE
D3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR1D3DFVF_SPECULAR
D3DDECLTYPE_FLOATmD3DDECLUSAGE_TEXCOORDnD3DFVF_TEXCOORDSIZEm(n)
D3DDECLTYPE_FLOAT3D3DDECLUSAGE_POSITION1부적당용
D3DDECLTYPE_FLOAT3D3DDECLUSAGE_NORMAL1부적당용

ProcessVertices 를 포함한 정점 선언의 사용법

ProcessVertices 의 출력을 기술하려면 , 정점 선언을 사용할 수 있다. 이러한 선언은, 다음의 규칙에 따를 필요가 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP