Grafik programlamayı öğrenmek, yalnızca API öğrenmekten ibaret değildir. Grafiklerin nasıl çalıştığını öğrenmekle ilgili. Vertex dönüşümleri, aydınlatma modelleri, gölge teknikleri, doku haritalama, ertelenmiş görüntü oluşturma vb. Bunları uygulamak için kullandığınız API ile hiçbir ilgisi yoktur.
Yani soru şudur: Bir API'nin nasıl kullanılacağını öğrenmek ister misiniz? Yoksa grafik mi öğrenmek istiyorsun ?
Donanım hızlandırmalı grafiklerle bir şeyler yapmak için, bu donanıma erişmek için bir API'nin nasıl kullanılacağını öğrenmelisiniz. Ancak bir kez sistemle etkileşime geçme yeteneğine sahip olduğunuzda, grafik öğreniminiz, API'nın sizin için ne yaptığına odaklanmayı bırakmaz ve bunun yerine grafik kavramlarına odaklanır. Aydınlatma, gölgeler, kabartma eşleme vb.
Amacınız grafik kavramlarını öğrenmesi ise, API ile harcadığımız zaman zaman harcadığımız değil ise grafik kavramlarını öğrenme . Gölgelendiricilerin nasıl derleneceği grafiklerle ilgisi yoktur. Onlara nasıl üniforma gönderileceği, köşe verilerinin arabelleklere nasıl yükleneceği vb. De yoktur. Bunlar araçlar ve grafik çalışması için önemli araçlardır.
Ama aslında grafik kavramları değiller. Onlar bir sonun aracı.
Bir sürer sürü işin ve size grafik kavramlarını öğrenmeye başlamak için hazırsınız noktaya ulaşamadan Vulkan ile öğrenme. Verileri gölgelendiricilere aktarmak, açık bellek yönetimi ve açık erişim senkronizasyonu gerektirir. Ve bunun gibi.
Buna karşılık, OpenGL ile o noktaya gelmek daha az iş gerektiriyor. Ve evet, modern, gölgelendirici temelli açık profilli OpenGL'den bahsediyorum.
Sadece ekranı temizlemek kadar basit bir şey yapmak için gerekenleri karşılaştırın. Vulkan'da bu, en azından çok sayıda kavramın anlaşılmasını gerektirir: komut tamponları, aygıt kuyrukları, bellek nesneleri, görüntüler ve çeşitli WSI yapıları.
OpenGL'de ... üç işlevleri var: glClearColor
, glClear
ve platforma özel takas görüşmesi tamponlar. Daha modern OpenGL kullanıyorsanız, ikiye indirebilirsiniz: glClearBufferuiv
ve arabellekleri değiştirin. Bir çerçevenin ne olduğunu veya görüntüsünün nereden geldiğini bilmenize gerek yok. Sen temizle ve tampon takas et.
OpenGL sizden çok şey sakladığından, grafik donanımı arayüzünü öğrenmek yerine, aslında grafikleri öğrendiğiniz noktaya gelmek için çok daha az çaba harcar.
Ayrıca, OpenGL (nispeten) güvenli bir API'dir. Genellikle yanlış bir şey yaptığınızda hatalar ortaya çıkar. Vulkan değil. Yardımcı olmak için kullanabileceğiniz hata ayıklama katmanları varken, çekirdek Vulkan API, bir donanım hatası olmadıkça size hemen hemen hiçbir şey söylemez. Yanlış bir şey yaparsanız, çöp işleme alabilirsiniz veya GPU’yu çökertebilirsiniz.
Vulkan'ın karmaşıklığı ile birleştiğinde, yanlışlıkla yanlış olanı yapmak çok kolaydır. Bir dokuyu doğru düzene yerleştirmeyi unutmak bir uygulamada işe yarar, başka bir uygulamada olmayabilir. Bir senkronizasyon noktasını unutmak bazen işe yarayabilir, ancak daha sonra bir sebeple görünmez bir şekilde başarısız olur. Ve bunun gibi.
Tüm söylenenler, grafik tekniklerini öğrenmekten çok grafik öğrenmeye daha çok şey var. Özellikle Vulkan'ın kazandığı bir alan var.
Grafiksel performans .
3B grafik programcısı olmak genellikle kodunuzu nasıl optimize edeceğiniz konusunda bazı fikirler gerektirir. İşte burası OpenGL'in bilgiyi sakladığı ve arkanızdaki şeyleri yapmasının bir problem olduğu yerdir.
OpenGL bellek modeli senkronizedir. Uygulamanın, kullanıcı farkı söyleyemediği sürece, zaman uyumsuz olarak komutlar vermesine izin verilir. Bu nedenle, bazı görüntülere yer veriyorsanız, bundan okumaya çalışın, uygulama bu iki görev arasında açık bir senkronizasyon olayı yayınlamalıdır.
Ancak OpenGL'de performans elde etmek için uygulamaların bunu yaptığını bilmeniz gerekir, böylece bunu önleyebilirsiniz . Uygulamanın gizlice senkronizasyon etkinlikleri yayınladığı yeri fark etmeniz ve ardından mümkün olduğunca bunları önlemek için kodunuzu yeniden yazmanız gerekir. Ancak API'nin kendisi bunu açıkça ifade etmiyor; bu bilgiyi bir yerden edinmiş olmalısın.
Vulkan ile ... bu senkronizasyon olaylarını yayınlayacak olan sizsiniz . Bu nedenle, donanımın komutları eşzamanlı olarak çalıştırmadığının farkında olmalısınız . Bu olayları ne zaman yayınlamanız gerektiğini bilmelisiniz ve bu nedenle programınızı yavaşlatacaklarının farkında olmalısınız. Yani onlardan kaçınmak için elinden geleni yapıyorsun.
Vulkan gibi açık bir API sizi bu tür performans kararları almaya zorlar. Bu nedenle, eğer Vulkan API'sini öğrenirseniz, hangi şeylerin yavaş olacağı ve hangi şeylerin hızlı olacağı konusunda zaten iyi bir fikriniz vardır.
Sizi yeni bir renderleme oluşturmaya zorlayan bazı framebuffer çalışmaları yapmak zorunda kalırsanız ... olasılıklar, bunu bir render geçişinin ayrı bir alt geçişine sığdırabileceğinizden daha yavaş olması iyi olacaktır. Bu, yapamayacağınız anlamına gelmez, ancak API size performans sorununa yol açabileceğini söyler.
OpenGL’de, API temel olarak sizi çerçevesiz eklerinizi willy-nilly olarak değiştirmeye davet ediyor. Hangi değişikliklerin hızlı ya da yavaş olacağına dair hiçbir kılavuz yoktur.
Bu durumda, Vulkan'ı öğrenmek, grafikleri nasıl daha hızlı hale getireceğinizi daha iyi öğrenmenize yardımcı olabilir. Ve kesinlikle CPU ek yükünü azaltmanıza yardımcı olacaktır.
Grafik oluşturma tekniklerini öğrenebileceğiniz noktaya gelmeden önce bu işlem daha uzun sürecektir.