2009-12-27 7 views
6

Ich bin ziemlich neu zu OpenGL, und ich scheinen einige Schwierigkeiten zu haben. Ich habe in GLSL einen einfachen Shader geschrieben, der Scheitelpunkte durch gegebene Gelenkmatrizen transformieren soll, was eine einfache Skelettanimation erlaubt. Jeder Knoten hat maximal zwei Knocheneinflüsse (gespeichert als x- und y-Komponenten eines Vec2), Indizes und entsprechende Wertigkeiten, die einem Array von Transformationsmatrizen zugeordnet sind, und werden in meinem Shader als "Attributvariablen" angegeben und dann gesetzt mit der Funktion "glVertexAttribPointer".Cocoa und OpenGL, Wie setze ich ein GLSL Vertex-Attribut mit einem Array?

Hier ist das Problem ... Ich habe es geschafft, die "Uniform Variable" Matrix von Matrizen richtig zu setzen, wenn ich diese Werte im Shader überprüfe, werden alle korrekt importiert und sie enthalten die korrekten Daten. Wenn ich jedoch versuche, die gemeinsame Indices-Variable zu setzen, werden die Vertices mit beliebigen Transformationsmatrizen multipliziert! Sie springen zu scheinbar zufälligen Positionen im Raum (die jedes Mal anders sind). Ich gehe davon aus, dass die Indizes falsch gesetzt sind und mein Shader über das Ende meines gemeinsamen Matrix-Arrays hinaus in den folgenden Speicher liest. Ich bin nicht ganz sicher, warum, denn nachdem ich alle Informationen gelesen hatte, die ich zu diesem Thema finden konnte, war ich überrascht, in ihren Beispielen den gleichen (wenn auch nicht sehr ähnlichen) Code zu sehen, der für sie zu funktionieren schien.

Ich habe versucht, dieses Problem seit einiger Zeit zu lösen, und es fängt wirklich an, mir auf die Nerven zu gehen ... Ich weiß, dass die Matrizen korrekt sind, und wenn ich manuell den Indexwert im Shader zu einem beliebigen ändere Integer, liest die korrekten Matrixwerte und arbeitet so, wie es soll, transformiert alle Ecken durch diese Matrix, aber wenn ich versuche, den Code zu verwenden, den ich geschrieben habe, um die Attributvariablen zu setzen, scheint es nicht zu funktionieren.

Der Code, den ich die Variablen gesetzt bin ist wie folgt ...

// this works properly... 
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices"); 
glUniformMatrix4fv(boneMatLoc, matCount, GL_TRUE, currentBoneMatrices); 

GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; 

// this however, does not... 
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices"); 
glEnableVertexAttribArray(boneIndexLoc); 
glVertexAttribPointer(boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices); 

Und meine Vertex-Shader wie folgt aussieht ...

// this shader is supposed to transform the bones by a skeleton, a maximum of two 
// bones per vertex with varying weights... 

uniform mat4 boneMatrices[32]; // matrices for the bones 
attribute vec2 boneIndices; // x for the first bone, y for the second 

//attribute vec2 boneWeight; // the blend weights between the two bones 

void main(void) 
{ 
gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates... 


vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex; 
//vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex; 

gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1); 
} 

Dies beginnt sich wirklich um mich zu vereiteln und jede und alle Hilfe geschätzt,

-Andrew Gotow

Antwort

2

Ok wird, habe ich figu lösche es aus. OpenGL zeichnet Dreiecke mit der Funktion drawArrays, indem es alle 9 Werte als Dreieck liest (3 Ecken mit je 3 Komponenten). Aus diesem Grund werden die Scheitelpunkte zwischen den Dreiecken wiederholt. Wenn also zwei benachbarte Dreiecke einen Scheitelpunkt teilen, wird er zweimal im Array angezeigt. Also mein Würfel, von dem ich ursprünglich dachte, dass er 8 Ecken hat, hat 36!

sechs Seiten, zwei Dreiecke eine Seite, drei Ecken pro Dreieck, multipliziert alle zu insgesamt 36 unabhängigen Ecken statt 8 gemeinsamen.

Das gesamte Problem war ein Problem mit der Angabe zu wenig Werte. Sobald ich mein Test-Array um 36 Werte erweitert habe, hat es perfekt funktioniert.