我将一个统一数组传递给几何着色器,并希望使用变量将其索引。我可以使用可变长度数组&具有固定数字的索引(数字常数)或者我可以定义一个固定长度的数组& index使用varible。但是我无法使用变量索引到可变长度数组。
下面是几何着色器的伪代码,其中包含可用的工具和不起作用的案例
这有效:
uniform vec2 dimensions[2];
// some code which computes index which is an int
float dimX = dimensions[index].x;
这有效:
uniform vec2 dimensions[];
// some code which computes index which is an int
float dimX = dimensions[0].x;
这不起作用:
uniform vec2 dimensions[];
// some code which computes index which is an int
float dimX = dimensions[index].x;
是否可以做这样的事情?
答案 0 :(得分:13)
可悲的是,这不可能。您没有包含您要定位的GLSL版本,但确实提到了几何着色器,因此我已经包含了GLSL 1.5规范的相关部分。下面:
通过声明一个名称后跟括号([])包含可选大小,可以将相同类型的变量聚合到数组中。在声明中指定数组大小时,它必须是大于零的整数常量表达式(请参见第4.3.3节“常量表达式”)。 如果使用不是整型常量表达式的表达式索引数组,或者将数组作为参数传递给函数,则必须在任何此类使用之前声明其大小。 强>
虽然桌面GLSL在使用非const表达式索引数组时比GLSL ES更宽容,但您仍需要在一些限制内工作。与纹理查找通常用于克服OpenGL ES中的非const数组索引的方式相同,您可以通过在几何着色器中使用一维纹理查找来解决此问题。我不得不怀疑你是否真的需要这个功能 那么 呢?
最好定义统一阵列的上限,因为GLSL规范。只需要一个实现在几何着色器阶段提供1024个统一组件(例如1024 float
,256 vec4
,64 mat4
或每个组合()。如果您的阵列在编译时具有已知的最大大小,那么您可以避免在不知不觉中超出此限制的情况下遇到麻烦。
由于您提到了GLSL 4.x,我想在OpenGL中指出一个名为Shader Storage Buffer Objects的新功能。使用SSBO时,可以在运行时使用具有动态长度的数组来实现您的目的。您可以在着色器中使用.length ()
查询SSBO的长度,并自行处理范围验证。但是,我认为这可能有点过头了,但值得一提。