gpt4 book ai didi

c++ - 如何正确渲染 3ds 文件中的面孔

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:49 24 4
gpt4 key购买 nike

我已经实现了将 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

最佳答案

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

您的问题是,您在 else block 内增加了 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 提供支持时更是如此。

关于c++ - 如何正确渲染 3ds 文件中的面孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com