Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Перетворення GLSL в шейдери Годо
У цьому документі пояснюється відмінність між мовою затінення Godot і GLSL і надаються практичні поради щодо перенесення шейдерів з інших джерел, таких як Shadertoy і The Book of Shaders, у шейдери Godot.
Для отримання детальної інформації про мову затінення Godot, будь ласка, зверніться до довідника Shading Language.
GLSL
Godot використовує мову затінення на основі GLSL із додаванням кількох функцій якості життя. Відповідно, більшість функцій, доступних у GLSL, доступні в мові затінення Годо.
Шейдерні програми
У GLSL кожен шейдер використовує окрему програму. У вас є одна програма для вершинного шейдера та одна для фрагментного шейдера. У 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)», щоб анулювати остаточне перетворення з простору перегляду в простір кліпу.
варіювання
Varyings — це тип змінної, яку можна передати від вершинного шейдера до фрагментного шейдера. У сучасному GLSL (3.0 і вище) варіації визначаються за допомогою ключових слів in
і out
. Змінна, що виходить із вершинного шейдера, визначається як out
у вершинному шейдері та in
у фрагментному шейдері.
Основний
У GLSL кожна шейдерна програма виглядає як самодостатня програма у стилі C. Відповідно, головною точкою входу є main
. Якщо ви копіюєте вершинний шейдер, перейменуйте main
на vertex
, а якщо ви копіюєте фрагментний шейдер, перейменуйте main
на fragment
.
Макроси
Препроцесор шейдерів Godot підтримує такі макроси:
#define
/#undef
#if
,#elif
,#else
,#endif
,defined()
,#ifdef
,#ifndef
#include
(лише файли.gdshaderinc
і з максимальною глибиною 25)#pragma disable_preprocessor
, який вимикає попередню обробку для решти файлу
Змінні
GLSL має багато вбудованих змінних, які жорстко закодовані. Ці змінні не є єдиними, тому їх не можна редагувати з основної програми.
Змінна |
Тип |
Еквівалент |
Опис |
---|---|---|---|
Gi_FragColor |
Out vec4 |
КОЛІР |
Вихідний колір для кожного пікселя. |
Gl_FragCoord |
Vec4 |
FRAGCOORD |
Для повноекранних квадроциклів. Для менших квадроциклів використовуйте UV. |
gl_Position |
Vec4 |
ВЕРШИНА |
Позиція Vertex, виведена з Vertex Shader. |
Gl_PointSize |
десяткове число |
POINT_SIZE |
Розмір примітиву точки. |
Gl_PointCoord |
Vec2 |
POINT_COORD |
Позиція точки під час малювання примітивів Point. |
Gl_FrontFacing |
bool |
FRONT_FACING |
Правда, якщо передня грань примітиву. |
Координати
gl_FragCoord
в GLSL і FRAGCOORD
у мові затінення Godot використовують ту саму систему координат. Якщо використовувати UV у Godot, координата y буде перевернута догори дном.
Точність
У GLSL ви можете визначити точність заданого типу (float або int) у верхній частині шейдера за допомогою ключового слова precision
. У Godot ви можете встановити необхідну точність окремих змінних, розмістивши кваліфікатори точності lowp
, mediump
і highp
перед типом під час визначення змінної. Для отримання додаткової інформації перегляньте довідник Shading Language.
shadertoy
Shadertoy це веб-сайт, який дозволяє легко писати фрагментні шейдери та створювати чиста магія.
Shadertoy не дає користувачеві повного контролю над шейдером. Він обробляє всі введення та уніформи та дозволяє користувачеві лише писати фрагментний шейдер.
Типи
Shadertoy використовує специфікацію webgl, тому працює з дещо іншою версією GLSL. Однак він все ще має звичайні типи, включаючи константи та макроси.
MainImage
Основною точкою входу в шейдер Shadertoy є функція mainImage
. mainImage
має два параметри, fragColor
і fragCoord
, які відповідають COLOR
і FRAGCOORD
у Godot відповідно. Ці параметри обробляються в Godot автоматично, тому вам не потрібно включати їх як параметри самостійно. Будь-що у функції mainImage
слід скопіювати у функцію fragment
під час перенесення на Godot.
Змінні
Щоб зробити написання фрагментних шейдерів простим і легким, Shadertoy передає для вас багато корисної інформації з основної програми у фрагментний шейдер. Деякі з них не мають еквівалентів у Godot, тому що Godot вирішив не робити їх доступними за замовчуванням. Це нормально, тому що Godot дає вам можливість виготовляти власну форму. Для змінних, еквіваленти яких указано як «Надати уніформу», користувачі самі відповідають за створення уніформи. Опис дає читачеві підказку про те, що вони можуть замінити.
Змінна |
Тип |
Еквівалент |
Опис |
---|---|---|---|
FragColor |
Out vec4 |
КОЛІР |
Вихідний колір для кожного пікселя. |
FragCoord |
Vec2 |
FRAGCOORD.xy |
Для повноекранних квадроциклів. Для менших квадроциклів використовуйте UV. |
IResolution |
Vec3 |
1.0 / SCREEN_PIXEL_SIZE |
Також можна здавати вручну. |
ITime |
десяткове число |
ЧАС |
Час від початку шейдера. |
ITimeDelta |
десяткове число |
Забезпечити уніформою |
Час відтворити попередній кадр. |
IFrame |
десяткове число |
Забезпечити уніформою |
Номер кадру. |
IChannelTime[4] |
десяткове число |
Забезпечити уніформою |
Час, відколи ця конкретна текстура почалася. |
IMouse |
Vec4 |
Забезпечити уніформою |
Позиція миші в піксельних координатах. |
IDate |
Vec4 |
Забезпечити уніформою |
Поточна дата, виражена в секундах. |
IChannelResolution[4] |
Vec3 |
1.0 / TEXTURE_PIXEL_SIZE |
Роздільна здатність конкретної текстури. |
IChanneli |
sampler2D |
ТЕКСТУР |
Godot забезпечує лише один вбудований; користувач може зробити більше. |
Координати
fragCoord
поводиться так само, як gl_FragCoord
в GLSL і FRAGCOORD
в Godot.
Книга шейдерів
Подібно до Shadertoy, The Book of Shaders надає доступ до фрагментного шейдера у веб-браузері, з яким користувач може взаємодіяти. Користувачеві обмежено написання коду фрагментного шейдера з переданим набором уніформ і без можливості додавати додаткові уніформи.
Щоб отримати додаткову допомогу щодо перенесення шейдерів на різні фреймворки, The Book of Shaders надає сторінку про запуск шейдерів у різних фреймворках.
Типи
Книга шейдерів використовує специфікацію webgl, тому в ній працює дещо інша версія GLSL. Однак він все ще має звичайні типи, включаючи константи та макроси.
Основний
Точкою входу для фрагментного шейдера Book of Shaders є main
, як і в GLSL. Усе, що написано у функції main
Книги шейдерів, слід скопіювати у функцію fragment
Годо.
Змінні
Book of Shaders ближче до простого GLSL, ніж Shadertoy. Він також використовує менше уніформи, ніж Shadertoy.
Змінна |
Тип |
Еквівалент |
Опис |
---|---|---|---|
Gi_FragColor |
Out vec4 |
КОЛІР |
Вихідний колір для кожного пікселя. |
Gl_FragCoord |
Vec4 |
FRAGCOORD |
Для повноекранних квадроциклів. Для менших квадроциклів використовуйте UV. |
u resolution |
Vec2 |
1.0 / SCREEN_PIXEL_SIZE |
Також можна здавати вручну. |
u time |
десяткове число |
ЧАС |
Час від початку шейдера. |
u mouse |
Vec2 |
Забезпечити уніформою |
Позиція миші в піксельних координатах. |
Координати
Книга шейдерів використовує ту саму систему координат, що й GLSL.