为什么我的几何着色器变得“过载”?

问题描述 投票:1回答:1

我使用OpenGL着色器绘制图形。图表的每个跨度都具有以下形式:

enter image description here

顶点着色器只是将a和b传递给几何着色器,然后在max_vertices点处评估曲线。

问题是,有时几何着色器似乎变得“过载”并停止吐出点:

enter image description here

两条曲线实际上具有完全相同的值,但由于某种原因,底部曲线具有几何着色器生成点的某种失败。

当我在几何着色器的以下行中更改max_vertices时:

layout (triangle_strip, max_vertices = ${max_vertices}) out;

从1024(gl.glGetInteger(gl.GL_MAX_GEOMETRY_OUTPUT_VERTICES)的结果)到256,然后我得到所需的输出:

enter image description here

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

opengl glsl geometry-shader
1个回答
4
投票

几何着色器有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完成。

© www.soinside.com 2019 - 2024. All rights reserved.