web-dev-qa-db-fra.com

Apprendre l'OpenGL moderne

Je suis conscient qu'il y a eu des questions similaires ces dernières années, mais après avoir fait quelques recherches, je ne peux toujours pas décider d'où et quoi apprendre. J'aimerais aussi voir votre point de vue actuel sur la programmation OpenGL moderne avec plus de C++ OOP et une approche shader. Et assurez-vous que ma compréhension réelle de certaines choses est valide.

Donc ... actuellement, nous avons OpenGL 4.2, qui, comme je l'ai lu quelque part, nécessite du matériel dx11 (qu'est-ce que cela signifie?) Et un ensemble de bibliothèques "latérales", pour par exemple créer une fenêtre.

Il y a le GLUT le plus courant, que je déteste extrêmement. L'une des principales raisons sont les appels de fonction, qui ne permettent pas la liberté dans la façon dont nous créons la boucle principale. Comme certains le disaient, ce n'était pas destiné aux jeux.

Il y a aussi GLFW, qui est en fait assez sympa et simple pour moi. Pour une raison quelconque, les gens l'utilisent avec GLUT. (qui fournit non seulement l'initialisation de la fenêtre, mais également d'autres utilitaires?)

Et il y a aussi SFML et SDL (SDL <SFML imo), alors que les deux ont parfois besoin d'une approche étrange pour travailler avec OGL et dans certains cas ne sont pas vraiment rapides.

Et nous avons aussi GLEW, qui est un utilitaire de chargement d'extensions ... attendez ... GLUT/GLFW n'est-il pas déjà une extension? Y a-t-il une raison de l'utiliser, comme y a-t-il des extensions vraiment importantes pour s'intéresser?

Jusqu'à présent, nous avons la création de fenêtres (et quelques utilitaires), mais ... OGL ne prend pas en charge le chargement des textures, ni des modèles 3D. De combien d'autres bibliothèques ai-je besoin?

Parlons maintenant de la partie éducation. Il y a (in) fameux tutoriel NeHe. Écrit en C avec l'utilisation de WinApi, avec un code extrêmement flou et des solutions obsolètes, mais toujours la plus populaire. On peut trouver des trucs comme Red Book, qui sont liés à des versions comme 2.x ou 3.x, mais il n'y a que quelques didacticiels (et inachevés) mentionnant 4.x.

Avec quoi aller?

38
Neomex

Si vous écrivez un jeu, j'éviterais des choses comme GLUT et j'écrirais vos propres wrappers qui auront le plus de sens pour votre architecture de rendu de jeu.

J'éviterais également OpenGL 4.2 à ce stade, à moins que vous ne souhaitiez cibler uniquement du matériel spécifique sur des plates-formes spécifiques, car le support est minime. c'est-à-dire que la dernière version de Mac OSX Lion vient d'ajouter la prise en charge d'OpenGL 3.2.

Pour la couverture la plus complète des machines fabriquées ces dernières années, construisez votre framework autour d'OpenGL 2.1 et ajoutez une prise en charge supplémentaire pour les nouvelles fonctionnalités OpenGL là où elles ont du sens. La conception générale doit être la même. Si vous ne souhaitez cibler que les machines "actuelles", c'est-à-dire les machines de fin 2011 et au-delà, construisez votre framework autour d'OpenGL 3. Seul le matériel le plus récent prend en charge la version 4.2, et uniquement sur Windows et certains Linux. Si vous souhaitez cibler les appareils mobiles et les consoles, utilisez OpenGL ES 2.0.

GLEW charge et gère Extensions OpenGL , qui sont des extensions matérielles de différents fournisseurs, par opposition à GLUT qui est une boîte à outils pour créer des applications OpenGL, des choses complètement différentes. Je recommande vivement d'utiliser GLEW, car il fournira un mécanisme propre pour déterminer quelles fonctionnalités sont disponibles sur le matériel sur lequel il est exécuté, et vous libèrera de la tâche d'attribuer manuellement des pointeurs de fonction aux fonctions appropriées.

OpenGL SuperBible est un très bon livre, vérifiez également OpenGL Shading Language . Tout ce que vous faites avec OpenGL moderne impliquera l'utilisation de shaders - plus de fonctionnalités fixes - donc votre plus grand défi sera de comprendre GLSL et comment les pipelines de shaders fonctionnent.

