3D引擎資料結構與glTF(4): BIN
回顧 glTF 檔案組織
glTF 是一種面向實時渲染的內容標準格式,類似於頂點緩衝、Index 緩衝這些資料它會以一個二進位制檔案的形式儲存,這樣,應用程式載入 glTF 內容時就可以把這些 Buffer 直接傳遞到圖形API,而不需要再對它們進行解析或者轉換,從而達到高效的目的。前面幾章我們主要是講 “.gltf” 檔案中的 JSON 物件的內容,這裡我們就介紹一下 glTF 中的 “.bin” 的使用。
如上圖所示 glTF 資源可以帶一個或者多個 .bin 檔案,用來儲存幾何資料(頂點、索引),動畫資料,Skin。 在前面一章,我們講 Mesh 資料的時候,就講到 頂點資料對應的是一個 index,下面我們就將一下具體怎麼從這個 index 找到對應的二進位制資料。
glTF 中的二進位制資料
首先,我們需要找到對應的 “.bin” 檔案:
- 在 “.gltf” 的 JSON 資料中有一個 “buffers” 欄位,裡面定義了這個 glTF 所包含的所有 .bin 檔案,例如下面這樣:
"buffers": [
{
"byteLength": 648,
"uri": "Box0.bin"
}
]
- 通過 buffers 欄位中的 “uri”,我們就可以載入 glTF 指定的 .bin 檔案了。
- 另外,這個 “uri” 欄位也可以通過 base64 編碼的方式,嵌入一些比較小的二進位制資料塊。
這個 .bin 檔案可以將很多頂點緩衝、動畫資料都打包在一個檔案中,那麼,接下來就需要 buffer view 和 accessor 來找到特定的資料了。
Buffer View 就是指定 .bin 檔案中的一段二進位制資料,它可以對應一個 Vertex Buffer 或者 Index Buffer 等,如下面這個例子所示。我們可以看到,每個 Buffer View 還有一個 target 欄位,它可以是 GL_ARRAY_BUFFER 或者 GL_ELEMENT_ARRAY_BUFFER。
"bufferViews": [
{
"buffer ": 0,
"byteOffset": 0,
"byteLength": 576,
"byteStride": 12,
"target": 34962
}
]
最後,頂點屬性或者 Index 對應的是 accessor,它定義了對應的 buffer view,和一些資料型別資訊等,如下面這個 json 所示。
"accessors": [
{
"bufferView": 0,
"byteOffset": 0,
"componentType": 5123,
"count": 36,
"type": "SCALAR"
}
]
總結一下
Mesh、Animation 等對應的二進位制資料都是通過索引一個 accessor 來定義的,而 accessor 定義裡資料型別資訊以及它所對應的 buffer view,然後 buffer view 定義裡自己對應的 buffer 中的哪一塊,最後 buffer 對應 .bin 檔案資料。:smile: