Die Speicherqualifizierer in
und haben out
tatsächlich einen Zweck, der den von varying
und 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 in
bei Vertex-Shader
varying
: wie out
bei Vertex-Shader, wie in
bei 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 .