Vertex Formats

3장의 학습목표!!
  • Direct3D의 두가지 목적을 이해한다.
  • 점을 표현하기 위한 유연한 vertex형태를 이해한다.
  • Transformed 버텍스와 Untransformed 버텍스의 차이를 안다.
  • 버텍스 버퍼가 무엇인지 알고 사용법을 안다.
  • 인덱스 버퍼가 무엇인지 알고 사용법을 안다.


Direct3D의 목적

...

만약 D3D를 쓰는 사람에게 "당신은 왜 D3D를 씁니까?" 라고 물으면, 일반적으로 이런 대답이 나온다. Z-Buffer라던지, 모델, 메시, 버텍스 셰이더와 픽셸세이더, 텍스쳐, 그리고 알파 에 대한 이야기를 한다. 이것은 많은 일을 하는 것처럼 보인다. 몇몇을 제외하면 이런 것들은 다음의 커다란 두 목적의 부가적인 것이다. 그 두가지란 Geometry Transformation과 Polygon Rendering이다. 간단히 말해서 D3D의 교묘한 점 처리와 삼각형 그리기라는 것이다. 물론 저것만으로 모두 설명할 수는 없지만, 저 간단한 것을 마음속에 품는다면 혼란스러운 일은 줄어들 것이다.

...

Vertex데이터의 표현

버텍스 데이터를 표현하는 방법은 많이 있고, D3D개발자들은 그들에게 편한 방식으로 접근했다. 어떤 버텍스는 다른 것보다 정보가 더 필요했고 다른 것들은 좀 더 달랐다.

버텍스를 표현 하는 방법을 flexible vertex format 줄여서 FVF라고 한다. 버텍스에 필요한 정보는 다음과 같다.
~cpp 
position : 점의 위치, 가장 중요한 정보이다.
RHW : Reciprocal of the homogenous W coordinate
Blending weights : 블랜딩 매트릭스
Vertex normal
Vertex point size : 버텍스의 크기 (포인트스프라이트에서 사용한다.)
Diffuse color 
Specular color
Texture coordinates
 

Position

점이 어디있나를 나타내는 정보이다.
~cpp 
#define CUSTOM_VERTEX_FVF D3DFVF_XYZ
struct CustomVertex
{
	float x;
	float y;
	float z;
};
 

CUSTOM_VERTEX는 내 버텍스 정보가 어떤 정보들을 담고있나를 지정하는 플래그이고, CustomVertex구조체는 실제 정보를 담는 나만의 구조체이다.

RHW

RHW는 동치좌표 W의 역수 입니다. 그러면 동치 좌표란 무엇이냐. 이것은 좌표계의 또 다른 점입니다. 이게 있음으로 우리는 4차원 좌표계가 됩니다.(??)
어쨌든 W좌표는 우리가 일하기 편하게 해줍니다.

SeeAlso : http://member.hitel.net/~kaswan/feature/3dengine/rhw.htm
~cpp 
#define CUSTOM_VERTEX_FVF D3DFVF_XYZ | D3DFVF_RHW
struct CustomVertex
{
	float x, y, z;
	float rhw;
};
 

Vercto Normal

이것은 3차원 좌표로서, 기본적인 x,y,z에 수직인 곳의 좌표를 정한다. 이것은 나중에 빛에 관련된 계산을 할 때에 사용된다.
~cpp 
#define CUSTOM_VERTEX_FVF D3DFVF_XYZ | D3DFVF_NORMAL
struct CustomVertex
{
	float x, y, z;
	float nx, ny, nz;
};
 
이 노말 좌표를 사용하면 RHW는 사용할 수 없다. (둘은 함께 사용할 수 없다는 뜻입니다.)

Diffuse Color

노말 좌표 뒤에 오는 정보로는 diffuse color가 있다. Diffuse color란 것은 빛이 그 점을 밝혔을 때 그 점에서 발산하는 컬러를 말한다. 3D에서의 빛은 실제 생활과는 달리 거의 아무일도 하지 않는 다는 것을 기억하다.
Diffuse Color의 형태는 D3DCOLOR(사실은 DWORD형이다.)형을 사용한다.
~cpp 
#define CUSTOM_VERTEX_FVF D3DFVF_XYZ | D3DFVF_RHW | D3DFVF_DIFFUSE
struct CustomVertex
{
	float x, y, z;
	float rhw;
	D3DCOLOR diffuse;
};
 

Specular Color

디퓨즈 컬러 다음에 오는 정보이다. 이것도 D3DCOLOR값이다. 이것은 한 점의 "Shininess"를 알려준다.
~cpp 
#define CUSTOM_VERTEX_FVF D3DFVF_XYZ | D3DFVF_RHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR
struct CustomVertex
{
	float x, y, z;
	float rhw;
	D3DCOLOR diffuse;
	D3DCOLOR specular;
};
 

Retrieved from http://wiki.zeropage.org/wiki.php/2dInDirect3d/Chapter3
last modified 2021-02-07 05:22:14