Sono abbastanza nuovo per OpenGL e mi sembra di avere qualche difficoltà. Ho scritto un semplice shader in GLSL, che dovrebbe trasformare i vertici con delle matrici congiunte, permettendo una semplice animazione scheletrica. Ogni vertice ha un massimo di due influenze ossee (memorizzate come componenti x e y di un Vec2), indici e pesi corrispondenti che sono associati a una matrice di matrici di trasformazione e sono specificate come "Variabili di attributo" nel mio shader, quindi impostate usando la funzione "glVertexAttribPointer".Cocoa e OpenGL, come si imposta un attributo vertice GLSL utilizzando un array?
Ecco dove si presenta il problema ... Sono riuscito a impostare correttamente la matrice "Uniform Variable" delle matrici, quando controllo questi valori nello shader, tutti sono importati correttamente e contengono i dati corretti. Tuttavia, quando tento di impostare la variabile Indices congiunta, i vertici vengono moltiplicati per matrici di trasformazione arbitrarie! Salgono a posizioni apparentemente casuali nello spazio (che sono diverse ogni volta) da questo presumo che gli indici siano impostati in modo errato e il mio shader stia leggendo oltre la fine del mio array matrix comune nella memoria seguente. Non sono esattamente sicuro del perché, poiché leggendo tutte le informazioni che sono riuscito a trovare sull'argomento, sono rimasto sorpreso nel vedere lo stesso codice (se non molto simile) nei loro esempi, e sembrava funzionare per loro.
Ho tentato di risolvere questo problema già da un po 'di tempo e sta davvero iniziando a darmi sui nervi ... So che le matrici sono corrette e quando cambio manualmente il valore dell'indice nello shader su un valore arbitrario intero, legge i valori matrix corretti e funziona come dovrebbe, trasformando tutti i vertici da quella matrice, ma quando provo a usare il codice che ho scritto per impostare le variabili degli attributi, non sembra funzionare.
Il codice che sto usando per impostare le variabili è il seguente ...
// 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);
E il mio vertex shader assomiglia a questo ...
// 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);
}
questo è davvero cominciando a vanificare me e ogni e qualsiasi aiuto sarà apprezzato,
-Andrew Gotow