OpenGL三角形邻接索引

Kaa*_*the 10 c c++ opengl

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

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

OpenGL 4.3规范的三角形邻接图.

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

单个三角形是一个愚蠢的例子,但是有很多网格,其中并非所有三角形都连接到另外三个 - 例如,具有开放端的圆柱体.

有没有一种标准的方法来处理这样的案件?如果我遗漏了规范中显而易见的东西,请道歉.

上面的图像是从OpenGL 4.3规范中复制的.

And*_*man 6

在阅读了对BЈовић的评论之后,我认为很明显你所寻找的是原始重启索引.

您可以使用以下API调用保留任意索引值以表示原始重启:glPrimitiveRestartIndex (...).经常-1使用,就像你原来的问题一样.

请看一下:OpenGL 4.3核心规范 - 10.3.5原始重启 - 第301页了解更多详情.

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


Nic*_*las 2

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

在没有相邻顶点信息的情况下,您需要使用曲面细分算法来寻找解决方案。许多算法都有处理没有相邻三角形的情况的方法。有些曲面细分算法没有;它们仅适用于完全规则的网格。

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

如果做不到这一点,您始终可以生成幻影顶点。例如,假设在您的图中没有顶点 6。您可以通过通过顶点 1 和 5 创建的线的中点镜像/投影顶点 3 来创建顶点 6 的数据。这会产生以下效果:规则的网格。

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