8

我是opengl编程的新手。我目前正在制作洞穴竖井形成的动画。我有一组坐标轴沿 z 轴的轮廓。我的计划是根据这些数据制作一个 3d 网格,并决定使用 TRIANGLE_STRIPS。我这样做的方式是创建了多个这样的条带:

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

我的问题是:

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

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

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

4

2 回答 2

6

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

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

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

3) 不要担心这个。一个好的网格将具有大约相等面积的三角形。大多数时候,索引被排序以命中顶点缓存(通常至少 16 个条目)。Strips 是一种优化 2 条目顶点缓存的方法。

于 2011-06-01T13:55:12.520 回答
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 _ _

但同样,请记住答案 3.。条带应该有一个合理的尺寸,这样退化的三角形就不会超过真正的三角形太多。

于 2011-05-31T17:51:44.347 回答