Est-ce qu'apprendre OpenGL 2.1 est inutile aujourd'hui?

44

Je suis nouveau dans le monde 3D OpenGL / DirectX et j'ai découvert que les spécifications OpenGL 4.1 et GLSL venaient d'être publiées aujourd'hui.

Un de mes amis m'a donné le Livre rouge pour OGL v2.1 mais, autant que j'ai lu, les versions 3.x et 4.x diffèrent beaucoup de la version 2.x et beaucoup de choses sont obsolètes maintenant.

Puis-je utiliser le livre pour commencer à apprendre les bases de la 3D et de la CG ou est-il préférable de trouver une nouvelle copie?

reefaktor
la source
10
Je ne connais pas grand chose à propos d'OpenGL / DirectX, mais j'aime bien jouer à des jeux sur une machine de plus d'un an. J'imagine que vous savez qu'avant OpenGL 3.x serait bénéfique pour mes habitudes de jeu. Juste une pensée.
Simurr
Je n'aime pas la façon dont cette question est formulée. Pouvez-vous créer un jeu sous OpenGL 2.1 ? La réponse: un oui définitif . Qu'entendez-vous par inutile alors? Pouvez-vous apprendre les bases de la 3D à partir d'un livre ancien ou d'une API obsolète? Encore une fois un oui définitif . Est-ce le meilleur moyen de le faire? Probablement pas .
Bobobobo

Réponses:

18

Dans des moments comme celui-ci, je me dirige toujours vers le Steam Hardware Survey: http://store.steampowered.com/hwsurvey/ - vous constaterez que le taux de pénétration des systèmes de classe DX10 / 11 sur le marché atteint presque 80%; ceci étant globalement équivalent à GL3.3 ou supérieur. Ce 80% est réservé aux utilisateurs de Vista / 7 - ajoutez un GPU DX10 / 11 avec XP et vous montez à un peu plus de 90%.

Sachant que nous parlons ici de joueurs légèrement plus hardcore, vous devez alors commencer à penser à votre public cible. S'agit-il des personnes que vous souhaitez cibler? Visez-vous ceux qui ont plus de matériel de bas niveau? Qu'en est-il des graphiques Intel? Qu'en est-il des utilisateurs Mac et Linux? Ce sont toutes des questions auxquelles vous devez répondre par vous-même, de sorte que des directives générales sont ce qu'il y a de mieux.

Ajoutons à cela, vous devez tenir compte du fait que si vous commencez à apprendre aujourd'hui avec l'intention d'expédier quelque chose, vous disposez d'une période minimale d'un an avant de vous y rendre (à moins que nous ne parlions à propos de cas vraiment triviaux / simples). Avec la tendance à la hausse des capacités gfx qui se poursuit, nous envisageons d’avoir une réelle adoption presque totale du matériel GL3.3 + d’ici là.

N'oubliez pas qu'avec GL2.1 ou une version inférieure, vous allez apprendre et utiliser énormément d'anciennes absurdités cruelles, même si vous vous limitez au sous-ensemble shaders et VBO de GL2.1 (les versions de niveau inférieur de GLSL sont désagréables à utiliser , et les VBO en streaming sont pratiquement inutilisables sans GL_ARB_map_buffer_range) - GL3.3 + a introduit des façons beaucoup plus agréables (et plus performantes) de gérer beaucoup de choses, vous ferez une meilleure utilisation du matériel du lecteur (et ils seront reconnaissants à pour cela) et vous passerez plus de temps à écrire du code productif plutôt que de vous battre contre une API qui ne veut vraiment pas coopérer avec vous.

Et bien sûr, il y a la situation redoutée du conducteur. Le fait difficile, mais vrai, est que les pilotes GL sous Windows sont dans un état déplorable - NV prend en charge les éléments qu’ils ne devraient pas, AMD ne prend pas en charge les éléments qu’ils devraient, et avec Intel, vous devez vraiment vous limiter aux fonctionnalités GL pour lesquelles il existe un équivalent en D3D. Plus le GL_VERSION est récent, plus il est probable que vous rencontriez des bogues de pilotes, mais pour GL3.3, les choses sont raisonnablement stables maintenant.

