OpenGL:3d网格和法线的三角形条带问题

时间:2011-05-31 13:12:18

标签: opengl gl-triangle-strip

我是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. 另一个问题是,这条带的长度不一样。有些比其他更短。 谢谢你的帮助:)

2 个答案:

答案 0 :(得分:6)

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

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

2)使用列表(glDrawElements)。不要使用条带。有一些最佳的方法可以为缓存订购这些列表,nvidia和ati在他们的开发人员部分中有大量的示例代码。

3)不要担心。良好的网格将具有大致相等的区域三角形。索引被排序以在大多数时间点击顶点缓存(通常至少16个条目)。 Strips是一种优化2个入口顶点缓存的方法。

答案 1 :(得分:2)

首先,在你的图片中,对角线实际上是翻转的,如果数字表示顶点的顺序(但这是一个小的演示错误)。

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

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

  3. 与三角形的总数相比,它们应至少具有合理的长度,否则绘制单个条带的开销只会超过稍快的顶点处理所节省的时间,但实际数字依赖于高度实现。你应该使用顶点数组/缓冲区,如果你关心性能,请远离开始/结束。

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

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

    但是,请再次回答3.记住。条带应该具有合理的尺寸,以便退化的三角形不会过多地超出实际三角形。