В дополнение к использованию Cg/HSL программ шейдеров, OpenGL Shading Language (GLSL) шейдеры могут писаться напрямую.
Тем не менее, использование чисто GLSL рекомендуется только для тестирования, или если вы уверены, что целевой платформой является только Mac OS X или мобильные устройства с поддержкой OpenGL ES 2.0. В большинстве обычных случаев, Unity кросс-скомпилирует Cg/HLSL в оптимизированный GLSL (это делается по умолчанию для мобильных платформ и может быть опционально включено для стационарных платформ при помощи #pragma glsl
).
Сниппеты GLSL программ записаны между ключевыми словами GLSLPROGRAM
и ENDGLSL
.
В GLSL, все входные точки функции шейдера должны зваться main()
. Когда Unity загружает GLSL шейдер, он загружает исходный код один раз для вершинной программы, с назначенным препроцессором VERTEX
, и ещё один раз для фрагментной программы, с назначенным препроцессором FRAGMENT
. Так что для разделения вершинной и фрагментной части программы в GLSL сниппете надо окружить их фрагментами кода #ifdef VERTEX .. #endif
и #ifdef FRAGMENT .. #endif
. Каждый GLSL сниппет должен содержать и вершинную и фрагментную программу.
Стандартные подключаемые файлы совпадают с теми, что предоставлены для Cg-шейдеров; у них просто есть расширение .glslinc
:
UnityCG.glslinc
Входная информация вершинных шейдеров получается из заранее назначенных GLSL переменных (gl_Vertex
, gl_MultiTexCoord0
, …) или же они задаются пользователем. Обычно только тангенциальный вектор требует назначения пользователем.
attribute vec4 Tangent;
Информация из вертексных программ во фрагментные проходит через варьирующиеся переменные, например:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this