10. Mesh와 Material 구조 변경
Mesh와 Material 구조 변경
- 메쉬 구조의 경우도 이번에 FBX를 로드하면서 바꿔야겠다는 생각이 들었다.
- 파일 하나에 여러 개의 메쉬가 존재하는 FBX 파일 특성 상 게임 오브젝트 하나당 하나의 정점 버퍼와 매칭되는 여러 개의 인덱스 버퍼를 가지고 있었던 기존 구조로 소화하기 어려웠다.
- 기존 구조에서 이를 구현한다면 하나의 FBX파일을 로드하면 여러 개의 게임 오브젝트가 만들어져야 했기 때문이다.
- 때문에 정점 버퍼와 그와 매칭되는 다수의 인덱스 버퍼를 하나의 MeshContainer라는 구조체로 두고, 이 구조체의 배열을 메쉬 클래스에서 관리하고, 렌더링할 때 가진 정점 버퍼와 인덱스 버퍼를 세팅해서 모두 렌더링해주는 방식으로 구현했다.
struct IndexBufferInfo
{
ComPtr<ID3D11Buffer> pBuffer;
int count;
};
struct MeshContainer
{
ComPtr<ID3D11Buffer> pVertexBuffer;
std::vector<IndexBufferInfo> indexBufferGroup;
};
- 기존 방식의 경우 하나의 메쉬와 여러 개의 머티리얼이 매칭되는 구조로 만들었었다.
- FBX SDK에서 메쉬가 로드될 때 1개 이상의 머티리얼을 같이 로드하기 때문이다.
- 사실 지금까지 하고 보니 내 엔진에서 머티리얼이란 재질에 관한 정보도 맞는 얘기지만 더 구체적으로는 텍스쳐 즉 색상에 관한 정보들을 담는 것이라는 느낌을 받았다.
- 하나의 메쉬에 여러 종류의 색상정보를 입히는 거라면 그 정보들을 하나의 머티리얼에서 관리하고 다중 머티리얼처럼 동작하면 되는 것 아닌가? 하는 생각이 들었다.
- 그래서 MaterialContainer 구조체를 만든 후, 이 구조체의 내부에 MaterialSubset 구조체를 추가해서 이 구조체가 하나의 머티리얼처럼 동작하도록 만들었다.
class Texture;
struct MaterialSubset
{
std::array<shared_ptr<Texture>, MATERIAL_VALUE_COUNT> textures;
MaterialParams materialParams;
wstring name;
void SetTexture(int _index, shared_ptr<Texture> _pTexture)
{
textures[_index] = _pTexture;
materialParams.SetTexOn(_index, nullptr != _pTexture ? 1 : 0);
}
};
struct MaterialContainer
{
std::vector<MaterialSubset*> materialSubsetVec;
void AddSubset(MaterialSubset* _pSubset) { materialSubsetVec.push_back(_pSubset); }
};
- 한 가지 더 애먹었던 점은 이제 바뀐 구조로 인스턴싱을 해야 하는 것인데 확실히 한번 뒤집고 나니 모르는 부분들이 보이고 막히는 부분이 생기면서 고생을 좀 했다.
- 첫 번째는 인스턴싱을 적용받는 물체들의 첫 번째 물체만 그려지고 나머지 물체들은 그려지지 않는 것인데, 원인은 인스턴싱을 적용 받는 물체는 상수버퍼로 플래그를 보내주는데, 기존과 동일하게 첫 번째 머티리얼에만 이 값을 세팅해줘서 생기는 문제였다....ㅋㅋㅋ
- 카메라를 움직여보니 인스턴싱하는 물체 중 첫 번째 물체만 제대로 그려지는 것을 보고 그나마 빨리 캐치할 수 있었다.
내일 할 일
- 팀원들과 Github 협업 연습 및 맵 기초 작업