19
Gerald

Donc ... actuellement, nous avons OpenGL 4.2, qui, comme je l'ai lu quelque part, nécessite du matériel dx11 (qu'est-ce que cela signifie?) Et un ensemble de bibliothèques "latérales", pour par exemple créer une fenêtre.

Le matériel DX11 est ... un matériel qui a "prend en charge DirectX 11" écrit sur le côté de la boîte. Je ne sais pas ce que vous demandez ici; vous ne savez pas ce qu'est Direct3D, ce qu'est D3D 11 ou ce qui sépare D3D 11 des versions précédentes?

FYI: D3D est une alternative Windows uniquement à l'utilisation d'OpenGL pour accéder au matériel de rendu. La version 11 n'est que la version la plus récente de l'API. Et D3D11 ajoute quelques nouveautés par rapport au D3D10, mais rien de ce dont un débutant aurait besoin.

OpenGL est une spécification qui décrit une certaine interface pour les opérations graphiques. Comment cette interface est-elle créée ne fait pas partie d'OpenGL. Par conséquent, chaque plate-forme a sa propre façon de créer un contexte OpenGL. Windows utilise l'API Win32 avec WGL. X-Windows utilise l'API X-Windows avec les fonctions GLX. Et ainsi de suite.

Les bibliothèques comme GLUT, GLFW, etc. sont des bibliothèques qui abstract toutes ces différences. Ils créent et gèrent une fenêtre OpenGL pour vous, afin que vous n'ayez pas à salir votre code avec des détails spécifiques à la plate-forme. Vous n'avez à utiliser aucun d'entre eux.

Certes, si vous êtes intéressé à apprendre OpenGL, il est préférable d'éviter de traiter des minutae spécifiques à la plate-forme, comme comment prendre soin d'un HWND et autres.

Et nous avons aussi GLEW, qui est un utilitaire de chargement d'extensions ... attendez ... GLUT/GLFW n'est-il pas déjà une extension? Y a-t-il une raison de l'utiliser, comme y a-t-il des extensions vraiment importantes pour s'intéresser?

C'est un autre malentendu. GLUT est une bibliothèque , pas une extension. Une extension OpenGL est partie d'OpenGL. Vous voyez, OpenGL n'est qu'une spécification, un document. L'implémentation d'OpenGL que vous utilisez actuellement implémente le système graphique OpenGL, mais elle peut également implémenter un certain nombre d'extensions à ce système graphique.

GLUT ne fait pas partie d'OpenGL; c'est juste une bibliothèque. Le travail de GLUT est de créer et de gérer une fenêtre OpenGL. GLEW est également une bibliothèque, qui est utilisée pour chargement des fonctions OpenGL . Ce n'est pas la seule alternative, mais c'est une alternative populaire.

Jusqu'à présent, nous avons la création de fenêtres (et quelques utilitaires), mais ... OGL ne prend pas en charge le chargement des textures, ni des modèles 3D. De combien d'autres bibliothèques ai-je besoin?

OpenGL n'est pas un moteur de jeu. Il s'agit d'un système graphique conçu pour s'interfacer avec du matériel graphique dédié. Ce travail n'a rien à voir avec des choses comme charger quoi que ce soit à partir de n'importe quel type de fichier. Oui, créer un jeu nécessite cela, mais comme indiqué précédemment, OpenGL n'est pas un moteur de jeu.

Si vous avez besoin de charger un format de fichier pour faire quelque chose que vous souhaitez faire, vous devrez soit écrire du code pour effectuer le chargement (et ajuster le format nécessaire pour interfacer avec GL), soit télécharger une bibliothèque qui le fera pour vous. Le Wiki OpenGL maintient un assez bonne liste d'outils pour différentes tâches .

Il y a (in) fameux tutoriel NeHe. Écrit en C avec l'utilisation de WinApi, avec un code extrêmement flou et des solutions obsolètes, mais toujours la plus populaire. On peut trouver des trucs comme Red Book, qui sont liés à des versions comme 2.x ou 3.x, mais il n'y a que quelques didacticiels (et inachevés) mentionnant 4.x.

