10

I am working on creating shaders for an OpenGL/Java engine that I am building. I have searched for a while, but I cannot find a way to have an array of variable size. I know that I can create a statically sized one like:

uniform vec3 variable[4];

But how would I go about creating an array of size X based on what I load to the shader from the CPU, if this is even possible.

Thanks in advance!

2 Answers 2

10

GLSL does not allow varying array sizes. It does however, as of OpenGL 4, support Shader Storage Buffer Objects which can be varying sizes.

More information on SSBOs: https://www.opengl.org/wiki/Shader_Storage_Buffer_Object

Thinking about it now, a hack way of doing it as well could be to encode your data into a texture and then pass that into the shader. For example, each of the 4 rgba components could be 1 byte of the data you wanted to pass. For data larger than a byte, you would break it out into bytes.

Sign up to request clarification or add additional context in comments.

Comments

6

You can't.

Either do as CConard96 said, or if you can't use SSBOs then just declare an hardcoded maximum value and set a lower value that you need.

For example like Nicol Bolas says 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;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.