我知道我可以glGet
使用GL_MAX_VARYING_VECTORS
来获取我可以用作变化的4分量矢量的数量。其他大小的向量,矩阵和所述类型的数组呢?这些包装有多紧密;有什么限制?
我遇到了this question并给出了一个很好的答案。但是,我对桌面OpenGL感兴趣,不是OpenGL ES 。这种情况有区别吗?我简要地搜索了this spec,但没有发现任何有用的东西。
除了对如何打包变换的一般兴趣,我有一个着色器程序,其唯一变化是vec2
s的数组。我想以编程方式获得此数组可以达到的最大大小。如何从GL_MAX_VARYING_VECTORS
在我的计算机上,GL_MAX_VARYING_VECTORS
为16
,我可以将数组调整为62
,然后才能编译。
此外,我应该使用varying
吗?我知道新版本的GLSL使用in
/ out
语法;我应该切换,你知道有什么资源可以让我开始吗?
答案 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
语法。但在这方面,这不会改变任何事情;它只是语法。