【问题标题】:Is specifying EndStreamPrimitive() necessary in Geometry shader with streams是否在带有流的几何着色器中指定 EndStreamPrimitive()
【发布时间】:2014-05-19 02:03:46
【问题描述】:

EndStreamPrimitive() 只能用于带有流的几何着色器。 带有流的几何着色器只能发出 GL_POINTS。 但是在 GL_POINTS 中,每个顶点本身就是一个图元。

那么拥有像 EndStreamPrimitive() 这样的函数有什么意义呢? 当原始类型 = GL_POINT 时仅指定 EmitStreamVertex() 表示原始结束。

我的下一个问题是几何着色器中的 max_vertices 是什么?

layout(points, max_vertices = 6) out;

我想这是几何着色器将发出的最大顶点数(无论天气如何,它是否使用流)。 如果我的几何着色器中有 2 个流,并且我向流 0 发出 2 个顶点,向流 1 发出 3 个顶点。是否应该将 max_vertices 的值设置为 5?

【问题讨论】:

    标签: opengl glsl geometry-shader


    【解决方案1】:

    据我所知,EndStreamPrimitive (...) 目前没有用;可能只是为了与非流 GLSL 设计保持一致而提供。如果取消对 points 作为唯一输出原语类型的限制,那么它可能在未来变得有用。


    回答您的第二个问题,这是您在 GS 的单次调用中发出的最大顶点数。几何着色器与其他阶段的不同之处在于其输出数据的大小可以在运行时变化。您可能会因为运行时的某些条件而决定要将 8 个顶点输出到流 1 —— GLSL 需要知道一个上限,并且它无法确定您的流控制是否基于其他地方设置的变量。

    两者 GS 调用可以发出的顶点数 (GL_MAX_GEOMETRY_OUTPUT_VERTICES) 和矢量分量的总和 (GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS) 设置了实现限制)。这些限制也在着色语言中定义。

    实现必须支持以下最低要求:

    const int gl_MaxGeometryOutputVertices        = 256;
    const int gl_MaxGeometryTotalOutputComponents = 1024;
    

    如果您的着色器超出这些限制,您需要将其拆分为多个调用。您可以使用多个绘图调用来做到这一点,也可以让 GL4+ 自动调用您的 GS 多次:

    layout (invocations = <num_invocations​>) in;
    

    您可以通过 gl_InvocationID​ (GL4+) 的值来确定 GS 正在执行的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多