如何填充GLSL变化,我可以拥有多少vec2?

时间:2016-08-17 07:00:33

标签: opengl glsl

我知道我可以glGet使用GL_MAX_VARYING_VECTORS来获取我可以用作变化的4分量矢量的数量。其他大小的向量,矩阵和所述类型的数组呢?这些包装有多紧密;有什么限制?

我遇到了this question并给出了一个很好的答案。但是,我对桌面OpenGL感兴趣,不是OpenGL ES 。这种情况有区别吗?我简要地搜索了this spec,但没有发现任何有用的东西。

除了对如何打包变换的一般兴趣,我有一个着色器程序,其唯一变化是vec2 s的数组。我想以编程方式获得此数组可以达到的最大大小。如何从GL_MAX_VARYING_VECTORS

中推导出来

在我的计算机上,GL_MAX_VARYING_VECTORS16,我可以将数组调整为62,然后才能编译。

此外,我应该使用varying吗?我知道新版本的GLSL使用in / out语法;我应该切换,你知道有什么资源可以让我开始吗?

1 个答案:

答案 0 :(得分:2)

对于所有版本的Desktop OpenGL(重要的地方),着色器阶段之间界面的限制是由"组件的数量来定义的,而不是"向量"的数量。 。例如,GL_MAX_VERTEX_OUTPUT_COMPONENTS定义VS可以生成的最大输出组件数。

A"组件"是浮点数,整数或布尔值。 vec3占用3个组件。 vec2[4]占用8个组件。

所以:

  

我想以编程方式获得此数组的最大大小。如何从GL_MAX_VARYING_VECTORS中获得它?

你不是。您可以从实际的组件数量中获得它。在现代桌面GL 3.2+中,这是由每阶段值定义的。对于顶点着色器,这是GL_MAX_VERTEX_OUTPUT_COMPONENTS。对于几何着色器,这是GL_MAX_GEOMETRY_OUTPUT_COMPONENTS

如果组件数为64(GL 4.x实现将返回的最小值),则可以有32 vec2 s。

根据标准,至少。在实践中,实现具有随着这些事物的工作方式而变化的趋势。特别是在早期,您几乎可以保证实现将获取数组的每个元素并将其扩展为vec4

他们现在这样做吗?好吧,要么他们做,要么他们不做。如果您将vec2的数组手动打包到vec4的数组中,那么您更有可能跨平台工作。因此,如果您不愿意/能够测试众多实施,那就是我要做的事情。

是的,如果你正在使用现代OpenGL实现,那么你应该使用in / out语法。但在这方面,这不会改变任何事情;它只是语法。