- Metin render etme kalitesine ilişkin sorunları, özellikle SDF (mesafe alanı) tabanlı yöntemlerin sınırlarını çözmek için yeni bir gerçek zamanlı vektör render tekniği öneriliyor
- Glifler (karakterler) vektör eğrileri halinde doğrudan GPU’ya gönderilip gerçek zamanlı rasterize edilerek sınırsız çözünürlük ve düşük bellek kullanımı sağlanıyor
- Texture atlas ve zaman içinde biriktirme (temporal accumulation) teknikleri kullanılarak yüksek anti-aliasing kalitesi ve verimli önbellekleme elde ediliyor
- OLED, LCD gibi farklı subpixel yapılarına da uyarlanabildiği için fringing (renk saçılması) olmadan yumuşak ve net sonuçlar veriyor
- Gerçek zamanlı metin, UI ve oyunlar gibi alanlarda yüksek kaliteli font render etme için basit ama ölçeklenebilir bir yaklaşım sunuluyor
Giriş: metin render etmenin zorlukları
- Gerçek zamanlı metin render etmede aliasing (basamaklanma), büyük texture’lar, derleme süresi, yakınlaştırma/uzaklaştırma, yumuşak hareket gibi çeşitli sorunlar bulunuyor
- Yaygın olarak kullanılan Multi-Channel Signed Distance Fields (SDFs) yöntemi, kalite ve esneklik açısından sınırlamalara sahipti
- Son dönemde OLED monitörlerdeki standart dışı subpixel yapıları ve fringing sorunları, subpixel anti-aliasingi de hesaba katan yeni bir yaklaşım geliştirilmesine neden olmuş
Mevcut SDF yaklaşımının sınırlamaları
Kalite
- SDF yaklaşımında, ince detaylar veya ince çizgiler içeren fontlarda kalite düşüşü ve bilgi kaybı ortaya çıkabiliyor
- Çözünürlük artırılmadığında bazı gliflerde artifact kalabiliyor
Atlas boyutu
- SDF önce çevrimdışı üretilip sonra atlas olarak saklanıyor; bu da çok sayıda glif veya CJK (Çince, Japonca, Korece) fontları için pratikte imkânsız boyutlara ulaşabiliyor
- Aynı anda birden fazla font kullanıldığında bellek tüketimi ve streaming bant genişliği yükü artıyor
Esneklik ve sadelik
- SDF bir ara aşama olduğu için kaynak veriden nihai sonuca kadar tüm akış karmaşık hale geliyor
- Gerçek zamanlı veya dinamik vektör görselleri doğrudan kullanma ya da düzenleme konusunda ciddi kısıtlar oluşuyor
Yeni yöntem: vektör eğrilerini gerçek zamanlı rasterize etmek
- Texture’ı önceden üretmek yerine, ekranda gerçekten görünen gliflerin vektör eğrisi verileri (Bezier eğrileri vb.) doğrudan GPU’ya gönderiliyor ve orada rasterize ediliyor
- Atlas texture içine yalnızca gerektiği kadar glif yerleştiriliyor; kullanım sıklığına göre tutuluyor veya serbest bırakılıyor
- Glif ekranda kaldığı sürece örnek biriktirme (temporal accumulation) ile çok yüksek kaliteli, daha yumuşak (anti-aliased) sonuçlar elde ediliyor
- İşlem her zaman vektör tabanlı olduğu için çözünürlük sınırı olmadan net sonuç sağlanıyor
Font eğrisi verisinin işlenmesi
- FreeType gibi açık kaynak kütüphanelerle farklı font formatları okunup gliflerin eğri bilgisi çıkarılıyor
- Glifler çizgi, ikinci/üçüncü dereceden Bezier eğrileri olarak ayrıştırılıyor ve GPU shader tarafındaki işlemleri basitleştirmek için tüm eğriler ikinci dereceden Bezier eğrilerine dönüştürülüyor
- Çizgiler, orta kontrol noktası eklenerek ikinci dereceden eğriye dönüştürülüyor
- Üçüncü dereceden eğriler, ikiye bölünmüş ikinci dereceden eğrilere çevriliyor
Coverage (piksel içi doluluk) hesabı
- Her piksel için yatay yönde (ray) eğrilerle kesişimler hesaplanıyor, winding number (birikimli kesişim sayısı) ile içeride/dışarıda olduğu belirleniyor
- Yüzlerce örnekleme (n kez biriken örnek) toplanıyor; bazı küçük hataların nihai sonuca etkisi yok denecek kadar az oluyor
- Örnek noktası yerleşimi (quasirandom sequence) tekniğiyle her karede farklı konumlardan sonuç biriktiriliyor
Eğri erişiminin optimize edilmesi
- Glifler yatay bantlar (band) halinde bölünüyor, her bantta yalnızca ilgili eğriler test edilerek işlem miktarı azaltılıyor
- Thread yerleşimi ve bant bazlı yineleme ile GPU üzerindeki toplu işlem verimliliği en üst düzeye çıkarılıyor
Atlas paketleme ve yönetimi
- Atlas’ta (paylaşılan texture) her glif görüntüsü için yer ayrılıp yönetiliyor
- Atlas’ta olmayan glifler için yeni alan ayrılıp rasterize ediliyor, mevcut olanlar yeniden kullanılıyor
- Aynı glif için bile subpixel konumu ve boyutuna göre farklı sürümler gerekebiliyor
- Z-Order Packing (Morton code vb.) ile tek boyutlu bitset ile 2D alan arasında verimli paketleme yapılıyor
- Latin dilleri için dikey, Arapça gibi diller için yatay temel alınması gibi dil yapısına göre esnek uygulamalar mümkün
- Glif artık gerekli değilse atlas alanı yeniden tahsis edilerek kullanılabiliyor
Zaman içinde biriktirme (Temporal Accumulation)
- Glif önbellekleme ve örnek biriktirme sayesinde, gösterimin hemen ardından hızlıca yüksek kaliteli örnekler elde edilip sonraki karelerde daha ince düzeltmeler yapılıyor
- İlk karede 8 örnek/piksel, sonrasında örnek sayısı kademeli olarak azaltılıyor, en fazla 512 birikime kadar çıkılıyor
- Yumuşak glif gösterimi ile kaynak optimizasyonu birlikte sağlanıyor
Subpixel anti-aliasing ve fringing önleme
- Subpixel düzeyinde (RGB gibi her alt bileşeni örnek kabul ederek) render alanı dağıtılarak yatay çözünürlük artışı etkisi sağlanıyor
- Standart LCD yapısı, OLED/WOLED gibi farklı dizilimler destekleniyor
- Fringing (renk saçılması) olmadan yumuşak etki tanımlanabiliyor
- Subpixel örnekleri üst üste gelecek şekilde yerleştirildiğinde gerçek monitördeki ışık karışımı etkisi de yansıtılabiliyor
- Piksel sınırları ya da hinting olmadan da doğal ve net çıktı elde etmek mümkün
Ekrana göre subpixel yapı yaklaşımının önemi
- Monitörün subpixel dizilimi bilgisi programatik olarak öğrenilebilirse çok daha hassas render sonuçları elde etmek mümkün
- Bunun donanım sınırından çok yazılım işleme problemi olduğu vurgulanıyor
Sonuç ve kullanım potansiyeli
- İyi metin render etmenin genel kullanılabilirlik ve hizmet kalitesi üzerinde büyük etkisi var
- Özellikle UI/oyun gibi alanlarda yüksek kaliteli font gösterimi, ürün deneyiminde ciddi fark yaratabiliyor
- Sadelik, ölçeklenebilirlik, yüksek kalite ve esneklik ilkelerini gerçekleştirebilen bir çalışma yapısı sunuyor
- Açık kaynak uygulama, farklı subpixel yapılarına uyum gibi özellikleriyle gerçek endüstriyel/üretim kullanımına çok uygun
1 yorum
Hacker News görüşleri
cosmic-textile font parsing/layout kullanarak açık kaynak birwgpusürümü yapmak eğlenceli olabilir, ama sonradan Slug tarafından dava edilmek sorun olur diye endişe dile getiriliyor