Cocoa et OpenGL, Comment puis-je configurer un attribut de sommet GLSL en utilisant un tableau?

StackOverflow https://stackoverflow.com/questions/1965027

Question

Je suis assez nouveau pour OpenGL, et je semble éprouver quelques difficultés. J'ai écrit un shader GLSL simple, qui est censé transformer les sommets par des matrices communes données, ce qui permet l'animation squelettique simple. Chaque sommet a un maximum de deux influences osseuses (stockées en tant que composantes x et y d'un VEC2), les indices et les pondérations correspondantes qui sont associées à un réseau de matrices de transformation, et sont exprimées en tant que « Attribut de variables » in my nuanceur, puis régler en utilisant la fonction "glVertexAttribPointer".

Voici où le problème se pose ... J'ai réussi à mettre le tableau « Variable uniforme » des matrices correctement, quand je vérifie ces valeurs dans le shader, ils sont tous importés correctement et ils contiennent les données correctes. Cependant, lorsque je tente de définir la variable commune indices les sommets sont multipliés par des matrices de transformation arbitraires! Ils sautent aux positions apparemment aléatoires dans l'espace (qui sont différents à chaque fois) de ce je suppose que les indices sont définis de manière incorrecte et mon shader est en train de lire après la fin de mon tableau de matrice commune dans la mémoire suivante. Je ne sais pas exactement pourquoi, parce que à la lecture de toutes les informations que je pouvais trouver sur le sujet, je fus surpris de voir le même (sinon très similaire) du code dans leurs exemples, et il semblait travailler pour eux.

J'ai essayé de résoudre ce problème pour un certain temps maintenant et il commence vraiment à me taper sur les nerfs ... Je sais que les matrices sont correctes, et lorsque je change manuellement la valeur d'index dans le shader à un nombre entier arbitraire , il lit les valeurs de la matrice correcte et fonctionne comme il le devrait, transformer tous les sommets de cette matrice, mais quand j'essaie d'utiliser le code que j'ai écrit pour définir les variables d'attributs, il ne semble pas fonctionner.

Le code que je utilise pour définir les variables est la suivante ...

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

Et mon vertex shader ressemble à ...

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

Cela commence vraiment à me frustrer, et toute aide sera appréciée,

-Andrew Gotow

Était-ce utile?

La solution

Ok, je l'ai compris. OpenGL tire triangles avec la fonction drawArrays en lisant toutes les 9 valeurs en tant que triangle (3 sommets avec 3 composants chacun). À cause de cela, les sommets sont repepated entre triangles, donc si deux triangles adjacents partagent un sommet, il est deux fois dans le tableau. Donc, mon cube que je pensais à l'origine avait 8 sommets, a en fait 36!

six côtés, deux triangles d'un côté, trois sommets par triangle, toutes les multiplie sur un total de 36 sommets indépendants au lieu de 8 unités partagées.

Tout le problème était un problème avec la spécification des valeurs trop peu. Dès que je tendis mon tableau de test pour inclure 36 valeurs qu'il a parfaitement fonctionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top