2010-03-04 5 views
19

GLSL ha un preprocessore completo in stile C. L'unica cosa che non funziona è #include. Una delle grandi caratteristiche è che è possibile utilizzare #ifdef per commentare le funzioni e creare così uno shader che può essere diluito se non vengono utilizzate determinate funzionalità.Definisci esternamente macro di preprocessore in GLSL

mia domanda è:

C'è un modo per definire una macro da codice C?

Non sembra esserci alcun modo per farlo con l'interfaccia openGL. Il trucco rapido è di anteporre alcune righe con #define FOO prima del file del modulo caricato del codice. Ma sembra un po 'indietro.

risposta

23

Non hai davvero bisogno di anteporre il codice al codice che hai caricato. Ecco perché ci sono più stringhe nell'API glShaderSourceARB.

qualcosa come il seguente fa quello che stai cercando:

char *sources[2] = { "#define FOO\n", sourceFromFile }; 
glShaderSourceARB(shader, 2, sources, NULL); 
+4

Questa è una soluzione valida, ma non molto meglio del prepending del codice sorgente. – rioki

+2

beh, dipende da cosa stai cercando. Questo è utile per prevenire l'allocazione e la copia aggiuntive della memoria (motivo per cui prenderei in considerazione la soluzione preliminare hacky). Cosa ti sembrerebbe migliore, e perché? – Bahbar

+1

Ho pensato più lungo le linee 'glDefine (" Moo "," Foo ")' ... ma sembra che ho studiato le specifiche correttamente ... – rioki

6

Ecco quello che uso per evitare #version problemi. È Java e non ottimizzato per perfo, ma funziona perfettamente:

// extract shader sourcecode from file 
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url); 

// apply defined values 
int versionIndex = shaderSource.indexOf("#version"); 
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name()); 
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1; 

for (int i = defined.size() - 1; i >= 0; --i) 
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n");