2012-02-29 20 views
5

Poszukuję sposobu użycia funkcji jako argumentu do innej funkcji w GLSL. W zwykłym C można go symulować, przekazując wskaźnik funkcji jako argument funkcji. Wydaje się również, że inne języki (takie jak HLSL) oferują teraz sposoby radzenia sobie z konstruktami wysokiego poziomu, takimi jak funkcje wyższego rzędu, lub mogą symulować je za pomocą clever use of HLSL structures. niestety na razie utknąłem w GLSL i nie mogę znaleźć żadnego sposobu na symulację funkcji wyższego rzędu. Czy w aktualnym (4.2) GLSL jest to naprawdę niemożliwe? Czy może brakuje mi jakiejś sprytnej sztuczki?Funkcje drugiego rzędu w GLSL?

Typowym przykładem co usiłuję osiągnąć:

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

I potrzebujesz tego rodzaju (prawdopodobnie kosztownego) pośrednictwa w cieniu, aby osiągnąć ...? –

+0

Oprócz tego, że tego rodzaju abstrakcja byłaby słodka w użyciu, praktyczny problem jaki mam jest następujący: Mam funkcję f, która przełącza parametr p (powiedzmy, int) i wywołuje inną funkcję f2 , która natura zależy od wartości przełączanej. Możliwość przekazania argumentu f2 jako argumentu pozwoli mi zadzwonić bezpośrednio, bez przełączania, ponieważ w kontekście mojej aplikacji dokładnie wiem, jaką funkcję wywołać wewnątrz f, wywołując samą f. Naprawdę nie wiem, czy to możliwe, ani ile by to kosztowało, ale myślę, że przejście na przełącznik 100-case jest prawdopodobnie gorszy. –

+0

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

Odpowiedz

4

Szukam sposobu, aby wykorzystać funkcję jako argument do innej funkcji w GLSL.

Krótka odpowiedź: nie możesz.

Najbardziej zbliżoną cechą tego rodzaju funkcjonalności, jaką uzyskasz w GLSL, jest shader subroutines. A to tylko pozwala zewnętrznemu interfejsowi OpenGL API wybrać, którego podprogramu użyć, a nie sam moduł cieniujący.

Po prostu zrób oświadczenie switch/case i gotowe.

+0

Dzięki za poradę. Uderza mnie jednak to, jak GLSL nie jest w stanie dostarczyć konstruktów wyższego poziomu niż bezinterpretacyjne C ... –

+0

@AlexRepain: GLSL musi działać w środowisku, które nie obsługuje nawet * rekurencji *. Dlaczego miałbyś oczekiwać działania wskaźników funkcji? –

+0

Nie oczekuję, że wskaźniki funkcji działają, pytam, czy istnieje obejście tego problemu. Poza tym, naprawdę nie potrzebuję rekursji per se, szukam tylko częściowego przekazywania połączeń. To, że może się okazać, że tworzy rekurencję, a następnie wysadza mi się w twarz, byłoby akceptowalnym efektem ubocznym. Ponadto nie widzę powodu, dla którego środowisko w ogóle nie poradziłoby sobie z rekurencją (pomyśl o rekursji typu tail-call), jeśli potrafi obsłużyć "chwilę" ... –