10

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

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

来自 OpenGL 4.3 规范的三角形邻接图。

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

单个三角形是一个愚蠢的例子,但是有很多网格并不是所有的三角形都连接到其他三个三角形上——例如,一个端部开口的圆柱体。

是否有处理此类案件的标准方法?如果我错过了规范中明显的内容,我深表歉意。

上图从 OpenGL 4.3 规范复制而来。

4

3 回答 3

6

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

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

看看:OpenGL 4.3 Core Specification - 10.3.5 Primitive Restart - pp. 301 了解更多详情。

我还应该指出,基于索引的原语重启是一个可以启用/禁用的功能,并且它一开始是禁用的。所以仅仅设置重启索引并不足以让它真正做任何事情。

于 2013-09-27T00:19:51.050 回答
2

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

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

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

否则,您始终可以生成幻像顶点。例如,假设在您的图表中,没有顶点 6。您可以通过顶点 1 和 5 创建的线的中点镜像/投影顶点 3,为顶点 6 创建数据。常规网格。

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

于 2018-03-02T15:31:40.363 回答
-1

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

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

于 2013-09-26T19:21:40.347 回答