Передача массива vec4 (четверка GLfloat) как юниформа шейдерам openGL

Я хочу передать массив vec4 фрагментному шейдеру OpenGL в качестве униформы, и это кажется намного сложнее, чем я надеялся. Дошло до того, что я пытаюсь передать массив GLfloat и реконструировать vec4 в шейдере, но это все еще не работает.

Я попытался объявить в vshader:

#extension GL_NV_shader_buffer_load : enable
uniform GLfloat* points;

и из кода вызовите:

glUniform1fv(points, pointsLen*4, points);

думая, что я передаю числа с плавающей запятой группами по 1, а количество vec4 у меня в 4 раза больше.
К сожалению, этот vshader не передает компиляцию в программу GLSL.

Как я могу это исправить? Либо исправить это, либо сделать это совершенно по-другому :)


person Yonatan K    schedule 19.01.2012    source источник
comment
uniform vec4 positions[50] не работает?   -  person genpfault    schedule 20.01.2012
comment
Это работает, но я не знаю размер во время компиляции.   -  person Yonatan K    schedule 20.01.2012


Ответы (1)


Shader_buffer_load от NVIDIA так не работает. Когда вы объявляете указатель uniform, это означает, что вы сообщаете компилятору, что предоставите адрес графического процессора, где хранятся данные для этого указателя. Этот адрес GPU берется из буферного объекта.

Поэтому вам нужно поместить свои данные в буферный объект, а затем сделать его резидентным (чтобы вы могли получить адрес GPU). Вы не даете ему указатель ЦП на массив данных.

Если вы просто хотите иметь массив данных, вам вообще не нужен Shader_buffer_load. GLSL позволяет использовать единые массивы. Вам просто нужно указать для них явный размер.

person Nicol Bolas    schedule 19.01.2012