如何从3ds文件中正确渲染面

时间:2011-10-24 00:56:16

标签: c++ c opengl 3ds

我已经实现了将3DS文件加载到我的OpenGL程序中的能力,并遇到了一个小问题。正确放置所有顶点,并绘制面,但问题是大多数(或全部)顶点似乎保留与一个或两个顶点的连接,从而产生大量额外边。任何人之前都遇到过这个问题,或者对我如何解决这个问题提出建议?

以下代码块是我用来绘制面的循环。它一次遍历一个顶点,跳过每四个值(理论上),因为它们是未使用的面修改器。

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
{
    //Face bit modifiers not needed, skip em.
    if(tLoop == 4)
    {
        tLoop = 0;
        continue;
    }
    else
    {
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
        tLoop++;
    }
}
glEnd();

接下来是代表我遇到的问题的图像。 http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

2 个答案:

答案 0 :(得分:3)

glBeginglEnd在循环之外的事实绝对没有问题。一个接一个地使用每个顶点绘制三角形只是正确的方法。它将每3个连续的顶点构建一个三角形,这就是你想要的。

你的问题是,你在else块中增加了tLoop,因此实际上跳过了每五个索引,而不是每四个索引。因此展开阻止了它,但它与glBegin/glEnd无法在循环之外工作无关。但正如评论中所述,您无论如何都不需要tLoop,因为您只能使用x

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
    if(x % 4)   //works if x starts at 1, though I don't know why x has to start at 1
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glEnd();

甚至更好地展开循环:

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) {
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]);
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]);
}
glEnd();

但是将glBegin/glEnd置于循环中是您可以做的最愚蠢的事情。事实上,如果你已经使用了基于顶点/索引数组的表示,那么将渲染代码移植到顶点数组应该非常容易,这比立即模式快得多,在VBO的驱动下更是如此。

答案 1 :(得分:0)

弄清楚我自己的问题。注意开始和结束块如何出现在循环之外。该程序试图一个接一个地使用网格中的每个顶点绘制三角形。因此它创造了一个巨大的混乱。我改为一次放置三个顶点(一个面),然后将开始/结束块放在循环中,并将循环更改为每次增加4,允许我跳过面数据。

万一有人好奇。