구조체
D3DVERTEXELEMENT9
파이프라인의 입력 정점 데이터를 정의한다.
Declaration과 관련된 구조체로, D3DVERTEXELEMENT9 구조체는 각 정보들의 타입이나 데이터의 길이 등을 설정한다.
Stream - 복수의 스트림을 구별하기 위한 번호
D3D 장치에 정점버퍼들을 동시에 여러 개 집어넣어줄 수 있는데, 이 때 정점버퍼가 들어가는 슬롯의 인덱스 번호이다. 정점버퍼가 하나면 0으로 설정하면 된다.
Offset - 스트림으로 사용하는 구조체의 선두 위치로부터 바이트 수
정점정보가 시작하는 메모리 위치에서 현재 요소가 시작하는 곳까지의 오프셋 값. 정점버퍼의 제일 앞에 위치 값을 넣는다면 오프셋은 0이다.
Type - D3DDECLTYPE 의 데이터형을 지정
데이터형이다. 사용하는 데이터에 맞는 형을 설정하면 된다
Method - 테셀레이터가 어느 데이터를 평면 분할에 사용하는지에 대한 선언, 하지 않는다면 D3DDECLMETHOD_DEFAULT
김포프 책에서 DEFAULT 이외 다른 값 사용하는 경우 아직 못봤다고 한다.
Usage - D3DDECLUSAGE 매크로를 사용하여 설정
해당 데이터 요소의 용도를 정의한다. 위치면 위치, 노말이면 노말, 탄젠트면 탄젠트, 텍스처 좌표면 텍스처 좌표 등
UsageIndex - 1개의 셰이더에 복수의 좌표가 있을 때 이를 구별하기 위한 용도로 사용, 셰이더 프로그래밍에서 dcl_positionX 인덱스에 대응
셰이더에서 TEXCOORD 시맨틱을 사용할 때 뒤에 붙던 숫자들(TEXCOORD0, TEXCOORD1, etc)이 UsageIndex이다.
0, 3 * 4, 6 * 4, 8 * 4
float 3개 3개 2개
셰이더를 사용할 때에는 FVF보다 정점선언을 사용하는게 일반적이다. 정점선언은 FVF에서 지원하지 않는 TANGENT나, BINORMAL같은 형도 지원할 뿐 아니라 FVF에서 특정 순서로 정점정보를 넣어줘야만 하는 제약도 없다.
김포프 셰이더 책에서는 정점 선언을 이렇게 처리한다
이러한 방식이 아래와 같은 방식보다는 보기에 편해보이나?
FVF가 좀 더 간편하게 버텍스를 정의해주는 거라면, 정점선언은 좀 더 세세하게 직접 만드는 용도라고 볼 수 있다.
정점 선언
정점 선언 개념상, 정점 선언은, 정점 DMA (Direct Memory Access)나 그래픽스 파이프의 테설레이터 엔진을 프로그래밍 하는 방법의 1 개이다. 정점 선언은, 데이터 레이아웃과 테셀레이트의 처리를 간��
telnet.or.kr
IDirect3DDevice9::CreateVertexDeclaration
장치 및 정점 요소로부터 정점 셰이더 선언을 생성한다
D3DVERTEXELEMENT로 만들어진 배열을 in 인자에 넣고, out 인자로 얻은 IDirect3DVertexDeclaration9** 정점 선언 포인터는, 나중에 메시를 그릴 때 이 정점버퍼의 포맷은 이러이러하니 알아서 올바른 데이터를 뽑아갈 것 이라는 지시를 D3D에 내리는데 사용한다.
IDirect3DDevice9::SetVertexDeclaration
정점 셰이더 선언을 설정한다
SetVertexDeclaration은 vertex의 정보 값을 나타낸다.
Vertex의 속성을 SetVertexDeclaration으로 설정해놓으면, 디바이스는 버텍스 정보를 받아와 정점 입력 레지스터로 받아온다.
'그래픽스 > Dx 9' 카테고리의 다른 글
Direct X - 버텍스, 인덱스 버퍼 (0) | 2020.09.16 |
---|---|
Direct X 9 - 셰이더(Effect) (0) | 2020.09.16 |
Direct X 9 - 함수 (0) | 2020.09.15 |