2012-02-29 24 views
5

Tôi đang tìm cách sử dụng hàm làm đối số cho hàm khác trong GLSL. Trong C thường xuyên, nó có thể được mô phỏng bằng cách truyền một con trỏ hàm làm đối số hàm. Dường như các ngôn ngữ khác (như HLSL) hiện cung cấp các cách để xử lý các cấu trúc cấp cao như các hàm bậc cao hơn hoặc có thể mô phỏng chúng bằng clever use of HLSL structures. tiếc là tôi đang bị kẹt với GLSL bây giờ và tôi không thể tìm thấy bất kỳ cách nào để mô phỏng các hàm bậc cao hơn. Có thực sự không thể trong hiện tại (4.2) GLSL? Hoặc tôi thiếu một số thủ thuật thông minh?Chức năng đặt hàng thứ hai trong GLSL?

ví dụ phổ biến về những gì tôi đang cố gắng để đạt được:

int f(someType f2, int i) { 
    return f2(i); 
} 
+0

Và bạn yêu cầu loại này (có lẽ là tốn kém) trong một bóng đổ, để đạt được ...? –

+0

Ngoài thực tế là kiểu trừu tượng này sẽ dễ sử dụng, vấn đề thực tế tôi có là: Tôi có hàm f chuyển qua tham số p (giả sử int) và gọi hàm khác f2 , mà tự nhiên phụ thuộc vào giá trị chuyển đổi. Có thể vượt qua f2 như một đối số sẽ cho phép tôi gọi trực tiếp mà không cần chuyển đổi, vì trong ngữ cảnh ứng dụng của tôi, tôi biết chính xác hàm nào gọi bên trong f khi gọi f. Tôi không thực sự biết nếu nó có thể, cũng không phải những gì nó sẽ chi phí, nhưng tôi nghĩ rằng đi trên một chuyển đổi 100 trường hợp có lẽ là tồi tệ hơn. –

+0

https://en.wikipedia.org/wiki/Defunctionalization – sigfpe

Trả lời

4

Tôi đang tìm kiếm một cách để sử dụng một chức năng như một tham số để một hàm trong GLSL.

Câu trả lời ngắn gọn: bạn không thể.

Điều gần nhất với loại chức năng này bạn sẽ nhận được trong GLSL là shader subroutines. Và điều đó chỉ cho phép API OpenGL bên ngoài chọn chương trình con để sử dụng, không phải chính trình đổ bóng.

Vì vậy, chỉ cần thực hiện tuyên bố switch/case và kết thúc.

+0

Cảm ơn lời khuyên. Tuy nhiên, nó tấn công tôi, cách GLSL không thể cung cấp các cấu trúc mức cao hơn C-con trỏ nhỏ hơn ... –

+0

@AlexRepain: GLSL phải chạy trong một môi trường thậm chí không hỗ trợ * đệ quy *. Tại sao bạn mong đợi các con trỏ hàm hoạt động? –

+0

Tôi không mong đợi các con trỏ hàm hoạt động, tôi hỏi nếu có một giải pháp cho nó. Bên cạnh đó, tôi không thực sự cần đệ quy cho mỗi lần, tôi chỉ tìm kiếm một số cuộc gọi lại. Thực tế là nó có thể bật ra để tạo thành một đệ quy và sau đó thổi lên trong khuôn mặt của tôi sẽ là một tác dụng phụ có thể chấp nhận được. Thêm vào đó, tôi không thấy lý do tại sao môi trường không thể xử lý đệ quy (nghĩ rằng đệ quy đuôi), nếu nó có thể xử lý 'while' ... –

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