2012-02-29 9 views
5

Sto cercando un modo per utilizzare una funzione come argomento per un'altra funzione in GLSL. Nella normale C, può essere simulato passando un puntatore a funzione come argomento di funzione. Sembra anche che altri linguaggi (come HLSL) ora forniscano modi per gestire costrutti di alto livello come le funzioni di ordine superiore, o in grado di simularli con clever use of HLSL structures. sfortunatamente per ora sono bloccato con GLSL e non riesco a trovare alcun modo per simulare le funzioni di ordine superiore. È davvero impossibile nell'attuale (4.2) GLSL? O mi manca qualche trucco intelligente?Funzioni di secondo ordine in GLSL?

esempio comune di quello che sto cercando di realizzare:

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

E hai bisogno di questo tipo di (probabilmente costoso) indirezione in uno shader, per ottenere ...? –

+0

A parte il fatto che questo tipo di astrazione sarebbe dolce da usare, il problema pratico che ho è il seguente: Ho una funzione f che commuta su un parametro p (diciamo, un int), e chiama un'altra funzione f2 , quale natura dipende dal valore commutato. Essere in grado di passare f2 come argomento mi permetterebbe di chiamare direttamente senza cambiare, poiché nel contesto della mia applicazione, so esattamente quale funzione chiamare all'interno di f quando si chiama f stessa. Non so davvero se è possibile, né quale sarebbe il costo, ma penso che andare su un interruttore di 100 casi sia probabilmente peggio. –

+0

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

risposta

4

sto cercando un modo per utilizzare una funzione come argomento a un'altra funzione in GLSL.

Risposta breve: non è possibile.

La cosa più vicina a questo tipo di funzionalità che otterrete in GLSL è shader subroutines. E questo permette solo all'API OpenGL esterna di selezionare quale subroutine usare, non lo shader stesso.

Quindi basta fare la dichiarazione switch/case e farla finita con.

+0

Grazie per il consiglio. Mi sembra tuttavia che GLSL non sia in grado di fornire costrutti di livello superiore rispetto a C2 senza puntatore ... –

+0

@AlexRepain: GLSL deve essere eseguito in un ambiente che non supporta nemmeno * ricorsione *. Perché dovresti aspettarti che i puntatori di funzione funzionino? –

+0

Non mi aspetto che i puntatori di funzione funzionino, sto chiedendo se c'è una soluzione alternativa. Inoltre, non ho davvero bisogno della ricorsione di per sé, sto solo cercando un passaggio di callback. Il fatto che potrebbe rivelarsi una ricorsione e poi esplodermi in faccia sarebbe un accettabile effetto collaterale. Inoltre non vedo perché l'ambiente non sia in grado di gestire la ricorsione (pensate a ricorsione di coda), se può gestire un 'while' ... –