Saf OpenGL mi yoksa GLSL mi? [kapalı]


11

Grafik programlama ile ilgilenmeye başladım, bu yüzden bariz giriş noktası OpenGL'yi öğrenmekti. Ancak, forumlar ve siteler etrafında dağınık bilgiler toplandığında, 3.0'dan önceki çoğu şey kullanımdan kaldırıldığı ve "3.0'dan beri gölgelendiricilerle ilgili" Amazon hakkında bir inceleme sunduğundan, saf bir OpenGL uygulaması kayboluyor gibi görünüyor. Ayrıca gördüğüm kitaplardan sadece süper sürüm yeni sürümü kapsıyor gibi görünüyor, ancak sadece kısmen kitabın iyi bir kısmı kullanım dışı işlevleri öğrettiğinden ve özellikle GLSL için kitaplar var.

Burası benim ilk sorunumla karşılaştı. Kullanmayı planladığım intel entegre grafiklere sahip dizüstü bilgisayar da dahil olmak üzere bazı donanımlar GLSL'yi desteklemiyor. İşlev

GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);

bir segmentasyon hatasına neden olur ve görünüşe göre sürücüm gölgelendiricileri desteklemez

Benim sorum şu: Bir oyunu sadece OpenGL'de yapmanın uygulanabilirliği nedir? gölgelendirici dilindeki yeri doldurulamaz iyi özellikleri kaçırıyor muyum? Ve ne tür bir donanım (eski gen i3, i5, i7, eski VGA'lar) oyunlarını gölgelendiricilerle düzgün bir şekilde çalıştırmayı bekleyebilirim?


1
GLSL olduğunu ben senin soru kullandığınız niyetinde donanım uyumlu OpenGL 3 olup olmadığını, özellikle uyumlu GLSL değil ilişkilidir düşünüyorum OpenGL.
deceleratedcaviar

@Daniel, eğer bir donanım / sürücü OpenGL 3.0 uyumlu ise GLSL uyumlu mu?
ibrabeicker

1
GLSL, OpenGL 3.0 spesifikasyonunun bir parçasıdır, bu yüzden evet, durum böyledir.
deceleratedcaviar

1
"Görünüşe göre sürücüm gölgelendiricileri desteklemiyor" diyorsunuz. Hangi OpenGL sürümünü alıyorsunuz? Mevcut tüm OpenGL işlevlerini doğru şekilde yüklüyor musunuz?
Nicol Bolas

1
@Papavoikos: NULL döndürürse, gölgelendiricilerin kullanılıp kullanılmayacağından çok daha büyük sorunlarınız var . OpenGL bağlamınızı doğru şekilde mi oluşturuyorsunuz? Unutmayın: oluşturulmuş ve geçerli bir bağlam oluşturulana kadar hiçbir GL işlevini çağıramazsınız.
Nicol Bolas

Yanıtlar:


9

Gölgelendirici kodu, glTexEnv, glTexGen ve doku matrisi çağrılarının karışıklığından kesinlikle daha net ve anlaşılması kolaydır ve bunu kullanarak daha fazla veya daha az keyfi matematik işlemini ifade edebileceğiniz bonusu vardır (sabit ile yapamazsınız) pipeline - "saf OpenGL" dediğiniz şey). Tek potansiyel dezavantajı, bunları kullanmaya başlamadan önce kodunuza belirli bir miktarda destekleyici altyapı yazmanız gerektiğidir, oysa eski yolla hemen hemen dalış yapabilirsiniz. Buna "potansiyel" dezavantajı diyorum çünkü ben aslında bir şeyler hazırlamanızı ve biraz daha önceden öğrenmenizi sağladığını düşünün - OpenGL'nin "kolay" olma şöhreti vardır ve zaman zaman insanların bununla kandırıldıklarını ve ilk ne yaptıklarını gerçekten bilmeden dalmalarını görürsünüz,

Donanım açısından, bir miktar gölgelendirici desteğine sahip olmak için son 5/6/7 yıl içinde piyasaya sürülen hemen hemen her şeye güvenebilirsiniz, ancak - eski Intel'ler (9xx serilerinden bazıları) - GLSL olmayacak, bunun yerine eski GL_ARB_vertex_program ve GL_ARB_fragment_program uzantıları olacaktır. Bunlar bir montaj dili benzeri gölgelendirici dili kullanır, ancak - itiraf süresi - Ben şahsen buna çok düşkünüm. Bazı daha modern özelliklerden (dallanma gibi) eksikse ve aynı şeyi yapmak için daha fazla gölgelendirici kodu gerektiriyorsa, kullanımı oldukça kolaydır. Bu uzantılar için ana programınızda gerekli olan destekleyici altyapı da GLSL'den çok daha hafiftir.

Bu onları GLSL üzerinden tavsiye edeceğim anlamına gelmez, ancak bu donanım sınıfında gerçekten çalışmanız gerekiyorsa orada bulunan bir seçenektir ve var olduklarının farkında olmak yararlıdır, bu da beni son noktaya getirir . Bu donanım sınıfında çalışmanız gerektiğinden gerçekten emin misiniz (örneğin dizüstü bilgisayarınızda giriş noktalarını almak için ihmal etmiş olabilirsiniz)?


Mesa3d'nin hala opengl 2.1 spesifikasyonu üzerinde olduğunu tamamen ihmal ettim. Bunu düzeltirim
ibrabeicker

6

Ayrıca artık "saf OpenGL" olmadığı da belirtilmelidir.

OpenGL ES 2.0 gölgelendirici olmayan tüm şeylerden vazgeçti ve WebGL buna dayandığından, sadece gölgelendiricilerle çalışıyor. OpenGL 3.0, sabit işlevli tüm öğeleri kullanımdan kaldırmıştır ve 3.1 bunları kaldırmıştır (çekirdek profillerinde. Çoğu uygulama uyumluluk profillerini destekler, ancak MacOSX 3.2 uygulamaları için desteklemez).

Bu yüzden gölgelendirici olmayan OpenGL öğrenmeyi önermem.


6

Geçmişte herhangi bir programlama yaptıysanız, GLSL kullanarak kendi gölgelendirici kodunuzu yazmak çok daha keyifli olacaktır. Başlangıçta sabit fonksiyonlu OpenGL öğrenmeye çalıştım ve bu benim için daha zordu çünkü mantıklı değildi. Sonra turuncu kitabı kullanarak GLSL öğrenmeye çalıştım ve o zamandan beri çok daha kolay ve daha fazlasını yaptım. Sadece 2 sentim.

GPU için programlar yazma gücü nedeniyle kesinlikle GLSL'ye giderdim.

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.