OpenGL'nin mobil cihazlar ve gömülü sistemler (OpenGL | ES) ve Web üzerinden JavaScript (WebGL) sürümlerini saymadığı için dört ana sürümü vardır. Tıpkı Direct3D 11'in Direct3D 8'den farklı şeyler yapması gibi, OpenGL 3'ün de OpenGL 1'den farklı şeyler yapması gibi. Büyük fark, OpenGL sürümlerinin çoğunlukla eski sürümlere eklenmesidir (ancak Baştan sona).
OpenGL'nin farklı sürümleri ve sürümleri üzerine ana OpenGL, profil konseptini de ekledi. Yani, Uyumluluk Profili (eski sürümlerden API'ler için destek sağlar) ve Çekirdek Profili (bu eski API'leri devre dışı bırakır). Gibi şeyler glBegin
size Çekirdek Profili kullandığınızda basitçe işi yok ama (varsayılan olan) Uyumluluk Profili kullanacaktır zaman.
Bir başka önemli komplikasyon olarak, OpenGL'nin bazı uygulamaları (Apple gibi, diğerleri arasında olduğu gibi) Çekirdek Profilini kullanırken yalnızca yeni OpenGL özelliklerini mümkün kılar. Bu, daha yeni API'ler kullanmak için eski API'leri kullanmayı bırakmanız gerektiği anlamına gelir .
Daha sonra, öğreticiler için kafa karıştırıcı birkaç senaryo ortaya çıkıyor:
- Öğretici eski ve yalnızca kullanımdan kaldırılmış API'leri kullanıyor.
- Öğretici yeni ve iyi yazılmış ve yalnızca Core uyumlu API'ler kullanıyor.
- Öğretici yeni ancak Uyumluluk modunda tüm API'leri etkinleştiren ve hem yeni hem de eski API'leri serbestçe karıştıran bir sürücü ile çalıştığınızı varsayma hatasını yapıyor.
- Eğitim, herhangi bir sürümde eski API'lerin hiçbirini desteklemeyen OpenGL | ES gibi farklı bir OpenGL sürümü içindir.
Gibi şeyler glBegin
bazen acil mod API denilen bir parçasıdır. Bu aynı zamanda kafa karıştırıcıdır çünkü OpenGL'de tutulan mod gibi bir şey yoktur ve “anında mod” grafiklerde zaten farklı bir tanımlamaya sahiptir. OpenGL 2.1’den beri kullanılmayan OpenGL 1.x API’leri olarak adlandırmak çok daha iyi.
OpenGL'nin 1.x API'si, eski günlerde derhal grafik boru hattına köşeleri gönderirdi. Bu, köşeleri oluşturan donanımın hızı, tepe verilerini oluşturan CPU'nun hızı ile kabaca aynı olduğunda iyi çalıştı. OpenGL geri döndüğünde üçgen rasterleştirmeyi boşalttı ve başka bir şey değil.
Bu günlerde, GPU, çok sayıda hızda çok yüksek hızlarda çiğneme yapabilir ve aynı zamanda gelişmiş tepe ve piksel dönüşümü gerçekleştirir ve CPU uzaktan bile kalkamaz. Bunun yanı sıra, CPU ve GPU arasındaki arabirim bu hız farkı etrafında tasarlanmıştır, yani artık GPU’ya artık bir köşe göndermenin bile mümkün olmadığı anlamına gelir.
Tüm GL sürücülerinin glBegin
dahili olarak bir köşe arabelleği ayırması, glVertex
bu arabelleğe getirilen köşeleri koyarak ve ardından bu arabelleğin glEnd
çağrıldığı zaman tek bir beraberlik çağrısına göndererek taklit etmesi gerekir . Bu işlevlerin ek yükü, yalnızca köşe arabelleğini kendiniz güncellediğinizden çok daha büyüktür, bu nedenle bazı belgelerin (çok yanlışlıkla!) Köşe arabelleğini "optimizasyon" olarak adlandırması gerekir (bu bir optimizasyon değil; gerçekte tek yol bu) GPU ile konuş).
OpenGL’de yıllarca süren itiraz edilmiş veya kullanılmamış çeşitli API'ler vardır. Sabit fonksiyonlu boru hattı denilen başka bir parça. Bazı belgeler hala bu boru hattını kullanabilir veya programlanabilir boru hattıyla karıştırılabilir. Sabit işlevli boru hattı eski günlerden itibaren ekran kartlarının 3D sahneleri oluşturmak için kullanılan matematiğin kodunu zorlaştırdığında ve OpenGL API'sı bu matematik için bazı yapılandırma değerlerini ayarlamakla sınırlı kalıyordu. Bugünlerde donanım çok az kodlanmış bir matematiğe sahip ve (CPU'nuz gibi) bunun yerine kullanıcı tarafından sağlanan programları (genellikle gölgelendiriciler olarak adlandırılıyor) çalıştırıyor.
Bir kez daha, sabit işlev özellikleri artık donanımda bulunmadığından, sürücüler eski API'yi taklit etmelidir. Bu, sürücünün içinde, kendi gölgelendiricinizi sağlamadığınızda kullanılan sabit işlevli günlerden eski matematiği yürüten bir dizi uyumluluk gölgelendiricisine sahip olduğu anlamına gelir. Eski OpenGL, eski sabit işlev durumunu (eski OpenGL aydınlatma API'si gibi) değiştiren işlevleri aslında bu değerleri sürücünün uyumluluk gölgelendiricilerine beslemek için tek tip arabellek gibi modern OpenGL özelliklerini kullanıyor.
Uyumluluğu destekleyen sürücüler bir çok sahne arkasında durmak zorundadır, bu eski özellikleri kullanırken ve bunları modern özellikler ile sorunsuz bir şekilde birleştirebildiğinizden emin olmak için çalışırlar, bu da sürücüyü büyük ölçüde zorlar. Bu, bazı sürücülerin sizi Çekirdek Profilinin daha yeni özelliklere erişmesini sağlamaya zorlama nedenlerinden biridir; aynı anda kullanılan eski ve yeni API'leri desteklemelerine gerek kalmadan sürücü iç sürücülerini büyük ölçüde basitleştirir.
Birçok belge, başlamak için daha kolay olmaları nedeniyle eski API'lerle başlamanızı önerebilir. Direct3D , uzmanlıkınız arttıkça ham Direct3D 11 kullanımıyla serbestçe karıştırılabilen daha basit çizim API'leri ve önceden yazılmış gölgelendiriciler sunan bir yardımcı kitaplık ( DirectX Tool Kit ) sunarak yeni başlayanlar için bu sorunu çözdü . Daha geniş OpenGL topluluğu, yeni başlayanlar için Uyumluluk Profili'ne sıkıştı, maalesef, eski OpenGL API'lerini yenileriyle karıştırmanıza izin vermeyen sistemler olduğu için yine sorunlu. Yeni OpenGL'de farklı seviyelerde özelliklere ve hedef kullanım durumlarına ve dillere sahip daha basit görüntü oluşturma için resmi olmayan kütüphaneler ve araçlar var ( MonoGame Örneğin, .NET kullanıcıları için), ancak resmi olarak onaylanan veya geniş ölçüde üzerinde anlaşılan hiçbir şey yoktur.
Bulduğunuz belgeler OpenGL için bile olmayabilir, ancak diğer benzer API'lerden biri için de olabilir. OpenGL | ES 1.x sabit fonksiyona sahipti ancak köşe gönderimi için OpenGL 1.x API'leri yoktu. OpenGL | ES 2.x + ve WebGL 1+ hiçbir sabit işlev özelliğine sahip değildir ve bu API'ler için geriye dönük uyumluluk modları yoktur.
Bu API'ler ana OpenGL'ye çok benziyor; oldukça uyumlu değiller, ancak OpenGL'de (bazılarının tümü değil) bazı sürücülerin OpenGL | ES (hangi WebGL'nin temel aldığı) ile uyumlu olmak için desteklediği resmi uzantıları var. Çünkü daha önce işler yeterince kafa karıştırıcı değildi.