Skip to content
Back to Blog
how-to-convert

Cách chuyển đổi glTF sang GLB (Mô hình 3D trong một file duy nhất)

2026-05-17 8 min read

glTF và GLB: Sự khác biệt thực sự giữa hai định dạng này là gì

Về bản chất, glTF và GLB là một. Chúng được định nghĩa bởi cùng một đặc tả của Khronos Group và chia sẻ cấu trúc dữ liệu giống hệt nhau, hỗ trợ cùng các vật liệu PBR, animation, và hệ thống phân cấp cảnh. Sự khác biệt thực sự duy nhất nằm ở cách đóng gói. Một asset glTF tiêu chuẩn là cả một bộ sưu tập các file phải đi liền với nhau. Bạn sẽ có một file JSON .gltf mà con người có thể đọc được, mô tả cảnh, vật liệu và cấu trúc lưới. Bên cạnh đó, bạn sẽ tìm thấy một hoặc nhiều file .bin chứa dữ liệu hình học thô—vị trí đỉnh, pháp tuyến, UV, vân vân. Rồi còn có một thư mục chứa các file ảnh texture, thường là PNG hoặc JPEG. Một mô hình nhân vật phức tạp vừa phải có thể bao gồm character.gltf, character0.bin, và một thư mục textures/ với mười tấm ảnh. Chỉ cần mất một trong các file đó, mô hình sẽ không thể tải được. GLB, mặt khác, là phiên bản chứa nhị phân. Nó đóng gói gọn gàng file JSON, dữ liệu nhị phân, và tất cả các texture vào một file .glb duy nhất. Tất cả được giữ lại với nhau bằng một header nhỏ 12-byte chứa một magic number (0x46546C67, tức là 'glTF' trong mã ASCII), một trường phiên bản (hiện tại là 2), và tổng chiều dài file. Phần còn lại của file chỉ là một chuỗi các khối dữ liệu. Điều này làm cho file GLB hoàn toàn độc lập. Bạn có thể gửi nó qua email, thả vào một trình cấu hình sản phẩm trên web, hoặc giao cho khách hàng mà không cần lo lắng về đường dẫn bị hỏng hay texture bị thiếu. Kích thước file gần như luôn nằm trong khoảng 1–3% so với gói ban đầu, vì vậy bạn gần như không phải đánh đổi gì về dung lượng lưu trữ cho sự tiện lợi to lớn này.

Khi nào bạn nên chuyển đổi glTF sang GLB (và khi nào không)

Đối với việc bàn giao và triển khai sản phẩm cuối cùng, lựa chọn mặc định của tôi luôn là GLB. Sự đơn giản của một file độc lập duy nhất thật sự quá tuyệt vời để có thể bỏ qua. Nhưng trong quá trình phát triển, việc gắn bó với định dạng glTF đa file thực sự có thể là lựa chọn thông minh hơn. Trường hợp nên dùng GLB rõ ràng nhất là khi bạn triển khai một mô hình lên một trình xem web như model-viewer, Babylon.js, hoặc Three.js. Một yêu cầu fetch duy nhất luôn tốt hơn một loạt các lệnh gọi mạng cho mỗi file nhị phân và texture. Một file GLB 4 MB sẽ tải nhanh hơn đáng kể trên kết nối di động so với cùng một mô hình được chia thành một file .gltf 120 KB, một file .bin 2.1 MB, và sáu texture tổng cộng 1.8 MB. Tại sao ư? Bởi vì mỗi file riêng lẻ đòi hỏi một vòng HTTP round-trip của riêng nó. Bạn cũng nên chuyển đổi sang GLB khi phân phối cho khách hàng hoặc các sàn thương mại; các nền tảng như Unity Asset Store, Sketchfab, và quy trình AR Quick Look của Apple đều hoạt động trơn tru với nó. Vậy định dạng glTF đa file tỏa sáng ở đâu? Trong quá trình tạo nội dung. Nếu một họa sĩ texture đang chỉnh sửa lặp đi lặp lại một map độ nhám 2K, họ chỉ cần thả một file PNG mới vào thư mục textures và làm mới. Cách này nhanh hơn nhiều so với việc phải đóng gói lại toàn bộ asset mỗi lần. Logic tương tự cũng áp dụng cho các hệ thống build tự động. Nếu quy trình của bạn chạy nén texture để tạo ra các biến thể KTX2 hoặc Basis Universal, việc thao tác trên các file riêng lẻ sẽ đơn giản hơn nhiều so với việc giải nén và đóng gói lại một file GLB trong mỗi lần build. Và đây là một hạn chế quan trọng cần nhớ: GLB được thiết kế để không thể tham chiếu đến các texture bên ngoài. Nếu file glTF ban đầu của bạn được thiết lập một cách thông minh để liên kết đến các texture trên CDN—một mô hình để chia sẻ texture atlas giữa các mô hình—việc chuyển đổi sang GLB sẽ nhúng các bản sao cục bộ và phá vỡ mô hình chia sẻ tài nguyên đó.

