DirectX Graphics 프로그래밍 가이드 프로그래밍 가능한 파이프라인 정점 셰이더 정점 셰이더와 정점 선언의 분리 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
Microsoft® DirectX® 9.0 에서는, 셰이더 생성 (CreateVertexShader) 시에는 정점 셰이더와 정점 선언을 바인드 하지 않게 되었다. 셰이더의 평가는 2 개의 부분으로 나누어졌다. 최초의 부분을 셰이더 생성시에 실행해, 나머지의 부분을 드로잉(Drawing) (DrawPrimitive) 시에 실행한다.
정점 셰이더와 정점 선언은 개체에 의해 표현한다. DirectX 8. x 드라이버를 사용해 이것을 실시하는 경우는, 얼마인가의 캐싱을 한다. 런타임은 "드로잉(Drawing)시" 에, 현재의 선언과 셰이더를 캡슐화한 결합 셰이더 개체가 존재할지 어떨지를 확인한다. 존재하는 경우는, 그것을 드라이버에 보내, 존재하지 않는 경우는, 그 셰이더 선언을 조합한 새로운 개체를 생성 한다. 게다가 애플리케이션 프로그래밍 인터페이스 (API)의 가용성의 문제를 해결하기 위해서, SetVertexDeclaration 호출해에 상당하는 개별의 SetFVF 호출을 실시한다. 이것은 편리한 함수이다. 이 호출을 실시하면, 현재 설정되어 있는 선언은 무효가 되어, 새로운 선언이 유효하게 된다. DirectX 8.0 이전의 드라이버 (스트림수가 0)에서는, 선언을 유연한 정점 포맷 (FVF)으로 변환할 수 없기 위해(때문에) SetVertexDeclaration 가 실패하는 경우가 있다.
DirectX 8. x 드라이버 (스트림수는 0 은 아니지만, 스트림 오프셋(offset)를 지원 하고 있지 않다)로 사용할 수 있는 것은 선언의 서브 세트이다. DirectX 8. x 형식의 선언에 변환 가능한 것만을 생성 할 수 있다. 따라서, 지정된 선언을 변환할 수 없으면 CreateVertexDeclaration 호출은 실패하는 경우가 있다. 믹스 모드의 경우,DrawXXX 를 실행 하면 이 실패가 일어난다. 이 셰이더가 하드웨어 정점 처리로 사용되고 있는지, 소프트웨어 정점 처리로 사용되고 있을지를 아는 것은 이 때 뿐이다. 이 변환에 대해 정리한 표를 나타낸다.
DirectX 8.0 이전의 드라이버 (스트림수를 0)로 사용할 수 있는 것은, decl 의 한층 더 작은 서브 세트이다. 적절한 FVF 로 변환할 수 있는 선언만이 사용할 수 있다. 이 변환을 할 수 없으면 CreateVertexDeclaration 는 실패하는 경우가 있다. 믹스 모드의 경우,DrawXXX 를 실행 하면 이 실패가 일어난다. 이 셰이더가 하드웨어 정점 처리로 사용되고 있는지, 소프트웨어 정점 처리로 사용되고 있을지를 아는 것은 이 때 뿐이다. 이 변환에 대해 정리한 표를 나타낸다. 사용할 수 있는 것은 스트림 0 뿐이다 (MaxStreams 능력으로부터 아키라등인가).
정점 요소의 차례는 FVF 코드의 차례와 같지 않으면 안 된다. D3DDECLUSAGE_POSITION 및 D3DDECLUSAGE_NORMAL 의 사용 방법 인덱스는 0 이 아니면 안된다. 장치의 정점 처리 모드를 믹스 모드로 전환하는 경우, 입력 정점 ( 및 인덱스) 스트림, 정점 선언, 정점 기능을 모두 리셋 할 필요는 없다. NULL 는, SetVertexDeclaration 에 대한 무효인 입력이다. 소프트웨어 정점 처리를 사용하고 있는 경우, 프로그래밍 가능한 정점 파이프라인의 셰이더 코드로 지정한 모든 사용 방법이, 드로잉(Drawing)시에 바인드 한 선언 (또는 FVF)안에 존재해야 한다.
다음의 규칙을 채용하고 있는 선언은, 고정 기능 파이프라인으로 렌더링 할 수 있다 (테설레이션은 불요와 상정).
DirectX 8. x | DirectX 9.0 사용법 | DirectX 9.0 사용법인덱스 |
---|---|---|
D3DVSDE_POSITION | D3DDECLUSAGE_POSITION | 0 |
D3DVSDE_POSITION2 | D3DDECLUSAGE_POSITION | 1 |
D3DVSDE_NORMAL | D3DDECLUSAGE_NORMAL | 0 |
D3DVSDE_NORMAL2 | D3DDECLUSAGE_NORMAL | 1 |
D3DVSDE_BLENDWEIGHT | D3DDECLUSAGE_BLENDWEIGHT | 0 |
D3DVSDE_BLENDINDICES | D3DDECLUSAGE_BLENDINDICES | 0 |
D3DVSDE_PSIZE | D3DDECLUSAGE_PSIZE | 0 |
D3DVSDE_DIFFUSE | D3DDECLUSAGE_COLOR | 0 |
D3DVSDE_SPECULAR | D3DDECLUSAGE_COLOR | 1 |
D3DVSDE_TEXCOORDn | D3DDECLUSAGE_TEXCOORD | n |
FVF | 데이터 타입 | 사용법 | 사용법인덱스 |
---|---|---|---|
D3DFVF_XYZ | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZRHW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 |
D3DFVF_XYZW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 |
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_UBYTE4 | D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 | 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_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 |
사용법 | 사용법인덱스 | DirectX decl |
---|---|---|
D3DDECLUSAGE_POSITION | 0 | D3DVSDE_POSITION |
D3DDECLUSAGE_POSITION | 1 | D3DVSDE_POSITION2 |
D3DDECLUSAGE_BLENDWEIGHT | 0 | D3DVSDE_BLENDWEIGHT |
D3DDECLUSAGE_BLENDINDICES | 0 | D3DVSDE_BLENDINDICES |
D3DDECLUSAGE_NORMAL | 0 | D3DVSDE_NORMAL |
D3DDECLUSAGE_NORMAL | 1 | D3DVSDE_NORMAL2 |
D3DDECLUSAGE_PSIZE | 0 | D3DVSDE_PSIZE |
D3DDECLUSAGE_COLOR | 0 | D3DVSDE_DIFFUSE |
D3DDECLUSAGE_COLOR | 1 | D3DVSDE_SPECULAR |
D3DDECLUSAGE_TEXCOORD | n | D3DVSDE_TEXTUREn, n <= 7 |
DirectX 8.0 및 그 이후의 드라이버에서는, 선언에 정상적으로 변환할 수 있어 따라 고정 기능 정점 처리로 사용할 수 있는 타입이 그 밖에도 있다.
데이터 타입 | 사용법 | 사용법인덱스 | FVF |
---|---|---|---|
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 | D3DFVF_XYZ |
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 | 부적당용 |