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