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
- Diskussion über Meta über Cross-Site-Duplikate und ob sie ein Problem darstellen
- Wenn Sie weitere Fragen haben, stellen Sie diese bitte als neue Fragen, anstatt sie in eine vorhandene zu bearbeiten So können die Antworten auf separate Fragen unabhängig voneinander verglichen werden. Sie können weiterhin Verknüpfungen zwischen den Fragen einfügen, wenn sie zusammenhängen.
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.