1. 程式人生 > >3D引擎資料結構與glTF(4): BIN

3D引擎資料結構與glTF(4): BIN

回顧 glTF 檔案組織

glTF 是一種面向實時渲染的內容標準格式,類似於頂點緩衝、Index 緩衝這些資料它會以一個二進位制檔案的形式儲存,這樣,應用程式載入 glTF 內容時就可以把這些 Buffer 直接傳遞到圖形API,而不需要再對它們進行解析或者轉換,從而達到高效的目的。前面幾章我們主要是講 “.gltf” 檔案中的 JSON 物件的內容,這裡我們就介紹一下 glTF 中的 “.bin” 的使用。

gltf-bin-glsl-png

如上圖所示 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:

原文地址