Cách chuyển đổi glTF sang GLB bằng CocoConvert

Sử dụng công cụ trên trình duyệt của CocoConvert là cách đơn giản nhất để có được file GLB, vì nó không yêu cầu cài đặt phần mềm. Toàn bộ quá trình hoạt động phía client đối với các file dưới 100 MB, nghĩa là dữ liệu hình học và texture quý giá của bạn thậm chí không bao giờ rời khỏi máy tính của bạn. Bước 1 — Chuẩn bị các file của bạn. Một asset glTF là một gói hoàn chỉnh, vì vậy bạn cần tải lên tất cả mọi thứ cùng nhau. Cách duy nhất để làm điều này là nén file .gltf, tất cả các file .bin liên quan, và toàn bộ thư mục textures vào một file lưu trữ duy nhất. Việc giữ nguyên cấu trúc thư mục bên trong là cực kỳ quan trọng. File .gltf dựa vào các đường dẫn tương đối như ./textures/baseColor.png, và trình chuyển đổi cần những đường dẫn đó phải chính xác bên trong file zip. Bước 2 — Mở trình chuyển đổi. Hãy truy cập /convert/gltf-to-glb và nhấp vào khu vực tải lên hoặc chỉ cần kéo file .zip của bạn vào trang. Công cụ này đủ thông minh để tự động tìm điểm vào glTF. Nếu vì lý do nào đó file zip của bạn chứa nhiều file .gltf (như các biến thể LOD), một danh sách thả xuống sẽ xuất hiện để bạn có thể chọn đúng file để sử dụng làm gốc. Bước 3 — Xem lại các tùy chọn chuyển đổi. CocoConvert cung cấp cho bạn một vài cài đặt. 'Embed textures' (Nhúng texture) được bật theo mặc định, đó chính xác là những gì bạn muốn cho một file GLB thực sự, đơn lẻ. Nếu bạn tắt tùy chọn này, đầu ra sẽ tham chiếu đến các URI texture bên ngoài, làm mất đi toàn bộ mục đích của việc chuyển đổi. Tùy chọn khác là 'Flatten buffer' (Làm phẳng buffer). Lời khuyên của tôi? Cứ để bật tùy chọn này. Nó hợp nhất nhiều file .bin thành một khối nhị phân duy nhất, đó là hành vi tiêu chuẩn của GLB. Bước 4 — Tải xuống. Thế là xong. Quá trình chuyển đổi thường mất từ 5 đến 20 giây, tùy thuộc vào số lượng texture bạn có và tổng kích thước file. Bạn sẽ nhận được một file .glb duy nhất, sẵn sàng để triển khai.

Giải pháp thay thế dòng lệnh: Sử dụng gltf-pipeline cho các quy trình tự động

Khi bạn đang chuyển đổi hàng chục mô hình như một phần của quy trình build, việc sử dụng giao diện web để làm từng cái một là không thực tế. Đối với bất kỳ loại quy trình tự động nào, công cụ Node.js gltf-pipeline từ đội ngũ Cesium là lựa chọn mã nguồn mở đáng tin cậy nhất hiện có. Đầu tiên, cài đặt nó toàn cục với npm: `npm install -g gltf-pipeline`. Việc chuyển đổi một asset đơn lẻ sau đó rất đơn giản: `gltf-pipeline -i scene.gltf -o scene.glb`. Cờ -i trỏ đến file .gltf đầu vào của bạn. Không giống như một công cụ web, gltf-pipeline tự động tìm các file .bin và texture liên quan trong cùng thư mục, vì vậy không cần phải nén bất cứ thứ gì. Cờ -b (cho --binary) được ngầm định khi tên file đầu ra của bạn kết thúc bằng .glb, đây là một sự tiện lợi hay ho. Để xử lý hàng loạt toàn bộ một thư mục, một vòng lặp shell đơn giản là người bạn đồng hành của bạn: `for f in models/*.gltf; do gltf-pipeline -i "$f" -o "${f%.gltf}.glb"; done`. Lệnh tương đương cho Windows PowerShell là `Get-ChildItem -Filter *.gltf | ForEach-Object { gltf-pipeline -i $_.FullName -o ($_.FullName -replace '.gltf','.glb') }`. gltf-pipeline cũng hỗ trợ nén lưới Draco với cờ --draco.compressionLevel (giá trị từ 0–10, mặc định là 7). Đối với bất kỳ mô hình nào có lưới dày đặc, bạn chắc chắn nên bật tính năng này. Nó có thể cắt giảm kích thước hình học từ 60–80%. Một bản quét 500.000 đa giác có dung lượng 18 MB không nén có thể thu nhỏ xuống còn khoảng 4 MB với Draco cấp 7. Thời gian giải mã lâu hơn một chút trên trình duyệt gần như luôn luôn xứng đáng. Hạn chế lớn duy nhất của công cụ này là nó không xử lý nén texture (KTX2/Basis). Đối với việc đó, bạn sẽ cần một bước riêng biệt trong quy trình của mình bằng cách sử dụng một công cụ như toktx hoặc basisu, trước hoặc sau khi bạn đóng gói GLB.

