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 8. xDirectX 9.0 사용법DirectX 9.0 사용법인덱스
D3DVSDE_POSITIOND3DDECLUSAGE_POSITION0
D3DVSDE_POSITION2D3DDECLUSAGE_POSITION1
D3DVSDE_NORMALD3DDECLUSAGE_NORMAL0
D3DVSDE_NORMAL2D3DDECLUSAGE_NORMAL1
D3DVSDE_BLENDWEIGHTD3DDECLUSAGE_BLENDWEIGHT0
D3DVSDE_BLENDINDICESD3DDECLUSAGE_BLENDINDICES0
D3DVSDE_PSIZED3DDECLUSAGE_PSIZE0
D3DVSDE_DIFFUSED3DDECLUSAGE_COLOR0
D3DVSDE_SPECULARD3DDECLUSAGE_COLOR1
D3DVSDE_TEXCOORDnD3DDECLUSAGE_TEXCOORDn

FVF 코드의 DirectX 9.0 정점 선언에의 맵핑

FVF데이터 타입사용법사용법인덱스
D3DFVF_XYZD3DDECLTYPE_FLOAT3D3DDECLUSAGE_POSITION0
D3DFVF_XYZRHWD3DDECLTYPE_FLOAT4D3DDECLUSAGE_POSITIONT0
D3DFVF_XYZWD3DDECLTYPE_FLOAT4D3DDECLUSAGE_POSITIONT0
D3DFVF_XYZB5 및 D3DFVF_LASTBETA_UBYTE4D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES0
D3DFVF_XYZB5D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES0
D3DFVF_XYZBn (n=1..4)D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATnD3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT0
D3DFVF_XYZBn (n=1..4) 및 D3DFVF_LASTBETA_UBYTE4D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES0
D3DFVF_NORMALD3DDECLTYPE_FLOAT3D3DDECLUSAGE_NORMAL0
D3DFVF_PSIZED3DDECLTYPE_FLOAT1D3DDECLUSAGE_PSIZE0
D3DFVF_DIFFUSED3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR0
D3DFVF_SPECULARD3DDECLTYPE_D3DCOLORD3DDECLUSAGE_COLOR1
D3DFVF_TEXCOORDSIZEm(n)D3DDECLTYPE_FLOATmD3DDECLUSAGE_TEXCOORDn

DirectX 9.0 정점 선언의 DirectX 8. x 정점 선언에의 맵핑

사용법사용법인덱스DirectX decl
D3DDECLUSAGE_POSITION0 D3DVSDE_POSITION
D3DDECLUSAGE_POSITION1 D3DVSDE_POSITION2
D3DDECLUSAGE_BLENDWEIGHT0 D3DVSDE_BLENDWEIGHT
D3DDECLUSAGE_BLENDINDICES0 D3DVSDE_BLENDINDICES
D3DDECLUSAGE_NORMAL0 D3DVSDE_NORMAL
D3DDECLUSAGE_NORMAL1 D3DVSDE_NORMAL2
D3DDECLUSAGE_PSIZE0 D3DVSDE_PSIZE
D3DDECLUSAGE_COLOR0 D3DVSDE_DIFFUSE
D3DDECLUSAGE_COLOR1 D3DVSDE_SPECULAR
D3DDECLUSAGE_TEXCOORDnD3DVSDE_TEXTUREn, n <= 7

DirectX 9.0 정점 선언의 FVF 코드에의 맵핑

DirectX 8.0 및 그 이후의 드라이버에서는, 선언에 정상적으로 변환할 수 있어 따라 고정 기능 정점 처리로 사용할 수 있는 타입이 그 밖에도 있다.

데이터 타입사용법사용법인덱스FVF
D3DDECLTYPE_FLOAT3D3DDECLUSAGE_POSITION0D3DFVF_XYZ
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부적당용


© 2002 Microsoft Corporation. All rights reserved.
↑TOP