Преобразование GLSL в шейдеры Godot

В этом документе объясняются различия между языком шейдеров Godot и GLSL, и даются практические советы по переносу шейдеров из других источников, таких как Shadertoy и The Book of Shaders, в шейдеры Godot.

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

GLSL

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

Шейдерные программы

В GLSL каждый шейдер использует отдельную программу. У вас есть одна программа для вершинного шейдера и одна для фрагментного шейдера. В Godot у вас есть один шейдер, который содержит функцию vertex и/или fragment. Если вы решили написать только одну функцию, Godot предоставит другую.

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

Атрибуты вершин

В GLSL вы можете передавать информацию о каждой вершине с помощью атрибутов и иметь возможность передавать её как можно больше или меньше. В Godot у вас есть определенное количество входных атрибутов, включая VERTEX (позиция), COLOR, UV, UV2, NORMAL. На странице каждого шейдера в разделе документации "Ссылки на шейдеры" приводится полный список вершинных атрибутов.

gl_Position

gl_Position получает конечную позицию вершины, указанной в вершинном шейдере. Она задаётся пользователем в пространстве клипа. Обычно в GLSL положение вершины в пространстве модели передается с помощью атрибута вершины под названием position, а преобразование из пространства модели в пространство клипа выполняется вручную.

В Godot, VERTEX определяет положение вершины в пространстве модели в начале функции vertex. Godot также обрабатывает окончательное преобразование в пространство клипа после выполнения пользовательской функции vertex. Если вы хотите пропустить преобразование из пространства модели в пространство вида, вы можете установить render_mode на skip_vertex_transform. Если вы хотите пропустить все преобразования, установите render_mode в skip_vertex_transform и установите PROJECTION_MATRIX в mat4(1.0), чтобы обнулить окончательное преобразование из пространства вида в пространство клипа.

Varуings

Varyings - это тип переменных, которые можно передавать из вершинного шейдера во фрагментный шейдер. В современном GLSL (3.0 и выше) переменные определяются с помощью ключевых слов in и out. Переменная, выходящая из вершинного шейдера, определяется с помощью out в вершинном шейдере и in во фрагментном шейдере.

Main

В GLSL каждая шейдерная программа выглядит как самодостаточная программа в стиле языка Си. Соответственно, главной точкой входа является main. Если вы копируете вершинный шейдер, переименуйте main в vertex, а если вы копируете фрагментный шейдер, переименуйте main в fragment.

Макросы

Godot shader preprocessor поддерживает следующие макросы:

  • #define / #undef

  • #if, #elif, #else, #endif, defined(), #ifdef, #ifndef

  • #include (только файлы .gdshaderinc и с максимальной глубиной 25)

  • #pragma disable_preprocessor, что отключает предварительную обработку оставшейся части файла

Переменные

В GLSL есть множество встроенных переменных, которые жёстко закодированы. Эти переменные не являются унифицированными, поэтому их нельзя редактировать из основной программы.

Переменная

Тип

Эквивалент

Описание

gl_FragColor

из vec4

ЦВЕТ

Выходной цвет для каждого пикселя.

gl_FragCoord

vec4

FRAGCOORD

Для полноэкранных квадратов. Для меньших квадратов используйте UV.

gl_Position

vec4

ВЕРШИНА

Положение Vertex (вершины), выход Vertex Shader.

gl_PointSize

float

РАЗМЕР_ТОЧКИ

Размер примитива Point (точка).

gl_PointCoord

vec2

МЕСТОПОЛОЖЕНИЕ_ТОЧКИ

Положение относительно точки при рисовании Точечных примитивов.

gl_FrontFаcing

bool

FRONT_FACING

Истина, если это передняя грань примитива.

Координаты

gl_FragCoord в GLSL и FRAGCOORD в языке шейдеров Godot используют одну и ту же систему координат. При использовании UV в Godot координата Y будет перевернута вверх ногами.

Точность

В GLSL точность заданного типа (float или int) можно определить в начале шейдера с помощью ключевого слова precision. В Godot можно задать необходимую точность отдельных переменных, добавив квалификаторы точности lowp, mediump и highp перед типом при определении переменной. Подробнее см. в справочнике Shading Language.

Shаdertoy

Shadertoy — это веб-сайт, который упрощает написание фрагментных шейдеров и создание чистой магии.

