GLSL и Unity
В дополнение к написанию HLSL шейдерных программ, вы также можете писать необработанные OpenGL Shading Language (GLSL) шейдерные программы на Unity. Это поддерживается только на платформах OpenGL Core и OpenGL ES.
Примечание: Это не рекомендуется или не требуется в качестве части обычного рабочего процесса; Unity перекомпилирует ваш HLSL в оптимизированный 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 выполняет некоторую предварительную обработку во время компиляции Shader; например, функции texture2D/texture2DProj могут быть заменены на texture/textureProj, основанные на графике API (GlES3, GLCore). Некоторые расширения не поддерживают новую конвенцию, особенно GL_OES_EGL_image_external.
Если вы хотите семплировать внешние текстуры в шейдерах GLSL, используйте вызов textureExternal/textureProjExternal вместо texture2D/texture2DProj.
Пример:
gl_FragData[0] = textureExternal(_MainTex, uv);