Sabit İşlevli ve Gölgelendiriciler: Hangisi yeni başlayanlar için?


16

Şu anda bilgisayar bilimleri için üniversiteye gidiyorum. Mevcut bir motoru küçük bir oyun yaratmak için bir noktada kullanmayı planlasam da, şu anda amacım şu temelleri öğrenmektir: 3D programlama. DirectX ve OpenGL arasında seçim hakkında biraz araştırma yaptım ve bunun genel sonucu, eğitim tekerlekleri platformunuz olarak OpenGL veya DirectX'i seçip seçmemeniz, bilginin çoğunun diğer platforma aktarılabilmesidir. . Bu nedenle, OpenGL daha fazla sistem tarafından desteklendiğinden (muhtemelen ne öğreneceğinizi seçmek için aptalca bir neden), öncelikle OpenGL'yi öğreneceğime karar verdim.

OpenGL'yi öğrenmek için bu kararı verdikten sonra, biraz daha araştırma yaptım ve bunca zamandır farkında olmadığım bir ikilemi öğrendim: sabit işlevli OpenGL ve modern programlanabilir gölgelendirici tabanlı OpenGL. İlk başta, gölgelendirici tabanlı OpenGL öğrenmeyi seçmem gereken bariz bir seçim olduğunu düşündüm, çünkü bugün sektörde en yaygın olarak kullanılan şey budur. Ancak, daha sonra burada bulunan Jason L. McKesson'un çok popüler Learning Modern 3D Grafik Programlamasını tökezledim : http://www.arcsynthesis.org/gltut/

Giriş bitlerini okudum ve "Bu Kitap Hakkında" bölümünde yazar şöyle diyor:

"İlk olarak, bu yaklaşımla öğrenilenlerin çoğu, kullanıcı programlanabilirlik ile çözülmesi gereken bir grafik problemiyle karşılaştığında kaçınılmaz olarak terk edilmelidir. Programlanabilirlik, sabit fonksiyon boru hattının neredeyse tamamını siler, böylece bilgi kolayca aktarılmaz."

aynı zamanda sabit işlevselliğin yeni başlayanlar için daha kolay ve daha hızlı bir öğrenme eğrisi sağladığını da belirtmektedir:

"Sabit fonksiyon boru hattını kullanarak neofit grafik programcılarına öğretmenin genellikle en kolay olduğu düşünülmektedir."

Doğal olarak, hangi paradigmanın öğrenileceği konusunda neden çatışabileceğimi görebilirsiniz: Sabit işlevsellik yollarını öğrenmek için çok fazla zaman harcıyorum (ve daha sonra unlearning) veya gölgelendiricilerle başlamayı seçebilir miyim? Öncelikli endişem, modern programlanabilir gölgelendiricilerin bir şekilde programlayıcının sabit işlevli boru hattını zaten anlamasını gerektirmesidir, ancak durumun bu olduğundan şüpheliyim.

TL; DR = İstekli bir oyun grafik programcısı olarak, sabit işlevsellik veya modern gölgelendirici tabanlı programlama yoluyla 3D programlamayı öğrenmek benim için en iyisidir?


Buna benzer bazı sorular da var ...
notlesh

"ancak aynı zamanda sabit işlevsellikin yeni başlayanlar için daha kolay ve daha hızlı bir öğrenme eğrisi sunduğunu da belirtiyor:" Merak ediyorum. Bu durumu tam olarak nasıl ortaya koyuyor? Alıntı açıkça "Genellikle en kolay kabul edilir ..." diyor (vurgu eklenmiştir). İçinde olduğu gibi, doğru kabul edilebilir , ancak bu doğru olduğu anlamına gelmez.
Nicol Bolas

Evet, bunu ifade etmenin garip bir yoluydu.
Rob Hays

Sabit işlevli boru hattı hem OpenGL'de hem de DirectX'te kullanımdan kaldırıldı, bu yüzden zamanınızı boşa harcamazdım. Temel gölgelendiriciler oldukça basittir ve kesinlikle bir render bağlamını çalıştıracak kadar anlamaktan daha karmaşık değildir.
3Dave

Yanıtlar:


30

Sabit işlevli şeylerle başlamanın daha kolay olduğu argümanını almıyorum. Sabit işlev, daha az kodla belirli şeyleri yapmanıza izin verebilir - örneğin, sabit işlevli OpenGL'de, bazı çok basit aydınlatma / gölgeleme glEnable(GL_LIGHTING)ve birkaç çağrı yapabilirsiniz. Sorun şu ki, biraz farklı bir şey istediğinizde - piksel başına aydınlatma, örneğin tepe başına aydınlatma yerine - sabit işlevli şeyleri tamamen terk etmeniz ve kullandığınız her türlü sabit işlevselliği uygulamak için bir gölgelendirici yazmanız gerekir. önce, ne değiştirmek istersen.

Her zaman gölgelendiricileri kullanmak daha basit ve daha az kafa karıştırıcı gibi görünüyor. Yüklenmeleri ve derlenmesi gereken ayrı bir kaynak dosyanız, parametreleri aramak ve ayarlamak için bazı ekstra C çağrıları vb.Gibi gölgelendiricilerin biraz daha fazla kurulum işine ihtiyacı vardır. birkaç farklı efekti kodlamak, farklı fikirleri denemek vb. gölgelendiriciler kod yazabildiğiniz her şeyi yapabilir, normal performans ve bellek sınırlarını modüle edebilir.


Harika, yanıt için teşekkürler. Büyük ihtimalle gölgelendiriciler için doğru yola çıkacağım.
Rob Hays

3
+1 - aynı zamanda "Learning C ++" ve "Learning BASIC" gibi. C ++ öğrenmeniz daha uzun sürecek, ancak uzun vadede daha fazla şey öğrenmiş olacaksınız.
Jonathan Dickinson

3
Opengl-tutorial.org'u tavsiye etmek istiyorum . Site temelleri oldukça güzel açıklıyor ve sadece gölgelendiricileri kullanıyor.
Exilyth


2

İkinci olarak doğrudan gölgelendiriciler için gidiyorum. Bu gerçekten değilKurulumu kadar zor ve ilk engeli geçtiğinizde parmaklarınızın ucunda tam güce sahipsiniz.

Daha da önemlisi, gölgelendirici programlamanın üniversitedeki kitaplarda ve grafik derslerinde gördüğünüz matematiksel denklemlerle daha yakından eşleştiğini göreceksiniz.


0

Sabit fonksiyon boru hattını programınızın omurgası olarak kullanmanızı öneririm. Tamamen gölgelendiriciler yerine bir şeyler göstermek daha kolay olur. Ardından, köşelerinizi veya normallerinizi bozmadığınızı bildiğinizde, yavaşça ama kesinlikle gölgeleme dünyasına adım atabilirsiniz.

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.