在Mac上将可变数组从顶点着色器传递到几何着色器

3
我希望能够从顶点着色器向几何着色器传递任意数量和不同类型的值。我知道OpenGL没有动态数组,因此数量应该在编译时指定。整个程序应该在配备NVIDIA GeForce 9400M显卡和仅提供OpenGL 2.1及其扩展的驱动程序的苹果MacBook上运行。
问题在于几何着色器以每个顶点一个元素的数组形式接收输入。据我所知,在我的设置中没有可用的数组或包含数组的接口块的数组。到目前为止,我能想到的最好的解决方案是指定一些变量来传递这些信息,从顶点着色器中提取出一个数组,并在几何着色器中将其转换回具有特定步幅长度的数组。这样,仍然可以使用计算索引访问值。
是否有更好、更优雅的方法?
2个回答

5

来自EXT_geometry_shader4规范

用户定义的varying变量可以在顶点着色器中声明为数组。这意味着,在输入几何着色器时,必须将其声明为二维数组。有关更多信息,请参见OpenGL Shading Language规范的4.3.6和7.6节。

例如,在顶点着色器中,您可以指定:

varying vec2 value[2];

在几何着色器中,这会变成一个二维数组,例如以三角形为输入原语

varying in vec2 value[3][2];

请注意数组索引的反直觉顺序!同时,必须明确指定数组的维度,使用整数常量。使用非常量整数变量或gl_VerticesIn会导致编译器错误。这两点已经在问题中提到的MacBook Pro型号上进行了测试。

2
核心OpenGL的几何着色器之所以不能像EXT_geometry_shader4一样工作,是有原因的。这就是其中之一。EXT_geometry_shader4不允许输入数组,因为那意味着允许值的数组。而GLSL无法处理它(直到最近才能够处理,但那只有两个月的历史)。
接口块可以在其中包含数组。你的问题是GLSL 1.20没有接口块。
除了使用不同的变量并手动展开所有循环外,你别无选择。您可以编写一个函数,该函数接受整数值并有条件地返回对应于该索引的不同值之一,但这大概就是您在老式GLSL中能得到的最好结果了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接