여러 책들은 번거롭게 일일히 점을 입력해서 배열방식으로 삽입하는데

이 글에서는 이미 벡터에 점과 나머지 정보가 담겨있는 상태에서 메쉬에 집어 넣어보자.


시작하기전 LPD3DXMESH == ID3DXMesh* 이다. 이는 정의에서도 확인할 수 있다.


1. 모든 점(Point)들은 std::vector<ST_PNT_VERTEX> vecTotalVertex에 담겨있다.

->ST_PNT_VERTEX는 구조체로 D3DXVECTOR3 p (점), D3DXVECTOR3 n (법선벡터), D3DXVECTOR2 t (텍스쳐)의 정보를 가지고 있다.

ST_PNT_VERTEX::FVF == D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 이다.

이와 비슷한 구조체를 여러분들은 이미 만들어서 사용중일거다.

ST_PNT_VERTEX대신에 여러분들이 사용중인 구조체의 이름을 적어주면 된다.

2. 모든 인덱스(Index)는 std::vector<WORD> vecIndex에 담겨있다.

3. 모든 속성(Attribute)은 std::vector<DWORD> vecAttribute에 담겨있다.


자 그럼 이제 MESH를 생성해보자.


LPD3DXMESH pMesh = NULL;


D3DXCreateMeshFVF(vecTotalVertex.size() / 3,    Mesh가 가지고 있는 모든 면의 개수, 현재 여기서는 삼각형으로 모든 면이 구현되기 때문에 이렇게 계산

vecTotalVertex.size(),        Mesh가 가지고 있는 모든 점의 개수

D3DXMESH_MANAGED,    생성 옵션, 관리 메모리 풀 내에 보관되도록 설정했다.

ST_PNT_VERTEX::FVF,        구조체의 FVF값, 현재 여기서는 D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 값이 들어가고 있다.

g_pD3DDevice,                DirectX Device를 넣어주면 된다. 여기서는 싱글톤으로 관리되는 디바이스를 넣어줬다.

&pMesh);                        방금 생성한 Mesh의 주소를 넣어주면 된다.


현재 모든 데이터가 파일에서 파싱되어 벡터에 저장되어 있기 때문에 벡터의 정보를 그대로 메쉬에 넣어보자


ST_PNT_VERTEX* vertex;                                            다른 구조체 이름으로 정의되었다면 해당 구조체 포인터를 만든다.

pMesh->LockVertexBuffer(0, (void**)&vertex);                Mesh에 점을 복사하기 위해서 메모리를 잠근다.

memcpy(vertex, &vecTotalVertex[0], vecTotalVertex.size() * sizeof(ST_PNT_VERTEX));

메모리에 벡터의 처음부터 끝까지 복사해서 집어 넣는다. ST_PNT_VERTEX대신에 여러분들의 구조체 이름을 적으면 된다.

pMesh->UnlockVertexBuffer();                                    점을 다 입력했다면 무조건 잠금을 해제한다.


WORD* index = 0;                                                          인덱스 버퍼에 접근하기 위한 WORD포인터

pMesh->LockIndexBuffer(0, (void**)&index);                         인덱스 버퍼를 잠근다.

memcpy(index, &vecIndex[0], vecIndex.size() * sizeof(WORD));   메모리에 벡터의 처음부터 끝까지 복사해서 집어넣는다. 인덱스는 무조건 WORD이다.

pMesh->UnlockIndexBuffer();                                            인덱스를 다 입력했다면 무조건 잠금을 해제한다.


DWORD* attributeBuffer = 0;                                속성버퍼에 접근하기위한 DWORD포인터

pMesh->LockAttributeBuffer(0, &attributeBuffer);      속성버퍼를 잠근다.

memcpy(attributeBuffer, &vecAttribute[0], vecAttribute.size() * sizeof(DWORD)); 

       메모리에 벡터의 처음부터 끝까지 복사해서 집어넣는다. 속성 인덱스는 무조건 DWORD 이다.

pMesh->UnlockAttributeBuffer                             속성을 다 입력했다면 무조건 잠금을 해제한다.


이와 같은 과정을 거치면 벡터에 저장된 모든 데이터를 Mesh에 삽입할 수 있다.

+ Recent posts