2011-11-11 25 views
57

Tôi muốn để đèn của OpenGL tự làm. Tôi muốn các trình đổ bóng của tôi cho phép một số lượng đèn thay đổi.GLSL/C++: Mảng đồng phục?

Chúng tôi có thể khai báo một loạt đồng phục trong trình đổ bóng GLSL không? Nếu có, chúng ta sẽ đặt giá trị của những đồng phục đó như thế nào?

+4

Bất cứ ai muốn có một số lượng đèn thay đổi, chỉ cần tạo các mảng có dung lượng tốt và giữ số lượng đèn hiện đang hoạt động. GLSL không cho phép các mảng có kích thước biến đổi (tất cả các kích thước mảng phải là các giá trị không đổi, được mã hóa cứng). – Miles

Trả lời

71

Có điều này là có thể. Bạn khai báo các mảng đồng nhất tương tự như cách bạn thực hiện trong C, ví dụ:

uniform float v[10]; 

Sau đó, bạn có thể thiết lập giá trị của họ sử dụng glUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...}; 
glUniform1fv(glGetUniformLocation(program, "v"), 10, v); 
+2

các tham số 1, 2, 3, 4 là gì? Điều đó có nghĩa là tôi chỉ có thể thiết lập các giá trị của một mảng lên đến bốn thành viên? – Miles

+0

Đó là một cách sử dụng rất thông minh/xoắn của 'glUniform1fv'. Người ta sẽ nghĩ rằng tham số thứ 2 của 'glUniform1fv' chỉ là một hình thức và nó nên được sử dụng như một 1. – bobobobo

+0

Vì vậy, về mặt kỹ thuật bạn có thể thiết lập một' vec4' thống nhất bằng cách sử dụng 'glUniform1fv (uniformId, 4, v);' ở đâu 'v' là một mảng của 4 float. – bobobobo

7

Có nó có thể khai báo một mảng của đồng phục trong shaders GLSL. Chỉ cần google "glsl uniform array" cho một số ví dụ (chỉnh sửa: hoặc xem ví dụ của datenwolf). Tuy nhiên có những hạn chế về việc có bao nhiêu đồng phục có thể được gửi tới các card đồ họa khác nhau (ít nhất là trên các card đồ họa cũ, tôi không chắc chắn về những card đồ họa hiện tại (mặc dù tôi vẫn tưởng tượng).

Nếu bạn quyết định đi xuống tuyến đường đồng phục, tôi khuyên bạn nên sử dụng bộ đệm đồng bộ. Theo http://www.opengl.org/wiki/Uniform_Buffer_Object, "Chuyển đổi giữa các ràng buộc đệm thống nhất thường nhanh hơn chuyển đổi hàng tá đồng phục trong một chương trình".

Nếu bạn có số lượng lớn đèn và thông số, bạn cũng có thể gửi dữ liệu dưới dạng bộ đệm nổi.

+6

Các đối tượng đệm đồng bộ chỉ có sẵn kể từ phiên bản GL 3.1. Phần mở rộng ARB_Uniform_Buffer_Object là cần thiết kể từ phiên bản 2.0. –

+54

Googling "glsl uniform array" hiện trả về trang này là kết quả đầu tiên !! Chúng ta làm gì bây giờ? – mlvljr

+1

Bạn có thể truy vấn OpenGL khi chạy để có được số lượng đồng phục tối đa với kết quả «Glint; glGetIntegerv (GL_MAX_UNIFORM_LOCATIONS, 0, & result); ' – rwols

Các vấn đề liên quan