3 puan yazan GN⁺ 2024-06-07 | 1 yorum | WhatsApp'ta paylaş

İçindekiler

  • Giriş
  • Grafik programlama öğrenmek
  • Küçük sorunlara takılıp kalmamak
  • Neden Vulkan?
  • Vulkan öğrenmek
  • Motor genel görünümü ve kare analizi
  • Genel tavsiyeler
    • Önerilen Vulkan kütüphaneleri
    • GfxDevice soyutlaması
    • Shader işleme
    • Push constant'lar, descriptor set'ler ve bindless descriptor'lar
    • Pipeline kalıpları
    • Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA) kullanımı
    • Bindless descriptor'lar
    • Her kare yüklenmesi gereken dinamik verilerin işlenmesi
    • Destructor'lar, silme kuyruğu ve temizlik
    • Senkronizasyon
  • Daha fazla uygulama notu
    • Çok sayıda sprite çizmek
    • Compute skinning
    • Oyun / renderer ayrımı
    • Sahne yükleme ve entity prefab'ları
    • MSAA
    • UI
    • Dear ImGui ve sRGB sorunları
    • Diğer noktalar
  • Vulkan'a geçerken kazanılanlar
  • Gelecekte yapılacaklar

Giriş

  • Bu, Vulkan öğrenip küçük bir oyun motoru yazma deneyimini belgeleyen bir içerik.
  • Vulkan hakkında ön bilgi olmadan 3 ay boyunca çalışıldı.
  • Küçük bir 3D oyun yapıldı ve yeniden kullanılabilir parçalar motor olarak ayrıştırıldı.

Grafik programlama öğrenmek

  • Grafik programlamaya yeni başlayanların önce OpenGL öğrenmesi önerilir.
  • OpenGL ile dokulu modelleri ekranda göstermeyi, basit aydınlatmayı ve shadow mapping'i öğrenmek faydalıdır.
  • OpenGL öğrenmek için önerilen kaynaklar:
    • learnopengl.com
    • Anton’s OpenGL 4 Tutorials kitabı
    • Thorsten Thormählen'in dersleri (ilk 6 video öneriliyor)

Küçük sorunlara takılıp kalmamak

  • Küçük sorunlara gereğinden fazla odaklanmamaya dikkat etmek gerekir.
  • Her zaman "Gerçekten gerekli mi?", "Bir darboğaz olacak mı?" diye sormak gerekir.
  • Gerekli olmayan özellikler daha sonra eklenebilir.
  • Basit bir oyunla başlamak ve aşırı karmaşık bir motor yapmamaya dikkat etmek gerekir.

Neden Vulkan?

  • Vulkan, modern GPU özelliklerini kullanabilmeye imkan verir ve açık kaynak teknolojileri ile standartları tercih edenler için uygundur.
  • OpenGL küçük oyunlar için yeterlidir, ancak modern GPU özelliklerini kullanmak zordur ve macOS'ta kullanımı sınırlıdır.
  • WebGPU, Vulkan'dan daha kolay öğrenilir ve oyunların tarayıcıda çalıştırılmasını sağlar.

Vulkan öğrenmek

  • Vulkan'ı öğrenmek başlangıçta zor görünse de, Khronos'un karmaşık kısımları basitleştirmesi ve yararlı kütüphaneler sunması sayesinde öğrenmek kolaylaştı.
  • Önerilen Vulkan öğrenme kaynakları:
    • vkguide
    • TU Wien'in Vulkan ders serisi
    • 3D Graphics Rendering Cookbook kitabı
    • Mastering Graphics Programming with Vulkan kitabı

Motor genel görünümü ve kare analizi

  • Motorun adı EDBR (Elias Daler’s Bikeshed Engine) ve bir Vulkan öğrenme projesi olarak başladı.
  • Motor ağırlıklı olarak küçük, seviye tabanlı oyunlar için uygundur.
  • Kare render süreci:
    • Skinning: model skinning işlemi compute shader ile yapılıyor
    • Shadow mapping: 4096x4096 derinlik dokusu kullanılıyor
    • Geometri ve shading: PBR modeli kullanılıyor
    • Derinlik çözümü: fragment shader ile manuel olarak yapılıyor
    • Post-processing efektleri: derinlik sisi, tone mapping ve bloom uygulanıyor
    • UI: UI tek bir draw call ile çiziliyor

Genel tavsiyeler

Önerilen Vulkan kütüphaneleri

  • vk-bootstrap: Vulkan başlatma kodunu basitleştirir
  • Vulkan Memory Allocator (VMA): bellek tahsisini yönetir
  • volk: extension fonksiyonlarının yüklenmesini basitleştirir

