Помимо написания программ шейдеров 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);