OpenGL三角形邻接索引

时间:2013-09-26 19:04:27

标签: c++ c opengl

我目前正在尝试编写一个程序,该程序将网格作为输入(由顶点位置和元素数组组成),并在glDrawElements()模式下输出用于GL_TRIANGLES_ADJACENCY的索引。

当我尝试编写代码时,我发现非闭合网格具有可能没有三个邻居的三角形。例如,由单个三角形组成的网格没有相邻的三角形。

Triangle adjacency diagram from OpenGL 4.3 spec.

在这种情况下,指数2,4和6应该是什么?似乎应该有一种标准的方法来告诉几何着色器一个或多个相邻的三角形不存在。但是,我在OpenGL规范(v4.3)中找不到相关信息。

单个三角形是一个愚蠢的例子,但是有很多网格,其中并非所有三角形都与其他三角形相连 - 例如,像一个带有开口端的圆柱体。

有没有一种标准方法来处理这样的案件?如果我错过了规范中明显的内容,请道歉。

从OpenGL 4.3规范复制的上图。

3 个答案:

答案 0 :(得分:6)

在读完你对BЈовић的评论后,我认为很明显你所寻找的是原始重启指数。

您可以使用以下API调用保留任意索引值以表示原始重启:glPrimitiveRestartIndex (...)。通常使用-1,与原始问题一样。

请查看:OpenGL 4.3 Core Specification - 10.3.5原始重启 - 第301页了解更多详情。

我还应该指出,基于索引的原语重启是一个可以启用/禁用的功能,并且它开始被禁用。因此,仅设置重启索引并不足以让它实际执行任何操作。

答案 1 :(得分:2)

这不是一个简单的问题需要解决。一般来说,如果GS需要邻接信息,那么您可能正在进行类似基于GS的曲面细分,其中您使用相邻的顶点信息来生成新的三角形数据。

如果没有相邻的顶点信息,您需要查看曲面细分算法以获得解决方案。许多算法都有处理没有相邻三角形的情况的方法。一些镶嵌算法;它们只适用于完美的规则网格。

在这些情况下,您遇到了问题。没有相邻三角形的边缘可能应该是锐边。因此,如果您的曲面细分算法无法创建锐边,那么您需要修改它以创建这样的东西。

如果失败,您总是可以生成幻像顶点。例如,假设在图中没有顶点6.您可以通过镜像/投影顶点3,通过顶点1和5创建的线的中点来创建顶点6的数据。这会产生一个效果。常规网格。

同样,这看起来有多好取决于您的曲面细分算法和您想要的结果。

答案 2 :(得分:-1)

好吧,如果你没有提供足够的顶点,那么你就不会得到任何渲染的东西。这意味着,如果为GL_TRIANGLES_ADJACENCY提供少于6个顶点,则不会渲染它。

最简单的测试是使用mode=GL_LINEScount=1