Kiểm tra file GLB đầu ra của bạn trước khi triển khai

Đừng bỏ qua bước này. Một file GLB mở hoàn hảo trong một trình xem có thể âm thầm thất bại trong một trình xem khác nếu nó chứa dữ liệu không tuân thủ. Hãy biến việc kiểm tra thành một phần tiêu chuẩn trong quy trình của bạn trước khi bạn giao bất kỳ asset đã chuyển đổi nào. Trình xác thực glTF của Khronos là nguồn chân lý duy nhất. Bạn có thể sử dụng nó trực tuyến tại validator.khronos.org—chỉ cần kéo file .glb của bạn vào trang. Nó xuất ra một báo cáo JSON có cấu trúc chi tiết về các lỗi, cảnh báo và thông tin khác. Lỗi là những vấn đề không thể bỏ qua. Những thứ như sự không khớp componentType của accessor hoặc các buffer view vượt quá độ dài buffer đã khai báo sẽ khiến hầu hết các trình tải từ chối file ngay lập tức. Cảnh báo thì ít nghiêm trọng hơn nhưng vẫn đáng đọc; một cảnh báo phổ biến như 'MESH_PRIMITIVE_UNUSED_TEXCOORD' chỉ có nghĩa là bạn có một bộ UV mà không có vật liệu nào sử dụng. Đối với các quy trình tự động, bạn có thể cài đặt trình xác thực dưới dạng một gói Node: `npm install -g gltf-validator`. Sau đó chạy `gltf-validator scene.glb --stdout > report.json` và đưa báo cáo đó vào một bước kiểm tra CI. Một bản build chắc chắn phải thất bại nếu số lượng lỗi lớn hơn không. Ngoài việc tuân thủ nghiêm ngặt đặc tả, hãy luôn kiểm tra trực quan trong ít nhất hai trình kết xuất khác nhau. Tôi khuyên dùng model-viewer (modelviewer.dev) và Babylon.js Sandbox (sandbox.babylonjs.com). Chúng sử dụng các triển khai WebGL khác nhau và rất giỏi trong việc phơi bày các vấn đề tinh vi về vật liệu. Bất cứ ai đã từng vật lộn với một normal map trông ổn trong công cụ DCC của họ nhưng lại bị đảo ngược một cách bí ẩn trên web đều hiểu nỗi đau này. Đặc tả glTF yêu cầu pháp tuyến kiểu OpenGL (Y-up), nhưng nhiều công cụ mặc định xuất ra kiểu DirectX (Y-down). Nếu ánh sáng của bạn trông giống như các vết lồi lõm bị đảo ngược, hãy lật kênh màu xanh lá của normal map và chuyển đổi lại.

Các lỗi chuyển đổi thường gặp và cách khắc phục

