OpenGL a quatre versions principales différentes, sans compter les versions pour les appareils mobiles et les systèmes intégrés (OpenGL | ES) et le Web via JavaScript (WebGL). Tout comme Direct3D 11 a une manière de faire différente de Direct3D 8, OpenGL 3 a une façon de faire différente de celle d’OpenGL 1. La grande différence est que les versions d’OpenGL ne sont généralement que des add-ons aux anciennes versions (mais pas entièrement).
Outre les différentes éditions et versions d'OpenGL, le principal OpenGL a également ajouté le concept de profils. À savoir le profil de compatibilité (qui active la prise en charge des API d'anciennes versions) et le profil principal (qui désactive ces anciennes API). Des choses comme glBegin
tout simplement ne fonctionnent pas lorsque vous utilisez le profil principal, mais le seront quand vous utiliserez le profil de compatibilité (qui est le profil par défaut).
Comme autre complication majeure, certaines implémentations d'OpenGL (comme celle d'Apple, entre autres) n'activeront les nouvelles fonctionnalités OpenGL que lorsque vous utilisez le profil principal. Cela signifie que vous devez cesser d'utiliser les anciennes API pour pouvoir utiliser les nouvelles API.
Vous vous retrouvez alors avec plusieurs scénarios très déroutants pour les tutoriels:
- Le didacticiel est ancien et utilise uniquement des API obsolètes.
- Le didacticiel est nouveau et bien écrit. Il utilise uniquement des API compatibles Core.
- Le didacticiel est nouveau, mais commet l'erreur de supposer que vous utilisez un pilote qui active toutes les API en mode de compatibilité et mélange librement les anciennes et les nouvelles API.
- Le tutoriel concerne une édition d'OpenGL différente, telle qu'OpenGL | ES, qui ne prend en charge aucune des anciennes API, quelle que soit leur version.
Des choses comme glBegin
font partie de ce qu'on appelle parfois l'API en mode immédiat. C'est également très déroutant, car un mode retenu dans OpenGL et le "mode immédiat" avaient déjà une définition différente dans les graphiques. Il est bien mieux de se référer à celles-ci sous le nom d'API OpenGL 1.x, car elles sont obsolètes depuis OpenGL 2.1.
L'API 1.x d'OpenGL soumettait immédiatement les sommets au pipeline graphique dans le passé. Cela fonctionnait bien lorsque la vitesse du matériel qui rendait les sommets était à peu près égale à celle du processeur générant les données du sommet. OpenGL à l'époque vient de décharger le rasterization du triangle et pas grand-chose d'autre.
De nos jours, le GPU peut parcourir de très nombreux sommets à très haute vitesse tout en effectuant une transformation avancée des vertex et des pixels et le processeur ne peut tout simplement pas suivre à distance. De plus, l'interface entre le processeur et le processeur graphique a été conçue autour de cette différence de vitesse, de sorte qu'il n'est même plus possible de soumettre des sommets au processeur graphique à la fois.
Tous les pilotes GL doivent émuler glBegin
en allouant en interne un tampon de vertex, en plaçant les vertices soumis avec glVertex
dans ce tampon, puis en soumettant ce tampon entier dans un seul appel de dessin lorsque glEnd
est appelé. Le surcoût de ces fonctions est bien plus important que si vous venez de mettre à jour vous-même le tampon de vertex, c’est pourquoi certaines documentations qualifient (par erreur!) Les tampons de vertex comme "une optimisation" (ce n’est pas une optimisation; c’est le seul moyen de parler au GPU).
Différentes autres API ont été obsolètes ou obsolètes dans OpenGL au fil des ans. Le pipeline dit à fonction fixe est un autre exemple. Certaines documentations peuvent toujours utiliser ce pipeline ou se mélanger au pipeline programmable. Le pipeline à fonction fixe provient de l'ancien temps où les cartes graphiques codaient en dur tous les calculs utilisés pour le rendu des scènes 3D et que l'API OpenGL était limitée à la définition de valeurs de configuration pour ce calcul. De nos jours, le matériel utilise très peu de maths codés en dur et (tout comme votre CPU) exécute des programmes fournis par l'utilisateur (souvent appelés shaders).
Une fois encore, les pilotes doivent émuler l'ancienne API car les fonctionnalités à fonction fixe ne sont tout simplement plus présentes sur le matériel. Cela signifie que le pilote contient un ensemble de nuanceurs de compatibilité qui exécutent l'ancien calcul des jours à fonction fixe, utilisé lorsque vous ne fournissez pas vos propres nuanceurs. Les anciennes fonctions OpenGL qui modifient cet ancien état à fonction fixe (comme l'ancienne API d'éclairage OpenGL) utilisent en fait des fonctionnalités OpenGL modernes, telles que des tampons uniformes, pour transmettre ces valeurs aux shaders de compatibilité du pilote.
Les pilotes qui prennent en charge la compatibilité doivent faire beaucoup de travail en coulisse pour comprendre quand vous utilisez ces fonctionnalités obsolètes et vous assurer que vous pouvez les combiner avec des fonctionnalités modernes, ce qui augmente les frais généraux et complique grandement les tâches du pilote. C'est l'une des raisons pour lesquelles certains pilotes vous obligent à activer le profil principal pour obtenir de nouvelles fonctionnalités. cela simplifie grandement les internes de leurs pilotes en évitant de prendre en charge les anciennes et les nouvelles API utilisées simultanément.
Beaucoup de documentation peut vous recommander de commencer avec les anciennes API simplement parce qu'elles sont plus faciles à utiliser. Direct3D a résolu ce problème pour les débutants en proposant une bibliothèque complémentaire ( Kit DirectX Tool Kit ) qui fournit des API de dessin plus simples et des shaders pré-écrits pouvant être mélangés librement avec l'utilisation brute de Direct3D 11 à mesure que votre savoir-faire se développe. La communauté OpenGL au sens large s’est heurtée au profil de compatibilité pour les débutants, ce qui est malheureusement problématique, car il existe à nouveau des systèmes qui ne vous permettent pas de mélanger les anciennes API OpenGL avec les plus récentes. Il existe des bibliothèques et des outils non officiels pour un rendu plus simple du nouvel OpenGL avec différents niveaux de fonctionnalités, ainsi que des cas d'utilisation et des langues cibles ( MonoGame pour les utilisateurs .NET par exemple), mais rien n’a été officiellement approuvé ou largement accepté.
La documentation que vous trouvez peut ne même pas être pour OpenGL mais peut-être pour l'une des autres API similaires. OpenGL | ES 1.x avait un rendu à fonction fixe mais ne disposait pas des API OpenGL 1.x pour la soumission de vertex. OpenGL | ES 2.x + et WebGL 1+ ne possèdent aucune fonctionnalité à fonction fixe et il n'existe aucun mode de compatibilité avec les versions antérieures pour ces API.
Ces API ressemblent beaucoup à OpenGL principal; ils ne sont pas tout à fait compatibles, mais il existe des extensions officielles d'OpenGL que certains (pas tous) pilotes prennent en charge pour devenir compatibles avec OpenGL | ES (sur lequel WebGL est basé). Parce que les choses n'étaient pas assez déroutantes auparavant.