Помимо написания программ шейдеров HLSL, вы также можете писать исходный язык шейдеров OpenGL (GLSL) шейдерПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь программы в Unity.
Примечание. Это не рекомендуется и не требуется как часть обычного рабочего процесса; Unity при необходимости кросс-компилирует ваш HLSL в оптимизированный GLSL. Использование необработанного GLSL рекомендуется только для тестирования или для поддержки проектов на платформах, использующих GLSL.
Фрагменты GLSL
Фрагменты программы GLSL записываются между ключевыми словами GLSLPROGRAM и ENDGLSL.
В GLSL все точки входа в функции шейдера должны вызываться main(). Когда Unity загружает шейдер GLSL, он загружает исходный код один раз для вершинной программы с определением препроцессора VERTEX и еще раз для фрагментной программы с FRAGMENT определение препроцессора. Таким образом, чтобы разделить вершинные и фрагментные части программы во фрагменте GLSL, нужно окружить их #ifdef VERTEX .. #endif и #ifdef FRAGMENT . . #endif. Каждый фрагмент GLSL должен содержать как вершинную программу, так и фрагментную программу.
Стандартные включаемые файлы соответствуют файлам, предоставляемым для шейдеров Cg/HLSL; у них просто есть расширение .glslinc:
UnityCG.glslinc
Входные данные вершинного шейдера поступают из предопределенных переменных GLSL (gl_Vertex, gl_MultiTexCoord0, …) или являются атрибутами, определяемыми пользователем. Обычно только касательному вектору требуется определяемый пользователем атрибут:
attribute vec4 Tangent;
Данные от вершинных программ к фрагментным передаются через переменные переменные, например:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
Внешние текстуры OES
Unity выполняет предварительную обработку во время компиляции шейдера; например, функции texture2D/texture2DProj можно заменить на texture/textureProj на основе графического API (GlES3, GLCore). Некоторые расширения не поддерживают новое соглашение, в первую очередь GL_OES_EGL_image_external.
Если вы хотите сэмплировать внешние текстуры в шейдерах GLSL, используйте вызовы textureExternal/textureProjExternal вместо texture2D/texture2DProj.
Пример:
gl_FragData[0] = textureExternal(_MainTex, uv);
