社内勉強会「レンダリング合宿1」 ソフトウェアラスタライザー基本実装編 01.座標変換
https://qiita.com/hrmtnryk/items/188ce13dcdcc289e9a61
このサイトを参考に、ソフトウェアラスタライザを勉強しながら作っているのですが、
3Dモデルの読み込みの箇所で「別途ローダーのソースが入ると面倒になるので簡素なバイナリフォーマットに変換して扱っています。」と書かれているのですが、
別のモデルを読み込みたいので同じバイナリフォーマットに変換して読み込みたいと思っています。
ちなみに、こちらがこのサイトでバイナリフォーマットを読み込んでいる箇所です。
iPhoneからの投稿なので、このURLのGitHub方が見やすいかもです。
https://github.com/NoriyukiHiromoto/Rendering01_SoftwareRasterizer/blob/01_04_polygon/project/Source/Application/Application.cpp
C++
1 2//===================================================================== 3// ファイルの読み込み処理 4//====================================================================== 5void Application::ModelLoad(const char* pFileName) 6{ 7 // ファイルパスの作成 8 std::string FullPath = pFileName; 9 size_t path_i = FullPath.find_last_of("\") + 1; 10 size_t ext_i = FullPath.find_last_of("."); 11 std::string Dir = FullPath.substr(0, path_i); 12 std::string ExtName = FullPath.substr(ext_i, FullPath.size() - ext_i); 13 std::string FileName = FullPath.substr(path_i, ext_i - path_i); 14 15 _MeshDatas = std::vector<MeshData>(); 16 17 // メッシュファイルを読み込み 18 HANDLE hFile = ::CreateFileA(pFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); 19 if (hFile != INVALID_HANDLE_VALUE) 20 { 21 DWORD ReadedBytes; 22 23 MeshFileBinaryHead Head; 24 ::ReadFile(hFile, &Head, sizeof(Head), &ReadedBytes, nullptr); 25 26 if (Head.GUID == 'MBIN') 27 { 28 _MeshDatas.resize(Head.MeshCount); 29 for (auto iMesh = 0U; iMesh < Head.MeshCount; ++iMesh) 30 { 31 auto& Dst = _MeshDatas[iMesh]; 32 33 MeshFileBinary MeshBin; 34 ::ReadFile(hFile, &MeshBin, sizeof(MeshBin), &ReadedBytes, nullptr); 35 36 // ジオメトリデータ読み込み 37 std::vector<VertexData> VertexDatas(MeshBin.TriangleVertexCount); 38 ::ReadFile(hFile, &(VertexDatas[0]), sizeof(VertexData) * MeshBin.TriangleVertexCount, &ReadedBytes, nullptr); 39 40 // 頂点データ&頂点インデックス 41 uint16_t Index = 0; 42 for (auto&& v : VertexDatas) 43 { 44 Dst._Position.push_back(Vector3{ v.Position[0], v.Position[1], v.Position[2] }); 45 Dst._Normal.push_back(Vector3{ v.Normal[0], v.Normal[1], v.Normal[2] }); 46 Dst._Index.push_back(Index++); 47 } 48 } 49 } 50 51 ::CloseHandle(hFile); 52 } 53} 54
試したことは、3Dモデルをバイナリフォーマットに変換と読み込みが出来ないので、
自作でOBJファイルのローダーを制作しています。
ベストなのは、このサイトの通りのmbinという形式で読めれば色々と都合がいいので質問しています。
どうやればいいのか教えていただきたいです。