Version: 2018.1
Создание программ с несколькими вариантами шейдеров
Shading Language used in Unity

GLSL Shader programs

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

Сниппеты 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

External OES textures

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);
Создание программ с несколькими вариантами шейдеров
Shading Language used in Unity
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961