Cho đến OpenGL 4.3, các mảng trong GLSL phải có kích thước cố định, biên dịch. 4.3 cho phép sử dụng các đối tượng đệm lưu trữ đổ bóng, cho phép độ dài cuối cùng của chúng là "không bị chặn". Về cơ bản, bạn có thể làm điều này:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL sẽ tìm ra có bao nhiêu ma trận là trong mảng này trong thời gian chạy dựa vào cách bạn sử dụng glBindBufferRange
. Vì vậy, bạn vẫn có thể sử dụng manyManyMatrices.length()
để nhận được độ dài, nhưng nó sẽ không phải là một hằng số biên dịch-thời gian.
Tuy nhiên, tính năng này là (tại thời điểm chỉnh sửa này) rất mới và chỉ được triển khai trong giai đoạn beta. Nó cũng yêu cầu phần cứng lớp GL 4.x (còn gọi là phần cứng Direct3D 11). Cuối cùng, vì nó sử dụng khối lưu trữ đổ bóng, việc truy cập dữ liệu có thể chậm hơn so với dữ liệu có thể hy vọng.
Vì vậy, tôi khuyên bạn chỉ nên sử dụng khối đồng nhất có số lượng ma trận lớn nhất mà bạn sẽ sử dụng. Nếu điều đó trở thành vấn đề về bộ nhớ (không chắc), thì bạn có thể tách các trình đổ bóng dựa trên kích thước mảng hoặc sử dụng các khối lưu trữ đổ bóng hoặc bất cứ thứ gì.
Nguồn
2012-03-28 23:33:46