En résumé, en l'absence de toute autre information (public cible, etc.), je ciblerais GL3.3 en tant que référence (en intégrant éventuellement une fonctionnalité à partir de GL_VERSIONs supérieures, là où elle est disponible et ne perturbe pas le codebase. trop) à moins qu'il y ait une raison très précise et clairement identifiée de descendre plus bas (et je voudrais en être absolument sûr à 100% plutôt que d'utiliser une notion vague de " mais qu'en est-il de ceux qui ont du matériel plus ancien "). Dans ce dernier cas, je n'irais pas au-dessous de GL2.1 et je chercherais à intégrer autant de fonctionnalités 3.x que possible, même à ce moment-là.

Maximus Minimus
la source
Excellent point sur GL3.3 ~ = Statistiques matérielles DX10 / 11 et Steam.
Nate
Juste pour mettre à jour ces statistiques - les GPU DX10 / 11 + Vista / 7 sont maintenant à ~ 88%, ajoutez 4,38% supplémentaires pour le GPU DX10 / 11 + XP et vous envisagez une pénétration assez supérieure à 90%. L’utilisation augmente beaucoup plus rapidement que je ne l’avais prévu lors de la publication de ce message.
Maximus Minimus
"GL3.3 + a introduit des façons beaucoup plus agréables (et plus performantes) de gérer beaucoup de choses" - Comment se comporte 3.2 en comparaison? Les utilisateurs de Mac ne disposent pas encore de la version 3.3. Je suppose que c'est à peu près la même chose, mais je ne veux pas en assumer trop.
michael.bartnett
38

Je suggérerais de rester à l'intersection de 2.1 et 3. Il y a encore beaucoup de matériel et de pilotes qui ne supportent que OpenGL 2.1, mais les pratiques encouragées par OpenGL 3 core sont meilleures. Ce tutoriel est un très bon point de départ (enseigne OpenGL 2.0 sans fonctionnalités obsolètes en 3).

Jake McArthur
la source
3
+1 pour le tutoriel de Joe Groff. Il vous guide à travers tout le pipeline du chapitre 2. Et tout code "utilitaire" qu’il ajoute n’a que deux fonctions: une pour lire un fichier (pour GLSL) et un pour lire des images TGA (et vous pourriez tout aussi bien en utiliser un autre). bibliothèque d'images ou écrivez votre propre chargeur d'images une fois que l'exemple fonctionne). Tout le reste est expliqué et fait partie du tutoriel.
michael.bartnett
18

Je dirais que ce n'est pas inutile.

Pourquoi? Eh bien, alors que le reste du monde prend en charge OpenGL 3.x et 4.0, Mac OS X ne prend toujours en charge que OpenGL 2.1. Et OpenGL ES, qui est utilisé sur la plupart des plates-formes portables, sinon toutes, est toujours largement pris en charge sur toutes les versions: 1.0, 1.1 et 2.0; qui sont à peu près comparables à OpenGL 1.4, 1.5 et 2.1, respectivement.

Donc, jusqu'à ce qu'OpenGL ES 1.0 disparaisse complètement de la surface de la Terre, sachant qu'OpenGL 2.x ne sera pas un gaspillage.

Cela ne veut pas dire qu’il n’est pas rentable d’utiliser OpenGL 3.x ou 4.0 sur des plates-formes qui le prennent en charge, bien sûr.

Mise à jour: à compter de la sortie de Mac OS X Lion (10.7), le profil OpenGL 3.2 Core est maintenant pris en charge sur Mac. Cette version déprécie de grandes parties d'OpenGL 1.x pour simplifier l'API. Les utilisateurs d'anciennes versions d'OS X (et des graphiques Intel bas de gamme) sont toujours limités à OpenGL 2.0 et 2.1. Connaître OpenGL 2.x est néanmoins toujours utile et le restera encore longtemps.

dégraissage
la source
Snow Leopard prend en charge la plupart des extensions d'OpenGL 3 - même les shaders de géométrie.
Axel Gneiting
@Alex Prendre en charge "la plupart" des extensions ne signifie pas que le noyau GL3 est pris en charge. Et nous ne parlons que de 3.x
Matias Valdenegro le
@Axel Gneiting: Ce n'est tout simplement pas la même chose. La plupart des fonctionnalités intéressantes d'OpenGL 3.0+ ne sont pas disponibles en tant qu'extensions. Il y a un grand nombre de changements fondamentaux.
Greyfade
12

La réponse de mh01 couvrait une grande partie des bases, je vais donc ajouter quelques suppléments.

OpenGL ES

Parlons de ES 2.0 vs. Desktop GL 2.1 vs. Desktop GL 3.3. Aux fins de la présente discussion, le terme "GL XY" désignera la version de bureau OpenGL XY, tandis que "ES XY" désignera OpenGL ES XY.

Sur le plan structurel , ES 2.0 a plus de points en commun avec le noyau GL 3.3 qu'avec GL 2.1. GL 3.3 et ES 2.0 sont tous deux basés sur du shader pur. Ils sont tous deux purement basés sur des objets tampons. Etc. GL 2.1 comporte de nombreuses interruptions de performance et de codage qui faciliteraient l’écriture d’une application GL 2.1 qui ne serait pas facilement portable vers ES 2.0.

Cependant, en termes de syntaxe du langage de shading , GLSL ES 1.00 (mappage vers ES 2.0) ressemble beaucoup plus au GLSL de GL 2.1 qu’à celui de GL 3.3. Les mots-clés attributeet varyingn'existent pas dans 3.3 core; il utilise inand out, ce qui est beaucoup plus cohérent et raisonnable lorsque vous utilisez plus de 2 étapes de shader (c'est pourquoi ES 3.0 a adopté la syntaxe GL 3.3).

