Fixed-Function vs Shaders: Welche für Anfänger?


16

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?


Es gibt auch einige ähnliche Fragen ...
notlesh

"Gleichzeitig macht es aber auch den Fall, dass die feste Funktionalität Anfängern eine einfachere und unmittelbarere Lernkurve bietet, indem sie sagt:" Ich bin neugierig. Wie genau trifft das zu? Weil das Zitat klar sagt: "Es wird allgemein als am einfachsten angesehen ..." (Hervorhebung hinzugefügt). Wie in kann es als wahr angesehen werden, aber das bedeutet nicht, dass es wahr ist.
Nicol Bolas

Ja, das war eine umständliche Formulierung.
Rob Hays

Die Pipeline mit festen Funktionen ist sowohl in OpenGL als auch in DirectX veraltet, sodass ich Ihre Zeit nicht damit verschwenden würde. Grundlegende Shader sind ziemlich unkompliziert und sicherlich nicht komplizierter als genug zu verstehen, um einen Renderkontext zum Laufen zu bringen.
3Dave

Antworten:


30

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.


Cool, danke für die Antwort. Ich werde höchstwahrscheinlich nur für Shader gehen.
Rob Hays

3
+1 - es ist auch ein bisschen wie "Learning C ++" vs "Learning BASIC". Das Erlernen von C ++ dauert länger, aber Sie werden auf lange Sicht mehr gelernt haben.
Jonathan Dickinson

3
Ich möchte opengl-tutorial.org weiterempfehlen . Die Site erklärt die Grundlagen recht gut und verwendet nur Shader.
Exilyth


2

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.