전체소스코드는 맨 아래있습니다.
DirectX 3D를 공부하던 중 Obj 모델링을 로드하고 그 정보를 저장하기 위해 LPD3DXMESH를 사용했다
LPD3DXMESH를 사용하기 위해 해야할 것들은...
1. LPD3DXMESH 초기화 해주기
D3DXCreateMeshFVF(
삼각형의 갯수,
정점의 갯수,
D3DXMESH_MANAGED,
FVF 포멧,
device,
LPD3DXMESH의 포인터); 위 함수를 이용하여 메쉬를 초기화 한다.
2. VertexBuffer 초기화 하기
일단 정점들을 저장한 배열이나 STL::Vector에 저장한다.
vector<CustomVertex> vVertexs;
버퍼 포인터를 받을 void 포인터 변수를 선언한다.
void * Vertices = nullptr;
락을 걸어준다.
lpD3DXMesh->LockVertexBuffer(0, Vertices);
그리고 배열이나 STL::Vector의 저장된 정점들을 복사해준다.
memcpy(Vertices, &vVertexs[0], sizeof(CustomVertex) * vVertexs.size());
락을 풀어준다.
lpD3DXMesh->UnlockVertexBuffer();
2. IndexBuffer 초기화 하기.
초기화할 인덱스 정보를 배열이나 STL:Vector에 저장한다.
vector<WORD> vIndexs;
버퍼 포인터를 받을 void 포인터 변수를 선언한다
void * Indices = nullptr;
락을 걸어준다.
lpD3DXMesh->LockIndexBuffer(0, &Indices))
그리고 배열이나 STL::Vector의 저장된 정점들을 복사해준다
memcpy(Indices, &vIndexs[0], sizeof(WORD) * vIndexs.size());
락을 풀어준다.
lpD3DXMesh->UnlockIndexBuffer();
2. AttributeBuffer 초기화 하기.
초기화할 속성 정보를 배열이나 STL:Vector에 저장한다.
vector<DWORD> vAttribute;
버퍼 포인터를 받을 DWRD 포인터 변수를 선언한다
DWRD * Attribute= nullptr;
락을 걸어준다.
lpD3DXMesh->LockAttributeBuffer(0, &dwAttribute))
그리고 배열이나 STL::Vector의 저장된 정점들을 복사해준다
memcpy(dwAttribute, &vAttribute[0], sizeof(DWORD) * vAttribute.size());
락을 풀어준다.
lpD3DXMesh->UnlockAttributeBuffer();
이렇게 설정해주고 그릴때 lpD3DXMesh->DrawSubset(SubsetNum); 이렇게 그려주면 메쉬가 그려진다.
전체 소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | bool cMeshRenderer::CreateMesh() { if (FAILED(D3DXCreateMeshFVF( vVertexs.size() / 3, vVertexs.size(), D3DXMESH_MANAGED, CustomFVF, g_device, &lpD3DXMesh))) { MessageBox(nullptr, L"Failed CreateMesh ", L"Error", MB_OK); return false; } void * Vertices = nullptr; if (FAILED(lpD3DXMesh->LockVertexBuffer(0, &Vertices))) { MessageBox(nullptr, L"Failed Mesh->LockVertexBuffer", L"Error", MB_OK); return false; } memcpy(Vertices, &vVertexs[0], sizeof(CustomVertex) * vVertexs.size()); lpD3DXMesh->UnlockVertexBuffer(); void * Indices = nullptr; if (FAILED(lpD3DXMesh->LockIndexBuffer(0, &Indices))) { MessageBox(nullptr, L"Failed Mesh->LockIndexBuffer", L"Error", MB_OK); return false; } memcpy(Indices, &vIndexs[0], sizeof(WORD) * vIndexs.size()); lpD3DXMesh->UnlockIndexBuffer(); DWORD * dwAttribute = nullptr; if (FAILED(lpD3DXMesh->LockAttributeBuffer(0, &dwAttribute))) { MessageBox(nullptr, L"FAiled Mesh->LockAttributeBuffer", L"Error", MB_OK); return false; } memcpy(dwAttribute, &vAttribute[0], sizeof(DWORD) * vAttribute.size()); lpD3DXMesh->UnlockAttributeBuffer(); return true; } | cs |
틀린 것이나 조언할것이 있다면 댓글로 해주세요 감사합니다