2011-12-01 18 views
6

¿Hay alguna manera de decir dentro del código fuente de un sombreador que el sombreador se está compilando para OpenGL ES? Quiero poder definir la versión usando la directiva de preprocesador #version para ser 100 para OpenGL ES (para que el sombreador compile para OpenGL ES 2.0), pero es la versión 110 para OpenGL 2.1).¿Es posible decir si la versión OpenGL es OpenGL ES dentro del código de sombreado?

¿Es la mejor manera de hacer esto para colocar la #version como una cadena separada que se alimenta a nivel de aplicación, o hay una manera de hacerlo dentro del sombreador?

Otra cosa útil, relacionada con poder hacer sería decir algo como #if version == 100 compilar este código, else compilar este código. ¿Es esto posible dentro de GLSL?

Gracias.

+1

no podría encontrarlo en su programa C donde carga el sombreador y antepone '#version 100' si es OpenGL ES y de lo contrario' #version 110'. Quiero decir que tienes que pasar OpenGL el sombreador como una cadena de todos modos, así que ¿por qué no hacer el procesamiento de la versión en C. – PeterT

+0

Sí, estaba pensando que era lo que iba a tener que hacer! –

Respuesta

5

Precedente #version del programa principal como PeterT sugerido en el comentario anterior es el único manera que funcionará. Ser capaz de hacer esto (y ser capaz de definir constantes sin tener algo como un interruptor de compilador -D disponible) es la intención principal detrás de glShaderSource tomando una matriz de punteros en lugar de un simple char*.

La especificación GLSL (capítulo 3.3) requiere que #version sea lo primero en una fuente de sombreado, excepto el espacio en blanco y los comentarios.

Por lo tanto, hay tal cosa como

#ifdef foo 
    #version 123 
#endif 

es válida, y tal cosa no se compilará (a menos que el compilador shader es excesivamente permisiva, es decir roto).

Sobre su segunda pregunta, la compilación condicional ciertamente funciona y usarla de la manera en que piensa hacer es algo bueno.

información
+0

Impresionante - ¡gracias! :) –

+0

Kk así que empecé a hacer exactamente eso y parece funcionar muy bien. Lo único es que sugerí que compruebe la versión con '#if versión == 100' pero en su lugar debería usar el valor incorporado' __VERSION__', por lo que sería, '#if __VERSION__ == 100', por ejemplo . –