Además de utilizar programas shader Cg/HSL, los shaders de OpenGL Shading Language (GLSL) se pueden escribir directamente.
Sin embargo, el uso de GLSL crudo solo se recomienda para pruebas, o cuando usted sabe que solo apuntará a Mac OS X, OpenGL ES en dispositivos móviles o Linux. En todos los casos normales, Unity hará una compilación cruzada de Cg/HLSL a un GLSL optimizado cuando se necesite.
Los snippets del programa GLSL están escritos entre las palabras claves GLSLPROGRAM
y ENDGLSL
.
En GLSL, todos los puntos de entrada de la función shader tienen que ser llamados main()
. Cuando Unity carga el shader GLSL, carga la fuente una vez para el Vertex Program, con el define del preprocesador VERTEX
, y una vez más para el fragment programa, con el define del preprocesador FRAGMENT
. Así que la forma de separar las partes del Vertex Program y Fragment program en el fragmento de GLSL es rodearlas con #ifdef VERTEX .. #endif
y #ifdef FRAGMENT .. #endif
.Cada fragmento GLSL debe contener tanto un vertex program como un fragment program.
Los archivos include estándar coinciden con los proporcionados para los shaders Cg/HLSL; Sólo tienen una extensión .glslinc
:
UnityCG.glslinc
Las entradas de Vertex Shader provienen de variables GLSL predefinidas (gl_Vertex
, gl_MultiTexCoord0
, …) o son atributos definidos por el usuario. Por lo general, sólo el vector tangente necesita un atributo definido por el usuario:
attribute vec4 Tangent;
Los datos del vertex program al fragment program se pasan a través de variables Varying, por ejemplo:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this