OpenGL三角形邻接索引

问题描述 投票:10回答:3

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

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

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

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

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

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

c++ c opengl
3个回答
2
投票

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

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

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

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

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


6
投票

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

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

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

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


-1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.