我使用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,然后我得到所需的输出:
发生了什么事?真正的最大顶点数是多少?为什么顶部图形不受影响,但底部图形已损坏?他们有相同的数据。
答案 0 :(得分:4)
几何着色器有two competing sets of limitations。第一个是每个GS调用中的顶点数,第二个是从GS调用(从GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
检索)输出的组件总数。你必须保持两者都能获得定义的行为。
1024是GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
所需的最小值;所有实现都将支持至少那么多。如果实现仅支持该数字,并且您尝试输出1024个顶点,则只能为每个此类顶点输出单个数据分量(单个float
或int
或其他任何内容,甚至不是{ {1}})。
总的来说,最好完全避免这个问题。您尝试做的事情似乎更容易通过compute shader或至少geometry shader instancing来完成。