1 puan yazan GN⁺ 2024-11-11 | 1 yorum | WhatsApp'ta paylaş
  • Dokusuz Metin Render Etme

    • Geleneksel olarak metin render etmek için fonttaki tüm glifleri bir atlasa render edip bunu bir texture olarak bind etmek ve ardından ekranda üçgenler çizerek glifleri tek tek render etmek gerekir.
    • Hata ayıklama mesajlarını hızlıca göstermek için basit bir yöntem tanıtılıyor.
    • Tüm metni tek bir draw call ile çizebilen bir teknik açıklanıyor.
  • Font: Dokusuz Pikseller

    • Font atlas texture'ını kaldırmak için, fragment shader içinde font atlasına benzer bir şeyin saklanması gerekir.
    • Bitmap'ler tamsayı sabitleri kullanılarak saklanabilir ve bu sayede glifler render edilebilir.
    • 8 bit tamsayılar bitmap olarak kullanılıp GLSL fragment shader'da ekrana çizilebilir.
  • Tek Draw Call

    • Tekrarlayan draw komutlarından kaçınmak için instance draw call kullanılabilir.
    • Her instance için konum ofseti ve gösterilecek metni içeren veriler kullanılır.
    • Mesajlar 4 karakterlik parçalara bölünerek uint32_t'ye dönüştürülür ve word_data yapısında saklanır.
  • Vertex Shader

    • Vertex shader üç çıktı üretir.
    • gl_Position, üçgenin köşelerini ekranda konumlandırır.
    • Gösterilecek kelime fragment shader'a aktarılır.
    • Texture koordinatları üretilerek uv koordinatları hesaplanır.
  • Fragment Shader

    • Fragment shader'ın metni render etmek için üç bilgiye ihtiyacı vardır.
    • uv koordinatları glif bitmap'inin doğru bitine eşlenerek glif render edilir.
    • Bit ayarlıysa ön plan rengiyle, ayarlı değilse arka plan rengiyle render edilir.
  • Tam Uygulama ve Kaynak Kodu

    • Bu tekniğin uygulaması le_print_debug_print_text modülünün kaynak kodunda bulunabilir.
    • Bu modül, hata ayıklama mesajlarını ekranda kolayca göstermeyi sağlar.

1 yorum

 
GN⁺ 2024-11-11
Hacker News görüşü
  • ShaderToy'da basit aritmetiklerle kod yazmak eğlenceli ve kolay bir iş. Metin hack'leri için birçok farklı örnek var
    • Örn: 300 karakterden kısa Matrix, yeşil CRT ekran efekti vb.
  • Bu yöntem yaratıcı, ancak ortaya çıkan sonuçlar çok güzel değil. Daha iyi sonuçlar için daha fazla bit eklenebilir, fakat verimli yöntem siyah-beyaz pikselleri kullanıp bunları texture olarak depolamak
  • Modern 3D render motorlarında metin çizmenin yaygın yolu SDF metin kullanmak. Bu, geleneksel bir texture atlas kullanarak signed distance field atlası oluşturur
  • Metin render etme algoritmalarını bizzat denemiş değilim, ancak birkaçını uygulama deneyimim oldu. Çözünürlükten bağımsızlık ve anti-aliasing gerektiği için bu yöntem yardımcı olmadı
  • Bu yöntem kavramsal olarak Will Dobbie'nin yöntemine benziyor ama daha basit. Piksel verisini bir dizide saklama yaklaşımı
  • Metni mesh olarak render etme seçeneği de var. TextMeshPro, keyfi ölçeklemeyi işlemek için signed distance field kullanıyor
  • Bunu geleneksel texture yöntemiyle performans açısından karşılaştırmak ilginç olurdu. Modern GPU'larda basit işler için cevap büyük olasılıkla performans açısından "evet" olur
  • Sebastian Lague'un videosu çeşitli font render etme tekniklerini ele alıyor
  • Font verisini fragment shader kaynak koduna gömen benzer bir teknik kullanma deneyimim var. snprintf kullanarak doğrudan GPU buffer'ına çıktı verdim
  • Bu yöntem BBC Basic'te küçük 8x8 sprite'lar çizmekle benzer. 35 yıl öncesinin anılarını canlandırıyor
  • GPU'lar texture'dan render almakta verimli, ancak bit işlemlerinde görece yavaş. Bellekten tasarruf ettiriyor, ama gerçekten atlas kullanmaktan daha hızlı olup olmadığı şüpheli
  • GPU'ya küçük texture'lar yüklemenin performansı ciddi biçimde etkileyip etkilemediğine dair bir soru var. 2D olarak bir texture'a string render edip texture'ı iki üçgen üzerinde göstermenin mümkün olup olmadığı merak ediliyor