Fonction fixe vs Shaders: lequel pour les débutants?

16

Je vais actuellement à l'université pour l'informatique. Bien que je prévoie d'utiliser un moteur existant à un moment donné pour créer un petit jeu, mon objectif est actuellement d'apprendre les principes fondamentaux: à savoir la programmation 3D. J'ai déjà fait des recherches sur le choix entre DirectX et OpenGL, et le sentiment général qui en est ressorti est que si vous choisissez OpenGL ou DirectX comme plate-forme de roues d'entraînement, une grande partie des connaissances sont transférables à l'autre plate-forme. . Par conséquent, étant donné qu'OpenGL est pris en charge par plus de systèmes (probablement une raison idiote pour choisir quoi apprendre), j'ai décidé que je vais d'abord apprendre OpenGL.

Après avoir pris cette décision d'apprendre OpenGL, j'ai fait plus de recherches et découvert une dichotomie que je n'étais pas au courant de tout ce temps: OpenGL à fonction fixe vs OpenGL basé sur un shader programmable moderne. Au début, je pensais que c'était un choix évident que je devais choisir d'apprendre OpenGL basé sur des shaders, car c'est ce qui est le plus couramment utilisé dans l'industrie aujourd'hui. Cependant, je suis tombé par la suite sur la très populaire programmation graphique moderne d'apprentissage par Jason L. McKesson, située ici: http://www.arcsynthesis.org/gltut/

J'ai lu les morceaux d'introduction et dans la section "À propos de ce livre", l'auteur déclare:

"Premièrement, une grande partie de ce qui est appris avec cette approche doit être inévitablement abandonnée lorsque l'utilisateur rencontre un problème graphique qui doit être résolu avec la programmabilité. La programmabilité efface presque tout le pipeline de fonctions fixes, de sorte que les connaissances ne sont pas facilement transférées."

mais en même temps, le fait que la fonctionnalité fixe offre une courbe d'apprentissage plus facile et plus immédiate pour les débutants en déclarant:

"Il est généralement considéré comme le plus facile d'enseigner aux programmeurs graphiques néophytes en utilisant le pipeline de fonctions fixes."

Naturellement, vous pouvez voir pourquoi je pourrais être en conflit sur le paradigme à apprendre: est-ce que je passe beaucoup de temps à apprendre (puis à désapprendre plus tard) les moyens de la fonctionnalité fixe, ou est-ce que je choisis de commencer avec des shaders? Ma principale préoccupation est que les shaders programmables modernes nécessitent en quelque sorte que le programmeur comprenne déjà le pipeline de fonctions fixes, mais je doute que ce soit le cas.

TL; DR = En tant que futur programmeur graphique de jeu, est-il dans mon intérêt d'apprendre la programmation 3D par le biais d'une programmation à fonctionnalité fixe ou d'un shader moderne?

Rob Hays
la source
Il y a aussi des questions similaires à cela ...
notlesh
"mais en même temps, cela prouve également que la fonctionnalité fixe fournit une courbe d'apprentissage plus facile et plus immédiate pour les débutants en déclarant:" Je suis curieux. Comment cela justifie-t-il cette affaire? Parce que la citation dit clairement: "C'est généralement considéré comme le plus facile ..." (non souligné dans l'original). Comme dans, cela peut être considéré comme vrai, mais cela ne signifie pas qu'il est vrai.
Nicol Bolas
Oui, c'était une façon maladroite de formuler cela.
Rob Hays
Le pipeline à fonction fixe a été déconseillé dans OpenGL et DirectX, donc je ne perdrais pas votre temps avec. Les shaders de base sont assez simples et certainement pas plus compliqués que de comprendre suffisamment pour faire fonctionner un contexte de rendu.
3Dave

Réponses:

30

Je n'accepte pas l'argument selon lequel il est plus facile de commencer avec les choses à fonction fixe. Il se peut que la fonction fixe vous permette de faire certaines choses avec moins de code - dans OpenGL à fonction fixe, par exemple, vous pouvez obtenir un éclairage / ombrage très basique en faisant glEnable(GL_LIGHTING)et quelques autres appels. Le problème est que dès que vous voulez quelque chose de légèrement différent - un éclairage par pixel, par exemple, au lieu d'un éclairage par sommet - vous devez abandonner complètement les fonctions fixes et écrire un shader pour implémenter les deux fonctionnalités fixes que vous utilisiez avant, plus tout ce que vous vouliez changer.

Il semble juste qu'il serait plus simple et moins déroutant d'utiliser des shaders tout le temps. Les shaders ont besoin d'un peu plus de travail de configuration car vous avez un fichier source séparé qui doit être chargé et compilé, quelques appels C supplémentaires pour rechercher et définir des paramètres, etc. Mais une fois que vous avez un shader, c'est la chose la plus simple pour coder quelques effets différents, essayer différentes idées, etc. Et vous n'avez pas à vous soucier de savoir où se trouvent les limites du système à fonction fixe et s'il peut ou non faire ce que vous voulez; les shaders peuvent faire tout ce pour quoi vous pouvez écrire du code, modulo les limites habituelles de performance et de mémoire.

Nathan Reed
la source
Cool, merci pour la réponse. Je finirai très probablement par aller bien pour les shaders.
Rob Hays
3
+1 - c'est aussi un peu comme "Learning C ++" vs "Learning BASIC". Il vous faudra plus de temps pour apprendre le C ++ mais vous en aurez appris davantage à long terme.
Jonathan Dickinson
3
Je voudrais recommander opengl-tutorial.org . Le site explique très bien les bases et n'utilise que des shaders.
Exilyth
3

Je dirais de commencer avec une fonction fixe sur GLUT. Je ne vais pas en dire beaucoup à ce sujet, mais les idées derrière les shaders sont assez compliquées et les connaissances requises sont la programmation 3D de base (c'est-à-dire la création de sommets et les matrices de transformation, etc.). Il y a beaucoup plus d'endroits que vous pouvez foutre en utilisant des shaders, il y en a beaucoup plus à coder.

Consultez mon tutoriel , et ces lighthouse3d les

bobobobo
la source
2

Je vais ensuite directement pour les shaders. Ce n'est pas vraiment que beaucoup plus difficile à mettre en place, et lorsque vous passez ce premier obstacle que vous avez la pleine puissance à portée de main.

Plus précisément, vous constaterez que la programmation des shaders correspond mieux aux équations mathématiques que vous voyez dans les livres et les conférences graphiques au collège.

MGB
la source
0

Je suggère d'utiliser le pipeline de fonctions fixes comme colonne vertébrale de votre programme. Je trouve qu'il est plus facile d'avoir quelque chose qui s'affiche en l'utilisant au lieu de simples shaders. Ensuite, lorsque vous savez que vous n'avez pas gâché vos sommets ou vos normales, vous pouvez lentement mais sûrement vous frayer un chemin dans le monde de l'ombrage.

Oskar
la source