从OBJ文件导入时如何在glTexCoordPointer中设置/计算texturebuffer

时间:2010-11-20 14:18:45

标签: android opengl-es 3d .obj

我正在解析Android中的OBJ文件,我的目标是渲染&显示对象。一切正常,除了正确的纹理映射(将资源/图像导入opengl等工作正常)。

我不知道如何将obj文件中的纹理相关数据填充到texturebuffer-object中。

在OBJ文件中我是vt-lines:

vt 0.495011 0.389417 
vt 0.500686 0.561346

和面线:

f 127/73/62 98/72/62 125/75/62

我的绘图程序看起来像(只有相关部分):

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

输出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

欢迎任何建议。

1 个答案:

答案 0 :(得分:3)

对不起,不确定这是多么光顾,但从顶部开始:

f 127/73/62 98/72/62 125/75/62

表示文件中给出的第127个位置的顶点,文件中的第73个纹理位置和第62个法线以及以类似方式指定的另外两个顶点之间的三角形。

在OpenGL中,你只为每个顶点指定一个索引(因为整个事件通过变换作为单个单元),所以你需要弄清楚位置,纹理坐标和法线的所有不同组合并安排你的缓冲区相应地传递给glVertexPointerglNormalPointerglTexCoordPointer。例如,上面的面可能最终通过GL_TRIANGLES指定在顶点0,1和2之间,在那里你将第127个位置复制到内部顶点缓冲区中的第一个位置,你将第73个纹理坐标复制到第一个在内部纹理坐标缓冲区中,您已将第62个法线复制到内部法线列表中的第一个。

您可能希望HashMap将组合键顶点/纹理坐标/法线和映射到内部数组中的位置。当您在传入的OBJ中遇到每个面时,您可以检查是否已将该组合分配给内部缓冲区中的某个位置,如果没有,则将其提供给下一个可用位置。

vt是纹理坐标,例如纹理坐标:

vt 0.495011 0.389417

表示在纹理空间内,x = 0.495011,y = 0.389417。从内存中,OBJ文件格式和OpenGL的y轴方向相反。因此,在OpenGL术语中,您需要s = 0.495011,t = 1 - 0.389417 = 0.610583。

如果你的物体正在使用一个相当复杂的纹理图集或蒙皮,我想,y坐标被翻转是很明显的;如果你只是在每个脸上都有类似于立方体的相同纹理,那么你可能只是看到它沿着垂直方向翻转。

这是否涵盖了混乱的根源?