2011-05-31 125 views
8

我是新来的opengl编程。我目前正在制作洞穴形成的动画。我有一组沿着z轴的轴的轮廓的坐标。我的计划是从这个数据中创建一个3d网格,并且我已经决定使用TRIANGLE_STRIPS。我这样做的方式是,我已经建立了多个条是这样的:OpenGL:3D网格和法线的三角形问题

 
11----12 5------6 
| /| | /| 
|/ | |/ | 
9-----10 3------4 
| /| | /| 
|/ | |/ | 
7------8 1------2 

我的问题是:

  1. 这是做正确的方式?因为现在我有法线问题。我想使用GL_SMOOTH阴影,并据我所知我需要计算顶点的法线?但在我的cas顶点10和3是相同的,所以会有两个法线?那是问题吗?还有什么其他的方式来创建多个带?

  2. 是否有任何其他方式来创建多个带?或者带条解决方案可能不是最好的解决方案?

  3. 另一个问题是,这些条带的长度不等。有些比其他人短。 谢谢您的帮助:)

回答

2

首先,在您的图片,对角线实际上翻转,如果数字代表顶点的顺序(但是这是一个轻微的错误陈述)。

  1. 这是剥离一个或多或少均匀的顶点网格的最简单和最充分的方法。你是对的,因为10和3需要相同的法线,所以你需要给他们相同的法线才能正确点亮。在这种情况下,索引是你的朋友。只需使用3和10的单个顶点(使用相应的法线)并使用索引的三角形条,其中索引3和10引用相同的顶点。这是解决顶点模糊的标准方法。如果你不知道我的意思,一般深入研究OpenGL和3D编程,特别是顶点和索引数组。

  2. 对于规则的网格,条通常是一个好主意,因为它们可以很容易地构建。对于更复杂的网格,现在不再需要它了,因为减少绘制调用次数通常更重要。

  3. 与三角形的总数相比,它们应该至少有一个合理的长度,否则绘制单条的开销超过了稍微快一点的顶点处理所节省的时间,但实际数量与实施高度相关。无论如何,您应该使用顶点数组/缓冲区,如果您关心性能,请远离开始/结束位置。

实际上,通过引入未渲染的退化三角形(以减少绘制调用次数),可以将多个条带合并为一条。你的例子可以呈现为以下单个条带:

1,2,3,4,5,6,6,7,7,8,9,10,11,12

但同样,记住答案。这些条应具有合理的大小,以便退化三角形不会超过实际三角形。

6

首先,不要使用三角形条。对于旧硬件来说这是旧概念。使用简单的索引三角列表。这很容易(起初),速度更快。 对你的问题:

1)每个顶点都有一个正常的。它与位置一样独特而重要。如果两个顶点具有不同的位置,它们将是不同的顶点。法线同样适用:有些顶点的位置相同,但法线不同。但它们是不同的顶点。想想如何离开球体的顶点与立方体的顶点不同。

2)使用列表(glDrawElements)。不要使用条。有一些最佳的方法可以将这些列表排序进行缓存,nvidia和ati在其开发人员部分中提供了大量示例代码。

3)别担心。一个好的网格将具有大致相等的面积三角形。索引经过排序,大部分时间点击顶点缓存(通常至少16个条目)。 Strips是一种优化2入口顶点缓存的方法。

+1

是:不要使用三角形条。三角带不是特别的“旧硬件”,或者更慢,但是使用它们会遇到很大的麻烦。 +1使用简单的索引三角形。顶点缓存通常是24,重要的是什么。 – Calvin1602 2011-06-01 18:56:55