2

我希望能够将每个顶点的任意数量的可变值从顶点着色器传递到几何着色器。我知道OpenGL没有动态数组,所以应该在编译时指定数字。整个过程应该在配备 NVIDIA GeForce 9400M 显卡和仅提供 OpenGL 2.1 的驱动程序以及一些扩展的 Apple MacBook 上运行。

这里的问题似乎是几何着色器以每个顶点一个元素的形式或数组的形式获取其输入。据我所知,我的设置中没有可用的数组数组,也没有包含数组的接口块数组。到目前为止,我能想到的最好的解决方案是指定一些变量来传递这些信息,这些信息是从顶点着色器中的数组中提取出来的,然后在几何着色器中变成具有一定步长的数组。这样,仍然可以使用计算的索引来执行对值的访问。

有没有更好、更优雅的方式?

4

2 回答 2

5

来自EXT_geometry_shader4 规范

用户定义的可变变量可以在顶点着色器中声明为数组。这意味着在输入到几何着色器时,必须将它们声明为二维数组。有关详细信息,请参阅 OpenGL 着色语言规范的第 4.3.6 和 7.6 节。

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

varying vec2 value[2];

在几何着色器中,这变成了一个二维数组,例如以三角形作为输入图元

varying in vec2 value[3][2];

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

于 2012-10-31T15:06:33.513 回答
2

核心 OpenGL 的几何着色器不能像 EXT_geometry_shader4 那样工作是有原因的。这是其中之一。EXT_geometry_shader4 不允许输入数组,因为这意味着允许值数组的数组。而 GLSL 无法处理这个问题(好吧,直到最近,但这才 2 个月大)。

接口块中可以有数组。您的问题是 GLSL 1.20没有 interface blocks

除了使用不同的变量并手动展开所有循环之外,您无能为力。您可以编写一个接受整数值并有条件地返回与该索引对应的不同值之一的函数,但这大约是您使用老式 GLSL 所能获得的最佳效果。

于 2012-10-25T17:14:34.543 回答