Como configurar/calcular texturebuffer em GltexCoordPointer ao importar do Obj-File
Pergunta
Estou analisando um arquivo Obj no Android e meu objetivo é renderizar e exibir o objeto. Tudo funciona bem, exceto o mapeamento de textura correto (importando o recurso/imagem para o OpenGL etc funciona bem).
Não sei como preencher os dados relacionados à textura do arquivo Obj em um objeto texturebuffer.
No arquivo OBJ, eu tenho linhas de TV:
vt 0.495011 0.389417
vt 0.500686 0.561346
e linhas de rosto:
f 127/73/62 98/72/62 125/75/62
My Draw-Routine parece (apenas peças relevantes):
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalsBuffer);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, t.getvtBuffer());
gl.glDrawElements(GL10.GL_TRIANGLES, t.getFacesCount(), GL10.GL_UNSIGNED_SHORT, t.getFaceBuffer());
Saída das contagens do arquivo OBJ:
Vertex-count: 1023
Vns-count: 1752
Vts-count: 524
/////////////////////////
Part 0
Material name:default
Number of faces:2037
Number of vnPointers:2037
Number of vtPointers:2037
Qualquer conselho é bem -vindo.
Solução
Desculpe, não tenho certeza até que ponto isso é condescendente, mas do topo:
f 127/73/62 98/72/62 125/75/62
Significa um triângulo entre o vértice com a 127ª posição apresentada no arquivo, a 73ª posição de textura no arquivo e o 62º normal e os outros dois vértices especificados de maneira semelhante.
No OpenGL, você especifica apenas um único índice por vértice (à medida que a coisa toda passa pela transformação como uma única unidade), então você precisa descobrir todas as diferentes combinações de posição, coordenada de textura e normal e organizar os buffers para os quais você passa glVertexPointer
, glNormalPointer
e glTexCoordPointer
adequadamente. Por exemplo, a face acima pode acabar sendo especificada via gl_triangles entre os vértices 0, 1 e 2, onde você copiou a 127ª posição para a primeira em seu buffer de vértice interno, você copiou a 73ª coordenada de textura ao primeiro em seu buffer de coordenada de textura interna e você copiou o 62º normal para o primeiro da sua lista normal interna.
Provavelmente, você deseja um hashmap que pegue a combinação de coordenadas/normais de vértice/textura da tecla e mapeamento para uma posição em suas matrizes internas. À medida que você se depara com cada rosto no OBJ de entrada, você pode verificar se já obteve essa combinação alocada a um ponto em seus buffers internos e fornecer o próximo disponível, se não.
VT é um coordenado de textura, por exemplo, a coordenada de textura:
vt 0.495011 0.389417
Significa que, dentro do espaço de textura, x = 0,495011, y = 0,389417. Da memória, o formato do arquivo OBJ e o OpenGL têm os eixos y em direções opostas. Portanto, em termos do OpenGL, você deseja s = 0,495011, t = 1 - 0,389417 = 0,610583.
Se o seu objeto estiver usando um atlas de textura ou pele adequadamente complicada, imagino que estaria longe de ser óbvio que as coordenadas Y são invertidas; Se você apenas tem algo como um cubo com a mesma textura repetida em sua totalidade em cada face, provavelmente a veria como sendo invertida ao longo da vertical.
Isso cobre a fonte de confusão?