2011-08-02 10 views
5

Desde GLSL no dispone de una opción de incluir archivos que estoy tratando de agregar esto usando un analizador "#pragma incluir". (Quiero esto porque tengo algunos métodos genéricos que me gustaría implementar solo una vez pero que podría usar en muchos sombreadores diferentes, como el paso suave de Ken Perlin)OpenGL/GLSL - usando glShaderSource con múltiples fuentes para apoyar los archivos de inclusión

Analizar los archivos de sombreado para obtener los archivos incluidos funciona bien. Pero al configurar ShaderSource con los múltiples archivos de origen siempre encuentro problemas; dado que mi shader principal normalmente comienza con "#version 330" y la # version-line siempre tiene que ser la primera línea del shader, solo puedo agregar mi archivo principal como el primero en la matriz de cadenas pasadas a glShadersource, y luego que todos los archivos incluidos. Pero entonces mi archivo principal no se puede utilizar ningún funciones implementadas en esos archivos incluidos, ya que en esencia va a ser concatenados después de mi archivo principal, por lo que el compilador se queja de que no conoce las funciones de mi archivo principal está utilizando.

La única manera que puedo pensar para conseguir que funcione es leer el archivo principal, analizar la incluyen pragma, y ​​luego reemplazar esa línea pragma con los archivos-contenido del archivo a ser incluido (aplicando de forma recursiva este mismo método para todos los archivos incluidos que podrían incluir otros archivos), pero eso significaría que los lienzos en los errores de compilación ya no coincidirían con los números reales del archivo principal.

¿Alguien ha configurado alguna clase de funcionalidad "incluir" para GLSL que funciona Y mantiene los números de lienzo? Y si es así, ¿cómo?

Respuesta

2

¿Qué pasa con el análisis de la etiqueta #version y haciendo de este un particular (y la primera) cadena de origen? De esta forma, también puede tener etiquetas de versión diferentes en las inclusiones (dependiendo de los requisitos de sus funciones) y simplemente reducirlas a una sola etiqueta de versión (la que tiene el número de versión más alto).

+0

¡Usted, señor, es un genio! No tengo idea de por qué no pensé en eso, pero creo que este será el camino a seguir para mí. \ o/ – Pygmy

1

Primero de todo, no es la directiva #line preprocesador que estableció la línea de fuente de corriente reportado en los mensajes de error del compilador. Al utilizar esta directiva de preprocesador, puede facilitar la inclusión de líneas fuente externas. Esto debería solucionar tu problema.

Además, he leído la extensión shading_language_include, lo que debería ayudar a apoyar "incluir" funcionalidades. Si su controlador no lo ha implementado, aún podría soportar la sintaxis que presenta la extensión, para que pueda soportar con gracia los sombreadores que requieren esa extensión.

-1

Si sus shaders están en los archivos, puede utilizar CPP (o gcc -E) para procesarlos (y hacer frente a cualquier directivas # include) antes de pasarlos a OpenGL. Puede incluso algo como popen("cpp -P main.glsl", "r") para leer y preprocesar su sombreador ...

+0

El uso de esta técnica es necesario para configurar los símbolos del preprocesador definidos por glsl framework (__VERSION__ por ejemplo). – Luca

Cuestiones relacionadas