可变大小的数组GLSL

时间:2016-05-19 23:05:16

标签: java glsl lwjgl

我正在为我正在构建的OpenGL / Java引擎创建着色器。我已经搜索了一段时间,但我找不到一种方法来获得一个可变大小的数组。我知道我可以创建一个静态大小的像:

uniform vec3 variable[4];

但是,如果可能的话,我将如何基于从CPU加载到着色器的内容来创建大小为X的数组。

提前致谢!

2 个答案:

答案 0 :(得分:3)

GLSL不允许改变数组大小。但是,从OpenGL 4开始,它支持着色器存储缓冲区对象,它们的大小可以不同。

有关SSBO的更多信息:https://www.opengl.org/wiki/Shader_Storage_Buffer_Object

现在考虑一下,这样做的黑客方法可能是将数据编码为纹理,然后将其传递到着色器中。例如,4个rgba组件中的每一个都可能是您想要传递的数据的1个字节。对于大于一个字节的数据,您可以将其分解为字节。

答案 1 :(得分:2)

你不能。

要么像CConard96所说,要么你不能使用SSBO,那么只需声明一个硬编码的最大值并设置一个你需要的较低值。

例如Nicol Bolas说here

#define MAX_NUM_TOTAL_LIGHTS 100
struct Light {
  vec3 position;
  float padding;
}
layout (std140) uniform Lights {
  Light light[MAX_NUM_TOTAL_LIGHTS];
  int numLights;
}