【问题标题】:Passing varying array from vertex to geometry shader on Mac在Mac上将不同的数组从顶点传递到几何着色器
【发布时间】:2012-10-25 13:01:33
【问题描述】:
我希望能够将每个顶点的任意数量的可变值从顶点着色器传递到几何着色器。我知道OpenGL没有动态数组,所以应该在编译时指定数字。整个过程应该在配备 NVIDIA GeForce 9400M 显卡和仅提供 OpenGL 2.1 以及一些扩展的驱动程序的 Apple MacBook 上运行。
这里的问题似乎是几何着色器以每个顶点一个元素的形式或数组的形式获取其输入。据我所知,我的设置中没有可用的数组数组,也没有包含数组的接口块数组。到目前为止,我能想到的最好的解决方案是指定一些变量来传递这些信息,这些信息是从顶点着色器中的数组中提取出来的,然后在几何着色器中变成具有一定步长的数组。这样,仍然可以使用计算的索引来访问这些值。
有没有更好、更优雅的方式?
【问题讨论】:
标签:
arrays
opengl
shader
vertex-shader
geometry-shader
【解决方案1】:
来自EXT_geometry_shader4 specification:
用户定义的可变变量可以声明为数组
顶点着色器。这意味着那些,在输入到几何着色器时,
必须声明为二维数组。请参阅第 4.3.6 和 7.6 节
OpenGL 着色语言规范了解更多信息。
例如,在顶点着色器中,您可以指定
varying vec2 value[2];
在几何着色器中,这变成了一个二维数组,例如以三角形作为输入基元
varying in vec2 value[3][2];
注意数组索引的违反直觉的顺序!另请注意,必须使用整数常量明确指定数组维度。使用非常量整数变量或 gl_VerticesIn 会产生编译器错误。这两个评论都在问题中提到的 MacBook Pro 型号上进行了测试。
【解决方案2】:
核心 OpenGL 的几何着色器不能像 EXT_geometry_shader4 那样工作是有原因的。这是其中之一。 EXT_geometry_shader4 不允许输入数组,因为这意味着允许值数组的数组。而 GLSL 无法处理这个问题(好吧,直到最近,但这才 2 个月大)。
接口块可以包含数组。您的问题是 GLSL 1.20 没有接口块。
除了使用不同的变量并手动展开所有循环之外,您无能为力。您可以编写一个接受整数值并有条件地返回对应于该索引的不同值之一的函数,但这大约是您使用老式 GLSL 所能获得的最佳效果。