1️⃣ FBX → Binary로 Export (AssimpTool 활용)

📌 핵심 흐름

void AssimpTool::Init()
{
	shared_ptr<Converter> converter = make_shared<Converter>();

	converter->ReadAssetFile(L"Tank/Tank.fbx");      // FBX -> 메모리
	converter->ExportMaterialData(L"Tank/Tank");     // Material → XML 저장
	converter->ExportModelData(L"Tank/Tank");        // Model → Binary 저장
}
  • ReadAssetFile로 FBX를 메모리로 읽고
  • ExportMaterialData: XML로 저장 (텍스처/머티리얼 정보)
  • ExportModelData: .mesh 바이너리로 저장 (정점/인덱스/Bone 정보 포함)

2️⃣ FileUtils를 활용한 바이너리 저장

// FileUtils::Write
template<typename T>
void Write(const T& data)
{
	DWORD numOfBytes = 0;
	assert(::WriteFile(_handle, &data, sizeof(T), (LPDWORD)&numOfBytes, nullptr));
}
  • 텍스처처럼 바이트 단위로 저장해야 할 때 FileUtils가 유용함
  • .mesh 파일로 저장 시 Bone, Mesh, Vertex, Index 등 순서에 맞게 직렬화

3️⃣ Binary로 저장된 파일을 메모리에 다시 Load

void Model::ReadModel(wstring filename)
{
	// .mesh 파일 로드
	file->Open(fullPath, FileMode::Read);

	// 1. Bone 정보 읽기
	// 2. Mesh 정보 읽기
	//    - Vertex / Index Buffer 세팅
}

이때 VertexBuffer, IndexBuffer, Geometry<ModelVertexType>를 구성하여 GPU에 전달할 준비를 마친다.


4️⃣ XML 머티리얼 정보 로딩

void Model::ReadMaterial(wstring filename)
{
	// .xml에서 텍스처 정보 추출
	auto texture = RESOURCES->GetOrAddTexture(textureStr, fullPath);
	material->SetDiffuseMap(texture);
}
  • 각 Material마다 XML에서 텍스처 경로 파싱
  • 해당 텍스처가 존재하면 SetDiffuseMap 등으로 등록

5️⃣ 캐시 정보 바인딩

void Model::BindCacheInfo()
{
	// Mesh에 Material, Bone 캐싱
	// Bone 계층 구조 연결 (parent, children)
}
  • 렌더링 시 성능을 위해 Material, Bone 캐시 연결
  • 계층 구조를 구성하여 원래 위치에 모델이 잘 출력되도록 처리

6️⃣ ModelRenderer 컴포넌트 생성 및 렌더링 처리

void ModelRenderer::Update()
{
	RENDER->PushTransformData(...);
	for (auto& mesh : meshes)
	{
		mesh->material->Update();
		_shader->DrawIndexed(...);
	}
}
  • ModelRenderer는 복수의 Mesh와 Material을 처리함
  • 각 버퍼 바인딩 후 Shader를 통해 드로우 호출

7️⃣ StaticMeshDemo에서 모델 생성 및 화면 출력

void StaticMeshDemo::CreateTank()
{
	shared_ptr<Model> m1 = make_shared<Model>();
	m1->ReadModel(L"Tank/Tank");
	m1->ReadMaterial(L"Tank/Tank");

	_obj = make_shared<GameObject>();
	_obj->AddComponent(make_shared<ModelRenderer>(_shader));
	_obj->GetModelRenderer()->SetModel(m1);
}
  • GameObject에 ModelRenderer를 붙이고
  • 미리 변환된 Tank.mesh, Tank.xml 파일을 로드해 셋팅
  • 화면에 탱크 모델이 출력됨

8️⃣ 쉐이더에서 Bone Transform 적용

cbuffer BoneBuffer
{
	matrix BoneTransform[MAX_MODEL_TRANSFORMS];
};

output.position = mul(input.position, BoneTransform[BoneIndex]);
  • 쉐이더에서 각 Vertex마다 BoneTransform을 곱해줘야 올바른 로컬좌표로 변환됨
  • 초기에는 Bone을 무시하면 뭉개진 형태가 출력됨

✅ 최종 출력 결과

  • Model, Material, Bone, Mesh 데이터를 올바르게 구성하고
  • GPU로 전송된 후 쉐이더에서 BoneTransform을 적용하여
  • 화면에 정상적인 Tank 모델 출력 완료!

profile
李家네_공부방

0개의 댓글