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

时间:2017-02-22 12:22:46

标签: c++ opengl geometry-shader

我创建了一个源自2D图像的规则网格,即每个像素都有一个顶点。每四个像素有两个三角形,所以我在右上角和左下角有一个三角形。我使用顶点和索引缓冲区。

Current state

现在我动态删除两种不同顶点边界的三角形/面(根据我的应用),否则会出现扭曲。我写了一个几何着色器,它取三角形并输出三角形或没有(见第一张图片)。着色器识别三角形是否“有缺陷”(具有橙色边缘)并省略它。

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

Goal state

如何在OpenGL中完成此操作?

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

1 个答案:

答案 0 :(得分:4)

这是我的想法:

将整个网格放在缓冲区/纹理中。  
为每四个像素构建四个三角形。他们互相交叉,是的。
在几何着色器中,您可以判断三角形是否“有缺陷”,因为它连接了两个错误的区域。或者,从纹理采样,因为交叉三角形是有效的,所以这个新的可以被丢弃。

编辑:另一种方法

使用纹理。使用GL_POINTS绘制实例。通过一些顺序和instanceID的帮助,着色器知道该点的位置。
对于这一点,测试四个可能的三角形。如果您从上到下以及从左到右实例,则只有一个点位于右侧,而下面的两个点用于四个三角形。而且你避免重复测试。
只发出你选择的那些。