assimp dll 문제도 해결했고, 다시 Modeling 임포트를 진행해보자. 솔직히 어제 쓰는 법은 대충 다 알았기 떄문에 오늘은 렌더링 하는 과정을 좀더 개선하는 게 좋을 것 같다. Mesh Renderer에서 모든 바인딩 명령을 처리하도록 해놓고 Renderer에서는 그냥 그 함수를 호출하도록 하는 과정은 Mesh Renderer에게 너무 많은 참조를 요구한다.
그렇기 때문에 Mesh Renderer는 실제로 아무런 작업을 하지 않고 렌더링 해주세요~ 하고 요청을 하는데, 이때 Mesh정보와 Transform 정보를 Renderer에게 알려주는 것이다. 실제로 Renderer는 그 호출에 따라 필요한 정보를 Bind 하고, Material 정보를 또 받아와서 나머지를 다 처리하도록 만들면 될 것이다. 그리고 Renderer에서 사용하는 셰이더, 텍스쳐 등등의 정보는 Renderer용 헬퍼 클래스에서 미리 다 초기화해서 가지고 있게 하고, string으로 그 클래스에서 관련 정보를 수집한 후 렌더링을 진행하는 것이다.
일단 제대로 모델링이 출력되는지 확인하기 위해 Model 클래스에서 Position과 Texture2D만 집어넣고 테스트를 해보았다. 일단 Mesh 클래스는 추후에는 빼야겠지만 VertexBuffer와 IndexBuffer 데이터를 가지고 있도록 했다.
대략 이런 느낌이다.
/*Vertex Buffer, Index Buffer Contatiner*/
class Mesh : public Bindable
{
public:
Mesh(Graphics& gfx, VertexBuffer& v);
Mesh(Graphics& gfx, VertexBuffer& v, std::vector<UINT>& indexBuffer);
/*버퍼 2개 context에 바인드.*/
void Bind() override;
private:
VertexBuffer vertexBuffer;
std::vector<UINT> indexBuffer;
const UINT stride;
private:
wrl::ComPtr<ID3D11Buffer> vertices;
wrl::ComPtr<ID3D11Buffer> indices;
DEFINEPROPERTY:
READONLY_PROPERTY(UINT, verticesCount);
GET(verticesCount) { return vertexBuffer.nVertices; }
READONLY_PROPERTY(UINT, indicesCount);
GET(indicesCount) { return indexBuffer.size(); }
};
사실 ID3DBuffer 2개만 갖고 있으면 되는데 혹시 디버깅에 쓰일 일이 있을 것 같아서 멤버로 일단 집어넣어 주었다.
처음에는 키즈나 아이 모델링을 가지고 한번 출력해보려고 했었다.
https://kizunaai.com/download/
DOWNLOAD | Kizuna AI official website
世界中のみんなとつながりたい」という目標に向かって活動する、バーチャルタレントKizuna AI(キズナアイ)のオフィシャルウェブサイトです。
kizunaai.com
근데 막상 압축을 풀고 나니, 텍스쳐가 여러장이 존재하고 있었다.
이렇게 텍스쳐가 여러 장이면 대체 어떻게 렌더링을 해야하는 거지? 너무 막막해졌다. 대충 생각하기로는 셰이더에 변수로 텍스쳐를 여러장을 넣어야 할 것이고(배열로 선언하던가 해서), vertex 정보에 어떤 텍스쳐를 사용하는지 판정하기 위한 변수를 따로 추가해주어야 할 것이다. 와... 파일 구조를 대체 어떻게 해야할 지 모르겠다. 그래서 아쉽지만 blender에서 대충 uvSphere를 fbx로 export하여 출력해보기로 하였다.
굿. 제대로 출력이 된다. Assimp가 제대로 동작하고 있음을 확인했다. Camera는 처음에 모델링 출력이 제대로 되었는지 확인할 방도가 없어서 따로 ImGui로 출력할 수 있도록 만들어 주었다. 임시로 만든 거라서 나중에 구조를 제대로 만들어야겠지만.
이제 뭘 만들어야 할까. Light? Picking? 아니면 제대로 Material 만들어서 키즈나 아이를 실제로 임포트할 수 있게 할까?
Light는 솔직히 지금 상황에서 별로 흥미가 없다. diffuse specular ambient 이런 라이트를 넣는다고 때깔이 좋게 나오는 것도 아니고, 배경 오브젝트가 있어야 의미가 있으니까. 그러니 picking 구현을 먼저하여 inspector 창을 출력할 수 있게 한 다음에 키즈나 아이 모델링 임포트, 그리고 애니메이션까지 아예 캐릭터의 끝을 봐보자. 그 다음 주변 환경을 꾸미는 거지. Terrain, Billboard, skybox 등등 말이다.
'진행과정 기록 > GameEngine' 카테고리의 다른 글
20200206 어떻게 다른 타입의 클래스포인터를 한곳에 저장하고, 또 꺼낼 수 있을까? (0) | 2020.02.06 |
---|---|
20200205 File Manager (0) | 2020.02.05 |
20200204 'dll이 없어 실행할 수 없습니다.' 오류 해결 (0) | 2020.02.04 |
20200203 Model (Assimp사용하여 임포팅) (0) | 2020.02.03 |
20200202 Assimp(Open Asset Importer) (2) | 2020.02.02 |