여러 책들은 번거롭게 일일히 점을 입력해서 배열방식으로 삽입하는데
이 글에서는 이미 벡터에 점과 나머지 정보가 담겨있는 상태에서 메쉬에 집어 넣어보자.
시작하기전 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에 삽입할 수 있다.
'프로그래밍 > DirectX' 카테고리의 다른 글
DirectX 마우스 피킹 (D3DXIntersectTri Picking) (0) | 2017.05.18 |
---|---|
ASE Animation (키프레임 애니메이션) 구현하기 (1) | 2017.05.11 |
윈도우 10 DirectX 9.0 SDK 설치 (13) | 2017.04.10 |