Pregunta

Soy bastante nuevo a OpenGL, y me parece estar experimentando algunas dificultades. He escrito un shader simple en GLSL, que se supone para transformar vértices por matrices de conjuntos dados, lo que permite animación del esqueleto simple. Cada vértice tiene un máximo de dos influencias de hueso (almacenados como los componentes X e Y de un Vec2), los índices y los pesos correspondientes que están asociados con una serie de matrices de transformación, y se especifican como "Atributo las variables" en mi shader, a continuación, establecer utilizando la función "glVertexAttribPointer".

Aquí es donde surge el problema ... Me las he arreglado para establecer la matriz "variable uniforme" de matrices correctamente, cuando compruebo esos valores en el shader, todos ellos se importan correctamente y que contienen los datos correctos. Sin embargo, cuando intento para establecer la variable conjunta Índices de los vértices se multiplican por matrices de transformación arbitrarias! Saltan a posiciones aparentemente al azar en el espacio (que son diferentes cada vez) a partir de esto estoy suponiendo que los índices no están configurados correctamente y mi shader es la lectura más allá del final de mi serie matriz articular en la siguiente memoria. No estoy exactamente seguro de por qué, porque después de leer toda la información que pude encontrar sobre el tema, me sorprendió ver el código mismo (si no es muy similar) en sus ejemplos, y parece que ha funcionado para ellos.

He intentado resolver este problema desde hace bastante tiempo ahora y es realmente empezando a poner nervioso ... Yo sé que las matrices son correctas, y cuando cambie manualmente el valor del índice en el shader a un entero arbitrario , lee los valores de la matriz correctas y funciona como debería, transformando todos los vértices de esa matriz, pero cuando intento y utilizando un código que escribí para establecer las variables de atributos, que no parece funcionar.

El código que estoy utilizando para establecer las variables es la 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 se observará todas y cada una ayuda,

-Andrew Gotow

¿Fue útil?

Solución

Ok, he descubierto. OpenGL dibuja triángulos con la función drawArrays mediante la lectura de cada 9 valores como un triángulo (3 vértices con 3 componentes cada uno). Debido a esto, los vértices están repepated entre triángulos, así que si dos triángulos adyacentes comparten un vértice se trata dos veces en la matriz. Así que mi cubo que originalmente pensé que tenía 8 vértices, en realidad tiene 36!

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

Todo el problema era un problema con la especificación de muy pocos valores. Tan pronto como me prolongado mi serie de pruebas para incluir 36 valores que funcionaba perfectamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top