Unity 6.3
0 онлайн 13 гостей 3 в системе
Вход

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);