为什么我的几何着色器变成 "overloaded"?

Why is my geometry shader becoming "overloaded"?

我使用 OpenGL 着色器绘制图形。图的每个跨度都具有以下形式:

顶点着色器只是将 a 和 b 传递给几何着色器,然后在 max_vertices 点计算曲线。

问题是有时几何着色器似乎变得 "overloaded" 并停止吐出点:

两条曲线实际上具有完全相同的值,但由于某种原因,底部的几何着色器无法生成点。

当我在几何着色器的以下行中更改 max_vertices 时:

layout (triangle_strip, max_vertices = ${max_vertices}) out;

从1024(gl.glGetInteger(gl.GL_MAX_GEOMETRY_OUTPUT_VERTICES)的结果)到256,然后我得到了想要的输出:

这是怎么回事?真正的最大顶点数是多少?为什么顶部的图不受影响,但底部的图损坏了?他们有相同的数据。

几何着色器有 two competing sets of limitations。第一个是每个 GS 调用中的顶点数,第二个是您从 GS 调用中输出的组件总数(从 GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 中检索)。您必须保持在两者内才能获得定义的行为。

1024 是 GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 所需的最小值;所有实现都将至少支持那么多。如果一个实现只支持那个数字,而你试图输出 1024 个顶点,你只能为每个这样的顶点输出一个数据组件(单个 floatint 或其他任何东西,甚至 vec2).

总的来说,最好完全避免这个问题。您正在尝试做的事情似乎通过 compute shader or at the very least, geometry shader instancing.

更容易完成