Dib*_*iba 8 opengl gl-triangle-strip
我是opengl编程的新手.我正在制作洞穴形成的动画.我有一组用于沿z轴的轴的轮廓的协调.我的计划是从这些数据制作一个3d网格,为此我已经决定使用TRIANGLE_STRIPS.我这样做的方式是我创建了多个像这样的条带:
11----12 5------6 | / | | / | | / | | / | 9-----10 3------4 | / | | / | | / | | / | 7------8 1------2
我的问题是:
这是正确的方法吗?因为现在我对法线有问题.我想使用GL_SMOOTH着色,据我所知,我需要计算顶点的法线?但在我的cas顶点10和3是相同的,所以会有两个法线??? 那是问题吗?有没有其他方法来创建多个条带?
有没有其他方法来创建多个条带?或者条带解决方案可能不是最好的解决方案?
另一个问题是,这种条带的长度不同.有些比其他更短.谢谢您的帮助 :)
首先,不要使用三角形条.这是旧硬件的旧概念.使用简单的索引三角形列表.它更容易(起初)和更快.对你的问题:
1)每个顶点都有一个法线.它与位置一样独特和重要.如果两个顶点具有不同的位置,则它们将是不同的顶点.这同样适用于法线:有些顶点具有相同的位置但具有不同的法线.但它们是不同的顶点.想想球体顶点与立方体顶点的不同之处.
2)使用列表(glDrawElements).不要使用条带.有最佳方法可以为缓存订购这些列表,nvidia和ati在他们的开发人员部分中有大量的示例代码.
3)不要担心.良好的网格将具有大致相等的区域三角形.索引被排序以在大多数时间点击顶点缓存(通常至少16个条目).Strips是一种优化2个入口顶点缓存的方法.
首先,在你的图片中,如果数字代表顶点的顺序,对角线实际上是翻转的(但这是一个较小的表示错误)。
这是剥离或多或少均匀的顶点网格的最简单且大多数时候足够的方法。你是对的,因为 10 和 3 需要相同的法线,所以你需要给它们相同的法线才能正确照亮它们。在这种情况下,索引是你的朋友。只需对 3 和 10 使用单个顶点(具有相应的法线)并使用索引三角形带,其中索引 3 和 10 引用相同的顶点。这是解决顶点歧义的标准方法。如果您不明白我的意思,请更深入地研究 OpenGL 和 3D 编程,尤其是顶点和索引数组。
对于规则的网格,条带通常是一个好主意,因为它们可以很容易地构建。对于更复杂的网格,现在不再需要它,因为减少绘制调用的数量通常更重要。
与三角形总数相比,它们至少应该具有合理的长度,否则绘制单个条带的开销就超过了稍快的顶点处理所节省的时间,但实际数字高度依赖于实现。无论如何,您应该使用顶点数组/缓冲区,如果您关心性能,请远离开始/结束。
实际上,您可以通过引入未渲染的退化三角形将多个条带合并为一个条带(以减少绘制调用的数量)。您的示例可以呈现为以下单个条带:
1, 2, 3, 4, 5, 6, 6, 7 , 7, 8, 9, 10, 11, 12
但再次请记住答案 3。这些条带应该具有合理的尺寸,以便退化三角形的重量不会超过真实三角形太多。