我希望能够将每个顶点的任意数量的变化值从顶点着色器传递到几何着色器。我知道OpenGL没有动态数组,所以应该在编译时指定数字。整个过程应该在带有NVIDIA GeForce 9400M显卡的Apple MacBook上运行,并且驱动程序只提供OpenGL 2.1以及一些扩展。
这里的问题似乎是几何着色器在表单中获取其输入或每个顶点有一个元素的数组。据我所知,我的设置中没有可用的数组数组,也没有包含数组的接口块数组。到目前为止,我能想出的最佳解决方案是指定一些变量来传递这些信息,从顶点着色器中的数组中提取并转换回几何着色器中具有特定步长的数组。这样,仍然可以使用计算索引来执行对值的访问。
有更好,更优雅的方式吗?
答案 0 :(得分:5)
来自EXT_geometry_shader4 specification:
用户定义的变量变量可以声明为数组中的数组 顶点着色器。这意味着那些在输入到几何着色器时, 必须声明为二维数组。见第4.3.6和7.6节 OpenGL着色语言规范以获取更多信息。
例如,在顶点着色器中,您可以指定
varying vec2 value[2];
并且在几何着色器中,这变成二维数组,例如用三角形作为输入图元
varying in vec2 value[3][2];
注意数组索引的违反直觉的顺序!还要注意必须使用整数常量显式指定数组维度。使用非常量整数变量或gl_VerticesIn会产生编译器错误。这两个评论都已经在问题中提到的MacBook Pro型号上进行了测试。
答案 1 :(得分:2)
核心OpenGL的几何着色器不能像EXT_geometry_shader4那样工作的原因。这是其中之一。 EXT_geometry_shader4不允许输入数组,因为这意味着允许数组数组的数组。并且GLSL无法处理(直到最近,但仅仅2个月)。
接口块可以包含数组。您的问题是GLSL 1.20 没有接口块。
除了使用不同的变量并手动展开所有循环之外,您无能为力。您可以编写一个带整数值的函数,并有条件地返回与该索引相对应的不同值之一,但这是您使用旧式GLSL获得的最佳值。