Do OpenGL 4.3, tablice w GLSL musiały mieć stały rozmiar. 4.3 pozwala na użycie obiektów bufora pamięci shaderów, które pozwalają, by ich ostateczna długość była "nieograniczona". Zasadniczo, można to zrobić:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL będzie dowiedzieć się, ile macierze są w tej tablicy w czasie wykonywania na podstawie sposobu korzystania glBindBufferRange
. Więc nadal możesz użyć manyManyMatrices.length()
, aby uzyskać długość, ale nie będzie to stała czasu kompilacji.
Jednak ta funkcja jest (w czasie tej edycji) bardzo nowa i została zaimplementowana tylko w wersji beta. Wymaga również sprzętu klasy GL 4.x (aka: sprzęt klasy Direct3D 11). Wreszcie, ponieważ używa bloków pamięci modułu cieniującego, dostęp do danych może być wolniejszy, niż można mieć nadzieję.
Jako takie, sugeruję, aby po prostu użyć jednolitego bloku o największej liczbie macierzy, które można użyć. Jeśli stanie się to problemem pamięci (mało prawdopodobne), możesz podzielić swoje moduły cieniujące na podstawie rozmiaru tablicy lub użyć bloków pamięci modułu cieniującego lub cokolwiek innego.