Hầu hết các lỗi chuyển đổi từ glTF sang GLB đều gây khó chịu nhưng may mắn là có những cách khắc phục đơn giản. Đây là những vấn đề xuất hiện lặp đi lặp lại. Thiếu texture trong file đầu ra: Đây là vấn đề số một. Thủ phạm gần như luôn là do các đường dẫn URI của texture trong file .gltf không được giải quyết trong quá trình chuyển đổi. Để gỡ lỗi này, hãy mở file .gltf của bạn trong một trình soạn thảo văn bản và tìm mảng images. Bạn sẽ thấy các mục như `"uri": "textures/Material_baseColor.png"`. Bạn phải đảm bảo rằng các file đó tồn tại ở chính xác đường dẫn tương đối đó bên trong file zip hoặc thư mục làm việc của bạn. Hãy nhớ rằng dấu phân cách đường dẫn và việc viết hoa/thường rất quan trọng trên máy chủ: `Textures/BaseColor.png` không giống với `textures/baseColor.png`. File đầu ra quá lớn: Nếu file GLB của bạn lớn bất ngờ, nguyên nhân gần như chắc chắn là do các texture của bạn. Một file PNG RGBA 4096×4096 duy nhất có thể chiếm 64 MB trong bộ nhớ khi chưa nén. Mặc dù bản thân PNG sử dụng nén không mất dữ liệu, một file GLB chỉ nhúng các byte của file PNG thô. Điều đó có nghĩa là texture PNG 12 MB của bạn sẽ thêm 12 MB vào file GLB. Để sử dụng trên web, bạn nên nghiêm túc xem xét việc giảm độ phân giải của texture xuống 2048×2048 (sự khác biệt về mặt hình ảnh thường không đáng kể) hoặc áp dụng nén KTX2 trước khi bạn đóng gói GLB. Animation không chạy: Nếu file glTF nguồn của bạn có animation xương nhưng chúng lại biến mất trong file GLB, điều đó có thể có nghĩa là dữ liệu animation chưa bao giờ được bao gồm. Một số trình xuất 3D ghi dữ liệu animation vào một file .bin riêng. Nếu file đó bị thiếu trong đầu vào chuyển đổi của bạn, dữ liệu animation đơn giản là đã mất. Cách khắc phục là xuất lại từ công cụ 3D của bạn, đảm bảo tất cả dữ liệu nhị phân được ghi vào một file .bin duy nhất, sau đó chạy lại quá trình chuyển đổi. CocoConvert sẽ báo cáo một cảnh báo trong nhật ký của nó nếu phát hiện các file được tham chiếu mà không tìm thấy trong kho lưu trữ của bạn. Luôn kiểm tra nhật ký trước khi tải xuống.

Kích thước file, hiệu suất và những gì cần mong đợi trong các dự án thực tế

Hãy vượt ra khỏi lý thuyết. Những kỳ vọng cụ thể tốt hơn những lời hứa mơ hồ, vì vậy đây là những gì quá trình chuyển đổi thực sự trông như thế nào đối với một số asset điển hình. Một mô hình đồ nội thất đơn giản—một lưới, hai vật liệu, bốn texture 1K—có thể bắt đầu dưới dạng một gói glTF đa file 3.2 MB. Sau khi chuyển đổi, nó trở thành một file GLB 3.1 MB. Sự giảm nhẹ kích thước đó đến từ việc loại bỏ khoảng trắng trong JSON và hợp nhất các header của buffer. Trên máy tính để bàn có kết nối nhanh, bạn sẽ không nhận thấy sự khác biệt về thời gian tải. Nhưng trên kết nối di động 4G, file GLB đơn lẻ đó sẽ bắt đầu render sớm hơn 300–500 ms nhờ tránh được chi phí của nhiều yêu cầu HTTP. Bây giờ hãy xem xét một nhân vật phức tạp với animation xương, 12 vật liệu và texture 2K. Đây có thể là một gói glTF 28 MB. Dưới dạng một file GLB thông thường, nó khoảng 27.4 MB. Nếu bạn thêm nén Draco cho hình học, nó có thể giảm xuống còn khoảng 22 MB. Nhưng nếu bạn áp dụng nén texture KTX2 Basis Universal trước, file GLB cuối cùng có thể nhỏ chỉ còn 9–11 MB. CocoConvert xử lý việc đóng gói cơ bản từ glTF sang GLB một cách hoàn hảo, nhưng hiện tại nó không áp dụng Draco hoặc KTX2. Đối với những tối ưu hóa nâng cao đó, bạn sẽ cần sử dụng các công cụ như gltf-pipeline và toktx trong một bước riêng biệt. Đối với các dự án AR, kích thước file là cực kỳ quan trọng. AR Quick Look của Apple và Scene Viewer của Google đều có các giới hạn được ghi nhận. Apple đề xuất giữ file GLB dưới 20 MB để tải đáng tin cậy qua mạng di động. Giới hạn cứng của Google là 200 MB, nhưng họ khuyên nên giữ dưới 15 MB để có hiệu suất tốt. Nếu file GLB đã chuyển đổi của bạn vượt quá các giới hạn này, đừng vội tìm đến các công cụ đơn giản hóa hình học. Hành động đầu tiên và có tác động lớn nhất của bạn gần như luôn là nén texture. Bản thân quá trình chuyển đổi tại /convert/gltf-to-glb là không mất mát đối với dữ liệu 3D — hình học, vật liệu, animation và hệ thống phân cấp cảnh được bảo toàn chính xác. Những gì bạn đưa vào cũng chính là những gì bạn nhận được, chỉ được đóng gói lại để có tính di động tối đa.

Ready to convert?

Try it now — fast, secure, and private.

Convert Now →