Jit*_*itu 9 arrays opengl glsl uniform
我将一个统一数组传递给几何着色器,并希望使用变量索引它.我可以使用带有固定数字的可变长度数组和索引(数字常量)或者我可以使用varible定义固定长度的数组和索引.但是我无法使用变量索引到可变长度数组.
下面是几何着色器的伪代码,其中包含无效的案例和案例
这有效:
uniform vec2 dimensions[2];
// some code which computes index which is an int
float dimX = dimensions[index].x;
Run Code Online (Sandbox Code Playgroud)
这有效:
uniform vec2 dimensions[];
// some code which computes index which is an int
float dimX = dimensions[0].x;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
uniform vec2 dimensions[];
// some code which computes index which is an int
float dimX = dimensions[index].x;
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
And*_*man 15
可悲的是,这不可能.您没有包含您要定位的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的长度,并自行处理范围验证.但是,我认为这可能有些过分但值得一提.
归档时间: |
|
查看次数: |
13529 次 |
最近记录: |