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