可变大小数组GLSL

问题描述 投票:0回答:2

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

uniform vec3 variable[4];

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

提前致谢!

java glsl lwjgl
2个回答
11
投票

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

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

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


7
投票

你不能。

要么按照 CConard96 所说的进行,或者如果您不能使用 SSBO,则只需声明一个硬编码的最大值并设置您需要的较低值。

例如像 Nicol Bolas 所说的这里

#define MAX_NUM_TOTAL_LIGHTS 100
struct Light {
  vec3 position;
  float padding;
}
layout (std140) uniform Lights {
  Light light[MAX_NUM_TOTAL_LIGHTS];
  int numLights;
}
© www.soinside.com 2019 - 2024. All rights reserved.