До OpenGL 4.3, массивы в GLSL должны были иметь фиксированный размер времени компиляции. 4.3 позволяет использовать объекты буфера хранения шейдеров, которые допускают «неограниченную» конечную длину. В принципе, вы можете сделать это:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL будет выяснить, сколько матриц в этом массиве во время выполнения на основе того, как вы используете glBindBufferRange
. Поэтому вы можете использовать manyManyMatrices.length()
для получения длины, но это не будет константой времени компиляции.
Однако эта функция (во время этого редактирования) очень новая и реализована только в бета-версии. Он также требует оборудования класса GL 4.x (aka: Direct3D 11-классное оборудование). Наконец, поскольку он использует блоки хранения шейдеров, доступ к данным может быть медленнее, чем можно было бы надеяться.
Как таковой, я предлагаю вам использовать единый блок с наибольшим количеством матриц, которые вы использовали бы. Если это становится проблемой памяти (маловероятно), вы можете разделить шейдеры на основе размера массива или использовать блоки хранения шейдеров или что угодно.