2016-05-19 2 views
2

Я работаю над созданием шейдеров для движка OpenGL/Java, который я создаю. Я искал какое-то время, но я не могу найти способ иметь массив переменных размеров. Я знаю, что я могу создать статический размером один, как:Массив переменной размерности GLSL

uniform vec3 variable[4]; 

Но как бы я идти о создании массива размера X, основанном на том, что я загружаю в затенение от процессора, если это вообще возможно.

Заранее благодарен!

ответ

3

GLSL не позволяет изменять размеры массива. Однако, как и OpenGL 4, поддержка Shader Storage Buffer Objects, которые могут быть разных размеров.

Более подробную информацию о SSBOs: https://www.opengl.org/wiki/Shader_Storage_Buffer_Object

Думая об этом сейчас, хак способ сделать это, а может быть, чтобы кодировать данные в текстуру, а затем передать, что в затенении. Например, каждый из 4 компонентов rgba может быть 1 байт данных, которые вы хотите передать. Для данных, больших байта, вы разбиваете его на байты.

2

Вы не можете.

Либо сделайте так, как сказал CConard96, или если вы не можете использовать SSBOs, тогда просто объявите твердое максимальное значение и установите более низкое значение, которое вам нужно.

Например, как Никол бола говорит 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; 
}