GPU’da Net Metin Render Etmek
(osor.io)- Mevcut Multi-Channel SDF yöntemi; ince çizgiler, büyük atlaslar, küçültme-büyütme ve yumuşak hareketlerde sınırlamalara sahip olduğu için GPU çalışma zamanı rasterizasyonu olarak yeniden uygulandı
- Yeni pipeline, yalnızca o anda görünen gliflerin Bézier eğrisi verilerini GPU’ya gönderiyor; çalışma zamanında bunları atlasa çizip ekranda örnekliyor
- Glif ekranda kalmaya devam ederse atlas önbelleği korunuyor, örnekler biriktirilerek kalite artırılıyor; ilk karede 8 samples-per-pixel ile başlayıp en fazla 512 samples değerine kadar rafine ediliyor
- Önbellek anahtarı font, glyph_index, piksel boyutu ve alt piksel ofsetini içeriyor; 8 bit sabit noktalı gösterimle yakın konum ve boyutlar aynı değere katlanarak yeniden kullanım artırılıyor
- Monitöre özgü RGB alt piksel düzeni örnekleme alanı olarak modellenirse OLED G9 gibi standart dışı dizilimlerde bile renk saçılması azaltılabiliyor; 4K tam ekran metin demosu Radeon 9070 üzerinde yaklaşık 0.1ms tepe maliyet gösteriyor
SDF Yerine Çalışma Zamanı Vektör Rasterizasyonunun Seçilme Nedeni
- Önceki uygulama Multi-Channel Signed Distance Fields kullanıyordu ve genel olarak iyi çalışıyordu; ancak gerçek kullanımda bazı kısıtlar devam ediyordu
- Kalite: İnce çizgilerde veya ayrıntısı çok olan fontlarda özellikler kaybolabiliyor ya da artefaktlar oluşabiliyordu; bazı durumlarda daha yüksek çözünürlüklü SDF gerekebiliyordu
- Atlas boyutu: SDF çevrimdışı üretildikten sonra atlasta saklandığı için, çok sayıda glife sahip Japonca ve Çince fontları tek bir atlasa pişirmek zordu
- Esneklik: Küçültme-büyütme sorunları veya alt piksel antialiasing gibi yeni fikirleri uygulamak zordu; çalışma zamanında üretilebilir ve düzenlenebilir vektör görsellere de uygun değildi
- Basitlik: Orijinal glif eğrilerini ara bir dokuya dönüştürme adımı sistem karmaşıklığını artırıyordu
- Miama gibi Latin fontları bile her glif için
64×64alan kullanan4096×1152bir atlas gerektiriyordu; çalışma zamanında birden fazla font kullanıldığında bellek ve streaming bant genişliği maliyeti büyüyordu - Yeni yaklaşımın amacı, glif tasarımcısının oluşturduğu Bézier eğrilerini daha doğrudan kullanarak orijinal veriden nihai piksele kadar olan dönüşüm adımlarını azaltmak
Genel Pipeline
- Temel fikir, tüm glifleri çevrimdışında önceden pişirmek yerine yalnızca o anda görünen gliflerin eğrilerini GPU’ya gönderip gerektiği anda rasterize etmek
- İşleme akışı basit
- Fonttan glif eğrisi verileri yüklenir
- GPU, çalışma zamanında glifi atlasa rasterize eder
- Ekran çıktısı sırasında ilgili atlas örneklenir
- Aynı glif sonraki karelerde de kullanılmaya devam ederse atlasta tutulur ve örnekler biriktirilerek yüksek kaliteli alt piksel antialiasing seviyesine kadar rafine edilir
- Vektör gösterimi doğrudan render edildiği için çözünürlük değişikliklerine yanıt vermek kolaydır; yalnızca tüm piksel kapsamasını değil, her alt piksel öğesinin kapsamasını da hesaplamak mümkündür
Glif Eğrilerinin İşlenmesi
- Font yüklemede, desteklenen formatları okumak için FreeType çevrimdışı aracın ara katmanı olarak kullanılır; her glifin eğrileri dolaşılıp özel bir asset formatında saklanır
- Glif eğrileri çizgi, ikinci dereceden Bézier ve üçüncü dereceden Bézier içerebilir; shader’ı basitleştirmek için hepsi ikinci dereceden Bézier’e dönüştürülür
- Çizgi, iki noktanın ortasına bir kontrol noktası eklenerek ikinci dereceden Bézier’e dönüştürülür
- Üçüncü dereceden Bézier, iki adet ikinci dereceden Bézier’e bölünür; bu, derece düşüren kayıplı bir dönüşümdür
- Üçüncü dereceden Bézier’i iki ikinci dereceden Bézier’e bölme yöntemi denenen fontların çoğunda iyi çalıştı; ancak hatayı daha da azaltan daha gelişmiş yöntemler de mümkündür
- Daha yüksek kaliteli dönüşüm gerekirse çevrimdışı araçla TrueType
.ttfgibi yalnızca ikinci dereceden Bézier içeren bir formata dönüştürülerek bu dönüşümün kendisi önlenebilir - Desmos grafiğinde girdi üçüncü dereceden Bézier ile ortaya çıkan iki ikinci dereceden Bézier’in şekilleri karşılaştırılabilir
Kapsama Hesabı ve Eğri Erişimi Optimizasyonu
- Kapsama, piksel bazında soldan sağa yatay ışınlar gönderip eğrilerle kesişimleri kontrol ederek winding number biriktirme yöntemiyle hesaplanır
- Matematiksel arka plan ve uygulama için GreenLightning’in GPU Font Rendering çalışmasına ve Sebastian Lague’in Rendering Text videosuna bakılabilir
- Kesişim hesabındaki hatalar belirli yükseklikteki örneklerde ortaya çıkabilir; ancak yüzlerce örnek biriktirildiğinde bir iki hata ortalama alındıktan sonra neredeyse görünmez olur
- En fazla 512 örnek biriktirildiğinde bir örnek hatalıysa
0yerine1/512=0.00195, veya1yerine511/512=0.99804olur - Kapsama uç değerlere yakınken clamp uygulanacak bir eşik de konabilir
- En fazla 512 örnek biriktirildiğinde bir örnek hatalıysa
- Örnek konumu dağılımında Martin Roberts’ın $R_2$ sequence yöntemi kullanılır; Shadertoy örneğinde dağılımın zamana göre değişimi görülebilir
- Eğri erişim maliyetini azaltmak için glifler birden çok yatay banda ayrılır ve her banda temas eden eğriler bitset olarak saklanır
- Yalnızca yatay ışınlar izlendiği için her texel’in kontrol edeceği eğri kümesi önemli ölçüde azaltılabilir
- Wave düzeyinde aynı bant aralığına erişim sağlanırsa eğri döngüleri ve okumaları skalerleştirilebilir
- Compute shader’da atlasa rasterize ederken thread’ler row-major biçimde yatay paketlenerek wave’in temas ettiği bant aralığı en aza indirilir
Atlas Paketleme ve Önbellek Anahtarı
- Başta doğrudan ekrana rasterize ediliyordu; ancak her karede yüksek kaliteli antialiasing hesaplamanın maliyeti yüksekti
- Metinlerin çoğu birden fazla kare boyunca aynı boyut ve konumda kalır; aynı glif aynı boyutta tekrarlandığından atlas ve zamansal birikim uygundur
- Atlas, gerekli glif yoksa alan ayırıp rasterizasyona başlar; zaten varsa mevcut sonucu aynen kullanır
- Kare sırasında atlasa ait glifler kontrol edilerek korunup korunmayacağı, daha fazla örneklenip örneklenmeyeceği veya kullanılmadığı için alanın serbest bırakılıp bırakılmayacağı belirlenir
- Atlas anahtarı şu öğeleri içerir
fontglyph_indexquantized_size_in_pixels_x,quantized_size_in_pixels_yquantized_subpixel_offset_x,quantized_subpixel_offset_y
- Alt piksel ofseti
frac(pixel_position)değerine karşılık gelir; glif piksel ızgarasına tam oturmadığında veya yumuşak şekilde kaydırıldığında konuma uygun antialiasing sonucu üretmek için gereklidir - Kayan noktalı değerler doğrudan anahtar olarak kullanılırsa matematiksel olarak aynı olması gereken değerler bile bit düzeyinde farklı olabilir; bu yüzden yakın konum ve boyutlar 8 bit kesir kısmına sahip sabit noktalı gösterimle aynı değere katlanır
- Statik metnin yoğun olduğu bir metin editöründe sabit aralıklı font kullanılıyorsa, karakter aralığı ve satır konumu piksel sınırlarına hizalanarak aynı glifin atlas önbellek isabet oranı artırılabilir
Z-Order Tabanlı Atlas Yerleşimi
- Çalışma zamanı glif yerleşimi Z-Order Packing ve boş hücre bitset’i kullanır
- Morton code tabanlı Z-Order, 2D hücreleri uzun bir 1D dizi gibi ele almayı sağlar; 2’nin kuvveti kadar ardışık hücre ayrıldığında 2D atlasta kare bir alan oluşur
- Temel hücre
16×16texel’dir ve glif boyutu bir sonraki 2’nin kuvvetine yuvarlanır- Örneğin
25×29bir glif32×32chunk ayırır - Bu durumda dört adet
16×16hücre gerektiği için hizalı ardışık 4 bit bulunup kullanılır
- Örneğin
- Latin alfabesindeki uzun ve ince glifler çoğunlukla dikey olduğundan, transpoze Z-Order kullanılırsa
l,j,i,1gibi glifler yarı alan kullanabilir - Buna karşılık Arapça gibi uzun ve ince gliflerin yatay olduğu durumlarda standart Z-Order daha uygundur
Zamansal Birikimle Kaliteyi Artırma Yöntemi
- Glif atlasta kalmaya devam ederse her karede biraz daha örnek eklenerek sonuç rafine edilebilir
- Varsayılan zamanlama, glifin ilk göründüğü karede 8 samples-per-pixel, sonraki karede 4, bir sonraki karede 2 ve daha sonra her karede 1 ekleyerek toplamda 512 örneğe kadar biriktirir
- İlk kare kalitesinin yüksek tutulmasının nedeni, yumuşak hareket eden veya boyutu değişen gliflerin her karede yeniden başlatılmış gibi davranmasıdır
- Kalite ve performans çeşitli yollarla ayarlanabilir
- Her karede eklenecek örnek/ışın sayısı
- Glifin ilk birkaç karesinde örnek artışı yapılıp yapılmayacağı
- Kare başına toplam örnek sayısı üst sınırı
- Mevcut glifleri her kare değil, birkaç karede bir güncelleyen time-slicing
- Glif eğrisi sayısına göre kesişim kontrolü maliyetini sınırlama yöntemi
- Bu uygulamada performans büyük bir sorun olmadı; girişteki tam ekran metin Radeon 9070 üzerinde 4K’da yaklaşık 0.1ms tepe maliyet gösterdi ve glifler maksimum örnek sayısına ulaştığında maliyet hızla 0’a yaklaştı
Alt Piksel Antialiasing ve Renk Saçılması
- Alt piksel antialiasing, monitör pikselindeki kırmızı, yeşil ve mavi öğeleri ayrı ayrı örnekleme alanları olarak görüp render eder
- Geleneksel RGB LCD’nin dikey şerit düzeninde yatay çözünürlük fiilen 3 katına çıkar; 4K için
3840×2160,3840×6480gibi ele alınabilir - OLED G9 gibi monitörlerin standart RGB dikey şeritlerden farklı standart dışı alt piksel düzenine sahip olması sorundur
- Varsayılan RGB dikey dikdörtgen düzeni varsayılırsa üstte yeşil, altta macenta renk saçılması görülür
- Örnek konumları monitörün gerçek alt piksel düzenine göre ayarlanırsa renk saçılması neredeyse yok olur ve yumuşak bir sonuç elde edilir
- Subpixel Zoo çeşitli alt piksel düzeni örneklerini gösterir; LG WOLED’in red-white-blue-green yapısı standart sıradan farklı bir örnektir
- Alt piksel öğelerini gerçek fiziksel boyutlarından daha büyük görüp birbirleriyle örtüşecek şekilde ayarlamak daha doğru sonuç verdi
- Alt piksellerin ışığı doğal olarak karışır ve biraz yayılır; bu nedenle örnekleme alanı fiziksel alt pikselden daha büyükmüş gibi davranır
- Örnekleme alanı piksel dışına da taşmalı ve komşu piksellerin alt piksel ışığıyla da karışmalıdır
- Evan Wallace’ın Easy Scalable Text Rendering yazısı, alt piksel antialiasing sonrası yatay blur gerektiğini savunur; bu da alt piksel öğelerini daha büyük ve örtüşen alanlar olarak görme yaklaşımıyla fiilen aynı etkiye sahiptir
Yazılımın Ekran Alt Piksel Bilgisini Bilebilmesi Gerekir
- Monitörün rastgele alt piksel düzenine erişim mümkün olursa, genel alt piksel antialiasing ve metin render kalitesi iyileştirilebilir
- Bu bilgi ortak ekran protokolleri üzerinden sağlanırsa, standart dizilimli monitörlerde bile donanıma özgü daha ince ayarlı rendering yapılabilir
- Ekran üreticileri, metin render sorunları nedeniyle daha iyi alt piksel düzenleri üzerinde deneme yapmaktan kaçınmak zorunda kalmaz
- Samsung, QD-OLED’de G8’den G9’a geçerken bu sorunları azaltmak için alt piksel düzenini değiştirdi; LG WOLED ve Samsung QD-OLED’de renk saçılması sıkça dile getiriliyor
- Bu sorunun donanım değişiminden çok yazılım düzeltmesiyle ele alınabilecek yönleri var
Gerçek Zamanlı Glif Render Etmenin Pratik Değeri
- İyi UI ve metin kalitesi, bir ürünün algılanan kalitesini yükseltebilir
- Oyunlarda metin kutuları, menüler, başlıklar ve bildirimler gibi kullanıcının dikkatini çeken öğeler sıkça görünür; metin kalitesindeki düşüş, kötü render edilmiş bir 3D sahne kadar deneyimi etkileyebilir
- Persona serisi, Metaphor: ReFantazio ve Nier: Automata, UI ve metin sunumu açısından iyi örneklerdir
- Gerçek zamanlı glif render kalitesini iyileştirme çabası, hem UI hem de oyun rendering’i için somut değere sahiptir
1 yorum
Hacker News yorumları
İlk videoda italik j’nin noktasına ne olmuş?
Alt piksel yazı tipi render etme okunabilirlik için önemli, ama yazıda belirtildiği gibi mevcut ekran standartlarından piksel dizilimi bilgisini alamıyor olmak üzücü
Dünya giderek Retina düzeyi ekranlara geçti ve orada alt piksel render etmenin neredeyse bir gerekçesi yok
Ekran görüntülerinin belirli bir alt piksel dizilimine bağlı kalması, bitmap büyütme/küçültmenin zorlaşması gibi pek çok sıkıntısı var
CRT ile Retina arasındaki LCD çağının geçici bir yeniliğiydi; bugün daha çok geriye dönük bir teknoloji gibi. Apple’ın birkaç yıl önce macOS’ten kaldırmasının bir nedeni var
Ekran üreticilerinin mi uygulamadığını merak ediyorum. Her hâlükârda en yaygın ekran modelleri için donanım bilgi veritabanında kolayca çıkarılıp saklanabilecek bir bilgi
Yazı harika ve çeşitli örnekleri gösteren “subpixel zoo”ya da bağlantı veriyor: https://geometrian.com/resources/subpixelzoo/
Monitörün yanlış dizilimi bildirdiği kaçınılmaz durumlarda da böyle bir yöntem gerekli
Anti-aliasing’siz bitmap yazı tipleri ya da hinting uygulanmış vektör yazı tipleriyle de okunabilirlik çok iyi
Ancak Çince veya Japonca gibi karakterleri çok karmaşık ayrıntılar içeren dillerde önemli hâle geliyor
GTK4, render işlemini GPU’ya taşırken RGB alt piksel render etmeyi bıraktı
GPU odaklı kararlar yüzünden RGB alt piksel render etmeyi sürdürmenin zorlaştığını duymuştum, ama yazı bunun mümkün olduğunu gösteriyor
O hâlde GTK’nin gerekçesi başka bir yerde olabilir, ya da sunulan çözümün dezavantajları vardır veya mevcut yığına iyi entegre olmuyordur
WebGL / WebGPU’da SDF ve MSDF uygulamakla ilgileniyorsanız, yazdığım öğreticiye bakabilirsiniz: https://infinitecanvas.cc/guide/lesson-015#msdf
JavaScript örneklerini Rust’a taşımayı denemiştim; doğrudan kopyala/yapıştır yapamıyorsunuz ama API yeterince benzer olduğu için port etmek kolay ve öğrenmek için ideal
WGPU belgelerini rahat kullanmaya başlamaya da vesile oluyor
GPU ile ilgili öğreticiler hazırlamayı seviyorum ve bunları böyle yapılandırmak isterim; mevcut bir şablon mu, yoksa bir dersin parçası mı merak ediyorum
Slug kütüphanesi, bu tür bir GPU glif rasterizer’ı uygulayan ticari bir middleware
[1]: https://sluglibrary.com/
cosmic-text’in yazı tipi ayrıştırma ve düzenleme kısımlarını kullanarak açık kaynak bir wgpu sürümü yapmak eğlenceli olurdu, ama sonunda Slug tarafından dava edilmek hiç eğlenceli olmaz
GPU sanki fiilen sınırsız vertex/piksel çizme gücüne sahipmiş gibi görünüyor; bu yüzden metni neden çevrimdışı render edip atlas içinde saklamak ve SDF gibi numaralar kullanmak gerektiğini hâlâ anlamıyorum
Yazıda da glif eğrilerinin atlasa yazıldığını söylüyor; shader’ın metni doğrudan render etmemesi için bir neden mi var, merak ediyorum
Bezier’i üçgen mesh’e dönüştürmenin mutlaka bir yolu vardır. CAD uygulaması için bir GPU metin renderer’ı yapmaya yeni başlıyorum; umarım yakında nedenini öğrenirim
GPU hızlıdır ama sonsuz hızlı değildir; önceden render edilmiş dokuları örneklemede çok güçlüdür
Bu yalnızca hız meselesi değil, güç tüketimi meselesi de. Zaten monitörün yenileme hızına ulaştıysanız ek performans artışı tepki hızını yükseltmez, ama pil ömrünü uzatabilir
Render etmede “yeterince hızlı” diye bir nokta yoktur; daha hızlı olmak her zaman kazanç sağlar
Modern GPU mimarilerinin hiçbiri yüksek yoğunluklu geometri işlemeyi iyi yapmaz. Böyle durumlarda üçgenleri GPU’ya olduğu gibi yığmak, atlas veya başka tekniklere göre çok verimsizdir
Çoğu GPU piksel shader’larını 4’lü gruplar hâlinde dispatch eder. Üçgenlerin hepsi 1 piksel boyutundaysa shader thread’lerinin 3’ü görsel çıktıya katkı sağlamaz
Buna quad overdraw denir. Üstelik gerçek bir neden yokken vertex işlemeye de çok zaman harcanır
Mümkün, ama kayda değer bir kazanç olmadan frame bütçesinin bir kısmından vazgeçip güç tüketimini artırmış olursunuz
Yazar, piksel başına en fazla 512 örnekle Bezier eğrilerini supersampling yaptığı için atlas kullanıyor; bu çok pahalı
Bunun yerine Bezier eğrisi alanı ile alt piksel alanının kesişim integralini hesaplayan bir formül çok daha hızlı olabilir ve atlas olmadan gerçek zamanlı çalışıp supersampling’den daha doğru sonuç verebilir gibi geliyor
Ve neredeyse her zaman o zamanı başka bir yerde kullanmak istersiniz
Daha fazla GPU zamanı gerektikçe minimum donanım gereksinimleri de daha hızlı yükselmek zorunda kalır. Metin havalı ve önemlidir, ama kullanıcı ya da müşteri kaybettirecek kadar önemli olmayabilir
“Yeni OLED’ler görüntü olarak iyi ama standart dışı alt piksel yapısı yüzünden renk taşması sorunu var” demekten daha kötü görünüyor
Anladığım kadarıyla mesele yalnızca standart dışı olmaları değil; OLED’lerde birbiriyle uyumlu olmayan birden fazla alt piksel dizilimi var
Bu yüzden FreeType OLED için alt piksel render etmeyi uygulamadı ve metinle çalışmak gerekiyorsa OLED’den kaçınmak için bir neden haline geliyor
Bu yalnızca FreeType’ın sorunu da değil; Qt, GTK gibi GUI araç takımlarının da buna uyum sağlaması gerekiyor. Çözümde ilerleme var mı pek bilmiyorum
Herhangi bir monitörün alt piksel yapısına erişebilmek iyi olurdu; belki de bu bilgi EDID ile iletilmeli
Örneğin benim dizüstüm dikey BGR dizilimine sahip ve FreeType ile KDE bunu iyi destekliyor
Tuhaf dizilimler çoğu zaman HDR ekranlarda belirli renklerin, özellikle mavinin, çok hızlı yanmasını önlemek için her renkte farklı boyutlar kullanma gereğinden kaynaklanıyor gibi görünüyor
Çok etkileyici bir çalışma
Bu alana aşina olmayanlar için ekleyeyim: Valve oyunlar için SDF metin render etme tekniğini geliştirdi ve 2007’de bu konuda çığır açıcı bir makale yayımladı
Bugün de video oyunlarında neredeyse değiştirilmeden çok yaygın kullanılan bir teknik
2012’de Behdad Esfahbod, OpenGL ES ile GPU’da çalışan bir SDF uygulaması olan Glyphy’yi yaptı; performansı ve hızlı metin dönüşümü gibi yeni özellikleri sayesinde geniş kabul gördü ama yaygın kullanım kazanmadı
Modern işletim sistemleri ve web tarayıcıları bu tür teknikler yerine 1990’lar tarzı TrueType rasterleştirmeye dayanmayı tercih ediyor
Hafif ve etkili bir yaklaşım ama yazıda görüldüğü gibi alt piksel hizalama ya da keyfi alt piksel dizilimi yapılamıyor; yakınlaştırma/uzaklaştırma performans maliyeti getiriyor ve eğme, döndürme, 3D dönüşüm gibi karmaşık dönüşümler de metin render motorunun içinde yapılamıyor
Döndürülmüş ya da deforme edilmiş metin gerekiyorsa bitmap’i yeniden örneklemek zorundasınız; bu da okunabilirliği sağlayan küçük özelliklerin hepsini bozup kötü görünmesine neden oluyor
İlerlemenin yavaş olmasının nedeni, kazanıma kıyasla iş yükü ve riskin çok büyük olması olabilir. Modern bir web tarayıcısı motorunu GPU hızlandırmalı metin render etme için yeniden yazmayı hayal etmek bile kolay değil
Glif render etme bunun yalnızca bir parçası; satır kırma işlemi ise ayrı bir sorun. CPU ile GPU arasında çok iletişim gerekebilir ve bu yavaş olabilir; yazılım ile GPU’nun derin entegrasyonu da zordur
Bu yöntem, SDF gibi donanımın 3D render pipeline’ına zorla uydurmaya çalışmaktan çok daha yüksek performanslı
Safari’de de muhtemelen öyledir ama doğrudan doğrulayarak söyleyemem
En güncel teknoloji seviyesinin ya da kullanıcılara dağıtılan uygulamaların gelişmediği düşüncesi yanlış
SDF, belirli bir pikselden harfin kenarına kadar olan yerel mesafeyi (Distance), verinin iki boyutlu dizisi olan bir alan (Field) olarak kodlar; bu mesafenin harfin içinde mi dışında mı olduğunu da işaret (Sign) bitiyle gösterir
Her harfin küçük bir veri haritası vardır; bunlar GPU dostu bir görüntü dosyası biçiminde birlikte paketlenir ve her harfin alt görüntüsünün nerede bulunacağını söyleyen bir açıklama dosyasıyla birlikte SDF render shader’ı tarafından kullanılır
Bu tür harf tanımları, alan değerleri arasındaki doğrusal interpolasyona karşı çok dayanıklıdır; bu yüzden görece düşük çözünürlüklü haritalarla bile neredeyse kusursuz büyütme yapılabilir. GPU’lar da haritadaki piksel değerlerini interpolate etmede iyidir
Ancak önemli nokta, bu haritaların geliştirme sırasında, mevcut yazı tipi sisteminden render etmek istediğiniz tüm karakterler için önceden işlenmesi gerektiğidir. Yazı tipinin desteklediği her karakter için gerekir
Tüm karakterleri yüksek çözünürlüklü bitmap yazı tipi olarak render etmeye göre veri miktarı çok daha azdır ama yazı tipi kontur tanımının kendisinden çok daha fazladır
İşletim sistemleri ya da tarayıcılar gibi dünya çapında mümkün olan tüm metinleri desteklemek isteyen sistemler SDF’yi metin render sistemi olarak kullanamaz. Tüm Unicode karakter kümesi için SDF haritaları gerekir ve bu çok büyük olur
Oyunlara genelde iyi uyar; çünkü çoğunlukla yerelleştirmenin yeterince iyi olmaması sorun edilmeyebilir ya da tamamen keyfi metin göstermeleri gerekmez
Orijinal SDF emoji de destekleyemez. Yalnızca glif kenarına kadar olan mesafeyi kodlar, glifin içindeki renk bilgisini içermez
Birden çok rengi destekleyen geliştirilmiş sürüm Multichannel SDF vardır ama toplam renk sayısında sınır bulunur
Pratikte oyun içi metinde SDF kullanan ve tüm dünyadan toplulukların etkileştiği bir sohbet sistemi de olan oyunlara yakından bakarsanız, oyun içi metin ile sohbet sistemindeki metin render etmenin farklı olma ihtimali yüksektir
https://keithclark.co.uk/articles/gpu-text-rendering-in-webk... (2014) şöyle diyor: “Chrome, Safari veya Opera’nın mevcut sürümlerinde bir öğe GPU’ya yükseltildiğinde alt piksel anti-aliasing’i kaybeder ve metin gri tonlamalı yöntemle render edilir”
Öyleyse eksik olanın ne olduğunu merak ediyorum. Bu cümleye göre en azından UTF-8 dizgesinden bitmap’e giden aşamanın bir kısmı GPU’da yapılabiliyor olmalı gibi geliyor
Etkileyici bir iş
Ancak alt piksel kenar yumuşatmaın kişisel olarak pek bir anlamı olmadığını düşünüyorum. 72 dpi monitörlerin kullanıldığı 2000’lerde iyi bir hack’ti, ama modern Retina ekranlarda fark edilmesi zor ve çok küçük bir iyileştirme uğruna birçok dezavantaj getiriyor
Yalnızca opak arka planlar üzerinde çalışıyor; rasterleştirilmiş sonuca yeniden boyutlandırma, aynalama, blur gibi efektler uygulanamıyor ve ekran görüntüleri başka bir ekranda bakıldığında kötüleşiyor
Firefox donanım araştırmasına [1] göre kullanıcıların %16’sı 1366x768 çözünürlüklü ekran kullanıyor
Bu yalnızca basitçe eski donanım meselesi değil; 96 dpi monitörler ve dizüstü bilgisayarlar hâlâ üretiliyor
[1]: https://data.firefox.com/dashboard/hardware
Diğer argümanlar, uygulanabildiği yerlerde alt piksel render etmenin verdiği daha iyi sonuçlarla karşılaştırıldığında pek önemli değil
SDF, en yakın kenara olan piksel mesafesini hesaplar; geleneksel yazı tipi renderer’larının ise piksel kapsamasını hesaplaması önemli bir farktır
Piksel kapsaması optimaldir. Küçük yazı tiplerinde, kenarların birleştiği yerlerde SDF kötü görünebilir
Yüksek PPI ekranlarda bu daha az sorun olabilir. Kendi SDF renderer’ımı uyguladım, ama FreeType’tan daha kötü görünüyordu
Ancak kesişim noktalarında, ya da genel olarak keskin köşelerde mesafe alanının sorun çıkardığı tespiti doğru
Birden fazla mesafe alanı kullanıp bunların kesişimini render etmek bunu bir ölçüde hafifletebilir. Örneğin https://github.com/Chlumsky/msdfgen var