2022. 8. 14. 21:18ㆍPublic/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 |