【问题标题】:geometry shader input with custom vertex count in OpenGL?OpenGL中具有自定义顶点数的几何着色器输入?
【发布时间】:2015-10-04 14:58:02
【问题描述】:

我正在做一个项目,其中(我正在简化一点)

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

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

问题:

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

注意:顺便说一下,我是 OpenGL 的新手,如果我的术语有误,请告诉我。


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

【问题讨论】:

  • 横截面是什么意思?我认为图表可能有助于理解您的意思。如果您的横截面始终穿过棱镜,那么您实际上只是在重复棱镜的末端几何形状。

标签: c++ opengl glsl geometry-shader


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多