Hasta OpenGL 4.3, las matrices en GLSL tenían que ser de un tamaño de tiempo de compilación fijo. 4.3 permite el uso de objetos de almacenamiento intermedio de sombreado, que permiten que su longitud final sea "ilimitada". Básicamente, usted puede hacer esto:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL se darán cuenta de cuántas matrices que están en esta matriz en tiempo de ejecución en función de cómo se utiliza glBindBufferRange
. Entonces todavía puede usar manyManyMatrices.length()
para obtener la longitud, pero no será una constante en tiempo de compilación.
Sin embargo, esta característica es (en el momento de esta edición) muy nueva y solo se implementó en versión beta. También requiere hardware GL 4.x-class (también conocido como hardware Direct3D 11-class). Por último, dado que usa bloques de almacenamiento shader, el acceso a los datos puede ser más lento de lo que uno podría esperar.
Como tal, le sugiero que utilice un bloque uniforme con la mayor cantidad de matrices que usaría. Si eso se convierte en un problema de memoria (poco probable), puede dividir los sombreadores en función del tamaño de la matriz o usar bloques de almacenamiento de sombreado o lo que sea.