Введение

Godot использует язык шейдеров, похожий на GLSL ES 3.0. Поддерживается большинство типов данных и функций. Возможно и остальные постепенно будут добавлены.

В отличие от шейдерного языка в Godot 2.x, реализация его в 3 версии намного ближе к оригиналу.

Типы шейдеров

Вместо использования конфигурации общего назначения в шейдерном язык Godot нужно указать, для чего предназначен шейдер. В зависимости от типа поддерживаются разные режимы рендеринга, встроенные переменные и функции обработки.

Каждый шейдер должен начинаться со строки в которой указывается его тип в формате:

Доступны следующие типы:

  • «spatial»: для 3D рендеринга.
  • «canvas_item»: для 2D рендеринга.
  • «particles»: для систем частиц.

Режимы Рендеринга

Различные типы шейдеров поддерживают различные режимы рендеринга. Они являются необязательными, но, если они указываются, то должны распологаться после типа shader_type. Пример синтаксиса:

Типы данных

Поддерживается большинство типов данных GLSL ES 3.0

Тип Описание
void Void datatype, используется только для функций, которые не возвращают значение
bool Логический тип, может содержать только «true» или «false»
bvec2 Двухкомпонентный вектор логических значений
bvec3 Трёхкомпонентный вектор логических значений
bvec4 Четырёхкомпонентный вектор логических значений
int Знаковое целое число
ivec2 Двухкомпонентный вектор знаковых целых чисел
ivec3 Трёхкомпонентный вектор знаковых целых чисел
ivec4 Четырёхкомпонентный вектор знаковых целых чисел
uint Беззнаковое скалярное целое число, не содержит отрицательных значений
uvec2 Двухкомпонентный вектор беззнаковых целых чисел
uvec3 Трёххкомпонентный вектор беззнаковых целых чисел
uvec4 Четырёхкомпонентный вектор беззнаковых целых чисел
float Число с плавающей точкой
vec2 Двухкомпонентный вектор чисел с плавающей точкой
vec3 Трёхкомпонентный вектор чисел с плавающей точкой
vec4  Четырёхкомпонентный вектор чисел с плавающей точкой
mat2 Матрица 2×2, размещённая в памяти по столбцам.
mat3 Матрица 3×3, размещённая в памяти по столбцам.
mat4 Матрица 4×4, размещённая в памяти по столбцам.
sampler2D Тип переменной для привязки 2D текстуры считываемой как число с плавающей точкой
isampler2D Тип переменной для привязки 2D текстуры считываемой как знаковое целое число
usampler2D Тип переменной для привязки 2D текстуры считываемой как беззнаковое целое число
samplerCube Тип переменной для привязки кубической текстуры считываемой как целое число

 

Приведение типов

Как и в GLSL ES 3.0, неявное приведение между скалярами и векторами одинакового размера, но разного типа не допускается. Также не допускается приведение типов разного размера. Преобразование должно выполняться явно с помощью конструкторов.

Пример:

Целочисленные константы по умолчанию знаковые, поэтому приведение всегда необходимо для преобразования в беззнаковое:

Элементы

Отдельные скалярные элементы векторных типов доступны через элементы ”x“,” y“,” z “и” w». Кроме того, использование “r”, “g”, “b” и  “a” тоже применимо и является эквивалентом. Используйте то, что лучше всего подходит для вашего случая.

Для матриц используется синтаксис индексирования m[строка][столбец] для доступа к каждому скаляру или m[idx] для доступа к вектору по индексу строки. Например, для доступа к позиции y объекта в mat 4 необходимо использовать синтаксис M[3][1].

Конструкции

Конструкции векторных типов должны всегда передавать:

Construction of matrix types requires pass vectors of same dimension as matrix. You could also build a diagonal matrix using matx(float) syntax. So the mat4(1.0) is an identity matrix.

Swizzling

It is possible to obtain any combination of them in any order, as long as the result is another vector type (or scalar). This is easier shown than explained:

Precision

It is possible to add precision modifiers to datatypes, use them for uniforms, variables, arguments and varyings:

Using lower precision for some operations can speed up the math involved (at the cost of, of course, less precision). This is rarely needed in the vertex shader (where full precision is needed most of the time), but often needed in the fragment one.

Keep in mind that some architectures (mainly mobile) benefit a lot from this, but are also restricted (conversion between precisions has a cost). Please read the relevant documentation on the target architecture to find out more. In all honesty though, mobile drivers are buggy so to stay out of trouble make simple shaders without specifying precision unless you really need to.

Операторы:

Шейдерный язык godot поддерживает такой же набор операторов как и GLSL ES 3.0. Ниже список данных операторов в порядке приоритета::

Приоритета Класс Оператор
1 (highest) группировка в скобках ()
2 Унарный +, -, !, ~
3 Мультипликативный /, *, %
4 additive +, —
5 bit-wise shift <<, >>
6 relational <, >, <=, >=
7 equality ==, !=
8 bit-wise and &
9 bit-wise exclusive or ^
10 bit-wise inclusive or |
11 logical and &&
12 (lowest) logical inclusive or ||