【问题标题】:Why is my geometry shader becoming "overloaded"?为什么我的几何着色器变得“过载”?
【发布时间】:2018-04-23 04:45:16
【问题描述】:

我使用 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,然后我得到想要的输出:

发生了什么?真正的最大顶点数是多少?为什么顶部的图表不受影响,但底部的图表已损坏?它们具有相同的数据。

【问题讨论】:

    标签: opengl glsl geometry-shader


    【解决方案1】:

    几何着色器有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 或至少geometry shader instancing 完成。

    【讨论】:

    • 感谢您的回答。您是否介意详细了解使用计算着色器或几何着色器实例化所涉及的内容,以及为什么它比我的解决方案更好?
    • 我添加了以下行,解决了我的问题:max_vertices = min(max_vertices, max_total_components // 4) 再次感谢。
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多