Il est facile de mapper les concepts appris dans les GL 3.3 à ES 2.0. Donc, si vous apprenez le GL 3.3 avec l’un des outils, vous comprendrez comment travailler dans le monde ES 2.0. Vous devrez bien sûr savoir où se trouve le sous-ensemble (c'est-à-dire ce que GL 3.3 peut faire que l'ES 2.0 ne peut pas), mais les concepts sont les mêmes.

Mapper la syntaxe de GLSL, de sorte que vous puissiez copier des shaders de l'un à l'autre, est un peu plus difficile. Mais vraiment, tout ce qu’il faut, c’est quelques #définis aux bons endroits. En outre, GLSL 3.30 possède quelques fonctionnalités de compatibilité ES, comme par exemple highp(ce qui ne fait rien dans le GLSL de bureau).

Vous gagnez donc quelque chose pour ES 2.0 en apprenant de GL 3.3 au lieu de GL 2.1.

Nicol Bolas
la source
8

Pour les jeux ne nécessitant pas les modifications plus importantes apportées à OpenGL exposées uniquement dans les versions les plus récentes, l'utilisation de la version 3.x + uniquement vous limite à une série de nvidia 8 et ultérieure (vous ne pouvez pas savoir sur les autres fournisseurs de graphiques que vous souhaitez consulter). Ainsi, si vous n'utilisez pas les fonctionnalités 3.x +, vous créez simplement une limite artificielle, empêchant les personnes disposant de cartes graphiques plus anciennes, mais très puissantes, de jouer à votre jeu.

Pour cette raison, je vous recommande fortement d’apprendre le sous-ensemble de compatibilité aval, ainsi que les versions les plus récentes, puis de choisir la version la plus basse pour laquelle vous pouvez réellement pousser votre jeu. Vous pouvez

Je noterai également, en réponse à une autre question, qu'OpenGL: ES 2.0 supprime le pipeline de fonctions fixes, de sorte qu'il équivaut davantage à la version 3.0 qu'à la version 2.1. De plus, elle prend toujours en charge différentes fonctionnalités par la version gl prise en charge au moment de l'exécution.

jsimmons
la source
4

Je dirais qu'il est préférable de connaître OpenGL à l'aide de votre livre rouge. Ignorez simplement les éléments déconseillés dans les versions les plus récentes (comme glBegin (), glEnd () - utilisez plutôt les VBO). La plupart des fonctionnalités des nouvelles versions étaient déjà disponibles auparavant via des extensions.

thbusch
la source
4

Je suis surtout d'accord avec thbusch. Mais je ne voudrais pas ignorer complètement les API obsolètes: il y a encore trop de code qui les utilise. Je leur ferais beaucoup moins d'attention, cependant. Inutile, par exemple, d’apprendre suffisamment à glBegin (), glEnd () pour écrire votre propre code en les utilisant. Mais vous devriez les reconnaître quand vous les voyez et avoir une idée de ce qu’ils font.

