Ini adalah demonstrasi rendering teks secara langsung pada GPU menggunakan garis besar vektor yang ditentukan oleh font.
Kontur mesin terbang dikonversi menjadi daftar kurva bezier kuadratik individu (ditentukan oleh titik kontrol mereka), yang diunggah ke GPU.
Quad dihasilkan untuk setiap mesin terbang dan piksel shader menentukan apakah setiap piksel ada di dalam atau di luar mesin terbang. Untuk melakukan ini, jumlah gulungan piksel dihitung dengan memotong sinar dengan kurva bezier. Di setiap persimpangan, sinar masuk atau keluar dari area yang diisi sebagaimana ditentukan oleh arah kurva bezier relatif terhadap sinar. Di setiap pintu keluar, jumlah belitan meningkat satu dan pada setiap entri, jumlah belitan berkurang satu. Setelah mempertimbangkan semua persimpangan, nomor belitan akan menjadi nol jika piksel berada di dalam garis besar.
Arah sinar tidak masalah untuk perhitungan angka berliku ini, tetapi matematika dapat sangat disederhanakan dengan menggunakan sinar yang sejajar dengan sumbu x. Dengan mengurangi posisi sampel dari titik kontrol kurva bezier, sistem koordinat digeser sehingga asal mula sinar ada di
Untuk menemukan persimpangan antara sinar dan kurva bezier tunggal, ingat bahwa kurva bezier kuadrat dijelaskan oleh rumus berikut (untuk latar belakang pada kurva bezier lihat kecantikan dan primer):
Hanya mengambil komponen y dan menerapkan kondisi tersebut
Yang dapat diatur ulang ke:
Sehingga dapat diselesaikan dengan menggunakan rumus kuadrat:
Mengganti
Persamaan kuadrat mungkin memiliki nol, satu atau dua solusi. Selanjutnya, solusi
Pada titik ini, persimpangan antara kurva sinar dan bezier telah diidentifikasi, tetapi mereka masih perlu diklasifikasikan sebagai entri atau keluar. Demo yang disediakan oleh Dobbie secara eksplisit menghitung turunan dari kurva bezier untuk masing -masing
Oleh karena itu, kurva bezier melintasi sumbu x dalam arah yang tetap pada setiap larutan, dan, dikombinasikan dengan konvensi untuk orientasi kontur,
Pendekatan yang berbeda untuk memahami hubungan ini adalah memperhatikan bahwa, karena tanda-tanda berbeda yang digunakan dalam solusi dan akar kuadrat menjadi non-negatif,
Jika parameter
Anti-aliasing sepanjang arah sinar diimplementasikan dengan mempertimbangkan jendela seukuran piksel di sekitar asal sinar. Jika persimpangan jatuh ke jendela ini, maka angka belitan diubah hanya secara fraksional untuk menghitung cakupan piksel. Berat fraksional ditentukan oleh jarak dari tepi kiri piksel (ini konsisten dengan sinar yang menunjuk ke kanan). Dengan mempertimbangkan bagian individual, orang dapat melihat bahwa ini menghitung cakupan satu dimensi dengan tepat.
Perhatikan, bahwa kita juga harus mempertimbangkan persimpangan sedikit di belakang asal sinar sekarang, tetapi implementasi pertama-tama menghitung persimpangan dengan sumbu x dan kemudian memverifikasi posisi x, sehingga tidak banyak berubah. Cara berpikir yang berbeda tentang hal ini adalah kondisinya
Untuk anti-aliasing penuh kita dapat menggunakan beberapa sinar di sepanjang arah yang berbeda (misalnya satu di sepanjang sumbu x dan satu di sepanjang sumbu y).
Teknik semacam ini tunduk pada artefak dari ketepatan numerik yang terbatas dari angka titik mengambang. Gambar di bawah ini menunjukkan contoh artefak seperti itu ketika sepenuhnya diperbesar (dan mengetahui ke mana harus mencari). Namun demikian, saya telah menemukan implementasi ini sudah cukup stabil secara numerik. Setiap artefak yang tersisa dapat dihilangkan dengan menggunakan algoritma slug, yang tidak diimplementasikan di sini karena paten terkait.
Demo ini juga tidak menerapkan optimasi kinerja apa pun (seperti banding) dan mungkin memiliki penggunaan GPU tinggi dalam beberapa skenario dan ketika menggunakan font yang sangat kompleks.

Klon proyek secara rekursif untuk menginisialisasi submodul untuk dependensi (atau jalankan git submodule update --init jika Anda sudah mengkloning repo):
git clone --recursive https://github.com/GreenLightning/gpu-font-rendering.git
cd gpu-font-rendering
# Note: CMake will create the build directory.
cmake -S . -B build
make -j8 --directory build
Di Windows, Anda mungkin ingin menggunakan CMake GUI dan/atau Visual Studio sebagai gantinya.
Di Linux, Anda mungkin harus menginstal paket tambahan untuk pengembangan OpenGL (misalnya sudo apt-get install xorg-dev libgl1-mesa-dev untuk ubuntu).
./build/main
Program ini mensyaratkan direktori fonts dan shaders berada di direktori saat ini untuk memuat sumber dayanya. Jika Anda hanya mendapatkan jendela hitam , ini kemungkinan besar masalahnya. Periksa direktori kerja Anda dan periksa konsol untuk kesalahan.
Diuji pada Windows 10, MacOS Monterey dan Ubuntu 22.04.