Sürüm 4.1 itibariyle OpenGL'de metin oluşturma için son teknoloji nedir? [kapalı]


199

OpenGL'de metin oluşturma hakkında bir dizi soru var, örneğin:

Ancak çoğunlukla tartışılan, sabit işlevli boru hattı kullanılarak dokulu dörtlüler yapmaktır. Kesinlikle gölgelendiriciler daha iyi bir yol yapmalıdır.

Uluslararasılaşma konusunda gerçekten endişelenmiyorum, dizelerimin çoğu işaretli etiketler olacak (tarih ve saat veya tamamen sayısal). Ancak araziler ekran yenileme hızında yeniden oluşturulacak ve biraz metin olabilir (ekranda birkaç bin gliften fazla değil, ancak donanım hızlandırmalı düzen güzel olurdu).

Modern OpenGL kullanarak metin oluşturma için önerilen yaklaşım nedir? (Yaklaşımı kullanarak mevcut yazılımlara atıfta bulunulması, iyi çalıştığına dair iyi bir kanıttır)

  • Örneğin konum ve yönlendirmeyi ve karakter dizisini kabul eden ve dokulu dörtlüler yayan geometri gölgelendiricileri
  • Vektör yazı tiplerini oluşturan geometri gölgelendiricileri
  • Yukarıdaki gibi, ancak mozaik gölgeleyiciler yerine
  • Yazı tipi rasterleştirmesi yapmak için bir hesaplama gölgelendiricisi

10
Son zamanlarda OpenGL ES odaklı olmakla birlikte, en son teknolojiye cevap veremiyorum, ancak GLU tesselator kullanarak bir TTF'yi yormak ve CPU'da hesaplanan karakter aralığı ile eski sabit işlevsellik boru hattı aracılığıyla geometri olarak göndermek, - neredeyse on yıl önce bile donanım ve iyi performans tahsis. Bu yüzden sadece gölgelendiricilerle değil, daha iyi bir yol bulabilirsiniz (elbette kriterlerinize bağlı olarak). FreeType, Bezier glif sınırlarını ve karakter aralığı bilgisini tükürebilir, böylece çalışma zamanında bir TTF'den canlı olarak çalışabilirsiniz.
Tommy

