TTF-DOOM: Chạy engine raycasting ngay trong máy ảo của phông chữ TrueType
TTF-DOOM là một dự án kỹ thuật độc đáo thực hiện chạy game dạng raycasting bên trong bộ xử lý hinting của phông chữ TrueType. Bằng cách tận dụng tính chất Turing-complete của font bytecode, tác giả đã nhúng engine dựng hình 3D vào glyph "A", biến tệp phông chữ thành một loại GPU đầy kỳ lạ.

Bạn đã bao giờ tưởng tượng việc chơi một tựa game kiểu Wolfenstein 3D chạy trực tiếp bên trong một tệp phông chữ chưa? Đó chính là điều mà một nhà phát triển với nickname 4RH1T3CT0R7 đã đạt được với dự án TTF-DOOM.
Đây không phải là một bản port hay trò chơi ghi đè lên hình ảnh font chữ. Thay vào đó, nó thực sự sử dụng máy ảo hinting (căn chỉnh) có sẵn trong đặc tả TrueType để thực hiện các tính toán đồ họa và hiển thị môi trường 3D.
Demo hoạt động của TTF-DOOM
Cơ chế hoạt động: Font chữ như một GPU
TrueType fonts sở hữu một máy ảo tích hợp để căn chỉnh các đường nét glyph (grid-fitting), đảm bảo văn bản hiển thị sắc nét ở mọi kích thước. Máy ảo này có ngăn xếp (stack), vùng lưu trữ (storage), phép tính số học, câu điều kiện và gọi hàm. Quan trọng hơn, nó được chứng minh là Turing-complete.
Trong TTF-DOOM, tác giả đã viết một engine raycasting (kỹ thuật dựng hình 3D dùng tia) bằng bytecode của TrueType. Cụ thể:
- Glyph chữ "A" trong phông chữ này chứa 16 đường viền thẳng đứng.
- Chương trình hinting sẽ đọc tọa độ người chơi từ các trục biến thể (font variation axes) thông qua lệnh
GETVARIATION. - Nó thực hiện thuật toán ray marching (DDA) dựa trên bản đồ 16x16 được lưu trong vùng lưu trữ của font.
- Cuối cùng, nó sử dụng lệnh
SCFSđể thay đổi độ cao của các thanh dọc trong glyph "A", tạo ra hiệu ứng thị giác 3D của các bức tường.
Minh họa quá trình biến đổi glyph
Toàn bộ engine này chỉ chiếm khoảng 6,5 KB bytecode, bao gồm 13 hàm và 795 slot lưu trữ cùng các bảng tra cứu sin/cos.
Kiến trúc và Trình biên dịch tùy biến
Dự án sử dụng kiến trúc lai, nơi phông chữ đóng vai trò như một thiết bị xử lý đồ họa (GPU) kỳ lạ:
- JavaScript: Xử lý chuyển động, kẻ địch, bắn súng và truyền dữ liệu.
- CSS/Font: Nhận tọa độ người chơi thông qua thuộc tính
font-variation-settingsvà thực hiện việc dựng hình tường.
Tác giả đã xây dựng một trình biên dịch nhỏ gồm lexer, parser và codegen để chuyển đổi một ngôn ngữ DSL (giống C) sang assembly của TrueType. Ví dụ, mã nguồn doom.doom sẽ được biên dịch thành các lệnh FDEF, CALL, RS, WS, SCFS và nhúng vào tệp .ttf.
Những thách thức "điên rồ" của toán học TrueType
Làm việc với máy ảo TrueType không hề dễ dàng. Tác giả đã gặp phải những vấn đề rất lạ lùng:
- Phép nhân kỳ lạ: Lệnh
MULthực hiện phép tính(a*b)/64thay vìa*b. Điều này dẫn đến kết quả1 * 4 = 0do làm tròn số nguyên. Tác giả phải dùng một workaround phức tạp thông qua lệnhDIVđể giải quyết vấn đề định điểm cố định F26Dot6. - Không có vòng lặp WHILE: Máy ảo không hỗ trợ vòng lặp trực tiếp. Mọi vòng lặp phải biên dịch thành các hàm đệ quy (recursive
FDEFs), nhưng FreeType lại giới hạn độ sâu gọi hàm khoảng 64 frame, khiến việc tối ưu hóa trở nên cực kỳ khó khăn. - Toàn độ: Tác giả phải dùng cờ đánh dấu (hit flags) thay vì lệnh
returnthông thường vì lệnh này không thoát khỏi hàm ngay lập tức trong ngữ cảnh đệ quy.
Chế độ debug cho thấy các trục biến đổi
Cách chạy thử
Nếu bạn muốn trải nghiệm sự kỳ lạ này, dự án đã hỗ trợ chạy trực tiếp trên trình duyệt hoặc cài đặt locally:
Trên trình duyệt (Chrome/Edge):
- Truy cập trang demo trực tiếp: https://4rh1t3ct0r7.github.io/ttf-doom/
- Dùng phím WASD để di chuyển, Mũi tên để quay.
- Phím Space để bắn và phím Tab để xem lớp debug (xem các trục biến đổi font thay đổi theo thời gian thực).
Dự án này không chỉ là một trò đùa kỹ thuật (just for fun) mà còn là một minh chứng tuyệt vời cho sự sáng tạo trong việc khai thác các công nghệ cũ hoặc ít được quan tâm như đặc tả phông chữ.



