Nei*_*l G 2 opengl glsl geometry-shader
我使用 OpenGL 着色器来绘制图形。图表的每个跨度都具有以下形式:
顶点着色器只是将 a 和 b 传递给几何着色器,然后几何着色器在max_vertices点处评估曲线。
问题是,有时几何着色器似乎变得“过载”并停止吐出点:
两条曲线实际上具有完全相同的值,但由于某种原因,底部曲线的几何着色器无法生成点。
当我更改max_vertices几何着色器的以下行时:
layout (triangle_strip, max_vertices = ${max_vertices}) out;
Run Code Online (Sandbox Code Playgroud)
从 1024 ( 的结果gl.glGetInteger(gl.GL_MAX_GEOMETRY_OUTPUT_VERTICES))到 256,然后我得到所需的输出:
怎么了?真正的最大顶点数是多少?为什么顶部的图表不受影响,但底部的图表已损坏?他们有相同的数据。
几何着色器有两组相互竞争的限制。第一个是每个 GS 调用中的顶点数,第二个是从 GS 调用中输出的组件总数(从 检索GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS)。您必须保持在两者之中才能获得定义的行为。
1024 是所需的最小值GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS;所有实现都将至少支持那么多。如果实现仅支持该数字,并且您尝试输出 1024 个顶点,则只能为每个此类顶点输出数据的单个组件(单个float或int其他任何内容,甚至不是vec2)。
总的来说,最好完全避免这个问题。您想要做的事情似乎通过计算着色器或至少通过几何着色器实例更容易完成。