QML2 (Qt5'ten) metin oluştururken OpenGL ve mesafe alanlarıyla bazı ilginç hileler yapıyor: blog.qt.digia.com/blog/2012/08/08/native-looking-text-in-qml-2
mlvljr

Bu yüzden tekrar kaybetmiyorum, işte Valve'in mesafe alanı yöntemini uygulayan bir kütüphane. code.google.com/p/glyphy Denemedim . Ayrıca belki de bir göz atmaya değer: code.google.com/p/signed-distance-field-font-generator
Timmmm

7
bu "konu dışı" yığın taşmasının laneti. ciddi anlamda?
Nikolaos Giotis

Yanıtlar:


202

Toplamda yalnızca bir düzine karakter oluşturmadığınız sürece oluşturma anahatları, eğriliğe yaklaşmak için karakter başına gereken köşe sayısı nedeniyle "hareketsiz" kalır. Piksel gölgelendiricideki çerçeve eğrilerini değerlendirmek için yaklaşımlar olmasına rağmen, bunlar kolayca antialiasize edilmekten muzdariptir, bu da mesafe haritası dokulu bir dörtlü kullanarak önemsizdir ve gölgelendiricideki eğrileri değerlendirmek hala hesaplamadan çok daha pahalıdır.

"Hızlı" ve "kalite" arasındaki en iyi değiş tokuş hala imzalı mesafe alanı dokusuna sahip dokulu dörtlüdür. Öyle çok az ama çok değil, daha yavaş bir düz, normal dokulu dörtlü kullanmaktan daha. Kalitesi ise tamamen farklı bir baloda. Sonuçlar gerçekten çarpıcı, elde edebileceğiniz kadar hızlı ve parlaklık gibi efektlerin de eklenmesi çok kolay. Ayrıca, teknik gerekirse eski donanıma güzel bir şekilde indirilebilir.

Teknik için ünlü Valve belgesine bakın .

Teknik kavramsal olarak örtülü yüzeylerin (metaballlar ve benzeri) nasıl çalıştığına benzer, ancak çokgen üretmez. Tamamen piksel gölgelendiricisinde çalışır ve bir uzaklık fonksiyonu olarak dokudan örneklenen mesafeyi alır. Seçilen bir eşiğin (genellikle 0,5) üzerindeki her şey "giriş", diğer her şey "çıkış" tır. En basit durumda, 10 yıllık gölgelendirici özelliği olmayan donanımda, alfa test eşiğini 0,5'e ayarlamak tam olarak bunu yapacaktır (özel efektler ve kenar yumuşatma olmadan da).
Yazı tipine biraz daha fazla ağırlık eklemek isterseniz (sahte kalın), biraz daha küçük bir eşik, tek bir kod satırını değiştirmeden hile yapar (sadece "font_weight" üniformanızı değiştirin). Işıma efekti için, kişi sadece bir eşiğin üzerindeki her şeyi "giriş" olarak ve diğeri (daha küçük) eşiğin üzerindeki her şeyi "dışarı, ama parlaklıkta" ve ikisi arasındaki LERP'ler olarak kabul eder. Kenar yumuşatma benzer şekilde çalışır.

Tek bir bit yerine 8 bitlik imzalı bir mesafe değeri kullanarak, bu teknik doku haritanızın etkin çözünürlüğünü her boyutta 16 kat artırır (siyah ve beyaz yerine, tüm olası tonlar kullanılır, bu nedenle 256 kat aynı depolama alanını kullanan bilgiler). Ancak 16x'in çok ötesinde büyütseniz bile, sonuç hala oldukça kabul edilebilir görünüyor. Uzun düz çizgiler nihayetinde biraz dalgalı olacak, ancak tipik "bloklu" örnekleme eserleri olmayacak.

Dörtlü noktaları noktalardan oluşturmak için bir geometri gölgelendirici kullanabilirsiniz (veri yolu bant genişliğini azaltın), ancak dürüstçe kazançlar oldukça marjinaldir. GPG8'de açıklandığı gibi anında karakter oluşturma için de aynı şey geçerlidir. Örnekleme yükü yalnızca çizilecek çok fazla metniniz varsa itfa edilir . Bence kazanımlar, eklenen karmaşıklık ve indirilemezlik ile hiçbir ilgisi yok. Ayrıca, sabit kayıtların miktarı ile sınırlandırılırsınız veya önbellek tutarlılığı için en uygun olmayan bir doku tampon nesnesinden okumak zorunda kalırsınız (ve amaç, başlamak için optimize etmekti!).
Yüklemeyi zamanında önceden planladıysanız ve son 15 yıl içinde üretilen her donanımda çalışacaksa, basit, sade eski bir köşe arabelleği de hızlıdır (muhtemelen daha hızlıdır). Ayrıca, yazı tipinizdeki belirli sayıda karakterle veya oluşturulacak belirli sayıda karakterle sınırlı değildir.

Yazı tipinizde 256 karakterden fazla olmadığından eminseniz, doku dizileri, geometri gölgelendiricisindeki noktalardan dörtlü üretmeye benzer şekilde veri yolu bant genişliğini ortadan kaldırmaya değer olabilir. Bir dizi dokusu kullanılırken, tüm dörtlülerin doku koordinatları aynı, sabit sve tkoordinatlara sahiptir ve yalnızca koordinatta farklılık gösterir r, bu da oluşturulacak karakter dizinine eşittir.
Ancak diğer tekniklerde olduğu gibi, beklenen kazanımlar önceki nesil donanımlarla uyumsuzluk pahasına marjinaldir.

Uzaklık dokuları oluşturmak için Jonathan Dummer'in kullanışlı bir aracı var: açıklama sayfası

Güncelleme: Programlanabilir Köşe Çekmede (D.Rákos, "OpenGL Insights", s. 239)
daha yakın zamana işaret edildiği gibi , en yeni nesil GPU'larda köşe verisinin programcıdan gölgelendiriciden çekilmesiyle ilişkili önemli bir ek gecikme veya ek yük yoktur, aynı şeyi standart sabit fonksiyon kullanarak yapmakla karşılaştırılır. Ayrıca, en yeni nesil GPU'lar gittikçe daha makul büyüklükte genel amaçlı L2 önbelleklere sahiptir (örn. Nvidia Kepler'de 1536kiB), bu nedenle dörtlü köşeler için rasgele ofsetleri bir tampon dokudan çekerken tutarsız erişim sorunu beklenebilir. sorun.

Bu, sabit bir dokuyu (dörtlü boyutlar gibi) bir tampon dokusundan daha çekici bir şekilde çekme fikrini ortaya çıkarır. Varsayımsal bir uygulama böylece PCIe ve bellek aktarımlarının yanı sıra GPU belleğini aşağıdaki gibi bir yaklaşımla en aza indirebilir:

  • Bu dizinden geçen bir tepe gölgelendiriciye tek girdi olarak yalnızca bir karakter dizini (görüntülenecek karakter başına bir tane) yükleyin gl_VertexIDve bunu geometri gölgelendiricisinde 4 noktaya yükseltin, hala karakter dizini ve köşe kimliği (bu "tepe noktası gölgeleyicisinde kullanılabilir hale getirilen gl_primitiveID") tek özellik olarak görünür ve bunu dönüşüm geri bildirimi yoluyla yakalar.
  • Bu hızlı olacaktır, çünkü sadece iki çıkış özelliği (GS'de ana darboğaz) vardır ve aksi takdirde her iki aşamada da "no-op" a yakındır.
  • Yazı tipindeki her karakter için dokulu dörtlü taban noktasına göre tepe konumlarını içeren bir arabellek dokusu bağlayın (bunlar temel olarak "yazı tipi metrikleridir"). Bu veriler, yalnızca sol alt tepe noktasının ofsetini saklayarak ve eksene hizalanmış kutunun genişliğini ve yüksekliğini kodlayarak dörtlü başına 4 sayıya kadar sıkıştırılabilir (yarım yüzer varsayarak, bu karakter başına 8 bayt sabit tampon olacaktır - tipik bir 256 karakterlik yazı tipi 2KB L1 önbelleğine tamamen sığabilir).
  • Taban çizgisi için üniforma oluşturma
  • Bir tampon dokusunu yatay ofsetlerle bağlayın. Bunlar olabilir belki de GPU hesaplanan, ancak kesinlikle sıralı bir işlemdir ve tüm önemsiz de (karakter aralığı düşünün) değil gibi, çok daha kolay ve CPU üzerinde bu tür şeyler için daha verimlidir edilebilir. Ayrıca, başka bir senkronizasyon noktası olan başka bir geri bildirim geçişine ihtiyaç duyar.
  • Önceden oluşturulmuş verileri geri bildirim arabelleğinden işler, tepe gölgelendirici, temel noktanın yatay ofsetini ve tampon nesnelerinden köşe ilkelerinin ofsetlerini (ilkel id ve karakter dizinini kullanarak) çeker. Gönderilen köşelerin orijinal tepe kimliği artık "ilkel kimliğimiz" dir (GS'nin köşeleri dörtlü hale getirdiğini unutmayın).

Bu şekilde, ideal olan tekdüze bant genişliğini ideal olarak% 75 azaltabilir (amortismana tabi tutulabilir), ancak yalnızca tek bir satır oluşturabilir. Bir çizim çağrısında birden fazla çizgi oluşturabilmek istendiğinde, tekdüze (bant genişliği kazançlarını daha küçük hale getirmek) yerine tampon çizgisine taban çizgisi eklemek gerekir.

Bununla birlikte,% 75 azalma varsayıldığında bile - "makul" miktarda metin görüntülemek için köşe verileri yalnızca 50-100kiB civarında (pratikte sıfır olan)GPU veya PCIe veriyoluna) - Yine de eklenen karmaşıklığın ve geriye dönük uyumluluğu kaybetmenin gerçekten zahmete değdiğinden şüpheliyim. Sıfırı% 75 azaltmak hala sıfırdır. Kuşkusuz yukarıdaki yaklaşımı denemedim ve gerçekten nitelikli bir açıklama yapmak için daha fazla araştırmaya ihtiyaç duyulacaktı. Ama yine de, birisi gerçekten çarpıcı bir performans farkı gösteremedikçe (milyarlarca karakter değil, "normal" miktarda metin kullanarak!), Benim bakış açım, köşe verileri için basit, sade eski bir köşe arabelleğinin haklı olarak iyi olduğu anlamına geliyor. "son teknoloji çözümün" bir parçası olarak görülmelidir. Basit ve anlaşılır, işe yarıyor ve iyi çalışıyor.

Yukarıda " OpenGL Insights " a daha önce atıfta bulunarak , Stefan Gustavson tarafından "Mesafe Alanlarına Göre 2D Şekil Oluşturma" bölümüne de dikkat çekerek mesafe alanı oluşturmayı ayrıntılı olarak açıklamaya değer.

Güncelleme 2016:

Bu arada, aşırı büyütmelerde rahatsız edici olan köşe yuvarlama eserlerini kaldırmayı amaçlayan birkaç ek teknik var.

Bir yaklaşım, yalnızca mesafe alanları yerine sözde mesafe alanları kullanır (fark, mesafenin gerçek çerçeveye değil, dış çizgiye veya kenarın üzerine çıkıntı yapan hayali bir çizgiye olan en kısa mesafedir ). Bu biraz daha iyidir ve aynı miktarda doku belleği kullanarak aynı hızda (özdeş gölgelendirici) çalışır.

Başka bir yaklaşım, üç medyan üçünü üç kanallı doku detaylarında ve github'da bulunan uygulamada kullanır . Bu, konuyu ele almak için daha önce kullanılan ve / veya hack'lerde bir gelişme olmayı amaçlamaktadır. Kaliteli, hafif, neredeyse farkedilmez, daha yavaş, ancak üç kat daha fazla doku belleği kullanır. Ayrıca, ekstra efektlerin (örn. Parlaklık) düzeltilmesi daha zordur.

Son olarak, karakterleri oluşturan gerçek bezier eğrilerini saklamak ve bir parça gölgelendiricide değerlendirmek , biraz daha düşük performansla (ancak bir sorun olduğu kadar değil) ve en yüksek büyütmelerde bile çarpıcı sonuçlar ile pratik hale geldi .
WebGL demosu burada gerçek zamanlı olarak bu teknikle büyük bir PDF oluşturma .


1
Oldukça iyi görünüyorlar (saf filtreleme ile ve mipmap oluşturma olmadığında bile, çok küçük dokularınız ve verileriniz güzelce enterpolasyon yapıyor). Şahsen birçok durumda "gerçek" şeyden bile daha iyi göründüklerini düşünüyorum , çünkü ipucu olarak gariplik yok, bu da genellikle "garip" olarak algıladığım şeyler üretiyor. Örneğin, daha küçük metinler belirgin bir nedenden ötürü aniden kalınlaşmaz veya piksel sınırlarına gelmez - "gerçek" yazı tipleriyle sıkça gördüğünüz efektler. Bunun tarihsel nedenleri olabilir (1985 s / b ekranlar), ama bugün, neden böyle olması gerektiği benim anlayışımın ötesinde.
Damon

2
Harika çalışıyor, paylaştığınız için teşekkürler! HLSL frag shader kaynağı isteyenler için buraya bakın . Bu clip(...)satırı if (text.a < 0.5) {discard;}(veya text.a < threshold) ile değiştirerek GLSL için uyarlayabilirsiniz . HTH.
Mühendis

1
Güncelleme için teşekkürler. Keşke tekrar oylayabilseydim.
Ben Voigt

2
@NicolBolas: Çok dikkatli okumuş görünmüyorsun. Her iki soru da yanıtta açıklanmaktadır. Kepler ikinci bir geçiş yoktur, orada bir "son nesil" örnek olarak verilmiştir (ve neden en açıklanmıştır) ve ben emin ben devlet değil hipotetik bant genişliği tasarrufu tekniği fark daha hızlı veya değer hiç sorun olduğuna inanıyoruz. Bununla birlikte, inanç hiçbir şey ifade etmiyor - kişi bilmek zorunda kalacaktı ("normal" metin miktarını her iki şekilde de bir darboğaz çizmeyi düşünmediğim için yapmadım). Bu olabilir bir bant genişliği konusunda umutsuz ve metnin "anormal" miktarda olduğunda yine bir değerli olabilir.
Damon

3
@NicolBolas: Bu cümle konusunda haklısın, üzgünüm. Gerçekten biraz yanıltıcı. Önceki paragrafta, "Muhtemelen bunu GPU'da bile oluşturabilirdim, ancak bu geri bildirim ve ... isnogud" gerektirirdi. - ancak "geri besleme arabelleğinden oluşturulan veriler" ile yanlışlıkla devam etti . Bunu düzeltirim. Aslında, haftasonunun tamamını yeniden yazacağım, bu yüzden daha az belirsiz.
Damon

15

http://code.google.com/p/glyphy/

GLyphy ve diğer SDF tabanlı OpenGL oluşturucular arasındaki temel fark, diğer birçok projenin SDF'yi bir dokuya örneklemesidir. Bu, örneklemenin sahip olduğu tüm olağan sorunlara sahiptir. Yani. dış çizgiyi bozar ve düşük kalitededir. GLyphy bunun yerine GPU'ya gönderilen gerçek vektörler kullanılarak SDF'yi temsil eder. Bu, çok yüksek kalitede renderleme ile sonuçlanır.

Dezavantajı, kodun OpenGL ES'li iOS için olmasıdır. Muhtemelen bir Windows / Linux OpenGL 4.x portu yapacağım (umarım yazar bazı gerçek belgeler ekleyecektir).


3
GLyphy ile ilgilenen herkes muhtemelen Linux.conf.au 2014 adresindeki
Fizz

14

En yaygın teknik hala dokulu dörtlüdür. Ancak 2005 yılında LORIA vektör dokular olarak adlandırılan bir şey geliştirdi, yani vektör grafikleri ilkel dokular olarak dokular haline getirdi. TrueType veya OpenType yazı tiplerini bir vektör dokusuna dönüştürmek için bunu kullanırsanız, bunu elde edersiniz:

http://alice.loria.fr/index.php/publications.html?Paper=VTM@2005


2
Bu tekniği kullanan herhangi bir uygulama biliyor musunuz?
luke

2
Hayır (üretim derecesinde olduğu gibi), ancak Kilgard'ın makalesinde (bağlantı için aşağıdaki cevabım bakın) şu şekilde özetlediğim kısa bir eleştiri var: henüz pratik değil. Bölgede daha fazla araştırma yapılmıştır; Kilgard tarafından belirtilen daha yeni çalışmalar arasında araştırma.microsoft.com / tr
Fizz

9

Mark Kilgard'ın bebeği NV_path_rendering'in (NVpr) yukarıdakilerden hiçbiri tarafından belirtilmediğine şaşırdım. Hedefleri yazı tipi oluşturma işleminden daha genel olsa da, yazı tiplerinden ve karakter aralığıyla da metin oluşturabilir. OpenGL 4.1 bile gerektirmez, ancak şu anda yalnızca satıcı / Nvidia uzantısıdır. Temel olarak glPathGlyphsNV, metrikleri vb. Almak için freetype2 kütüphanesine bağlı olarak yazı tiplerini yollara dönüştürür . Ardından, karakter aralığı bilgilerine erişebilir ve glGetPathSpacingNVyol "dönüştürülmüş" yazı tiplerini kullanarak metin görüntülemek için NVpr'nin genel yol oluşturma mekanizmasını kullanabilirsiniz. (Bunu tırnak içine aldım, çünkü gerçek bir dönüşüm yok, eğriler olduğu gibi kullanılıyor.)

NVpr yazı tipi yetenekleri için kaydedilen demo maalesef özellikle etkileyici değildir. (Belki birileri intertublarda bulabileceğiniz çok daha etkileyici SDF demosu boyunca bir tane yapmalıdır ...)

Yazı tipleri bölümü için 2011 NVpr API sunum konuşması burada başlıyor ve bir sonraki bölümde devam ediyor ; bu sunumun nasıl bölündüğü biraz talihsiz bir durum.

NVpr hakkında daha genel malzemeler:

  • Nvidia NVpr hub , ancak açılış sayfasındaki bazı malzemeler en güncel değil
  • "Şablon, sonra kapak" (StC) adı verilen yol oluşturma yönteminin beyinleri için Siggraph 2012 belgesi ; makalede ayrıca Direct2D gibi rakip teknolojilerin nasıl çalıştığı da kısaca açıklanmaktadır. Yazı tipi ile ilgili bitler makalenin ekine verilmiştir . Videolar / demolar gibi bazı ekstralar da var .
  • Güncelleme durumu için GTC 2014 sunumu ; Özetle: şimdi Google'ın Skia (Nvidia, 2013 ve 2014'ün sonlarında kodu katkıda bulundu) tarafından destekleniyor ve bu da Google Chrome'da ve [Skia'dan bağımsız olarak sanırım] Adobe Illustrator CC 2014'ün beta sürümünde kullanılıyor
  • uzantısı kayıt defterindeki resmi belgeler
  • USPTO, Kprard / Nvidia'ya NVpr ile bağlantılı olarak en az dört patent vermiştir; bu , StC'yi kendiniz uygulamak istiyorsanız muhtemelen bilmeniz gerekir: US8698837 , US8698808 , US8704830 ve US8730253 . Buna, çoğu patent başvurusu olan "olarak da yayınlandı" şeklinde bağlanan 17 USPTO dokümanı gibi bir şey daha bulunduğundan, bunlardan daha fazla patent verilmesi tamamen mümkündür.

Ve "şablon" kelimesi cevabımdan önce bu sayfada herhangi bir isabet üretmediği için, bu sayfaya katılan SO topluluğunun alt kümesi, çok sayıda olmasına rağmen, mozaik içermeyen, şablon-buffer- genel olarak yol / yazı tipi oluşturma için temel yöntemler. Kilgard, opengl forumunda mozaikleme içermeyen yol oluşturma yöntemlerinin hala bir [GP] GPU kullanıyor olmalarına rağmen bataklık standart 3D grafiklerden nasıl farklılaşabileceğini aydınlatabilecek SSS benzeri bir gönderi içeriyor. (NVpr, CUDA özellikli bir çipe ihtiyaç duyar.)

Tarihsel perspektif için, Kilgard aynı zamanda klasik "Doku Eşlemeli Metin için Basit bir OpenGL tabanlı API", SGI, 1997'nin yazarıdır, bu da 2011'de çıkış yapan şablon tabanlı NVpr ile karıştırılmamalıdır.


Çoğu, bu sayfada tartışılan tüm yöntemler olmasa da, NVpr gibi şablon tabanlı yöntemler veya GLyphy gibi SDF tabanlı yöntemler (diğer cevaplar zaten kapsadığı için burada daha fazla tartışmayacağım) ancak bir sınırlaması vardır: herhangi bir ölçekleme düzeyinde jagji içermeyen geleneksel (~ 100 DPI) monitörlerde büyük metin görüntüleme için uygundur ve ayrıca yüksek DPI, retina benzeri ekranlarda küçük boyutlarda bile güzel görünürler. Bununla birlikte, Microsoft'un Direct2D + DirectWrite'ın size verdikleri şeyi tam olarak sağlamazlar, yani ana ekranlardaki küçük glifleri ima ederler. (Genel olarak ipucunu görsel olarak incelemek için bu yazım sayfasına bakınız . Antigrain.com'da daha ayrıntılı bir kaynak bulunmaktadır .)

Microsoft'un şu anda ipucu ile yapabileceği herhangi bir açık ve ürünlenmiş OpenGL tabanlı şeyin farkında değilim. (Apple'ın OS X GL / Quartz içlerine cehaleti kabul ediyorum, çünkü bilgim dahilinde Apple, GL tabanlı yazı tipi / yol oluşturma şeylerini nasıl yaptığını yayınlamadı. MacOS 9'un aksine OS X'in Bazı insanları rahatsız eden ipucu ver .) Her neyse, INRIA'dan Nicolas P. Rougier tarafından yazılmış OpenGL gölgelendiricileri aracılığıyla ipucunu ele alan bir 2013 araştırma makalesi var ; OpenGL'den ima yapmanız gerekiyorsa muhtemelen okumaya değer. Freetype gibi bir kütüphane, ipucu söz konusu olduğunda zaten tüm işi yapıyor gibi görünse de, bu aslında şu sebepten ötürü değil, kağıttan alıntı yapıyorum:

FreeType kitaplığı, RGB modunda alt piksel kenar yumuşatma kullanarak bir glifi rasterleştirebilir. Bununla birlikte, bu sorunun sadece yarısıdır, çünkü gliflerin doğru yerleştirilmesi için alt piksel konumlandırması da yapmak istiyoruz. Dokulu dörtlü kesirli piksel koordinatlarında görüntülemek sorunu çözmez, çünkü yalnızca tam piksel düzeyinde doku enterpolasyonu ile sonuçlanır. Bunun yerine, alt piksel alanında kesin bir kayma (0 ile 1 arasında) elde etmek istiyoruz. Bu bir parça gölgelendiricide yapılabilir [...].

Çözüm tam olarak önemsiz değil, bu yüzden burada açıklamaya çalışmayacağım. (Kağıt açık erişimli.)


Rougier'in makalesinden öğrendiğim başka bir şey (ve Kilgard'ın dikkate almadığı gibi), yazı tipi güçlerinin (Microsoft + Adobe) bir değil iki karakter aralığı belirtim yöntemi yaratmasıdır. Eskisi bir çekirdek tablosuna dayanır ve freetype tarafından desteklenir. Yeni olana GPOS denir ve yalnızca özgür yazılım dünyasında HarfBuzz veya pango gibi daha yeni font kitaplıkları tarafından desteklenir. NVpr bu kitaplıkların hiçbirini desteklemiyor gibi göründüğünden, karakter aralığı bazı yeni yazı tipleri için NVpr ile birlikte çalışmayabilir; Bu forum tartışmasına göre, görünüşe göre vahşi doğada olanlar var .

