- Untuk mengatasi masalah kualitas perenderan teks, khususnya keterbatasan pendekatan berbasis SDF (distance field), diajukan teknik perenderan vektor real-time yang baru
- Dengan mengirim glif (karakter) dalam bentuk kurva vektor langsung ke GPU dan melakukan rasterisasi real-time, pendekatan ini mencapai resolusi tak terbatas serta penggunaan memori yang rendah
- Dengan memanfaatkan texture atlas dan teknik temporal accumulation, pendekatan ini mewujudkan kualitas anti-aliasing yang tinggi serta caching yang efisien
- Karena dapat disesuaikan untuk berbagai struktur subpiksel (mis. OLED, LCD, dan lain-lain), hasilnya tetap halus dan tajam tanpa masalah fringing (bleeding warna)
- Pendekatan ini menawarkan cara yang sederhana namun sangat skalabel untuk perenderan font berkualitas tinggi pada teks real-time, UI, game, dan lain-lain
Pendahuluan: Tantangan dalam perenderan teks
- Dalam perenderan teks real-time, ada berbagai persoalan seperti aliasing (efek tangga), tekstur besar, waktu build, zoom in/out, dan pergerakan yang mulus
- Metode Multi-Channel Signed Distance Fields (SDFs) yang selama ini banyak digunakan memiliki keterbatasan dari sisi kualitas dan fleksibilitas
- Pemicu pendekatan baru ini adalah struktur subpiksel nonstandar pada monitor OLED terbaru serta masalah fringing, yang mendorong pengembangan metode yang juga mempertimbangkan subpixel anti-aliasing
Keterbatasan metode SDF yang ada
Kualitas
- Pada metode SDF, font dengan detail halus atau banyak goresan tipis mengalami penurunan kualitas dan kehilangan informasi
- Jika resolusi tidak dinaikkan, artefak akan tetap muncul pada glif tertentu
Ukuran atlas
- SDF dibuat secara offline terlebih dahulu lalu atlas disimpan, tetapi untuk banyak glif atau font CJK (Tionghoa, Jepang, Korea) ukurannya bisa menjadi tidak realistis
- Jika beberapa font digunakan sekaligus, konsumsi memori dan beban bandwidth streaming meningkat besar
Fleksibilitas dan kesederhanaan
- Karena harus melewati tahap perantara berupa SDF, alur keseluruhan dari data sumber hingga hasil akhir menjadi kompleks
- Ada banyak keterbatasan ketika ingin langsung memanfaatkan atau mengedit gambar vektor yang bersifat real-time atau dinamis
Pendekatan baru: rasterisasi real-time kurva vektor
- Alih-alih membuat tekstur lebih dulu, data kurva vektor glif yang benar-benar terlihat di layar (seperti kurva Bézier) dikirim langsung ke GPU lalu dirasterisasi di tempat
- Hanya glif yang diperlukan yang dimasukkan ke dalam texture atlas, lalu dipertahankan atau dilepas sesuai frekuensi penggunaan
- Selama glif masih tampil di layar, akumulasi sampel (temporal accumulation) digunakan untuk menghasilkan hasil yang sangat berkualitas tinggi dan lebih halus (anti-aliased)
- Karena selalu diproses berbasis vektor, hasilnya tetap tajam tanpa batasan resolusi
Pemrosesan data kurva font
- Berbagai format font dibaca menggunakan pustaka open source seperti FreeType, lalu informasi kurva glif diekstrak
- Glif diparse dalam bentuk garis, kurva Bézier kuadratik/kubik, lalu semua kurva diubah menjadi kurva Bézier kuadratik agar pemrosesan di shader GPU lebih sederhana
- Garis diubah menjadi kurva kuadratik dengan menambahkan titik kontrol tengah
- Kurva kubik diubah menjadi dua kurva kuadratik yang telah dibagi
Perhitungan coverage (isian di dalam piksel)
- Untuk setiap piksel, dihitung titik perpotongan dengan kurva pada ray arah horizontal, lalu bagian dalam/luar ditentukan melalui winding number (jumlah perpotongan kumulatif)
- Ratusan sampel (n kali akumulasi sampel) dijumlahkan, dan sedikit galat halus hampir tidak memengaruhi hasil akhir
- Dengan teknik penempatan titik sampel (quasirandom sequence), hasil dari berbagai posisi diakumulasikan pada setiap frame
Optimasi akses kurva
- Glif dibagi dalam unit band horizontal, sehingga hanya kurva terkait pada setiap band yang diuji untuk mengurangi komputasi
- Penjadwalan thread dan iterasi per band memaksimalkan efisiensi komputasi bulk di GPU
Packing dan pengelolaan atlas
- Setelah setiap gambar glif dialokasikan ke atlas (tekstur bersama), atlas dikelola sebagai berikut
- Jika glif belum ada, ruang baru dialokasikan lalu dirasterisasi; jika sudah ada, hasilnya digunakan ulang
- Perlu dicatat bahwa bahkan untuk glif yang sama, versi yang berbeda mungkin dibutuhkan tergantung posisi subpiksel dan ukuran
- Melalui Z-Order Packing (seperti Morton code), diterapkan packing yang efisien antara bitset 1 dimensi dan ruang 2D
- Dapat diterapkan secara fleksibel menurut struktur bahasa, misalnya basis vertikal untuk rumpun Latin dan basis horizontal untuk rumpun Arab
- Saat glif tidak lagi diperlukan, ruang atlas dapat dialokasikan ulang untuk digunakan kembali
Akumulasi waktu (Temporal Accumulation)
- Melalui caching glif dan akumulasi sampel, pendekatan ini cepat memperoleh sampel berkualitas tinggi segera setelah ditampilkan, lalu menyempurnakannya lebih lanjut di frame berikutnya
- Frame pertama menggunakan 8 sampel/piksel, lalu jumlah sampel berkurang secara bertahap, dengan akumulasi hingga 512 kali
- Dengan demikian, tampilan glif yang halus dan optimasi sumber daya dapat dicapai secara bersamaan
Subpixel anti-aliasing dan pencegahan fringing
- Dengan membagi area render pada tingkat subpiksel (menganggap setiap elemen seperti RGB sebagai sampel), pendekatan ini meningkatkan resolusi horizontal secara efektif
- Mendukung berbagai susunan seperti struktur standar LCD maupun OLED/WOLED
- Dapat menghasilkan efek halus tanpa fringing (bleeding warna)
- Jika sampel subpiksel disusun agar saling tumpang tindih (Overlapping), efek pencampuran cahaya pada monitor nyata juga dapat tercermin
- Hasil yang alami dan tajam dapat dicapai tanpa batas piksel maupun hinting
Pentingnya pendekatan struktur subpiksel per display
- Jika informasi susunan subpiksel monitor dapat diperiksa secara terprogram, perenderan yang jauh lebih presisi menjadi memungkinkan
- Ditekankan bahwa ini bukan keterbatasan hardware, melainkan masalah pemrosesan software
Penutup dan prospek pemanfaatan
- Perenderan teks yang baik sangat memengaruhi keseluruhan usability dan kualitas layanan
- Khususnya pada UI/game, ekspresi font berkualitas tinggi dapat membuat perbedaan besar dalam pengalaman produk
- Ini adalah struktur kerja yang dapat mewujudkan prinsip sederhana, skalabel, berkualitas tinggi, dan fleksibel
- Dengan implementasi open source, dukungan berbagai subpiksel, dan lain-lain, pendekatan ini sangat cocok untuk penggunaan nyata di industri/produksi
1 komentar
Opini Hacker News
wgpuopen source dengan memanfaatkan parsing/font layout dari cosmic-text, tetapi khawatir nanti justru digugat oleh Slug