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

C++ 在OpenGL中使用自定义顶点计数的几何体着色器输入?,c++,opengl,glsl,geometry-shader,C++,Opengl,Glsl,Geometry Shader,我正在做一个项目,在那里(我正在简化一点) 我需要计算三维形状的横截面并渲染它们。例如,我可能有一个四面体列表(每个四面体由4个顶点组成),或者一个三角棱镜列表(每个三角棱镜由6个顶点组成),或者一个n棱镜列表(每个n棱镜由2*n个顶点组成),等等。 我想计算它们的二维横截面(二维横截面将由三角形组成),并渲染横截面 我想到的最简单和最有效的方法是将3D顶点发送到顶点着色器,然后将它们发送到几何体着色器并在那里获取横截面。但是,为了做到这一点,几何体着色器需要采用具有4个点或6个点(超过3个点)

我正在做一个项目,在那里(我正在简化一点)

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

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

问题: 几何体着色器是否可以处理自定义长度的基本体,类似于细分着色器中使用的面片基本体?我仍然只从几何体着色器输出三角形

注意:顺便说一下,我对OpenGL有点陌生,所以如果我有任何术语错误,请告诉我


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

几何体着色器是否有办法处理自定义的基本体 长度,类似于细分着色器中使用的面片基本体

如果要使用几何体着色器,有两种简单的方法可以实现这一点:

1) 使用三角形_邻接作为输入基本体类型,而不是三角形,它为每个几何体着色器调用提供6个顶点。通常,这用于在当前三角形的三条边上提供邻接信息,但可以通过元素缓冲区提供所需的任何数据

2) 使用点(或其他任何东西)作为输入基元类型,并使用内置变量gl_primitiveId。创建着色器存储缓冲区、纹理缓冲区或简单的纹理以保存几何体数据,并使用此基本体ID访问当前形状的数据。如果有顶点计数不同的形状,则可以使用使用基本体id访问的附加索引缓冲区。然后在从索引缓冲区获得的偏移量处访问顶点缓冲区


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

横截面是什么意思?我想一张图表可能有助于理解你的意思。如果你的横截面总是穿过棱镜,那么你实际上只是在重复棱镜的末端几何体。