헛둘이 2023. 8. 6. 22:19

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 협업 연습 및 맵 기초 작업