Avec quoi aller?

Le Wiki OpenGL maintient une liste de matériels en ligne pour apprendre des trucs OpenGL , à la fois old-school et plus modernes.

AVERTISSEMENT: l'auto-promotion sans vergogne suit!

Mes tutoriels sur l'apprentissage des graphiques sont plutôt bons, avec de nombreuses sections et sont toujours en cours de développement. Il n'enseigne aucune fonctionnalité spécifique à OpenGL 4.x, mais OpenGL 3.3 est entièrement compatible avec 4.2. Tous ces programmes fonctionneront très bien sur du matériel 4.x.

37
Nicol Bolas

J'apprends également l'OpenGL moderne. J'ai également eu du mal à trouver de bonnes ressources, mais voici ce que j'ai découvert jusqu'à présent.

J'ai cherché un bon livre et j'ai fini avec OpenGL ES 2.0 Programming Guide , ce qui, je pense, est le meilleur choix pour apprendre l'OpenGL moderne en ce moment. Oui, le livre parle d'OpenGL ES, mais ne vous laissez pas effrayer. La bonne chose à propos d'OpenGL ES 2.0 est que toutes les parties lentes de l'API ont été supprimées afin que vous n'ayez aucune mauvaise habitude de l'apprendre alors qu'il est encore très proche d'OpenGL de bureau sinon, avec seulement quelques fonctionnalités manquantes, que je pense que vous pouvez apprendre assez facilement après avoir maîtrisé OpenGL ES 2.0.

D'un autre côté, vous n'avez pas le désordre avec les bibliothèques de fenêtrage, etc. que vous avez avec OpenGL de bureau et donc le livre sur OpenGL ES ne vous aidera pas là-bas. Je pense que les bibliothèques à utiliser sont très subjectives, mais jusqu'à présent, je me suis bien débrouillé avec SDL, ImageMagick et Open Asset Import Library .

Maintenant, le livre a été d'une bonne aide, mais à part ça, il y a aussi une belle collection de tutoriels enseignant l'OpenGL moderne à partir de zéro à développement OpenGL sur Linux . (Je pense que le nom est néanmoins valable sur d'autres systèmes d'exploitation.) Le livre, les tutoriels et un ou deux regards de temps en temps sur le Orange Book ont suffi à me faire comprendre les bases de l'OpenGL moderne . Notez que je ne suis toujours pas un maître dans le domaine, mais cela m'a définitivement lancé.

6
Antti

Je suis d'accord qu'il est très difficile d'accéder à OpenGL ces jours-ci, lorsque tous les didacticiels et exemples utilisent des fichiers de projet obsolètes, des liens boken, etc., et si vous demandez de l'aide, vous êtes simplement dirigé vers ces mêmes anciens didacticiels.

Au début, j'étais vraiment confus avec les didacticiels NeHe, mais quand j'ai eu un peu mieux comprendre le C, la compilation de bibliothèques sous UNIX et d'autres choses de base, tout s'est mis en place.

En ce qui concerne le chargement de texture, je peux recommander SOIL: http://www.lonesock.net/soil.html

Je ne suis pas sûr mais je me souviens que j'ai eu du mal à le compiler correctement, mais c'est peut-être ma faible expérience à l'époque. Donnez-moi un cri si vous rencontrez des problèmes!

Une autre astuce utile est d'obtenir un Linux VM en cours d'exécution et vous pouvez ensuite télécharger l'exemple de code NeHe Linux et le compiler hors de la boîte. Je pense que vous avez juste besoin de GLUT pour que cela fonctionne.

Je préfère également GLFW à GLUT, principalement parce que GLUT n'est pas maintenu activement.

Bonne chance!

3
oskob

Le point majeur d'OpenGL moderne est la tesselation et le nouveau type de programmes de shader, donc je voudrais recommander de commencer à partir d'un tutoriel autonome sur OpenGL 4 tesselation, à savoir: http://prideout.net/blog/?p= 48

Après les manuels et les didacticiels, un bon suivi est de jeter un œil aux moteurs open source qui sont basés sur le "nouveau" OpenGL 3/4. En tant que développeur, je voudrais pointer Linderdaum Engine .

2
Sergey K.