2012-05-05 6 views
5

Short:Funzioni riutilizzabili/condivise GLSL, costanti condivise (OpenGL ES 2.0)?

Posso definire una funzione che può essere utilizzata da ogni shader? Oppure devo definirlo per shader?


L'intera storia:

  • voglio creare numerosi shader destinati a colorare i frammenti di ingresso con rampe di pendenza predefiniti (qualcosa di simile - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).

  • voglio definire un gradiente rampa costante per ogni Shader (una serie di campioni di colore vec4, dove il valore alfa detiene la posizione gradiente, vedere Pos nell'immagine sopra)

  • e ho bisogno una funzione che può restituire un campione di colore dalla rampa del gradiente data per una particolare posizione di coordinate della trama.

Così le rampe devono essere definito una volta per lo shader, e la funzione dovrebbe essere definita tutti in una volta che ogni shader può usare in modo sicuro.

Ho gli algoritmi, la domanda è per le funzioni di condivisione e definire le costanti in GLSL.

È possibile? Oppure devo copiare la funzione in ogni shader? Esiste almeno un'opzione di precompilazione?

risposta

9

È possibile farlo in modo simile a C: si dichiarano le funzioni nelle intestazioni e si definiscono nel comune file C.

In GLSL è necessario fare seguente:

  1. in alcuni degli shader (stringa) si definisce la funzione (consente di chiamare COMUNE):

    float getCommonValue() { return 42; } 
    
  2. in tutte le shader che si desidera per utilizzare questa funzione si dichiara unica e usarlo (consente di chiamare SHADER1):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. quando si compila shader con glCompileShader si compila Shader comune solo una volta e conservare lo shader GLuint qualche parte

  4. quando si collega programma con glLinkProgram per SHADER1 si collega a programmare con glAttachShader entrambi shader - Comune e SHADER1. In questo modo sarai in grado di chiamare la funzione getCommonValue da uno shader all'altro.

  5. È possibile riutilizzare il valore di GLuint COMMON shader più volte per diversi programmi sahder (SHADER1, SHADER2, ...).

+0

Whoa, suona bene, ci proverò. – Geri