Das Kapitel der Shader
Mit der Definition von gl_Position wird anscheinend automatisch ein Output an den fragment shader definiert. Das ist interessant, da wir für andere Variablen im vertex shader extra das Keyword out angeben müssen. Für die Position jedoch nicht.
Wenn man sich zum Beispiel mal folgenden Code anschaut, dann bekommt “ourColor” extra den Keyword out, “gl_Position” jedoch nicht und das aPos genauso das Keyword in erhält 🤔
#version 330 core
layout (location = 0) in vec3 aPos; // the position variable has attribute position 0
layout (location = 1) in vec3 aColor; // the color variable has attribute position 1
out vec3 ourColor; // output a color to the fragment shader
void main()
{
gl_Position = vec4(aPos, 1.0);
ourColor = aColor; // set ourColor to the input color we got from the vertex data
}
Was mir auch auffällt bisher bei OpenGL/C++ (oder auch Visual Studio), dass meine Suchanfragen bei Google oftmals nicht ansatzweise die Ergebnisse erbringen die ich mir erhoffe. Bei allen anderen Sprachen findet man direkt mehrere Einträge, die die selbe Frage schon diskutiert und gelöst haben. Aktuell finde ich nur “Textwände”, die man durchackern muss bis man eine kleine Konfiguration vorgenommen hat, die im Endeffekt ein ganz anderes Problem addressiert.
Was genau ist jetzt eigentlich ein Vertex Attribute? Anscheinend werden die Vertex Attribute im Vertex Shader an der “layout”-Stelle definiert. Ein Layout-Eintrag mit einer Location (und in keyword) gilt dann als ein (1) Attribut (wenn man das so salopp sagen kann). Also gibt es im oberen Shader ganze zwei Attribute. Wie ich das jetzt verstehe muss mit der Location festgelegt werden, welcher Teil der Input-Daten an dieses Attribut weitergeleitet werden?! Aber warum jetzt location 0 oder 1…? Ist das eine Art ID?
Jab, und hier ist auch schon die Antwort. Die Pointer greifen genau auf diese Location zu (der erste Paramter ist die Location):
// position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// color attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
glEnableVertexAttribArray(1);
Jetzt wird mir immerhin das letzte Attribut des Pointers klar. Da das Vertex aus 3 floats für die Koordinaten besteht und dann die 3 floats für die Farbe folgt müssen wir ein Offset von 3 floats setzen um direkt die Farbkodierung auszulesen (viele dieser Infos werden bestimmt erst durch die richtigen Grafiken auf learnopengl deutlich aber ich will hier nicht stumpf jede Grafik kopieren).
Das aktuelle Ergebnis sieht so aus:

2 Comments
I only understand train station. Immerhin weiß ich, was ein Dreieck ist.
🙂
So geht es mir teils auch noch aber immerhin ein Anfang!