GLSL - Verwendung eines benutzerdefinierten Ausgabeattributs anstelle von gl_Position

8

Ich lerne gerade OpenGL mit Shadern (3.3). Es gibt jedoch eine Sache, die ich nicht auszuarbeiten scheint. Ich habe gelesen, dass die Verwendung von eingebauten Variablen wie gl_Position und gl_FragCoords in OpenGL 3+ veraltet ist, daher wollte ich meine eigene Ausgabevariable verwenden.

Also statt dessen:

%Vor%

Ich schrieb dies:

%Vor%

Die Shader kompilieren in beiden Fällen ohne Probleme, aber der zweite Code erzeugt nur einen leeren Bildschirm. Muss ich irgendwie angeben, welche Variable die Ausgabe ist?

    
michy04 25.06.2014, 19:05
quelle

2 Antworten

26

Dies wurde hauptsächlich durch die Kommentare abgedeckt, aber um eine Antwort zu geben, möchte ich zusammenfassen, welche vordefinierten GLSL-Variablen im Kernprofil verschwunden sind und welche noch vorhanden sind.

In den meisten Fällen wurden vordefinierte Variablen aus Core-Profil-Shadern entfernt, da direkte Teile der festen Funktionspipeline aus der API entfernt wurden. Es gab eine Menge von uniform Variablen, die einen Zustand widerspiegeln, der einfach nicht mehr existiert. Typische Beispiele sind:

  • Fehler beim Transformationsstatus der Funktion ( gl_ModelViewMatrix , gl_ProjectionMatrix , etc.).
  • Beleuchtungsparameter ( gl_Light* ).
  • Materialparameter ( gl_Material* ).
  • Schnittebenen ( gl_Clip* ).

Entsprechend sind Vertex-Shader-Eingaben, die feste Funktionsscheitelattribute erhalten haben, verschwunden, da nur generische Attribute im Kernprofil unterstützt werden. Dazu gehören gl_Vertex , gl_Normal , gl_Color usw.

Es gab auch einige vordefinierte varying -Variablen wie gl_FrontColor , gl_BackColor und gl_TexCoord , die alle verschwunden sind und leicht durch die Definition Ihrer eigenen out / in ersetzt werden können. Variablen.

Ebenfalls verschwunden sind die vordefinierten Fragment-Shader-Ausgaben gl_FragColor und gl_FragData . Dies ist ein interessanter Fall, da der Grund nicht in der Abwertung von Funktionen liegt. Mein Verständnis ist, dass sie veraltet waren, weil sie nicht flexibel genug waren, um aktuelle Funktionalität aufzunehmen. Da der Typ von gl_FragColor vec4 war, müsste die Ausgabe des Fragment-Shaders Vektoren mit Float-Komponenten sein. Dies funktioniert nicht gut, wenn Ihr Renderziel einen anderen Typ aufweist, z. wenn Sie in eine Integer-Textur rendern.

Also, welche vordefinierten Variablen sind noch übrig? Während viel weniger als zuvor, gibt es immer noch einige, die sich alle auf feste Funktionen beziehen, die in der programmierbaren Pipeline noch vorhanden sind. Beispiele umfassen:

  • Die Vertex-Koordinatenschnittstelle zwischen Vertex-Shader und Fragment-Shader, die hauptsächlich aus der Ausgabe gl_Position im Vertex-Shader und dem gl_FragCoord -Eingang im Fragment-Shader besteht. Es gibt immer noch eine Reihe von festen Funktionsblöcken zwischen Vertex- und Fragment-Shadern, wie Clipping und Rasterisierung. Diese festen Funktionsblöcke arbeiten mit Vertex-Koordinaten, so dass die vordefinierten Variablen immer noch sinnvoll sind.
  • Einige Variablen im Zusammenhang mit der Instanziierung ( gl_VertexID , gl_InstanceID ).
  • gl_ClipDistance , um Clipping mit beliebigen Ebenen zu unterstützen, was auch in der Form fester Funktionen noch vorhanden ist.
  • %Code%. Die Wicklungsreihenfolge von Dreiecken wird von einer festen Funktion ausgewertet und dem Fragment-Shader zur Verfügung gestellt.

Keine dieser Listen ist annähernd erschöpfend, aber ich hoffe, es ist ein nützlicher Überblick und bietet einige Hintergrundinformationen. Wie immer geben die Spezifikationsdokumente die endgültige und vollständige Antwort.

    
Reto Koradi 26.06.2014, 08:06
quelle
1

Wie unser Kollege gerade sagte, ist gl_Position nicht veraltet. Ich habe gerade das Buch OpenGL Superbible 6th edition über OpenGL 4.3 gekauft und direkt auf den ersten Seiten (Seite 18) wird diese Funktion verwendet.

Ich kann nur empfehlen, das Buch zu bekommen. Es wurde von den Entwicklern von OpenGL geschrieben und ist wirklich didaktisch.

Ich war auch wie du verloren, weil ich versucht habe, über das Internet oder Stackexchange zu lernen, und nachdem ich dieses Buch bekommen habe, habe ich eine wundervolle Zeit mit OpenGL. Ich denke, was ich in drei Wochen mit dem Buch lernen werde, wird mehr wert sein als 5 Jahre aus dem Internet zu lernen. OpenGL ist nicht kompliziert und kein "Biest", wie viele Leute sagen, solange Sie es aus diesem Buch lernen. Wenn Sie es über das Internet lernen, bin ich sicher, es ist mehr als ein Biest!

Dieses Buch sagt direkt am beginnig, dass er nichts lehren wird, die nicht Kern OpenGL ist, so können Sie sicher sein, nicht in Fallen wie das laufen Sie getan haben.

Sie können dieses in Amazon verwendete Buch für so günstig wie 50 Cent kaufen. Ich kann es nur empfehlen!

    
user9589 11.11.2015 20:10
quelle

Tags und Links