C++ 在OpenGL中动态创建规则网格的互补三角形

C++ 在OpenGL中动态创建规则网格的互补三角形,c++,opengl,geometry-shader,C++,Opengl,Geometry Shader,我已经创建了一个规则的网格,它起源于2D图像,即每个像素都有一个顶点。每四个像素有两个三角形,因此我在右上角和左下角各有一个三角形。我使用顶点和索引缓冲区 现在,我动态删除两种不同类型顶点边界处的三角形/面(根据我的应用程序),因为否则会出现扭曲。我编写了一个几何体着色器,它获取一个三角形并输出该三角形,或者什么也不输出(参见第一张图片)。着色器会识别三角形是否“有缺陷”(具有橙色边),并将其忽略 现在这很好,但我可能会丢失一些细节,因为我的顶点几何体。我可以将互补三角形添加到网格中(请参见第

我已经创建了一个规则的网格,它起源于2D图像,即每个像素都有一个顶点。每四个像素有两个三角形,因此我在右上角和左下角各有一个三角形。我使用顶点和索引缓冲区

现在,我动态删除两种不同类型顶点边界处的三角形/面(根据我的应用程序),因为否则会出现扭曲。我编写了一个几何体着色器,它获取一个三角形并输出该三角形,或者什么也不输出(参见第一张图片)。着色器会识别三角形是否“有缺陷”(具有橙色边),并将其忽略

现在这很好,但我可能会丢失一些细节,因为我的顶点几何体。我可以将互补三角形添加到网格中(请参见第二张图片,带有橙色虚线的新三角形)

如何在OpenGL中实现这一点?

我的第一个想法是创建一个四边形而不是两个三角形,检查四个可能的三角形情况,并在几何体着色器中动态创建这些三角形。但这可能是缓慢的;GL_四边形已被弃用,替代方案也可能很慢。你有什么想法?

以下是我的想法: 将整个网格置于缓冲区/纹理中。
为每四个像素构建四个三角形。他们互相交叉,是的。
在几何体着色器中,您可以判断三角形是否“错误”,因为它连接了两个错误的区域。或者,从纹理中采样,因为交叉三角形是有效的,所以可以丢弃这个新三角形。 编辑:另一种方法 使用纹理。使用GL_点绘制实例。通过某种顺序和instanceID的帮助,着色器知道点在哪里。
对于这一点,测试四个可能的三角形。如果从上到下和从左到右引用,则四个三角形仅使用右侧的一个点和下方的两个点。避免重复测试。

仅发射您选择的几何体。

是否有特殊原因需要动态生成所有这些几何体,或者是否也可以提前生成所有几何体一次,并仅在必要时进行更新。因为如果你不在每一帧更新这些三角形,最好使用后一种方法,而不是使用几何体着色器。我正在处理实时视频,这意味着每一帧都有不同的图像数据。我仍然认为几何体着色器可能是你最好的选择。使用顶点栅格创建缓冲区,然后使用几何体着色器更改顶点的发射顺序。如果您决定不绘制三角形,只需颠倒其索引的顺序,并使用背面消隐使其不可见。这仍然允许您添加互补三角形。@Bartvbl我不确定是否能跟上您。我假设我在几何体着色器中一次处理一个三角形,这意味着我可以忽略它(不需要反转索引顺序)或保留它。按照我的理解,我无法访问缺失的第四个顶点来生成互补三角形。几何体着色器一次在单个三角形上执行。函数的输入是一个类似于此处所示的结构:。您可以自行决定发射这些顶点的顺序。或者,您可以更改它们的坐标,使三角形成为“互补”类型。最后,您可以反转顶点发射的顺序,使其通过背面消隐进行消隐(我似乎记得几何体着色器可以作为内置功能进行消隐,但我目前无法找到它),我将尝试您的建议!这应该行得通,但我还是更喜欢更高效的方法。我已经成功地尝试了您的第一种方法,但我无法在毫秒内衡量巨大的性能损失。不幸的是,我的质量改进微不足道,但仍然是一个进步!