In / Out-Schlüsselwörter in GLSL

46

Ich verstehe nicht wirklich, wie man die in/ out-Schlüsselwörter in GLSL verwendet, und Google ist ungewöhnlich wenig hilfreich.

Was genau machen sie? Wie würde ich sie verwenden, wenn ich beispielsweise eine variierende Variablenmenge pro Scheitelpunkt an den Fragment-Shader übergeben möchte?

Buchstäblich jedes Tutorial, das ich finde, verwendet die varying/ attributeSchlüsselwörter und das ist nicht hilfreich.

Avi
quelle

Antworten:

65

Die Speicherqualifizierer inund haben outtatsächlich einen Zweck, der den von varyingund enthält und diesen ersetzt attribute. Sie definieren, welche Variablen für den Shader in Puts bzw. Out Puts sind. Siehe die GLSL 4.2 Referenzkarte Seite 7:

  • in: Verknüpfung in Shader von der vorherigen Stufe
  • out: Verknüpfung von einem Shader zur nächsten Stufe
  • attribute: wie inbei Vertex-Shader
  • varying: wie outbei Vertex-Shader, wie inbei Fragment-Shader (Hinweis: Diese werden auf der oben genannten Referenzkarte fälschlicherweise vertauscht.)

Mit der Randnotiz, dass die beiden letzteren irgendwie veraltet sind: Sie sind im 4.2-Kernprofil nicht vorhanden, sondern nur im Kompatibilitätsprofil.


Was genau machen sie?

Verwenden Sie den Vertex-Shader vom Intro zum modernen OpenGL. Kapitel 2.2: Shader :

#version 110

attribute vec2 position;    
varying vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Es sollte in 4.2 umgeschrieben werden als:

#version 420

in vec2 position;    
out vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Nicht hilfreiche Tutorials

Ich vermute, der Hauptgrund, warum Sie "veralteten" Tutorial-Code finden, ist, dass nicht jeder Zugriff auf GLSL 3.3+ -kompatible Hardware hat. Unabhängig davon, für ein gutes und aktuelleres Tutorial zeige ich Ihnen gerne die Richtung von Nicol Bolas ' Learning Modern 3D Graphics Programming .

Eric
quelle
2
@NicolBolas Ha! Ich dachte schon, dass daran etwas faul ist. Das ist dann ein Fehler in dieser Referenzkarte. Vielen Dank! :-)
Eric