Fino a OpenGL 4.3, gli array in GLSL dovevano essere di dimensioni fisse e in fase di compilazione. 4.3 consente l'uso di oggetti buffer di memoria shader, che consentono la loro lunghezza massima "illimitata". In sostanza, si può fare questo:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL sarà capire quanti matrici sono in questo array in fase di esecuzione in base a come si utilizza glBindBufferRange
. Quindi puoi ancora usare manyManyMatrices.length()
per ottenere la lunghezza, ma non sarà una costante in fase di compilazione.
Tuttavia, questa funzione è (al momento della modifica) molto nuova e implementata solo in versione beta. Richiede anche hardware GL 4.x-classe (noto anche come hardware Direct3D di classe 11). Infine, poiché utilizza blocchi di archiviazione shader, l'accesso ai dati potrebbe essere più lento di quanto si possa sperare.
Come tale, suggerirei di utilizzare solo un blocco uniforme con il maggior numero di matrici che usereste. Se questo diventa un problema di memoria (improbabile), allora è possibile dividere gli shader in base alle dimensioni dell'array o utilizzare blocchi di storage shader o altro.
fonte
2012-03-28 23:33:46