Pergunta

Sou bastante novo no OpenGL e parece que estou enfrentando algumas dificuldades.Eu escrevi um shader simples em GLSL, que supostamente transforma vértices por determinadas matrizes conjuntas, permitindo animação esquelética simples.Cada vértice tem no máximo duas influências ósseas (armazenadas como os componentes x e y de um Vec2), índices e pesos correspondentes que estão associados a uma matriz de matrizes de transformação e são especificados como "Variáveis ​​de atributos" no meu shader e, em seguida, defina usando a função "glVertexAttribPointer".

É aqui que surge o problema...Consegui definir corretamente o array de matrizes "Variável Uniforme", quando verifico esses valores no shader, todos eles são importados corretamente e contêm os dados corretos.No entanto, quando tento definir a variável conjunta Indices, os vértices são multiplicados por matrizes de transformação arbitrárias!Eles saltam para posições aparentemente aleatórias no espaço (que são diferentes a cada vez). A partir disso, estou assumindo que os índices estão definidos incorretamente e meu shader está lendo além do final da minha matriz de matriz conjunta na memória seguinte.Não sei exatamente por que, porque ao ler todas as informações que encontrei sobre o assunto, fiquei surpreso ao ver o mesmo código (se não muito semelhante) em seus exemplos, e pareceu funcionar para eles.

Já faz algum tempo que tento resolver esse problema e está realmente começando a me irritar ...Eu sei que as matrizes estão corretas, e quando altero manualmente o valor do índice no shader para um número inteiro arbitrário, ele lê os valores corretos da matriz e funciona como deveria, transformando todos os vértices por aquela matriz, mas quando tento e use o código que escrevi para definir as variáveis ​​​​de atributos, parece não funcionar.

O código que estou usando para definir as variáveis ​​é o seguinte...

// 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 meu sombreador de vértice fica assim...

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

Isso está realmente começando a me frustrar, e toda e qualquer ajuda será apreciada,

-André Gotow

Foi útil?

Solução

Ok, eu descobri.OpenGL desenha triângulos com a função drawArrays lendo cada 9 valores como um triângulo (3 vértices com 3 componentes cada).Por causa disso, os vértices são repetidos entre triângulos, portanto, se dois triângulos adjacentes compartilham um vértice, ele aparece duas vezes na matriz.Então meu cubo, que originalmente pensei ter 8 vértices, na verdade tem 36!

seis lados, dois triângulos por lado, três vértices por triângulo, tudo multiplicado para um total de 36 vértices independentes em vez de 8 compartilhados.

Todo o problema era especificar poucos valores.Assim que estendi meu array de teste para incluir 36 valores, ele funcionou perfeitamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top