FVF

2022. 8. 14. 21:18Public/GraphicsAPI

Flexible Vertex Format(FVF)

 

D3D 8.0 이후부터는 FVF를 사용해야 정점 셰이더를 사용할 수 있다.

 

FVF는 D3D에서 정해져 있는 정점 포맷 중에서 자신이 제작하는 프로그램에 알맞은 것들을 모아서 새로운 정점 포맷을 정하는 방법이다.

 

D3D 9.0에서 정해져 있는 포맷은 다음과 같다.

  • 정점의 좌표 
    x,y,z좌표 (float)

  • RHW
    RHW(float)

  • 결합 가중치
    1~4결합 가중치(float)

  • 정점의 법선벡터
    x,y,z좌표(float)
  • 정점의 점 크기
    점 크기(float)
  • 확산광 색
    확산광 RGBA(DWORD)
  • 반사광 색
    반사광 RGBA(DWORD)
  • 텍스처 좌표 1
    1~4차원 좌표계(float 1~4)
    .
    .
    .
  • 텍스처 좌표 8
    1~4차원 좌표계(float 1~4)


위의 포맷을 모두 사용할 수도 있지만, 이 경우 정점 하나를 표현하는데, 최대 184바이트가 필요하다.

이는 화면에 삼가형 하나를 그리는 데 552바이트, 즉 0,5k 정도가 필요하다는 것이 되므로 

대단히 어리석은 짓이다. 각각의 포맷이 어떤 의미인지를 정확히 알고 필요한 것들만 플래그를 세팅하여

사용하도록 하자.

 

  • 정점의 좌표 : 말 그대로 3차원 좌표를 나타낸다.
  • RHW(reciprocal homeeneous W) 동차 좌표계의 w값, 이 값이 있으면 변환이 완료된 정점
  • 결합가중치 : 스키닝에 사용된다. 추후에 다룰 예정
  • 정점의 법선벡터 : 정점의 법선벡터를 나타냄, 광원 처리 시에 사용
  • 확산광 색 : RGBA(r,g,b,a) 매크로값이며, 정점의 확산광 색을 나타냄
  • 반사광 색 : RGBA(r,g,b,a)매크로값이며, 정점의 반사광 색을 나타냄
  • 텍스처 좌표 1~8 : 텍스처 좌표값을 나타냄, D3D는 8개의 텍스쳐를 동시에 겹쳐서 사용할 수 있음, 
                                 예를 들어, 법선매핑을 하려고 첫 번째 값을 diffuse 맵정보로, 두 번째 값을 법선맵 정보로 설정해서                               사용하는 식 

 

/// 사용자 정점을 정의할 구조체
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; /// 정점의 변환된 좌표(rhw값이 있으면 변환이 완료된 정점이다.
    DWORD color;        /// 정점의 색깔
};

/// 사용자 정점 구조체에 관한 정보를 나타내는 FVF값
/// 구조체는 X,Y,Z,RHW값과 Diffuse색깔값으로 이루어져 있음을 알 수 있다.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

 

보이는 것처럼 구조체와 함꼐 반드시 플래그 선언을 해주어야 한다.

플래그 선언은 구조체 선언 시에 사용된 항목에 들어간 그대로 선언해 주어야 한다.

만약 구조체 선언부의 내용과 플래그 선언부의 내용이 다를 경우 그 정점은 절대로 작동하지 않으며, 심지어는 시스템 다운이 발생할 수 있다. 이는 정점 버퍼가 대부분 그래픽카드 메모리에 잡히기 때문에 작은 오차로도 충분히 그래픽카드를 다운시키기 때문이다. 그리고 또한 주의할 것은 앞의 FVF 그림에서 선언된 그 순서에 맞추어 구조체 선언도 해주어야 한다는 것이다. 다시 말해서, 아래와 같이 선언할 경우

 

struct BADVERTEX
{
    FLOAT rhw, x, y, z; //정점의 변환된 좌표
    DWORD color; //정점의 색깔
};
#define D3DFVF_BADVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

 

FVF 플래그의 경우 동일하지만 구조체 선언에서 정점의 positoin 보다 rhw 값이 먼저 나오고 있다. 이는 

FVF의 선언 순서에 위배되는 것으로, 이렇게 선언된 정점은 절대로 작동하지 않으며, 실제로 이 상태로 렌더링

했을 경우의 출력 결과는 아무도 장담할 수 없다.

 

'Public > GraphicsAPI' 카테고리의 다른 글

그리기 (Render)  (0) 2022.08.14
정점 버퍼  (0) 2022.08.14
일반적인 WIN32 구조와 D3D 비교  (0) 2022.08.10
삼각형  (0) 2022.08.06
모델표현 / 버텍스 포맷  (0) 2022.08.06