Ich gehe derzeit zur Hochschule für Informatik. Obwohl ich vorhabe, irgendwann eine vorhandene Engine zu verwenden, um ein kleines Spiel zu erstellen, ist mein Ziel im Moment, die Grundlagen zu erlernen: nämlich 3D-Programmierung. Ich habe bereits einige Nachforschungen bezüglich der Wahl zwischen DirectX und OpenGL angestellt, und das allgemeine Gefühl, das dabei herauskam, war, dass ein Großteil des Wissens auf die andere Plattform übertragbar ist, unabhängig davon, ob Sie OpenGL oder DirectX als Ihre Trainingsradplattform auswählen . Da OpenGL von mehr Systemen unterstützt wird (wahrscheinlich ein dummer Grund, sich für das Erlernen von OpenGL zu entscheiden), habe ich beschlossen, zunächst OpenGL zu lernen.
Nachdem ich mich dazu entschlossen hatte, OpenGL zu lernen, recherchierte ich weiter und fand eine Dichotomie heraus, die mir die ganze Zeit irgendwie unbekannt war: OpenGL mit festen Funktionen im Vergleich zu modernem programmierbarem Shader-basiertem OpenGL. Zuerst dachte ich, dass es eine naheliegende Entscheidung war, Shader-basiertes OpenGL zu erlernen, da dies heute in der Branche am häufigsten verwendet wird. Dann bin ich jedoch auf das sehr beliebte Learning Modern 3D Graphics Programming von Jason L. McKesson gestoßen, das sich hier befindet: http://www.arcsynthesis.org/gltut/
Ich habe die einleitenden Abschnitte durchgelesen und im Abschnitt "Über dieses Buch" heißt es:
"Erstens muss vieles, was mit diesem Ansatz gelernt wird, unweigerlich aufgegeben werden, wenn der Benutzer auf ein Grafikproblem stößt, das mit Programmierbarkeit gelöst werden muss. Die Programmierbarkeit löscht fast die gesamte feste Funktionspipeline, sodass das Wissen nicht einfach übertragen werden kann."
Gleichzeitig wird jedoch auch der Fall angeführt, dass die feste Funktionalität Anfängern eine einfachere und unmittelbarere Lernkurve bietet, indem Folgendes angegeben wird:
"Es wird allgemein als am einfachsten angesehen, Neuling-Grafikprogrammierer unter Verwendung der festen Funktionspipeline zu unterrichten."
Natürlich können Sie sehen, warum es zu Konflikten zwischen mir und dem zu lernenden Paradigma kommen kann: Verbringe ich viel Zeit damit, die Methoden der festen Funktionalität zu lernen (und sie später wieder zu verlernen), oder entscheide ich mich, mit Shadern zu beginnen? Mein Hauptanliegen ist, dass moderne programmierbare Shader es erfordern, dass der Programmierer die Pipeline mit festen Funktionen bereits versteht, aber ich bezweifle, dass dies der Fall ist.
TL; DR = Ist es in meinem Interesse, als aufstrebender Spielgrafik-Programmierer 3D-Programmierung durch feste Funktionalität oder moderne Shader-basierte Programmierung zu erlernen?
quelle
Antworten:
Ich kaufe mir nicht das Argument, dass es einfacher ist, mit den Sachen mit festen Funktionen zu beginnen. Es kann vorkommen, dass Sie mit der Festfunktion bestimmte Dinge mit weniger Code erledigen können - in OpenGL mit Festfunktion können Sie beispielsweise einige sehr einfache Beleuchtungs- / Schattierungsfunktionen ausführen
glEnable(GL_LIGHTING)
und einige andere Aufrufe ausführen. Das Problem ist, dass Sie, sobald Sie etwas Anderes wollen - zum Beispiel Pro-Pixel-Beleuchtung anstelle von Per-Vertex-Beleuchtung - die Fixfunktionalität ganz aufgeben und einen Shader schreiben müssen, um beide von Ihnen verwendeten Fixfunktionalitäten zu implementieren vorher, plus was auch immer Sie ändern wollten.Es scheint einfach einfacher und weniger verwirrend zu sein, die ganze Zeit Shader zu verwenden. Shader benötigen etwas mehr Setup-Arbeit, da Sie eine separate Quelldatei haben, die geladen und kompiliert werden muss, einige zusätzliche C-Aufrufe zum Nachschlagen und Einstellen von Parametern usw. Aber sobald Sie einen Shader in Betrieb haben, ist dies die einfachste Sache um ein paar verschiedene Effekte zu programmieren, verschiedene Ideen auszuprobieren usw. Und Sie müssen sich nicht darum kümmern, wo die Grenzen des Systems mit festen Funktionen liegen und ob es tun kann oder nicht, was Sie wollen. Shader können alles tun, wofür Sie Code schreiben können, und dabei die üblichen Leistungs- und Speichergrenzen modulieren.
quelle
Ich würde sagen, mit fester Funktion auf GLUT zu beginnen. Ich werde nicht viel dazu sagen, aber die Ideen hinter Shadern sind ziemlich kompliziert und das erforderliche Wissen ist die grundlegende 3D-Programmierung (dh Vertex-Erstellungs- und Transformationsmatrizen usw.). Es gibt viel mehr Stellen, an denen Sie Shader verwenden können, und es gibt noch viel mehr zu programmieren.
Überprüfen Sie mein Tutorial , und diese lighthouse3d diejenigen
quelle
Ich gehe gerade für Shader. Es ist nicht wirklich , dass es sehr viel schwieriger einzurichten, und wenn man diese erste Hürde passieren haben Sie die volle Leistung an der Hand.
Um es auf den Punkt zu bringen, werden Sie feststellen, dass die Shader-Programmierung den mathematischen Gleichungen, die Sie in Büchern und Grafik-Vorlesungen am College sehen, besser entspricht.
quelle
Ich würde vorschlagen, die feste Funktionspipeline als Rückgrat Ihres Programms zu verwenden. Ich finde es einfacher, wenn etwas angezeigt wird, anstatt nur Shader zu verwenden. Wenn Sie dann wissen, dass Sie Ihre Eckpunkte oder Normalen nicht durcheinander gebracht haben, können Sie sich langsam, aber sicher in die Schattenwelt vorarbeiten.
quelle