Ich lese Tutorials über OpenGL und OpenGLES und bin ein wenig verwirrt über die Verwendung der Funktion glVertexAttribPointer
in diesen beiden APIs.
Im Tutorial OpenGL verwendet diese Funktion als letzten Parameter einen numerischen Offset (mit einem Casting nach const GLVoid *) und ich nehme an, dass die Scheitelpunkte direkt aus dem aktuellen Array-Buffer stammen.
%Vor%Im Tutorial OpenGLES zeigt der letzte Parameter direkt auf eine Struktur, die Vertices repräsentiert:
%Vor%Ich kann nicht verstehen, wie diese 2 Funktionen funktionieren. Sind sie völlig unterschiedliche Funktionen?
Sie sind die gleiche Funktion, die auf zwei verschiedene Arten verwendet wird. Ich würde erklären, warum es so funktioniert, aber es ist dir egal, und es ist aus sehr dummen und irrelevanten Gründen.
Was zählt, ist was sie tun. Und was sie tun, hängt von etwas ab, das du nicht angezeigt hast: was an GL_ARRAY_BUFFER
gebunden ist.
Siehe das Verhalten von glVertexAttribPointer
ändert sich in Abhängigkeit davon. Wenn beim Aufruf von GL_ARRAY_BUFFER
kein Pufferobjekt an glVertexAttribPointer
gebunden ist, nimmt die Funktion an, dass der letzte Wert ein -Zeiger ist (wie der Name der Funktion sagt: glVertexAttrib Zeiger <) / b>). Insbesondere ist es ein Zeiger in den Client-eigenen Speicher.
Wenn es Zeit zum Rendern ist, werden die Vertex-Attributdaten von dem zuvor bereitgestellten Zeiger kommen. Daher verwendet das zweite Beispiel nur ein Array von Client-Daten, die im Standard-C-Stil deklariert sind, als Quelldaten. Es sind keine Pufferobjekte beteiligt.
Hinweis: Das Kernprofil von OpenGL 3.1+ hat die Fähigkeit zur Verwendung von Client-Speicher entfernt. Dort müssen Sie Pufferobjekte verwenden, wie unten erklärt.
Wenn ein Pufferobjekt an GL_ARRAY_BUFFER
gebunden ist, wenn glVertexAttribPointer
aufgerufen wird, passiert etwas Besonderes. OpenGL wird vorgeben, dass der Zeiger (was ist der letzte Parameter ist so weit wie C / C ++ betrifft) ist eigentlich ein Byte-Offset in den Puffer gebunden an GL_ARRAY_BUFFER
. Es konvertiert den Zeiger in eine ganze Zahl und speichert dann den ganzzahligen Offset und das aktuell an GL_ARRAY_BUFFER
gebundene Pufferobjekt.
Also nimmt der obige Code 3*sizeof(GLfloat)
, den Byte-Offset, und wandelt ihn in einen Zeiger um. OpenGL nimmt den Zeiger und konvertiert ihn zurück in einen Offset, was 3*sizeof(GLfloat)
wieder ergibt.
Wenn es an der Zeit ist, zu rendern, liest OpenGL dann das zuvor angegebene Pufferobjekt unter Verwendung des zuvor angegebenen Offsets.
Das erste Beispiel setzt die Eckendaten in ein Pufferobjekt im GPU-Speicher. Im zweiten Beispiel werden die Scheitelpunktdaten in einem regulären C / C ++ - Array im CPU-Speicher abgelegt.
GL-Spezifikation erwähnt dies deutlich:
Fall 1: Wenn ein benanntes Pufferobjekt ungleich null an das GL_ARRAY_BUFFER-Ziel gebunden wird, während ein generisches Vertexattributfeld angegeben wird, wird der Zeiger als Byteoffset im Datenspeicher des Pufferobjekts behandelt.
Fall 2: Gibt einen Zeiger auf die erste Komponente des ersten generischen Vertex-Attributs im Array an.