Преобразование 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.