2016-07-20 32 views
2

Ich lese gerade einen Code (speziell Beispielcode für das Oculus Mobile SDK, das nur einige farbige Würfel rendert), wo er ein Vertex-Shader-Attribut mit glGetAttribLocation abruft (im Shader ist es eine mat4, es ist die Transformationsmatrix), dann ein wenig weiter unten macht er einige Sachen, wo er zu diesem Shader-Attributindex hinzufügt.Was bewirkt das Hinzufügen eines GLuint-Attributindex?

VertexTransformAttribute = glGetAttribLocation(Program.Program, "VertexTransform"); 

//some stuff happens in between 

for (int i = 0; i < 4; i++) 
{ 
    GL(glEnableVertexAttribArray(VertexTransformAttribute + i)); 
    GL(glVertexAttribPointer(VertexTransformAttribute + i, 4, GL_FLOAT, 
          false, 4 * 4 * sizeof(float), (void *)(i * 4 * sizeof(float)))); 
    GL(glVertexAttribDivisor(VertexTransformAttribute + i, 1)); 
} 

Zu einem gewissen Grad, ich verstehe, dass er für alle Würfel etwas mit der Transformationsmatrix tut, aber ich bin nicht sicher, was den Index hinzugefügt wird.

Jede Hilfe, die diesen Teil erklärt, würde geschätzt werden!

Antwort

4

Jedes Vertex-Attribut liefert 4 Werte an OpenGL, auch wenn Sie nicht alle 4 davon verwenden. Aber in GLSL können Sie matrices and arrays of types for the type of a vertex shader input variable verwenden. Da diese mehr als 4 Werte benötigen, benötigen Sie mehr als 1 Attribut, um die Daten zu liefern, obwohl Sie nur eine tatsächliche Variable deklariert haben.

Daher ist der Attributort für den Namen der Eingabevariablen der erste Attributindex. Und OpenGL ordnet automatisch die nächsten X-Attributindizes nacheinander zu, um die Anforderung für Ihre Variable zu erfüllen. Im Falle eines mat4 ist das eine 4x4-Matrix. Daher muss OpenGL ihm insgesamt 4 Attribute zuweisen, wobei jedes Attribut eine einzelne Spalte der Matrix darstellt. Diese werden der Reihe nach zugewiesen, beginnend mit dem Attributindex, der dem Variablennamen zugeordnet ist, und 3 Attributindizes später.

+0

Um zu erweitern, was in diesem Beispiel speziell passiert, ist, dass der Beispielschreiber die Modelltransformation (normalerweise dargestellt als ein mat4) für jedes gerenderte Objekt in einen Puffer verschiebt, so dass sie anschließend alle mit einem einzigen Aufruf gerendert werden können zu einem instanziierten Anruf. Weitere Informationen finden Sie unter http://learnopengl.com/#!Advanced-OpenGL/Instancing, einschließlich eines Abschnitts, in dem der Autor etwas Ähnliches tut, jedoch keine Schleife verwendet. – Jherico