OpenGL:三角带在3D网格和法线中的问题

8

我是OpenGL编程的新手,目前正在制作洞穴柱状物的动画。我有一组沿z轴方向的柱状物剖面坐标。我的计划是从这些数据中创建一个3D网格,并且为此我决定使用TRIANGLE_STRIPS。我创建了多个类似于以下的条带:

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

我的问题如下:

  1. 这样做对吗?因为现在我遇到了法线问题。我想使用GL_SMOOTH着色,为此我需要计算顶点的法线,但是在我的情况下,顶点10和3是相同的,那么会有两个法线吗?这是个问题吗?还有没有其他创建多个条带的方法?

  2. 还有没有其他创建多个条带的方法?或者说条带的解决方案可能不是最好的吗?

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

2个回答

6

首先,不要使用三角形条带。这是旧硬件的旧概念。请使用简单的索引三角形列表。这样更容易(起初)并且更快。

对于你的问题:

1)每个顶点都有一个法线。它与位置一样独特和重要。如果两个顶点具有不同的位置,则它们将是不同的顶点。同样适用于法线:有相同位置但法线不同的顶点。但它们是不同的顶点。想想球体上的顶点与立方体上的顶点之间的区别。

2)使用列表(glDrawElements)。不要使用条带。有最佳的方法来为缓存排序这些列表,NVIDIA和ATI在其开发者部分有大量示例代码。

3)暂时不用担心这个。一个好的网格将具有近似相等的面积三角形。索引被排序以尽可能多地命中顶点缓存(通常至少16个条目)。条带是优化2个条目顶点缓存的一种方式。


1
是的:不要使用三角形条带。三角形条带并不特别“适用于旧硬件”或者更慢,但如果你使用它们,你会陷入麻烦。建议使用简单的索引三角形。至于顶点缓存通常为24,这是无关紧要的。 - Calvin1602

3
首先,在您的图片中,对角线实际上是反转了的,如果数字代表顶点的顺序(但这只是一个小的展示错误)。
以下是需要注意的几点:
1. 对于一个相对均匀的网格,最简单而且通常足够的方法是去除顶点。您是正确的,10和3需要相同的法线,因此您需要为它们提供相同的法线才能使它们正确地照明。在这种情况下,索引是您的朋友。只需使用一个单一的顶点来表示3和10(带有相应的法线),并使用索引三角形带,其中索引3和10引用相同的顶点。这是解决顶点模糊性的标准方法。如果您不知道我在说什么,请深入研究OpenGL和3D编程,特别是顶点和索引数组。
2. 对于规则网格,条带通常是一个很好的选择,因为它们可以很容易地构建。对于更复杂的网格,现在通常不再需要条带,因为减少绘制调用的数量更为重要。
3. 条带的长度应该至少与三角形的总数相当,否则单个条带的开销会超过稍快的顶点处理所节省的时间,但实际的数字高度依赖于实现。无论如何,您应该使用顶点数组/缓冲区,如果您关心性能,请避免使用begin/end。
4. 您实际上可以通过引入未呈现的退化三角形(以减少绘制调用的数量)将多个条带合并为一个。您的示例可以渲染为以下单个条带:
1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12
但是,再次请注意第3点。条带的大小应该合理,这样退化三角形不会过多地影响实际三角形的数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接