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.

Перетворення 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.