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

정점 포맷


유연한 정점 포맷 (FVF)의 코드는, 인터리브 되어 저장 되는 정점의 내용을 단일 데이터 스트림에 기술한다. 일반적으로, 고정 기능 정점 처리 파이프라인으로 처리되는 데이터를 지정한다.

Microsoft® Direct3D® 애플리케이션에서는, 복수의 방법으로 모델의 정점을 정의할 수 있다. 유연한 정점 정의 (유연한 정점 포맷또는유연한 정점 포맷 코드라고도 부른다)가 지원 되고 있는 것으로부터, 필요한 정점의 성분만 애플리케이션으로 사용해, 사용하지 않는 정점의 성분은 삭제할 수 있다. 필요한 정점의 성분만 사용할 수 있으므로, 애플리케이션으로 메모리를 절약할 수 있어 모델의 렌더링에 필요한 처리 대역폭을 최소한으로 억제할 수가 있다. D3DFVF 를 조합해 사용해, 정점의 포맷 방법을 지정한다.

FVF 사양에는 포인트 사이즈의 포맷도 포함되어 D3DFVF_PSIZE 에 의해 지정한다. 이 사이즈는, 비 TL 정점에 대해서는 카메라 공간 단위로, TL 정점에 대해서는 장치 공간 단위로 나타낸다.

C++ 애플리케이션에서는,IDirect3DDevice9 인터페이스의 렌더링 메서드에 의해, 이러한 플래그의 편성을 받는 메서드를 사네, 그 편성을 사용해 기본도형의 렌더링 방법을 결정한다. 기본적으로는, 이러한 플래그는, 애플리케이션으로 어느 정점의 성분 (위치 좌표, 정점 혼합 웨이트, 법선, 색, 텍스처 좌표의 수로 포맷)을 사용할까를 시스템에 알려 또, Direct3D 로 렌더링 파이프라인의 어느 부분을 정점의 성분에 적용할까를 간접적으로 알린다. 게다가 특정의 정점 포맷 플래그의 유무에 의해, 메모리에 존재하는 정점의 성분 필드와 생략 한 정점의 성분을 시스템에 알린다.

장치의 제한을 조사하려면 , D3DFVFCAPS_DONOTSTRIPELEMENTS 및 D3DFVFCAPS_TEXCOORDCOUNTMASK 유연한 정점 포맷 플래그에 대해 장치를 문의한다. 더 자세한 정보는,D3DCAPS9 구조체의 FVFCaps 멤버를 참조할것.

정점의 포맷 방법에 관한 시스템 조건 중(안)에서 중요한 것은, 데이터의 표시 순서이다. 다음 그림은 메모리내의 모든 정점의 성분의 순서와 거기에 관계하는 데이터형을 나타내고 있다.

정점의 순서의 그림

텍스처 좌표는 다양한 포맷으로 선언할 수 있어 최소 1 요소의 좌표, 최대 4 요소의 텍스처 좌표 (2D 투영 텍스처 좌표의 경우)를 사용해 텍스처를 처리할 수 있다. 더 자세한 정보는, 「텍스처 좌표 포맷」을 참조할것. 매크로의 D3DFVF_TEXCOORDSIZEn 세트를 사용해, 정점 포맷으로 사용하는 텍스처 좌표 포맷을 식별하기 위한 비트 패턴을 생성 한다.

애플리케이션이 모든 구성 요소를 사용한다고는 할 수 없다. 동차 W의 역수 (RHW)와 정점 법선 필드는 서로 배타적이다. 또, 대부분의 애플리케이션으로 8 개의 텍스처 좌표 세트를 모두 사용한다고도 할 수 없다. 그러나, Direct3D 에는 이러한 유연성이 있다. 어느 플래그를 다른 플래그와 병용 하는 경우에는, 몇개의 제한이 있다. 예를 들어, D3DFVF_XYZ 플래그와 D3DFVF_XYZRHW 플래그는 병용 할 수 없다. 이 경우, 변환 되지 않은의 정점와 변환 끝난 정점의 양쪽 모두를 사용해, 1 개의 정점의 위치 좌표를 정의하게 되기 때문이다.

인덱스 정점 혼합을 사용하려면 , D3DFVF_LASTBETA_UBYTE4 플래그는 FVF 의 마지막에 둘 필요가 있다. 이 플래그를 지정 하면, 5 번째의 혼합 웨이트는, 부동 소수점수(실수)는 아니고 DWORD 로서 처리된다. 더 자세한 정보는, 「인덱스 첨부 정점 혼합」을 참조할것.

다음 코드는, D3DFVF_LASTBETA_UBYTE4 플래그를 사용하는 FVF 코드와 이 플래그를 사용하지 않는 FVF 코드와의 차이를 나타내고 있다. 다음에 정의하는 FVF 는, D3DFVF_LASTBETA_UBYTE4 플래그를 사용하지 않았다. 4 개의 혼합 인덱스를 사용하는 경우는, 플래그 D3DFVF_XYZ3 가 존재한다. 이것은, 4 번째의 혼합 인덱스에 대해서, 항상 (1 - 최초의 3 개의 합계)을 사용하기 때문이다.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

다음에 정의하는 FVF 는, D3DFVF_LAST_UBYTE4 플래그를 사용하고 있다.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};


© 2002 Microsoft Corporation. All rights reserved.
↑TOP