- Đề xuất một kỹ thuật kết xuất vector thời gian thực mới để giải quyết các vấn đề về chất lượng của kết xuất văn bản, đặc biệt là giới hạn của các phương pháp dựa trên SDF (trường khoảng cách)
- Bằng cách truyền trực tiếp các glyph (ký tự) ở dạng đường cong vector lên GPU để rasterize theo thời gian thực, phương pháp này đạt được độ phân giải không giới hạn và mức sử dụng bộ nhớ thấp
- Tận dụng kỹ thuật texture atlas và tích lũy theo thời gian (temporal accumulation) để hiện thực hóa chất lượng khử răng cưa cao và cơ chế cache hiệu quả
- Có thể tùy biến theo nhiều cấu trúc subpixel khác nhau (ví dụ: OLED, LCD, v.v.), nhờ đó mang lại kết quả mượt và sắc nét mà không gặp hiện tượng fringing (lem màu)
- Đưa ra một cách tiếp cận đơn giản nhưng có khả năng mở rộng cao cho kết xuất phông chữ chất lượng cao trong văn bản thời gian thực, UI, game, v.v.
Giới thiệu: bài toán của kết xuất văn bản
- Trong kết xuất văn bản thời gian thực, có nhiều vấn đề như aliasing (răng cưa), texture lớn, thời gian build, phóng to/thu nhỏ, chuyển động mượt
- Phương pháp Multi-Channel Signed Distance Fields (SDFs) được dùng phổ biến trước đây có những giới hạn về chất lượng và tính linh hoạt
- Gần đây, do cấu trúc subpixel phi tiêu chuẩn của màn hình OLED và vấn đề fringing, tác giả đã phát triển một cách tiếp cận mới có tính đến cả khử răng cưa subpixel
Giới hạn của phương pháp SDF hiện có
Chất lượng
- Với SDF, ở các phông chữ có nhiều chi tiết tinh hoặc nét mảnh, sẽ phát sinh vấn đề suy giảm chất lượng và mất mát thông tin
- Nếu không tăng độ phân giải, một số glyph cụ thể sẽ vẫn để lại artifact
Kích thước atlas
- SDF được tạo offline từ đầu rồi lưu vào atlas, nhưng với nhiều glyph hoặc phông chữ CJK (Trung, Nhật, Hàn) thì kích thước có thể lớn đến mức gần như không khả thi trong thực tế
- Khi dùng đồng thời nhiều phông chữ, mức tiêu thụ bộ nhớ và gánh nặng băng thông streaming tăng mạnh
Tính linh hoạt và sự đơn giản
- Vì phải đi qua bước trung gian là SDF, toàn bộ luồng từ dữ liệu nguồn đến kết quả cuối trở nên phức tạp
- Việc sử dụng trực tiếp hoặc chỉnh sửa ảnh vector theo thời gian thực hay động cũng bị hạn chế đáng kể
Cách làm mới: rasterize đường cong vector theo thời gian thực
- Thay vì tạo texture sẵn, dữ liệu đường cong vector của glyph thực sự xuất hiện trên màn hình (như đường cong Bézier) được truyền trực tiếp lên GPU và rasterize ngay tại chỗ
- Chỉ đưa các glyph cần thiết vào atlas texture, đồng thời giữ lại hoặc giải phóng tùy theo tần suất sử dụng
- Trong lúc glyph còn xuất hiện trên màn hình, hệ thống dùng tích lũy mẫu (temporal accumulation) để tạo ra kết quả mượt hơn với chất lượng khử răng cưa rất cao
- Do luôn xử lý theo kiểu dựa trên vector, phương pháp này cho kết quả sắc nét mà không bị giới hạn bởi độ phân giải
Xử lý dữ liệu đường cong phông chữ
- Dùng các thư viện mã nguồn mở như FreeType để đọc nhiều định dạng phông chữ khác nhau và trích xuất thông tin đường cong của glyph
- Glyph được phân tích thành đường thẳng, đường cong Bézier bậc hai/bậc ba, rồi mọi đường cong được chuyển thành Bézier bậc hai để đơn giản hóa xử lý trong shader GPU
- Đường thẳng được chuyển thành đường cong bậc hai bằng cách thêm điểm điều khiển ở giữa
- Đường cong bậc ba được tách thành 2 đường cong bậc hai
Tính coverage (mức lấp đầy bên trong pixel)
- Với mỗi pixel, hệ thống tính giao điểm giữa tia theo phương ngang và đường cong, rồi dùng winding number (số giao cắt tích lũy) để xác định bên trong/bên ngoài
- Hàng trăm mẫu (n lần tích lũy mẫu) được cộng dồn, và một số sai số vi mô hầu như không ảnh hưởng đến kết quả cuối
- Dùng kỹ thuật bố trí điểm mẫu (quasirandom sequence) để tích lũy kết quả từ nhiều vị trí khác nhau qua từng frame
Tối ưu truy cập đường cong
- Glyph được chia theo các dải ngang (band), và mỗi dải chỉ kiểm tra các đường cong có liên quan để giảm khối lượng tính toán
- Phân bố thread và lặp theo từng band giúp tối đa hiệu quả xử lý hàng loạt trên GPU
Đóng gói và quản lý atlas
- Cấp phát và quản lý ảnh của từng glyph trong atlas (texture dùng chung)
- Với glyph chưa có, hệ thống cấp phát không gian mới để rasterize; với glyph đã có thì tái sử dụng
- Lưu ý rằng ngay cả cùng một glyph, vẫn có thể cần các phiên bản khác nhau tùy theo vị trí subpixel và kích thước
- Hiện thực cơ chế đóng gói hiệu quả giữa bitmap 1 chiều và không gian 2D bằng Z-Order Packing (Morton code, v.v.)
- Có thể ứng dụng linh hoạt theo cấu trúc ngôn ngữ, chẳng hạn hệ Latin ưu tiên theo chiều dọc, hệ Ả Rập ưu tiên theo chiều ngang
- Khi glyph không còn cần thiết nữa, không gian trong atlas sẽ được cấp phát lại để sử dụng tiếp
Tích lũy theo thời gian (Temporal Accumulation)
- Thông qua cơ chế cache glyph và tích lũy mẫu, hệ thống nhanh chóng đạt chất lượng mẫu cao ngay sau khi hiển thị, rồi tiếp tục tinh chỉnh qua các frame sau
- Frame đầu dùng 8 mẫu/pixel, sau đó giảm dần số mẫu, tối đa tích lũy 512 lần
- Đảm bảo đồng thời hiển thị glyph mượt mà và tối ưu tài nguyên
Khử răng cưa subpixel và ngăn fringing
- Phân bổ vùng kết xuất ở cấp độ subpixel (coi từng phần tử như RGB là một mẫu) để tạo hiệu ứng tăng độ phân giải theo chiều ngang
- Hỗ trợ nhiều cách sắp xếp khác nhau như cấu trúc chuẩn của LCD, OLED/WOLED, v.v.
- Cho phép tạo hiệu ứng mượt mà mà không bị fringing (lem màu)
- Khi sắp xếp để các mẫu subpixel chồng lấp (Overlapping), phương pháp này còn phản ánh được cả hiệu ứng hòa trộn ánh sáng của màn hình thực tế
- Có thể tạo đầu ra tự nhiên và sắc nét ngay cả khi không cần biên pixel hay hinting
Tầm quan trọng của cách tiếp cận theo cấu trúc subpixel của từng màn hình
- Nếu có thể xác định bằng lập trình thông tin sắp xếp subpixel của màn hình, việc kết xuất sẽ còn tinh vi hơn nhiều
- Nhấn mạnh rằng đây không phải giới hạn của phần cứng mà là vấn đề ở cách xử lý phần mềm
Kết luận và triển vọng ứng dụng
- Kết xuất văn bản tốt ảnh hưởng lớn đến tính khả dụng tổng thể và chất lượng dịch vụ
- Đặc biệt trong UI/game, biểu diễn phông chữ chất lượng cao có thể tạo ra khác biệt lớn trong trải nghiệm sản phẩm
- Đây là một cấu trúc triển khai hiện thực được các nguyên tắc đơn giản, khả năng mở rộng, chất lượng cao, linh hoạt
- Rất phù hợp cho ứng dụng thực tế trong công nghiệp/production nhờ triển khai mã nguồn mở và khả năng hỗ trợ nhiều cấu trúc subpixel khác nhau
1 bình luận
Ý kiến trên Hacker News