Công Việc Gần Đây Trên Bgfx
Trong khoảng thời gian gần đây, mình đã thực hiện một số công việc thú vị liên quan đến bgfx bên cạnh việc phát triển bộ ràng buộc lua trước đó đã công bố. Dưới đây là những cập nhật đáng chú ý:
Cải tiến trình điều khiển Direct3D12 cho nền tảng MinGW
Mình đã đóng một bản vá (patch) quan trọng để sửa lỗi thiết kế giao diện trong trình điều khiển Direct3D12 của bgfx, giúp nó có thể biên dịch thành công và chạy ổn định bằng MinGW. Đây chính là lỗi đã đề cập trong bài blog trước đây về thiết kế interface của Direct3D12. Bản yêu cầu kéo (pull request) này đã được đội ngũ phát triển bgfx chính thức chấp nhận.
Hỗ trợ hiển thị chữ tiếng Trung trong chế độ debug text
Ban đầu, mình đã thử nghiệm tiếp cận theo mô hình hệ thống DOS cũ bằng cách mở rộng hỗ trợ ký tự hai byte, tận dụng byte thuộc tính trong bộ nhớ video giả lập để đánh dấu đặc biệt cho các ký tự Unicode cần chiếm 2 slot. Tuy nhiên phương pháp này dễ dẫn đến lỗi “nửa ký tự” và không thể hiện tính mở rộng cho các tập ký tự Unicode đa dạng, nên bản yêu cầu đầu tiên đã bị từ chối.
Sau đó, mình đã phát triển một giải pháp toàn diện hơn:
- Triển khai hệ thống quản lý nhiều code page (ví dụ: CP437 cho ký tự DOS, CP936 cho tiếng Trung)
- Xây dựng bộ nhớ đệm tìm kiếm hiệu quả cho nhiều tập ký tự
- Xuất font điểm ma trận 15x15 từ bộ font Văn Tuyền Hắc thể (WenQuanYi)
- Mở rộng bộ nhớ video ảo từ 1 byte lên 3 byte để lưu trữ codepoint Unicode
- Cải tiến API debug print tự động chèn khoảng trắng sau mỗi chữ Hán nhằm đảm bảo căn chỉnh chính xác
Hiện bản vá này vẫn đang chờ được hợp nhất vào nhánh chính nhưng không bị từ chối, vẫn nằm trong danh sách PR đang mở trên GitHub.
Công cụ biên dịch shader với Lua
Hệ thống shader đa nền tảng của bgfx sử dụng công cụ tiền xử lý dựa trên tiền xử lý C (cpp) kết hợp macro và điều kiện #ifdef, giữ nguyên cú pháp shader OpenGL. Tuy nhiên công cụ cpp bên thứ ba tích hợp sẵn chỉ xử lý được từ hệ thống tập tin, không hỗ trợ nạp từ bộ nhớ.
Để khắc phục nhược điểm này, mình đã viết lại hoàn toàn công cụ biên dịch shader bằng Lua, sử dụng thư viện tiền xử lý Lua thuần. Phiên bản hiện tại mới triển khai backend OpenGL nhưng đã đủ dùng cho các dự án demo. Ưu điểm nổi bật:
- Xử lý văn bản mạnh mẽ hơn so với C/C++
- Dễ bảo trì và mở rộng
- Hỗ trợ nạp runtime trực tiếp
Dù vậy, tác giả chính của bgfx không ưa chuộng phương pháp dùng ngôn ngữ kịch bản cho thư viện runtime, và có kế hoạch tái cấu trúc phần này bằng C++ để tạo thành thư viện dùng được tại runtime. Vì vậy, mình quyết định không tiếp tục phát triển phiên bản Lua này.
Cập nhật về thư viện tiền xử lý Lua
Phiên bản thư viện cpp viết bằng Lua mà mình sử dụng chứa nhiều lỗi tiềm ẩn. Mình đã vừa dùng vừa sửa một số điểm chính, tuy nhiên đây là dự án “chết” nên không thể gửi PR được. Giải pháp là fork về và chỉnh sửa riêng cho dự án của mình.
Những cải tiến này không chỉ giúp mình hiểu sâu hơn về kiến trúc hệ thống đồ họa, mà còn mở ra nhiều khả năng mới cho các ứng dụng sử dụng bgfx. Mình hy vọng những đóng góp này sẽ tiếp tục được cộng đồng đón nhận và phát triển trong tương lai!