2009-12-27 16 views
6

Soy bastante nuevo en OpenGL, y parece que estoy teniendo algunas dificultades. He escrito un sombreador simple en GLSL, que se supone que transforma los vértices mediante matrices conjuntas dadas, lo que permite una animación esquelética simple. Cada vértice tiene un máximo de dos influencias óseas (almacenadas como los componentes xey de un Vec2), los índices y los pesos correspondientes que están asociados con una matriz de matrices de transformación, y se especifican como "Variables de atributo" en mi sombreador, luego configura usando la función "glVertexAttribPointer".Cocoa y OpenGL, ¿Cómo configuro un atributo de vértice GLSL usando una matriz?

Aquí es donde surge el problema ... He logrado establecer correctamente la matriz de matrices de "Uniform Variable", cuando verifico esos valores en el sombreado, todos se importan correctamente y contienen los datos correctos. Sin embargo, cuando intento establecer la variable índices conjunta, los vértices se multiplican por matrices de transformación arbitrarias. Saltan a posiciones aparentemente aleatorias en el espacio (que son diferentes cada vez). Supongo que los índices están configurados incorrectamente y mi sombreador está leyendo más allá del final de mi matriz conjunta en la siguiente memoria. No estoy seguro de por qué, porque al leer toda la información que pude encontrar sobre el tema, me sorprendió ver el mismo código (si no muy similar) en sus ejemplos, y pareció funcionar para ellos.

He intentado resolver este problema desde hace bastante tiempo y realmente me está poniendo de los nervios ... Sé que las matrices son correctas, y cuando cambio manualmente el valor del índice en el sombreador a un arbitrario entero, lee los valores correctos de la matriz y funciona como debería, transformando todos los vértices por esa matriz, pero cuando intento usar el código que escribí para establecer las variables de atributo, parece que no funciona.

El código que estoy utilizando para establecer las variables es el siguiente ...

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

Y mi sombreado de vértices se parece a esto ...

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

Esto es realmente empezando a frustrarme y todas y cada una ayuda será apreciada,

-Andrew Gotow

Respuesta

2

Ok, he figu rojo hacia fuera. OpenGL dibuja triángulos con la función drawArrays leyendo cada 9 valores como un triángulo (3 vértices con 3 componentes cada uno). Debido a esto, los vértices se repepetan entre triángulos, de modo que si dos triángulos adyacentes comparten un vértice aparece dos veces en la matriz. Entonces mi cubo, que originalmente pensé que tenía 8 vértices, en realidad tiene 36!

seis lados, dos triángulos por un lado, tres vértices por triángulo, todos multiplican a un total de 36 vértices independientes en lugar de 8 compartidos.

Todo el problema era un problema al especificar muy pocos valores. Tan pronto como extendí mi matriz de prueba para incluir 36 valores funcionó perfectamente.

Cuestiones relacionadas