Son olarak, karmaşık metin düzeni (CTL) yapmanız gerekiyorsa, bunun için OpenGL tabanlı bir kitaplık görünmediğinden, şu anda OpenGL'de şansınız yok gibi görünüyor. (Öte yandan DirectWrite, CTL'yi işleyebilir.) HarfBuzz gibi CTL oluşturabilen açık kaynaklı kütüphaneler vardır, ancak (şablon tabanlı yöntemleri kullanırken) nasıl iyi çalıştıracağınızı bilmiyorum OpenGL. Muhtemelen yeniden şekillendirilmiş anahatları çıkarmak ve bunları yol olarak NVpr veya SDF tabanlı çözümlere beslemek için tutkal kodunu yazmanız gerekir.


4
NV_path_rendering'den bahsetmedim çünkü bu bir uzantı, işleri daha da kötüleştirmek için özel bir satıcı. Normalde sadece evrensel olarak uygulanabilir teknikler için cevap vermeye çalışırım.
datenwolf

1
Bunu bir dereceye kadar kabul edebilirim. Yöntemin kendisini ("şablon, sonra kapak") doğrudan OpenGL'de uygulamak zor değildir, ancak önceki şablon tabanlı girişimler sona erdiğinden, bu şekilde saf şekilde yapıldığında yüksek komut yükü olacaktır. Kilkia'ya göre Skia [Ganesh aracılığıyla] şablon tabanlı bir çözümü denedi, ancak vazgeçti. CUDA yeteneklerini kullanarak aşağıdaki katman Nvidia tarafından uygulanma şekli bunu gerçekleştirir. Bir sürü EXT / ARB uzantısını kullanarak kendiniz "Mantle" StC'yi deneyebilirsiniz. Ancak Kilgard / Nvidia'nın NVpr'de iki patent başvurusuna sahip olduğuna dikkat edin.
Fizz

3

En iyi seçeneğiniz OpenGL arka ucuyla kahire grafiklerine bakmak olacaktır .

3.3 çekirdekli bir prototip geliştirirken yaşadığım tek sorun OpenGL arka ucunda kullanımdan kaldırıldı. 1-2 yıl önceydi, bu yüzden durum düzelebilirdi ...

Neyse, umarım gelecekte masaüstü opengl grafik sürücüleri OpenVG uygular.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.