Gehen Sie reines OpenGL oder GLSL? [geschlossen]

11

Ich habe mich für das Studium der Grafikprogrammierung interessiert, daher war der offensichtliche Einstiegspunkt das Erlernen von OpenGL. Wenn man jedoch verstreute Informationen in Foren und Websites sammelt, scheint eine reine OpenGL-Implementierung zu verblassen, da die meisten Dinge vor 3.0 veraltet sind und eine Rezension bei Amazon zitiert wird, "seit 3.0 dreht sich alles um die Shader". Auch von den Büchern, die ich gesehen habe, sieht es so aus, als ob nur das Superbible die neuere Version abdeckt, aber nur teilweise, weil ein großer Teil des Buches veraltete Funktionen lehrt und es Bücher speziell für GLSL gibt.

Hier stieß ich auf mein erstes Problem. Einige Hardwares unterstützen GLSL nicht, einschließlich des Notebooks mit integrierten Intel-Grafiken, das ich verwenden wollte. Die Funktion

GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);

verursacht einen Segmentierungsfehler und anscheinend unterstützt mein Treiber keine Shader

Meine Frage ist also, wie realisierbar es ist, ein Spiel nur in OpenGL zu erstellen. Vermisse ich unersetzliche gute Funktionen in der Shader-Sprache? Und welche Art von Hardware (alte Generation i3, i5, i7, alte VGAs) kann ich erwarten, um ein Spiel mit Shadern richtig auszuführen?

ibrabeicker
quelle
1
GLSL ist OpenGL. Ich denke, Ihre Frage hängt damit zusammen, ob die Hardware, die Sie verwenden möchten, OpenGL 3-kompatibel und nicht speziell GLSL-kompatibel ist.
verzögert
@ Daniel Also, wenn eine Hardware / ein Treiber OpenGL 3.0-kompatibel ist, ist sie GLSL-kompatibel?
Ibrabeicker
1
GLSL ist Teil der OpenGL 3.0-Spezifikation. Ja, das ist der Fall.
verzögert
1
Sie sagen: "Wie es aussieht, unterstützt mein Treiber keine Shader." Welche Version von OpenGL erhalten Sie? Laden Sie alle verfügbaren OpenGL-Funktionen korrekt?
Nicol Bolas
1
@Papavoikos: Wenn es NULL zurückgibt, haben Sie viel größere Probleme als die Verwendung von Shadern. Erstellen Sie Ihren OpenGL-Kontext korrekt? Denken Sie daran: Sie können keine GL-Funktionen aufrufen, bis Sie einen gültigen Kontext erstellt und aktuell gemacht haben.
Nicol Bolas

Antworten:

9

Shader-Code ist definitiv klarer und verständlicher als ein Durcheinander von glTexEnv-, glTexGen- und Texturmatrix-Aufrufen und hat den Bonus, dass Sie damit jede mehr oder weniger willkürliche mathematische Operation ausdrücken können (was Sie mit dem Fixed nicht tun können Pipeline - was Sie "pure OpenGL" nennen). Der einzige mögliche Nachteil ist, dass Sie eine bestimmte Menge an unterstützender Infrastruktur in Ihren Code schreiben müssen, bevor Sie sie verwenden können, während Sie mit der alten Methode ziemlich genau eintauchen können. Ich nenne das einen "potenziellen" Nachteil, weil ich Denken Sie tatsächlich, dass Sie dadurch Dinge vorbereiten und im Voraus etwas mehr lernen können - OpenGL hat den Ruf, "einfach" zu sein, und Sie sehen gelegentlich, wie sich Leute davon täuschen lassen und direkt eintauchen, ohne wirklich zu wissen, was sie zuerst tun.

In Bezug auf die Hardware können Sie sich auf fast alles verlassen, was in den letzten 5/6/7 Jahren veröffentlicht wurde, um ein gewisses Maß an Shader-Unterstützung zu erhalten. Bei älteren Intel-Versionen (einige der 9xx-Serien) handelt es sich jedoch nicht um GLSL. Stattdessen werden die älteren Erweiterungen GL_ARB_vertex_program und GL_ARB_fragment_program verwendet . Diese verwenden eine Assembler-ähnliche Shader-Sprache, aber - Geständniszeit - ich persönlich mag sie sehr gern. Es ist eigentlich recht einfach zu bedienen, wenn einige modernere Funktionen (z. B. Verzweigung) fehlen und mehr Zeilen Shader-Code erforderlich sind, um dasselbe zu tun. Die unterstützende Infrastruktur, die in Ihrem Hauptprogramm für diese Erweiterungen benötigt wird, ist viel leichter als auch für GLSL.

Das heißt aber nicht, dass ich sie über GLSL empfehlen würde, aber sie sind eine Option, die es gibt, wenn Sie wirklich auf dieser Hardwareklasse laufen müssen, und es ist nützlich zu wissen, dass sie existieren, was mich zum letzten Punkt bringt . Sind Sie wirklich sicher, dass Sie wirklich auf dieser Hardwareklasse laufen müssen (z. B. bei Ihrem Notebook haben Sie möglicherweise nur versäumt, die Einstiegspunkte zu erhalten)?

Maximus Minimus
quelle
Ich habe die Tatsache völlig vernachlässigt, dass Mesa3d immer noch der OpenGl 2.1-Spezifikation entspricht. Ich werde das beheben
ibrabeicker
6

Es sollte auch beachtet werden, dass es kein "reines OpenGL" mehr gibt.

OpenGL ES 2.0 hat alle Nicht-Shader-Inhalte über Bord geworfen, und da WebGL darauf basiert, funktioniert es auch nur mit Shadern. OpenGL 3.0 hat alle Inhalte mit festen Funktionen verworfen und 3.1 entfernt (in Kernprofilen. Die meisten Implementierungen unterstützen Kompatibilitätsprofile, MacOSX jedoch nicht für die Implementierung von 3.2).

Daher würde ich nicht empfehlen, OpenGL ohne Shader zu lernen.

Nicol Bolas
quelle
6

Wenn Sie in der Vergangenheit programmiert haben, macht das Schreiben Ihres eigenen Shader-Codes mit GLSL viel mehr Spaß. Ich habe ursprünglich versucht, OpenGL mit fester Funktion zu lernen, und es war schwieriger für mich, weil es keinen Sinn ergab. Dann habe ich versucht, GLSL mit dem orangefarbenen Buch zu lernen, und es war viel einfacher und hat seitdem mehr gemacht. Nur meine 2 Cent.

Ich würde definitiv in Richtung GLSL gehen, weil ich Programme für die GPU schreiben kann.

Joey Green
quelle