In addition to using Cg/HSL shader programs, OpenGL Shading Language (GLSL) Shaders can be written directly.
However, use of raw GLSL is only recommended for testing, or when you know you are only targeting Mac OS X, OpenGL ES mobile devices, or Linux. In all normal cases, Unity will cross-compile Cg/HLSL into optimized GLSL when needed.
Сниппеты GLSL программ записаны между ключевыми словами GLSLPROGRAM
и ENDGLSL
.
В GLSL, все входные точки функции шейдера должны зваться main()
. Когда Unity загружает GLSL шейдер, он загружает исходный код один раз для вершинной программы, с назначенным препроцессором VERTEX
, и ещё один раз для фрагментной программы, с назначенным препроцессором FRAGMENT
. Так что для разделения вершинной и фрагментной части программы в GLSL сниппете надо окружить их фрагментами кода #ifdef VERTEX .. #endif
и #ifdef FRAGMENT .. #endif
. Каждый GLSL сниппет должен содержать и вершинную и фрагментную программу.
Standard include files match those provided for Cg/HLSL shaders; they just have a .glslinc
extension:
UnityCG.glslinc
Входная информация вершинных шейдеров получается из заранее назначенных GLSL переменных (gl_Vertex
, gl_MultiTexCoord0
, …) или же они задаются пользователем. Обычно только тангенциальный вектор требует назначения пользователем.
attribute vec4 Tangent;
Информация из вертексных программ во фрагментные проходит через варьирующиеся переменные, например:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
Unity does some preprocessing during Shader compilation; for example, texture2D/texture2DProj
functions may be replaced to texture/textureProj
, based on graphics API (GlES3, GLCore). Some extensions don’t support new convention, most notably GL_OES_EGL_image_external
.
If you want to sample external textures in GLSL shaders, use textureExternal/textureProjExternal
calls instead of texture2D/texture2DProj
.
Пример:
gl_FragData[0] = textureExternal(_MainTex, uv);