GfxDevice soyutlaması

  • GfxDevice sınıfı Vulkan işlevlerini kapsüller; Vulkan context başlatma, swapchain oluşturma ve yönetme gibi işleri ele alır.

Shader işleme

  • Shader'lar GLSL kullanılarak yazılır.
  • Build aşamasında shader'ları önceden derleyerek çalışma zamanı bağımlılıkları azaltılır.

Push constant'lar, descriptor set'ler ve bindless descriptor'lar

  • Vulkan'da shader'lara veri aktarmak için descriptor set'ler kullanılır.
  • Bindless descriptor'lar ve buffer device address kullanılarak descriptor set kullanımı en aza indirilir.

Pipeline kalıpları

  • Çizim aşamalarını ayırmak için pipeline sınıfları kullanılır.
  • init, cleanup, draw metotlarıyla pipeline başlatma, temizleme ve çizim işlemleri yapılır.

Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA) kullanımı

  • Vertex türleri tek bir yapıda birleştirilir ve shader içinden vertex'lere doğrudan erişilir.
  • Buffer adresleri push constant ile aktarılır.

Bindless descriptor'lar

  • Dokular bindless şekilde yönetilerek shader içinden doğrudan erişilebilir hale getirilir.
  • Sampling için doku kimliği push constant olarak aktarılır.

GN⁺ görüşü

  • Vulkan yüksek performans ve modern GPU özellikleri sunar, ancak başlangıç öğrenme eğrisi diktir.
  • Önce OpenGL öğrenip ardından Vulkan'a geçmek daha iyidir.
  • Vulkan öğrenmek için çeşitli kaynaklar vardır ve bunlar kullanıldığında öğrenme kolaylaşır.
  • Vulkan kullanarak küçük bir oyun motoru yazmak, grafik programlamayı derinlemesine anlamaya yardımcı olur.
  • Vulkan'ın karmaşıklığını azaltmak için yararlı kütüphaneler kullanmak iyi bir fikirdir.

1 yorum

 
GN⁺ 2024-06-07
Hacker News görüşü

Hacker News yorum özeti

  • Minimal yaklaşımın etkisi: Bir metaverse istemcisi Rust ile yazılıyor ve Vulkan, WGPU, Rend3 kullanılırken karmaşık sorunlar yaşanıyor. WGPU, birçok platformu desteklemeye çalıştığı için geliştirmesi zorlaşıyor.

  • Vulkan'ın avantajları ve OpenGL'in sadeliği: Vulkan, gelişmiş GPU özelliklerinden mümkün olan en yüksek düzeyde yararlanabiliyor; ancak OpenGL, basit 2D/düşük poligonlu oyunlar için daha uygun. AAA oyun endüstrisi görsel kaliteye odaklansa da, birçok oyuncu oynanışla daha çok ilgileniyor.

  • Yalnızca gerekli özellikleri uygulamak: Junior programcılar en yeni araçlara ve "best practice"lere takılma eğiliminde, ancak asıl önemli olan gerçek problemi çözmek için gereken en az sayıdaki özelliğe odaklanmak.

  • Vulkan'ın karmaşıklığı: Vulkan'da performansı optimize etmek OpenGL'e kıyasla daha zor ve çok daha fazla kod ile senkronizasyon çalışması gerekiyor. Hobi amaçlı işler için OpenGL ES3 daha pratik.

  • Ek soyutlama katmanlarının sorunu: Vulkan öğrenme materyalleri ek soyutlama katmanları getirdiği için, temel bellek yönetimi örneklerini bulmak zorlaşıyor.

  • Vulkan öğrenmenin zorluğu: OpenGL öğrenmesi kolaydı, ancak Vulkan basit işleri bile karmaşık hale getiriyor. Yeni bir teknolojiyi öğrenmek çok zaman alıyor.

  • Bilimsel veri görselleştirme için Vulkan öğrenmek: Bilimsel veri görselleştirme motoru yazmak için Vulkan öğrenildi ve bu süreçte birçok soyutlamayı anlamak zaman aldı.

  • Vulkan öğrenmenin güçlüğü: Vulkan'ın gerçek bir motorda nasıl kullanıldığını anlamak zor. İyi soyutlamaları ve render sırasını nasıl belirlemek gerektiğini öğrenmek için daha fazla kaynağa ihtiyaç var.

  • Grafik programlama topluluğunun desteği: Vulkan motoru geliştirirken topluluğun desteği ve geri bildirimi büyük yardım sağlıyor.