在OpenGL中使用自定义顶点计数的几何着色器输入?

时间:2015-10-04 14:58:03

标签: c++ opengl glsl geometry-shader

我正在开展一个项目(我正在简化一点)

  

我需要计算三维形状的横截面并渲染它们。例如,我可能有一个四面体列表(每个四面体由4个顶点组成),或者三角形棱柱列表(每个三角形棱柱由6个顶点组成),或者n个棱镜列表(每个n棱镜由2 * n组成)顶点)等   我想计算它们的二维横截面(二维横截面将由三角形组成),并渲染横截面。

我想到的最简单和最有效的方法是将3D顶点发送到顶点着色器,然后将它们发送到几何着色器并在那里截取横截面。但是,为了做到这一点,几何着色器需要采用4点或6点(超过3点)的基元。这是一个问题,因为据我所知,几何着色器只能采用点,线和三角形,而没有更多点。我可以通过将几个3D顶点的属性存储在单个GLSL顶点中来解决这个问题,但这将是非常复杂和不优雅的。

问题:

几何着色器是否有办法处理自定义长度的基元,类似于曲面细分着色器中使用的补丁基元?我仍然只会从几何着色器输出三角形。

注意:顺便说一句,我是OpenGL的新手,所以请告诉我是否有任何错误的术语。

编辑:按"横截面"我指的是沿着平面的任何横截面,其不一定与棱镜的基部对齐。因此,每个横截面将产生可变数量的三角形。例如,平面可以在0,3或4个点处与四面体相交,并且几何着色器(理想情况下)将采用4点基元并输出0,1或2个三角形。另外,我的问题与实际横截面计算无关。我特别询问是否有一种方法可以使用超过3个点的图元作为几何着色器的输入。最后,这是我发布的第二个问题,所以我不知道我是否正确地格式化了东西。对不起,如果我没有!

1 个答案:

答案 0 :(得分:3)

  

几何着色器是否有办法处理自定义的基元   长度,类似于曲面细分着色器中使用的补丁基元?

如果您想使用几何着色器,有两种直接的方法可以实现这一点:

1)使用 triangles_adjacency 作为输入基元类型而不是三角形,它为每个几何着色器调用提供6个顶点。通常,这用于在当前三角形的三个边缘提供邻接信息,但您可以通过元素缓冲区提供所需的任何数据。 See here for a quick overview of geometry shaders.

2)使用 points (或其他任何东西)作为输入基元类型,并使用内置变量 gl_PrimitiveIDIn 。创建着色器存储缓冲区,纹理缓冲区或仅用于保存几何数据的纹理,并使用此基元ID访问当前形状的数据。如果您的形状具有不同的顶点数,则可以使用您使用原始ID访问的其他索引缓冲区。然后以索引缓冲区的偏移量访问顶点缓冲区。

第二种解决方案显然更灵活。第三种选择是首先不在几何着色器中执行此操作。您执行计算着色器,比如每个形状调用一次,为顶点和索引绑定可写入着色器存储缓冲区,像往常一样在着色器中进行横截面计算,将生成的几何存储在缓冲区中,然后绘制横截面几何像往常一样。这样,您就不需要绕过顶点着色器,它可以变换您不想渲染的顶点。