İç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
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.