Domanda

Sono abbastanza nuovo per OpenGL, e mi sembra di essere sperimentando alcune difficoltà. Ho scritto un semplice shader in GLSL, che dovrebbe trasformare i vertici da dati matrici comuni, permettendo semplice animazione scheletrica. Ogni vertice ha un massimo di due influenze ossee (memorizzata come componenti xey di un vec2), indici e pesi corrispondenti che sono associati con una serie di matrici di trasformazione, e sono specificati come "Abilità variabili" nel mio Shader, quindi impostare utilizzando la funzione "glVertexAttribPointer".

Ecco dove il problema si pone ... Sono riuscito a impostare la matrice "Uniform Variabile" di matrici correttamente, quando controllo questi valori nello shader, tutti loro sono importati correttamente e contengono i dati corretti. Tuttavia, quando si tenta di impostare la variabile giunto indici i vertici vengono moltiplicati per matrici di trasformazione arbitrarie! Saltano a posizioni apparentemente casuali nello spazio (che sono diversi ogni volta) da questa Sto supponendo che gli indici sono impostate in modo errato e mio Shader sta leggendo oltre la fine della mia matrice comune nella seguente memoria. Io non sono esattamente sicuro perché, perché dopo aver letto tutte le informazioni che ho trovato su questo argomento, sono rimasto sorpreso di vedere lo stesso (se non molto simili) Codice nei loro esempi, e sembrava di lavorare per loro.

Ho cercato di risolvere questo problema per un bel po 'di tempo ed è davvero cominciando a darmi sui nervi ... so che le matrici siano corrette, e quando cambio manualmente il valore di indice nello shader per un intero arbitrario , legge i valori della matrice corretti e lavora come dovrebbe, trasformando tutti i vertici da quella matrice, ma quando provo e utilizzare il codice che ho scritto per impostare le variabili di attributo, 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 è veramente cominciando a vanificare me, ed ogni e qualsiasi aiuto sarà apprezzato,

-Andrew Gotow

È stato utile?

Soluzione

Ok, ho capito. 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 sono repepated tra triangoli, quindi se due triangoli adiacenti condividono un vertice viene due volte nella matrice. Quindi il mio cubo che ho inizialmente pensato aveva 8 vertici, ha in realtà 36!

sei lati, due triangoli un lato, tre vertici per triangolo, tutti moltiplica su di un totale di 36 vertici indipendenti invece di 8 quelli condivisi.

L'intero problema è stato un problema con la specifica troppo pochi valori. Appena ho prolungato il mio serie di test per includere 36 valori ha funzionato perfettamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top