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?
Réponses:
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à.
la source
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).
la source
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.
la source
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
attribute
etvarying
n'existent pas dans 3.3 core; il utilisein
andout
, 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.
la source
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.
la source
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.
la source
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.
la source
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.
glLoadIdentity
ce type de fonctions est obsolète et doit être évitéglLightfv
il convient d’éviter toute autre fonction d’éclairage à fonction fixe.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.La question pour laquelle j'ai posté cette réponse à l'origine était un doublon, je la republie ici.
la source
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).
la source
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.
la source