Merender Teks yang Tajam di GPU
(osor.io)- Pendekatan Multi-Channel SDF yang ada masih memiliki keterbatasan pada goresan tipis, atlas besar, pengecilan·pembesaran, dan pergerakan halus, sehingga diimplementasikan ulang sebagai rasterisasi runtime di GPU
- Pipeline baru hanya mengirim data kurva Bézier dari glyph yang sedang terlihat ke GPU, menggambarnya ke atlas saat runtime, lalu mengambil sampel dari atlas itu di layar
- Jika glyph tetap berada di layar, cache atlas dipertahankan sambil mengakumulasi sampel untuk meningkatkan kualitas; dimulai dari 8 samples-per-pixel pada frame pertama dan disempurnakan hingga maksimum 512 samples
- Kunci cache mencakup font, glyph_index, ukuran piksel, dan offset subpiksel; nilai posisi dan ukuran yang berdekatan dilipat menjadi nilai yang sama dengan fixed-point 8-bit untuk meningkatkan reuse
- Dengan memodelkan struktur subpiksel RGB per monitor sebagai area sampel, color fringing dapat dikurangi bahkan pada susunan nonstandar seperti OLED G9, dan demo teks layar penuh 4K menunjukkan biaya puncak sekitar 0,1 ms pada Radeon 9070
Alasan memilih rasterisasi vektor runtime alih-alih SDF
- Implementasi sebelumnya menggunakan Multi-Channel Signed Distance Fields dan secara umum bekerja dengan baik, tetapi dalam penggunaan nyata masih ada beberapa batasan
- Kualitas: pada font dengan goresan tipis atau banyak detail, fitur bisa hilang atau muncul artefak, dan kadang diperlukan SDF beresolusi lebih tinggi
- Ukuran atlas: karena SDF dibuat offline lalu disimpan dalam atlas, font Jepang·Tionghoa dengan banyak glyph sulit dipanggang ke satu atlas
- Fleksibilitas: sulit menerapkan ide baru seperti masalah pengecilan·pembesaran atau subpixel antialiasing, dan tidak cocok untuk gambar vektor yang dapat dibuat·diedit saat runtime
- Kesederhanaan: tahap mengubah kurva glyph asli menjadi tekstur perantara menambah kompleksitas sistem
- Bahkan font Latin seperti Miama membutuhkan atlas
4096×1152yang memakai area64×64untuk tiap glyph; jika beberapa font dipakai saat runtime, biaya memori dan bandwidth streaming menjadi besar - Tujuan pendekatan baru ini adalah menggunakan kurva Bézier yang dibuat pembuat glyph secara lebih langsung, sehingga mengurangi tahap transformasi dari data asli ke piksel akhir
Pipeline keseluruhan
- Intinya adalah, alih-alih memanggang semua glyph terlebih dahulu secara offline, hanya kurva dari glyph yang sedang terlihat yang dikirim ke GPU dan dirasterisasi pada saat dibutuhkan
- Alur pemrosesannya sederhana
- Memuat data kurva glyph dari font
- GPU merasterisasi glyph ke atlas saat runtime
- Saat output ke layar, atlas tersebut disampling
- Jika glyph yang sama terus digunakan pada frame berikutnya, glyph dibiarkan di atlas dan sampel diakumulasi untuk menyempurnakannya hingga menjadi subpixel antialiasing berkualitas tinggi
- Karena representasi vektor dirender secara langsung, perubahan resolusi lebih mudah ditangani, dan bukan hanya coverage seluruh piksel, tetapi juga coverage tiap elemen subpiksel dapat dihitung
Pemrosesan kurva glyph
- Untuk pemuatan font, FreeType digunakan sebagai lapisan perantara pada tool offline untuk membaca format yang didukung, lalu kurva tiap glyph ditelusuri dan disimpan ke format aset sendiri
- Kurva glyph dapat mencakup garis, Bézier kuadratik, dan Bézier kubik; agar shader lebih sederhana, semuanya dikonversi menjadi Bézier kuadratik
- Garis dibuat menjadi Bézier kuadratik dengan menambahkan satu titik kontrol di tengah dua titik
- Bézier kubik dibagi menjadi dua Bézier kuadratik, dan ini adalah konversi lossy yang menurunkan derajatnya
- Cara membagi Bézier kubik menjadi dua Bézier kuadratik bekerja baik pada sebagian besar font yang dicoba, tetapi metode yang lebih canggih untuk mengurangi error juga memungkinkan
- Jika dibutuhkan konversi berkualitas lebih tinggi, tool offline dapat mengubahnya ke format yang hanya memiliki Bézier kuadratik, seperti TrueType
.ttf, sehingga konversi ini sendiri bisa dihindari - Di grafik Desmos, bentuk Bézier kubik input dan dua Bézier kuadratik hasilnya dapat dibandingkan
Perhitungan coverage dan optimisasi akses kurva
- Coverage dihitung per piksel dengan menembakkan ray horizontal dari kiri ke kanan, memeriksa perpotongan dengan kurva, lalu mengakumulasi winding number
- Latar matematika dan implementasinya dapat merujuk ke GPU Font Rendering dari GreenLightning dan video Rendering Text dari Sebastian Lague
- Ketidakakuratan perhitungan perpotongan dapat terjadi pada sampel di ketinggian tertentu, tetapi jika ratusan sampel diakumulasi, satu atau dua error nyaris tidak terlihat setelah dirata-ratakan
- Saat mengakumulasi maksimum 512 sampel, jika satu sampel salah, hasilnya menjadi
1/512=0.00195alih-alih0, atau511/512=0.99804alih-alih1 - Ambang clamp juga dapat ditetapkan saat coverage mendekati nilai ekstrem
- Saat mengakumulasi maksimum 512 sampel, jika satu sampel salah, hasilnya menjadi
- Untuk distribusi posisi sampel digunakan $R_2$ sequence dari Martin Roberts, dan distribusinya dari waktu ke waktu dapat dilihat pada contoh Shadertoy
- Untuk mengurangi biaya akses kurva, glyph dibagi menjadi beberapa band horizontal, dan hanya kurva yang menyentuh tiap band yang disimpan sebagai bitset
- Karena hanya ray horizontal yang dilacak, himpunan kurva yang perlu diperiksa tiap texel dapat dikurangi secara signifikan
- Jika rentang band yang sama diakses pada level wave, iterasi dan pembacaan kurva dapat diskalarkan
- Saat merasterisasi ke atlas di compute shader, thread dipacking secara horizontal dalam urutan row-major untuk meminimalkan rentang band yang disentuh wave
Packing atlas dan kunci cache
- Awalnya rasterisasi dilakukan langsung ke layar, tetapi biaya menghitung antialiasing berkualitas tinggi setiap frame terlalu besar
- Sebagian besar teks tetap berada pada ukuran dan posisi yang sama selama beberapa frame, dan glyph yang sama berulang pada ukuran yang sama, sehingga atlas dan akumulasi temporal cocok digunakan
- Jika glyph yang dibutuhkan belum ada, atlas mengalokasikan ruang dan memulai rasterisasi; jika sudah ada, hasil yang ada langsung digunakan
- Selama frame, glyph di atlas diperiksa untuk menentukan apakah akan tetap dipertahankan, disampling lebih lanjut, atau dilepas ruangnya karena tidak dipakai
- Kunci atlas mencakup elemen berikut
fontglyph_indexquantized_size_in_pixels_x,quantized_size_in_pixels_yquantized_subpixel_offset_x,quantized_subpixel_offset_y
- Offset subpiksel setara dengan
frac(pixel_position), dan diperlukan untuk menghasilkan antialiasing yang sesuai posisi ketika glyph tidak tepat sejajar dengan grid piksel atau saat discroll halus - Jika nilai floating-point digunakan apa adanya sebagai kunci, nilai yang secara matematis seharusnya sama bisa berbeda pada level bit, sehingga posisi dan ukuran yang berdekatan dilipat menjadi nilai yang sama dengan fixed-point pecahan 8-bit
- Pada editor teks dengan banyak teks statis yang memakai font monospace, jarak karakter dan posisi baris dapat diselaraskan ke batas piksel untuk meningkatkan hit rate cache atlas dari glyph yang sama
Penempatan atlas berbasis Z-Order
- Penempatan glyph saat runtime menggunakan Z-Order Packing dan bitset sel kosong
- Z-Order berbasis Morton code memungkinkan sel 2D diperlakukan seperti array 1D panjang, dan jika sel berurutan dialokasikan sebanyak pangkat dua, hasilnya menjadi area persegi pada atlas 2D
- Sel dasar berukuran
16×16texel, dan ukuran glyph dibulatkan naik ke pangkat dua berikutnya- Misalnya glyph
25×29mengalokasikan chunk32×32 - Dalam kasus ini diperlukan 4 sel
16×16, sehingga dicari dan digunakan 4 bit berurutan yang selaras
- Misalnya glyph
- Glyph alfabet Latin yang panjang dan tipis kebanyakan berbentuk vertikal, sehingga dengan memakai Z-Order yang ditransposisikan, glyph seperti
l,j,i,1dapat memakai hanya setengah ruang - Sebaliknya, untuk kasus glyph panjang dan tipis berbentuk horizontal seperti bahasa Arab, Z-Order standar lebih cocok
Cara meningkatkan kualitas dengan akumulasi temporal
- Jika glyph tetap berada di atlas, sampel dapat ditambahkan sedikit demi sedikit setiap frame untuk menyempurnakan hasilnya
- Jadwal dasar dimulai dengan 8 samples-per-pixel pada frame pertama saat glyph muncul, lalu 4 pada frame berikutnya, 2 pada frame setelahnya, kemudian menambahkan 1 sampel per frame hingga total 512
- Alasan menetapkan kualitas frame pertama cukup tinggi adalah karena glyph yang bergerak halus atau berubah ukuran seolah diinisialisasi ulang setiap frame
- Kualitas dan performa dapat diatur dengan berbagai cara
- Jumlah sampel·ray yang ditambahkan tiap frame
- Apakah sampel dinaikkan pada beberapa frame awal glyph
- Batas atas total sampel per frame
- Time-slicing yang memperbarui glyph lama setiap beberapa frame, bukan setiap frame
- Cara membatasi biaya pemeriksaan perpotongan berdasarkan jumlah kurva glyph
- Dalam implementasi ini performa tidak menjadi masalah besar; teks layar penuh pada bagian awal menunjukkan puncak sekitar 0,1 ms pada 4K di Radeon 9070, dan setelah glyph mencapai jumlah sampel maksimum, biayanya cepat mendekati 0
Subpixel antialiasing dan color fringing
- Subpixel antialiasing merender elemen merah·hijau·biru di dalam piksel monitor sebagai area sampel masing-masing
- Pada struktur garis vertikal RGB LCD tradisional, resolusi horizontal secara efektif menjadi 3 kali lipat, sehingga pada 4K
3840×2160dapat diperlakukan seperti3840×6480 - Masalahnya, monitor seperti OLED G9 memiliki struktur subpiksel nonstandar yang berbeda dari garis vertikal RGB standar
- Jika diasumsikan sebagai struktur persegi panjang vertikal RGB dasar, color fringing hijau terlihat di bagian atas dan magenta di bagian bawah
- Jika posisi sampel diatur sesuai struktur subpiksel monitor yang sebenarnya, color fringing hampir tidak ada dan hasilnya halus
- Subpixel Zoo menunjukkan berbagai contoh struktur subpiksel, dan struktur red-white-blue-green pada LG WOLED adalah contoh yang berbeda dari urutan standar
- Hasil yang lebih akurat didapat dengan menganggap elemen subpiksel lebih besar dari ukuran fisiknya dan mengaturnya agar saling tumpang tindih
- Cahaya subpiksel bercampur secara alami dan sedikit menyebar, sehingga area sampel berperilaku seolah lebih besar daripada subpiksel fisik
- Area sampel juga harus menyebar ke luar piksel, dan bercampur dengan cahaya subpiksel dari piksel sekitar
- Easy Scalable Text Rendering dari Evan Wallace berpendapat bahwa blur horizontal diperlukan setelah subpixel antialiasing, yang pada dasarnya memiliki efek yang sama dengan menganggap elemen subpiksel lebih besar dan saling tumpang tindih
Perangkat lunak perlu mengetahui informasi subpiksel display
- Jika struktur subpiksel arbitrer pada monitor dapat diakses, kualitas subpixel antialiasing dan rendering teks secara umum dapat ditingkatkan
- Jika informasi seperti ini disediakan melalui protokol display umum, rendering yang lebih rinci per hardware juga dimungkinkan bahkan pada monitor dengan susunan standar
- Produsen display tidak perlu menghindari eksperimen struktur subpiksel yang lebih baik karena masalah rendering teks
- Samsung mengubah struktur subpiksel dari G8 ke G9 pada QD-OLED untuk mengurangi masalah ini, dan color fringing sering disebut pada LG WOLED dan Samsung QD-OLED
- Masalah ini masih punya ruang untuk ditangani dengan koreksi perangkat lunak, bukan penggantian hardware
Nilai praktis rendering glyph real-time
- UI yang baik dan kualitas teks dapat meningkatkan kualitas produk yang dirasakan pengguna
- Dalam game, elemen seperti kotak teks, menu, judul, dan notifikasi yang menarik perhatian pengguna sering muncul; penurunan kualitas teks dapat memengaruhi pengalaman sama seperti adegan 3D dengan rendering buruk
- Seri Persona, Metaphor: ReFantazio, dan Nier: Automata adalah contoh yang baik dalam ekspresi UI dan teks
- Upaya meningkatkan kualitas rendering glyph real-time memiliki nilai nyata baik untuk UI maupun rendering game
1 komentar
Komentar Hacker News
Apa yang terjadi dengan titik pada huruf j miring di video pertama?
Rendering font subpiksel penting untuk keterbacaan, tetapi seperti disorot dalam tulisan itu, sayang sekali kita tidak bisa mendapatkan spesifikasi susunan piksel dari standar display yang ada
Dunia makin bergeser ke display kelas Retina, dan di sana hampir tidak ada alasan untuk rendering subpiksel
Banyak masalahnya: screenshot menjadi terikat pada susunan subpiksel tertentu, dan pembesaran/pengecilan bitmap juga sulit
Itu adalah inovasi sementara pada era LCD di antara CRT dan Retina, dan sekarang lebih mirip teknologi yang melihat ke belakang. Ada alasan yang masuk akal mengapa Apple menghapusnya dari macOS beberapa tahun lalu
Saya penasaran apakah produsen display tidak mengimplementasikannya. Bagaimanapun, untuk model display yang paling umum, ini adalah informasi yang bisa dengan mudah disimpulkan dan disimpan dalam database informasi hardware
Tulisannya bagus, dan juga menautkan “subpixel zoo” yang menunjukkan berbagai contoh: https://geometrian.com/resources/subpixelzoo/
Pendekatan seperti ini tetap diperlukan bahkan untuk kasus yang tak terhindarkan ketika monitor melaporkan susunan yang salah
Font bitmap tanpa antialiasing atau font vektor yang di-hint saja sudah sangat mudah dibaca
Ini baru menjadi penting untuk bahasa seperti Mandarin atau Jepang, yang karakternya memiliki detail sangat kompleks
GTK4 meninggalkan rendering subpiksel RGB saat memindahkan rendering ke GPU
Saya pernah dengar keputusan yang berpusat pada GPU membuat rendering subpiksel RGB sulit dipertahankan, tetapi tulisan ini menunjukkan bahwa hal itu mungkin
Kalau begitu, mungkin alasan GTK ada di tempat lain, atau solusi yang diajukan punya kekurangan, atau tidak terintegrasi dengan baik ke stack yang ada
Jika tertarik pada cara mengimplementasikan SDF dan MSDF di WebGL / WebGPU, lihat tutorial yang saya tulis sendiri: https://infinitecanvas.cc/guide/lesson-015#msdf
Saya pernah mencoba memindahkan contoh JavaScript ke Rust; tidak bisa sekadar copy/paste, tetapi API-nya cukup mirip sehingga mudah di-port, cocok untuk belajar
Itu juga jadi pemicu untuk makin terbiasa memakai dokumentasi WGPU
Saya suka membuat tutorial terkait GPU dan ingin menyusunnya seperti ini; penasaran apakah ini template yang sudah ada atau bagian dari suatu kuliah
Library Slug adalah middleware komersial yang mengimplementasikan rasterizer glif GPU seperti ini
[1]: https://sluglibrary.com/
Akan menarik membuat versi wgpu open source dengan memakai sebagian parsing font dan layout dari cosmic-text, tetapi sama sekali tidak akan menyenangkan kalau ujung-ujungnya dituntut oleh Slug
GPU tampak seolah memiliki kemampuan menggambar vertex/piksel yang praktis tak terbatas, jadi saya masih belum paham mengapa teks harus dirender offline, disimpan dalam atlas, bahkan memakai trik seperti SDF
Tulisan itu juga mengatakan kurva glif ditulis ke atlas, tetapi saya penasaran kenapa shader tidak merender teks secara langsung saja
Pasti ada cara mengubah Bézier menjadi mesh segitiga. Saya baru akan mulai membuat renderer teks GPU untuk aplikasi CAD, jadi semoga segera tahu alasannya
GPU memang cepat, tetapi tidak cepat tanpa batas, dan sangat kuat dalam mengambil sampel dari tekstur yang sudah dirender sebelumnya
Ini bukan hanya soal kecepatan, melainkan juga konsumsi daya. Jika sudah mencapai refresh rate monitor, peningkatan performa tambahan tidak akan meningkatkan responsivitas, tetapi bisa memperpanjang daya tahan baterai
Dalam rendering tidak ada yang namanya “cukup cepat”; kalau bisa lebih cepat, selalu ada manfaatnya
Semua arsitektur GPU modern tidak menangani geometri padat dengan baik. Dalam kasus seperti ini, sekadar mendorong segitiga ke GPU sangat tidak efisien dibanding atlas atau teknik lain
Sebagian besar GPU mendispatch pixel shader dalam unit 4. Jika semua segitiga berukuran 1 piksel, tiga thread shader tidak akan berkontribusi pada keluaran visual
Ini disebut quad overdraw. Selain itu, banyak waktu juga dihabiskan untuk pemrosesan vertex tanpa alasan nyata
Memang bisa, tetapi itu berarti mengorbankan sebagian anggaran frame dan meningkatkan penggunaan daya tanpa banyak keuntungan
Penulis memakai atlas karena ia melakukan supersampling kurva Bézier hingga 512 sampel per piksel, dan itu sangat mahal
Sebagai gantinya, menghitung integral perpotongan antara area kurva Bézier dan area subpiksel bisa jauh lebih cepat, dan tampaknya bisa berjalan real-time tanpa atlas sekaligus lebih akurat daripada supersampling
Dan hampir selalu kita ingin memakai waktu itu untuk hal lain
Semakin banyak waktu GPU yang dibutuhkan, semakin cepat pula hardware minimum yang disyaratkan. Teks memang keren dan penting, tetapi mungkin tidak cukup penting sampai layak kehilangan pengguna atau pelanggan
Kelihatannya lebih buruk daripada sekadar “OLED baru memang enak dilihat, tetapi punya masalah color fringing karena struktur subpiksel yang tidak standar”
Sejauh yang saya pahami, masalahnya bukan hanya tidak standar; pada OLED ada beberapa susunan subpiksel yang tidak saling kompatibel
Karena itu FreeType tidak mengimplementasikan rendering subpiksel untuk OLED, dan ini menjadi alasan untuk menghindari OLED jika perlu bekerja dengan teks
Ini juga bukan hanya masalah FreeType; toolkit GUI seperti Qt dan GTK juga harus ikut menyesuaikan. Saya tidak tahu pasti apakah ada kemajuan dalam penyelesaiannya
Akan bagus kalau kita bisa mengakses struktur subpiksel monitor secara arbitrer, dan mungkin informasi semacam ini seharusnya disampaikan lewat EDID
Misalnya laptop saya memakai susunan BGR vertikal, dan FreeType serta KDE mendukungnya dengan baik
Susunan yang aneh tampaknya sering muncul pada display HDR karena tiap warna perlu memakai ukuran berbeda agar warna tertentu, terutama biru, tidak burn-in terlalu cepat
Ini pekerjaan yang sangat mengesankan
Sebagai tambahan bagi yang tidak akrab dengan bidang ini, Valve membuat rendering teks SDF untuk game dan menerbitkan makalah terobosan tentang topik ini pada 2007
Hingga kini teknik ini masih sangat luas dipakai di video game, hampir tanpa perubahan
Pada 2012 Behdad Esfahbod membuat Glyphy, implementasi SDF yang berjalan di GPU dengan OpenGL ES, dan mendapat banyak pengakuan karena performa serta fitur baru seperti transformasi teks yang cepat, tetapi tidak dipakai secara luas
Sistem operasi modern dan browser web lebih memilih bergantung pada rasterisasi TrueType ala 1990-an ketimbang teknik seperti ini
Itu pendekatan yang ringan dan efektif, tetapi seperti terlihat di tulisan tersebut, tidak bisa melakukan penyelarasan subpiksel atau susunan subpiksel arbitrer; zoom in/out punya biaya performa besar; dan transformasi kompleks seperti skew, rotasi, atau transformasi 3D juga tidak bisa dilakukan di dalam mesin rendering teks
Jika perlu teks yang diputar atau ditransformasikan, bitmap harus di-resample, yang merusak semua detail kecil pembentuk keterbacaan sehingga hasilnya tidak bagus
Alasan kemajuannya lambat mungkin karena beban kerja dan risikonya terlalu besar dibanding manfaatnya. Membayangkan menulis ulang mesin browser web modern dengan rendering teks berakselerasi GPU saja sudah tidak mudah
Rendering glyph hanyalah satu bagian, sedangkan pemrosesan line breaking adalah masalah lain. Ini bisa lambat karena perlu banyak komunikasi antara CPU dan GPU, dan integrasi mendalam antara software dan GPU juga sulit
Cara ini performanya jauh lebih baik daripada memaksakannya masuk ke pipeline rendering 3D hardware seperti SDF
Safari mungkin juga begitu, tetapi saya tidak bisa memastikannya sendiri
Anggapan bahwa tingkat teknologi terbaru atau implementasi yang dikirimkan ke pengguna tidak berkembang itu keliru
SDF mengenkode jarak lokal (Distance) dari suatu piksel ke tepi huruf sebagai medan (Field), yaitu array data dua dimensi, dan menandai apakah jarak itu berada di dalam atau di luar huruf dengan bit tanda (Sign)
Setiap huruf memiliki peta data kecil; peta-peta itu dipaketkan bersama dalam bentuk file gambar yang ramah GPU, lalu digunakan oleh shader rendering SDF bersama file deskripsi yang memberi tahu di mana subgambar tiap huruf bisa ditemukan
Definisi huruf seperti ini sangat kuat terhadap interpolasi linear di antara nilai-nilai field, sehingga peta beresolusi relatif rendah pun memungkinkan pembesaran yang nyaris sempurna. GPU juga piawai menginterpolasi nilai piksel pada peta
Namun yang penting adalah peta-peta ini harus dipraproses selama pengembangan untuk semua karakter yang ingin dirender dari sistem font yang ada. Ini diperlukan untuk setiap karakter yang didukung font
Datanya memang jauh lebih sedikit daripada merender semua karakter sebagai font bitmap resolusi tinggi, tetapi jauh lebih banyak daripada definisi outline font itu sendiri
Sistem seperti sistem operasi atau browser, yang ingin mendukung semua teks yang mungkin ada di seluruh dunia, tidak bisa memakai SDF sebagai sistem rendering teks. Mereka akan membutuhkan peta SDF untuk seluruh himpunan karakter Unicode, sehingga ukurannya menjadi terlalu besar
Game cocok dengan pendekatan ini karena umumnya tidak harus memiliki lokalisasi yang benar-benar menyeluruh, atau tidak perlu menampilkan teks yang sepenuhnya arbitrer
SDF asli juga tidak bisa mendukung emoji. Ia hanya mengenkode jarak ke tepi glyph dan tidak memuat informasi warna di dalam glyph
Memang ada versi perbaikan bernama Multichannel SDF yang mendukung beberapa warna, tetapi jumlah total warnanya tetap terbatas
Dalam praktiknya, jika mengamati game yang memakai SDF untuk teks di dalam game sekaligus memiliki sistem chat tempat komunitas global saling berinteraksi, kemungkinan besar rendering teks di dalam game dan rendering teks pada sistem chat berbeda
Menurut https://keithclark.co.uk/articles/gpu-text-rendering-in-webk... (2014), “ketika sebuah elemen dipromosikan ke GPU di versi Chrome, Safari, atau Opera saat ini, ia kehilangan antialiasing subpiksel dan teks dirender dengan metode grayscale”
Kalau begitu, saya penasaran apa yang masih kurang. Jika mengikuti kalimat itu, setidaknya sebagian tahap dari string UTF-8 menjadi bitmap tampaknya bisa dilakukan di GPU
Ini pekerjaan yang mengesankan
Namun, secara pribadi saya merasa subpixel antialiasing tidak terlalu berarti. Pada era 2000-an saat orang masih memakai monitor 72dpi, ini adalah trik yang lumayan, tetapi di layar Retina modern sulit dibedakan, dan demi peningkatan yang sangat kecil kita mendapat berbagai kelemahan
Ini hanya berfungsi di atas latar belakang opak, hasil rasterisasinya tidak bisa diberi efek seperti perubahan ukuran, mirroring, atau blur, dan screenshot akan terlihat buruk jika dilihat di display lain
Menurut survei hardware Firefox [1], 16% pengguna memakai display beresolusi 1366x768
Ini bukan sekadar masalah hardware lama; monitor dan laptop 96dpi pun masih diproduksi hingga sekarang
[1]: https://data.firefox.com/dashboard/hardware
Argumen lainnya tidak terlalu penting dibandingkan hasil yang lebih baik dari subpixel rendering di tempat yang memang bisa diterapkan
Yang penting tentang SDF adalah ia menghitung jarak piksel ke tepi terdekat, sedangkan renderer font tradisional menghitung cakupan piksel
Cakupan piksel adalah yang optimal. Pada font kecil, SDF bisa terlihat buruk di bagian tempat tepi-tepi bertemu
Di display PPI tinggi mungkin ini tidak terlalu bermasalah. Saya pernah mengimplementasikan renderer SDF sendiri, dan hasilnya tampak lebih buruk daripada FreeType
Namun, benar bahwa distance field menimbulkan masalah pada titik perpotongan, atau secara umum pada sudut yang tajam
Ini bisa dikurangi sampai batas tertentu dengan memakai beberapa distance field dan merender perpotongannya. Contohnya ada https://github.com/Chlumsky/msdfgen