我已经实现了将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
答案 0 :(得分:3)
glBegin
和glEnd
在循环之外的事实绝对没有问题。一个接一个地使用每个顶点绘制三角形只是正确的方法。它将每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,允许我跳过面数据。
万一有人好奇。