Il est toujours utile de lire au moins une fois l'intégralité du Red Book, même si vous ne construisez pas l'exemple de code et ne faites pas d'exercices couvrant les fonctionnalités abandonnées dans OpenGL 3.x.

utilisateur1800
la source
3

La réponse courte:

Apprendre à utiliser OpenGL 2.1 est une bonne idée, même aujourd’hui, à condition d’apprendre les «bons côtés».

La réponse longue:

OpenGL peut essentiellement être divisé en deux parties: "Les bonnes parties" et "Fonctions héritées".

Honnêtement, je ne vois pas grand avantage à apprendre les fonctions héritées (la "fonction fixe"). Cependant, une partie importante d'OpenGL 2.1 (les bonnes parties) est toujours disponible avec des modifications relativement mineures.

En tant que tel, apprendre certaines parties d'OpenGL 2.1 peut être bénéfique. En particulier, OpenGL ES 2 est très populaire de nos jours et ES 2 est principalement (mais pas exactement) un sous-ensemble d’OpenGL 2.1. OpenGL ES 2 est indispensable pour la programmation 3D dans les smartphones.

Alors quoi de "bien"? Essentiellement, tout ce qui se trouve dans OpenGL 3.x "Profil de base" (par opposition à "Profil de compatibilité") et / ou dans OpenGL ES 2.

  • Shaders de vertex et de fragment: apprenez-les
  • Textures: toujours bonnes.
  • Matrices: savoir comment ils fonctionnent est bénéfique, mais glLoadIdentityce type de fonctions est obsolète et doit être évité
  • Lumière: Il est utile de savoir comment simuler la lumière en images de synthèse, mais glLightfvil convient d’éviter toute autre fonction d’éclairage à fonction fixe.
  • Tampons de tableau: bons
  • glBegin, glVertex, glColor, glEnd: Éviter. Peut-être bon pour une expérimentation rapide, mais il y a d'autres meilleures façons de faire la même chose.
  • Afficher les listes: éviter

La question pour laquelle j'ai posté cette réponse à l'origine était un doublon, je la republie ici.

luiscubal
la source
1

Je ne crois pas que ce soit une mauvaise idée. Un grand nombre de concepts GL couvrent toutes les versions d'OpenGL et vous aideront toujours. J'ai un certain nombre de livres OpenGL d'il y a 10 ans qui aident encore aujourd'hui. Je dirais que si vous êtes nouveau sur OpenGL et que certains meilleurs livres sont plus anciens, vous en apprendrez beaucoup et le code devrait toujours fonctionner. La plupart des OpenGL sont compatibles avec les versions antérieures (je crois).

Mongoïde
la source
1

Je vous conseille d’apprendre d’abord les éléments modernes et de prétendre que les éléments existants n'existent pas tant que vous n’en avez pas besoin.

Les éléments obsolètes peuvent être utiles dans certains cas, par exemple si vous essayez de programmer pour quelque chose qui ne supporte qu’OpenGL 1.5 ou plus ancien (on peut le trouver sur les anciens netbooks crappy et les anciens systèmes MacOS), OpenGL ES 1.x (les anciens iPhone et Android avant la version 1.6), ou OpenGL SC (le sous-ensemble Saftey Critical si vous programmez un affichage sur un chasseur à réaction). Minecraft, par exemple, est basé sur OpenGL 1.3 et peut donc prendre en charge des matériels très anciens (mais même ceux-ci ont une option "avancée").

Cela peut également être utile si vous souhaitez simplement afficher des pixels à l'écran sans vous soucier de le faire de la bonne façon.

Il est utile de s’appuyer sur certaines des fonctionnalités proposées par défaut par OpenGL lors de l’apprentissage, telles que la configuration d’une fenêtre d’affichage de -1,0 à 1,0 et le rendu sans shaders. Cela vous permet d'apprendre sans avoir à tout faire en une seule fois.

Mais à part cela, il devrait être ignoré si possible.

Je vous suggère de consulter ma réponse ici et ici pour des informations plus détaillées.

David C. Bishop
la source