我使用OpenGL着色器绘制图形。图表的每个跨度都具有以下形式:
顶点着色器只是将a和b传递给几何着色器,然后在max_vertices
点处评估曲线。
问题是,有时几何着色器似乎变得“过载”并停止吐出点:
两条曲线实际上具有完全相同的值,但由于某种原因,底部曲线具有几何着色器生成点的某种失败。
当我在几何着色器的以下行中更改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个顶点,则只能输出每个此类顶点的单个数据分量(单个float
或int
或其他任何内容,甚至不是vec2
)。
总的来说,最好完全避免这个问题。你想要做的事情似乎更容易通过compute shader或至少geometry shader instancing完成。