Shadertoy не предоставляет пользователю полного контроля над шейдером. Он обрабатывает все входные данные и юниформы, позволяя пользователю только написать фрагментный шейдер.

Типы

Shadertoy использует спецификацию webgl, поэтому использует немного другую версию GLSL. Тем не менее, в нём по-прежнему присутствуют стандартные типы данных, включая константы и макросы.

mаinImage

Основной точкой входа в шейдер Shadertoy является функция mainImage. У mainImage есть два параметра: fragColor и fragCoord, которые соответствуют COLOR и FRAGCOORD в Godot соответственно. Эти параметры обрабатываются в Godot автоматически, поэтому вам не нужно добавлять их в качестве параметров самостоятельно. Всё содержимое функции mainImage следует скопировать в функцию fragment при портировании в Godot.

Переменные

Чтобы сделать написание фрагментных шейдеров простым и легким, Shadertoy обрабатывает передачу множества полезной информации из основной программы в фрагментный шейдер за вас. Некоторые из них не имеют аналогов в Godot, потому что Godot решил не делать их доступными по умолчанию. Это нормально, потому что Godot дает вам возможность создавать свои собственные формы. Для переменных, эквиваленты которых перечислены как "Provide with Uniform", пользователи сами отвечают за создание такой формы. Описание дает читателю подсказку о том, что можно передать в качестве замены.

Переменная

Тип

Эквивалент

Описание

frаgColor

из vec4

ЦВЕТ

Выходной цвет для каждого пикселя.

fragCoord

vec2

FRAGCOORD.xy

Для полноэкранных квадратов. Для меньших квадратов используйте UV.

iRеsolution

vec3

1.0 / SCREEN_PIXEL_SIZE

Также можно передать вручную.

iTime

float

TIME

Время с момента запуска шейдера.

iTimeDelta

float

Обеспечение Uniform

Время рендеринга предыдущего кадра.

iFrame

float

Обеспечение Uniform

Номер кадра.

iChannelTime[4]

float

Обеспечение Uniform

Прошло время с момента появления этой конкретной текстуры.

iMouse

vec4

Обеспечение Uniform

Положение мыши в пиксельных координатах.

iDate

vec4

Обеспечение Uniform

Текущая дата, выраженная в секундах.

iChannelResolution[4]

vec3

1.0 / TEXTURE_PIXEL_SIZE

Разрешение конкретной текстуры.

iChanneli

Sampler2D

TEXTURE

Godot предоставляет только одну встроенную функцию; пользователь может создать больше.

Координаты

fragCoord ведет себя так же, как gl_FragCoord в GLSL и FRAGCOORD в Godot.

Книга Шейдеров

Подобно Shadertoy, The Book of Shaders предоставляет доступ к фрагментному шейдеру в веб-браузере, с которым пользователь может взаимодействовать. Пользователь ограничен написанием кода фрагментного шейдера с заданным списком переданных юниформ-переменных и не имеет возможности добавлять дополнительные юниформ-переменные.

Для получения дополнительной информации по портированию шейдеров на различные фреймворки в The Book of Shaders имеется страница <https://thebookofshaders.com/04>`_ о запуске шейдеров на различных фреймворках.

Типы

Книга шейдеров использует спецификацию webgl, поэтому использует немного другую версию GLSL. Тем не менее, в ней по-прежнему присутствуют стандартные типы данных, включая константы и макросы.

Main

Точкой входа для фрагментного шейдера Book of Shaders является main, как и в GLSL. Всё, что написано в функции main Book of Shaders, следует скопировать в функцию fragment Godot.

Переменные

Книга шейдеров ближе к чистому GLSL, чем Shadertoy. Кроме того, в ней реализовано меньше юниформ-объектов, чем в Shadertoy.

Переменная

Тип

Эквивалент

Описание

gl_FragColor

из vec4

ЦВЕТ

Выходной цвет для каждого пикселя.

gl_FragCoord

vec4

FRAGCOORD

Для полноэкранных квадратов. Для меньших квадратов используйте UV.

u_resolution

vec2

1.0 / SCREEN_PIXEL_SIZE

Также можно передать вручную.

u_time

float

TIME

Время с момента запуска шейдера.

u_mouse

vec2

Обеспечение Uniform

Положение мыши в пиксельных координатах.

Координаты

Book of Shaders использует ту же систему координат, что и GLSL.