2012-04-21 44 views
0

我正在制作一个给定obj文件的程序,它将呈现模型。目前它的工作原理没有纹理贴图,但是我想实现这个功能,读取材质库文件。在从obj文件加载的模型上映射纹理的有效方法

但我看到顶点的数量可以不同于纹理坐标的数量。看这个例子:

# Blender v2.58 (sub 0) OBJ File: '' 
# www.blender.org 
mtllib /home/frenk/Documenti/Progetti/dado.mtl 
o Cube 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -0.999999 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
vt 0.593772 0.740196 
vt 0.593666 0.869263 
vt 0.394866 0.869219 
vt 0.394973 0.740152 
vt 0.792572 0.740240 
vt 0.993810 0.740284 
vt 0.993703 0.869351 
vt 0.792466 0.869307 
vt 0.792360 0.995233 
vt 0.593560 0.995189 
vt 0.593984 0.482061 
vt 0.792784 0.482105 
vt 0.792678 0.611172 
vt 0.593878 0.611129 
usemtl dado_verde_dado.tga 
s off 
f 1/1 2/2 3/3 4/4 
f 5/5 8/6 7/7 6/8 
f 1/1 5/5 6/8 2/2 
f 2/2 6/8 7/9 3/10 
f 3/11 7/12 8/13 4/14 
f 5/5 1/1 4/14 8/13 

所以我不能使用函数drawElements(),因为索引不匹配。我是否将顶点坐标映射到纹理坐标,一对一?

//example 
glBegin(GLTriangles); 
gltexcoord2f(...); glvertex3f(...); 
... 
blaBlaBla(...); 
... 
glEnd(); 

我认为一个高效的API必须存在做我想做的。

+1

ASSIMP库会为您加载.obj文件,并根据需要设置所有内容。但是,您仍然必须生成GL对象才能使用模型。 – Robinson 2012-04-21 19:53:51

回答

0

不幸的是OpenGL没有高效的API来做你想做的事情。如果你想使用OBJ与顶点数组/缓冲区,你将不得不分解所有的顶点和texcoords给你,并重新组合它们在数组中,使顶点的数量和texcoords的数量是相同的,复制顶点和texcoords如所须。

如果你搜索,我相信你会发现如何做到这一点的几个问题。