구조체

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가 좀 더 간편하게 버텍스를 정의해주는 거라면, 정점선언은 좀 더 세세하게 직접 만드는 용도라고 볼 수 있다.

 

 

 

 

telnet.or.kr/directx/graphics/programmingguide/gettingstarted/vertexdeclaration/vertexdeclaration.htm#Mapping_FVF_to_DX9_Decl

 

정점 선언

정점 선언 개념상, 정점 선언은, 정점 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

+ Recent posts