EDIT: Dies ist ein Duplikat einer Frage aus dem Stapelüberlauf: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Wenn Sie einen Wert vom Vertex-Shader zum Fragment-Shader senden möchten, sollte der Vertex-Shader eine Variable als out Der Fragment-Shader sollte eine andere Variable als deklarieren in und beide Variablen müssen gleiche Namen und Typen haben. Dies ist jedoch nicht der Fall, wenn Sie den Farbwert vom Fragment-Shader senden möchten. Tatsächlich können Sie die Ausgabevariable wie gewünscht aufrufen. Warum? In einer älteren Version gab es eine Variable mit dem Namen gl_FragColor
Wie verknüpft das Programm Ihre Ausgabefragmentvariable mit gl_FragColor?

Kommentare

Antwort

Es funktioniert fast genauso wie Vertex-Shader-Eingaben.

In Vertex-Shadern haben Sie Eingaben. Diese Eingaben stellen Vertex-Attributindizes dar, die Zahlen, die Sie an glVertexAttribPointer und

und so weiter. Sie legen fest, welche Eingabe von welchem Attribut abgerufen wird. In GLSL 3.30 verwenden Sie diese Syntax:

layout(location = 2) in color; 

Hiermit wird festgelegt, dass die color Vertex-Shader-Eingabe vom Attribut stammt Speicherort 2. Vor 3.30 Uhr (oder ohne ARB_explicit_attrib_location) müssten Sie dies entweder explizit mit glBindAttrbLocation einrichten Verknüpfen oder Abfragen des Programms für den Attributindex mit glGetAttribLocation . Wenn Sie keinen expliziten Attributspeicherort angeben, weist GLSL einen Speicherort willkürlich zu (dh auf implementierungsdefinierte Weise).

Das Festlegen im Shader erfolgt fast immer die bessere Option.

In jedem Fall funktionieren Fragment-Shader-Ausgaben fast genauso. Fragment-Shader können in mehrere Ausgabefarben schreiben. die selbst mehreren Puffern im Framebuffer zugeordnet werden . Daher müssen Sie angeben, welche Ausgabe an welche Fragmentausgabefarbe gesendet wird.

Dies Der Prozess beginnt mit dem Wert für die Fragmentausgabestelle. Er wird sehr ähnlich wie die Vertex-Shader-Eingabestellen festgelegt:

layout(location = 1) out secColor; 

Es gibt auch die API-Funktionen glBindFragDataLocation und glGetFragDataLocation , die analog zu glBindAttribLocation und glGetAttribLocation sind.

Wenn Sie keine explizite Zuordnung vornehmen Bei Implementierungen wird normalerweise eine Ihrer Ausgabevariablen dem Speicherort 0 zugewiesen. Der OpenGL-Standard erfordert jedoch kein dieses Verhalten, sodass Sie auch nicht darauf angewiesen sein sollten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.