2012-05-05 14 views
5

corta:GLSL funciones reutilizables/compartidas, constantes compartidas (OpenGL ES 2.0)?

¿Puedo definir una función que cada shader puede usar? O tengo que definirlo por shader?


La historia completa:

  • Quiero crear numerosos shaders destinados a colorear los fragmentos de entrada con rampas gradiente predefinidos (algo como esto - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).

  • quiero definir una rampa de gradiente constante para cada shader (una matriz de muestras de color vec4, donde el valor alfa mantiene la posición de gradiente, ver Pos en la imagen anterior)

  • y necesito una función que puede devolver una muestra de color de la rampa de gradiente dada para una determinada posición de coordenadas de textura.

Así las rampas tienen que ser definido una vez por shader, y la función debe haber definido todos a la vez que cada shader puede utilizar con seguridad.

Tengo los algoritmos, la pregunta es para compartiendo funciones, y defino las constantes en GLSL.

¿Esto es posible? O tengo que copiar la función en cada sombreador? ¿Hay alguna opción de precompilación al menos?

Respuesta

9

Puede hacerlo de la misma manera que en C: declara las funciones en los encabezados y las define en el archivo C común.

En GLSL tendrá que hacer lo siguiente:

  1. de alguna shader (cadena) se define la función (permite llamarlo COMÚN):

    float getCommonValue() { return 42; } 
    
  2. en todos los shaders que desea para usar esta función solo la declara y la usa (vamos a llamarla SHADER1):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. al compilar shaders con glCompileShader compila COMÚN shader de una sola vez y almacenar en algún lugar de sombreado GLuint

  4. cuando se vincula con el programa de glLinkProgram para SHADER1 se adjunta a programar con glAttachShader ambos shaders - común y SHADER1. Por lo tanto, podrá llamar a la función getCommonValue de un sombreador a otro.

  5. puede reutilizar el valor COMMON shader GLuint varias veces para diferentes programas de Sahder (SHADER1, SHADER2, ...).

+0

Whoa, suena bien, lo intentaré. – Geri