2009-12-27 15 views
6

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

risposta

2

Ok, ho figu cancellalo. OpenGL disegna triangoli con la funzione drawArrays leggendo ogni 9 valori come un triangolo (3 vertici con 3 componenti ciascuno). Per questo motivo, i vertici vengono ripubblicati tra i triangoli, quindi se due triangoli adiacenti condividono un vertice, viene visualizzato due volte nell'array. Quindi il mio cubo che inizialmente pensavo avesse 8 vertici, in realtà ne ha 36!

sei lati, due triangoli su un lato, tre vertici per triangolo, tutto si moltiplica per un totale di 36 vertici indipendenti anziché 8 condivisi.

L'intero problema è stato un problema con la specifica di pochi valori. Non appena ho esteso il mio array di test per includere 36 valori, ha funzionato perfettamente.

Problemi correlati