Frage

Ich bin ziemlich neu in OpenGL, und ich scheinen einige Schwierigkeiten zu erleben. Ich habe einen einfachen Shader in GLSL geschrieben, die von bestimmten Eckpunkten zu transformieren gemeinsamen Matrizen sollte, einfache Skelettanimation ermöglicht. Jeder Scheitelpunkt ein Maximum von zwei Knochen Einflüssen (gespeichert als die x- und y-Komponenten eines Vec2), Indizes und entsprechenden Gewichten, die mit einer Reihe von Transformationsmatrizen zugeordnet sind, und werden als „Attributvariablen“ in meinem Shader angegeben, so eingestellt mit der "glVertexAttribPointer" Funktion.

Hier ist, wo das Problem entsteht ... Ich habe es geschafft, die „Uniform Variable“ Array von Matrizen richtig zu setzen, wenn ich diese Werte im Shader prüfen, alle von ihnen sind korrekt importiert und sie enthalten die richtigen Daten. Allerdings, wenn ich die gemeinsame Indizes Variable die Eckpunkte werden, multipliziert mit beliebigen Transformationsmatrizen zu setzen versuchen! Sie springen zu scheinbar zufälligen Positionen im Raum (die jedes Mal anders sind) von diesem ich davon aus bin, dass die Indizes nicht richtig eingestellt sind und meine Shader liest über das Ende meines gemeinsamen Matrix-Array in den folgenden Speicher. Ich bin mir nicht ganz sicher, warum, denn auf alle Informationen zu lesen ich zu diesem Thema finden konnte, ich war überrascht, das gleiche zu sehen (wenn auch nicht sehr ähnlich) Code in ihren Beispielen, und es schien, für sie zu arbeiten.

Ich habe versucht, dieses Problem nun schon seit geraumer Zeit zu lösen, und es fängt wirklich meine Nerven zu gehen auf ... Ich weiß, dass die Matrizen richtig sind, und wenn ich manuell den Indexwert in der auf einen beliebigen ganzzahligen Shader ändern es die richtigen Matrixwerte liest und so funktioniert, wie es sollte, alle Ecken von dieser Matrix Transformation, aber wenn ich den Code versuchen und verwende ich schrieb die Attributvariablen zu setzen, ist es nicht zu funktionieren scheint.

Der Code, den ich die Variablen gesetzt bin mit wird folgt als ...

// 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 sieht wie folgt aus ...

// 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);
}

Das ist wirklich beginnen, mich zu vereiteln, und jede und alle Hilfe zu erkennen ist,

-Andrew Gotow

War es hilfreich?

Lösung

Ok, ich habe es herausgefunden. OpenGL zieht Dreiecken mit der drawArrays Funktion von jedem 9-Wert als ein Dreieck (3 Eckpunkten mit 3 Komponenten jeweils) zu lesen. Wegen dieses Vertices zwischen repepated Dreiecke, so dass, wenn zwei benachbarte Dreiecke einen Eckpunkt teilen sie zweimal im Array aufkommt. Also meinen Würfel, der ursprünglich dachte ich acht Ecken hat, hat tatsächlich 36!

sechs Seiten, zwei Dreiecke eine Seite, drei Scheitel pro Dreieck, werden alle Multiplikationen, um insgesamt 36 unabhängige Vertices statt 8 geteilt diejenigen.

Das ganze Problem war ein Problem mit zu wenig Werte angeben. Sobald ich meinen Test-Array erweiterte 36 Werte enthält es funktionierte perfekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top