Game Maker - создание игр | HellRoom Games
Январь 16, 2025, 07:33:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Инструкция по использованию шейдеров в GM Studio. Часть 1  (Прочитано 28021 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« : Июнь 13, 2013, 18:57:10 »

Перевод статьи о шейдерах из блога разработчиков GMS. Оригинал тут. Сразу прошу прощения за мой посредственный английский. Просьба сообщать в ЛС о неточностях перевода (или если у вас есть более удачный вариант перевода).

Вторая часть тут

Автор: Mike Dailly
Перевод: Dmi7ry

Примеры использования шейдеров
<a href="http://www.youtube.com/watch?v=nxOE21BtpBI" target="_blank">http://www.youtube.com/watch?v=nxOE21BtpBI</a>



В связи с близким выходом Студии v1.2, самое время приоткрыть завесу над тем, что такое шейдеры, что они могут делать и как их можно будет использовать в Студии. Однако, так как это довольно большая тема, я разделю её на несколько статей, и первая будет содержать обзор, который даст вам идеи, каким образом вы будете использовать их.

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

Также нужно отметить то, что GLSL ES имеет некоторые ограничения, но мы их рассмотрим позже. А для начала давайте вкратце рассмотрим, что такое шейдеры и как они работают.


Обзор шейдеров: часть 1

Во-первых, что такое шейдеры? Когда мы говорим о шейдерах, мы на самом деле говорим о двух различных типах программ, которые работают непосредственно на видеокарте - вершинном шейдере (vertex shader) и пиксельном шейдере (pixel shader). Обе эти небольшие программы работают вместе, манипулируя тем, что видеокарта выводит на экран, позволяя в режиме реального времени менять позицию и цвет (или RGBA) данных, которые фактически заносятся в буфер дисплея.

Итак, какие же эффекты способны делать шейдеры? Если кратко - почти любые. Давайте возьмём несколько примеров, что разработчики хотели бы сделать в Студии, но просто не могут сейчас.

Насыщенность цвета. Допустим, при выстреле в плохого парня вы хотите, чтобы бандит "вспыхнул", позволяя игроку узнать, что пуля попала в цель. В настоящее время мы можем его сделать темнее, но не светлее. То есть если мы сейчас устанавливаем цвет рисования c_black, спрайт станет выглядеть подобно тени, но мы не сможем сделать наоборот - по крайней мере, не очень легко. Какие-то разработчики используют некоторые трюки с затемнением, но это не особо хорошее решение. Однако с шейдерами это становится сделать гораздо проще: так как пишется информация о цвете, вы можете просто изменить значения на белый (или любой другой цвет), сохраняя при этом уровень прозрачности (который сохраняет форму в целости). И это крошечный шейдер, который позволил создать вспышку, которую все искали.

Конечно же, вы можете сделать гораздо больше - вроде правильной глубины резкости, преломление стекла и воды, сдвиг цветового пространства HSV или даже использовать множественные текстуры для таких вещей, как карты нормалей и так далее. Если вы можете что-то представить, вероятно, это можно сделать.

В прошлом я также использовал их, чтобы делать вещи, которые на самом деле не имеют ничего общего с рендерингом. Я присваивал каждому объекту значение и тогда рендерил его. Как только весь экран был отрендерен, я мог "взять" цвет с экрана и перевести его обратно в объект, на который я нажал. Для выбора из десятков тысяч объектов, это было очень удобно и просто.

Очевидно, что всё это невероятно мощно. Итак, что делает Студия при рендеринге? Хорошо, когда мы строим четырёхугольный полигон, это на самом деле два треугольника, каждый из которых имеет собственный набор данных о вершинах - позиция вершины, цвет и информация о текстуре, которую использует видеокарта для построения.

Как же эти данные выглядят? Каждая точка содержит X, Y, Z (для 2D координата Z не существенна), цвет и координаты текстуры для U и V в диапазоне от 0.0 до 1.0. Это образует один угол, выглядя примерно так:

Код:
X=10
Y=10
Z=1
Colour=$FFFFFFFF
U=0.0
V=1.0

Перед тем, как с головой погрузиться в написание шейдеров, давайте посмотрим, как они создаются и используются в Студии.


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


Как вы можете видеть, в настоящее время в редакторе скриптов есть две вкладки, названные Vertex (вершинные шейдеры) и Fragment (или Pixel, пиксельные шейдеры), внутри которых вы можете написать соответствующий скрипт. Точно так же, как имена скриптов, у каждого шейдера есть имя, которое вы можете использовать для выбора шейдера.

Как вы можете увидеть из изображения выше, Студия будет также утверждать некоторые определённые вещи для вас, такие как матрицы, освещение и различные другие установки, освобождая вас от необходимости устанавливать их.

Теперь, когда мы можем создать шейдер, как мы можем его использовать внутри Студии? Здесь есть два аспекта шейдеров. Первый - непосредственно дескриптор шейдера и второй - константы шейдера (как вершинного так и пиксельного). Сначала нужно установить шейдер, что очень просто:

Код:
shader_set( MaskShader );

а затем, чтобы отключить его использование:

Код:
shader_reset();

Теперь, когда вы можете сделать некоторые интересные вещи только с этим, что делает шейдеры неоценимыми, это возможность установить константы непосредственно в шейдере. Чтобы получить константу, видимую и в шейдере и в GML через GLSL ES, вы должны использовать ключевое слово UNIFORM. Затем вам нужно использовать их, чтобы передать конкретные детали в экземпляр, такие, как, например, оттенок цвета, сила свечения или даже преломления.

Однако, первое, что вам нужно сделать - получить дескриптор каждой константы. Здесь есть два типа констант: униформы (uniforms) и образцы (samplers). Униформы - это обычные константы: целые, булевы, плавающие, векторы, матрицы и т.п., в то время как образцы - это текстуры. В отличии от обычного использования GML, вы можете использовать до 8 текстур одновременно - или столько, сколько поддерживает устройство, так как количество может быть меньше.

В приведённом выше примере маски нам понадобится доступ к униформе u_vMaskCol. Этот четырёхмерный вектор (vec4) мы используем в пиксельном шейдере для установки цвета маски, применяемую, когда используется спрайт попадания - как следствие, мы можем "мигать" (или делать блеклым) спрайтом в качестве эффекта.

Код:
global.maskshader_col = shader_get_uniform( MaskShader, “u_MaskCol” );

Будет искаться переменная и, если она найдена, её дескриптору будет присваиваться значение глобальной переменной maskshader_col. После, когда захотите установить константу, вы можете использовать эту переменную, устанавливая её так, как вам нравится.

Код:
shader_set( MaskShader );
shader_set_uniform_f( global.maskshader_col, Red, Green, Blue, AlphaMask );

Сначала вы устанавливаете шейдер, который берёт на себя рендеринг из Студии, а также говорит системе, какие из констант шейдера будут установлены. Значения передаются в простых переменных с плавающей запятой, а что они означают, будет определяться вашим шейдером.

И вот оно! Студия будет заполнять все матрицы видов/проекций, устанавливать основные текстуры (названные gm_BaseTexture) и после вызывать ваш шейдер, когда идёт отрисовка спрайтов/тайлов/фонов и т.п.

Все пиксельные шейдеры требуют чтобы вы установили gl_FragColor при выходе и этот vec4 выведется на экран.

Для обычного использования вы можете по-прежнему использовать команды вроде draw_self(), draw_sprite_ext() и т.п., и Студия будет создавать примитивы, настраивать матрицы и текстуры, предоставляя вам простую работу по отрисовке пикселей.

Итак, это была первая часть. Вторая часть будет содержать подробности создания и использования шейдеров. А сейчас - немного *кхе-кхе* лёгкого чтения - спецификация языка шейдеров OpenGL ES
« Последнее редактирование: Июль 30, 2013, 08:21:55 от Dmi7ry » Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
D-side
Новичок
*

Репутация: 0
Offline Offline

API: GameMaker Studio
Деятельность: Программная архитектура, процедурная графика, гейм-дизайн
Сообщений: 3


« Ответ #1 : Июль 03, 2013, 05:06:20 »

Перевод понравился. Но дико хотелось почитать реальный код шейдеров - как он есть.
Поставил себе бету студии с шейдерами. Там есть демка с несколькими простейшими. Сам писать пока не научился, но язык дико напоминает упрощённый С.
Для простых пиксельных эффектов там используется "пропускающий шейдер" на вершинном шейдере и что-то содержательное на фрагментном. Вот вам все примеры (для тех, кому лень качать бету и хочется почитать код). Комментарии автора сохранены, добавлены описания "кто что делает".

Могу сказать точно - без понимания линейной алгебры придётся тяжко, если полезете в вершинные. На фрагментных жить ещё можно и без этого.
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #2 : Июль 03, 2013, 05:57:59 »

Собственно, в блоге разработчиков уже 4 статьи по шейдерам. Можете почитать там.

Добавлено: Июль 30, 2013, 08:22:40
Добавлено официальное видео с демонстрацией использования шейдеров.
« Последнее редактирование: Июль 30, 2013, 08:22:40 от Dmi7ry » Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Vendet
Гл. Администратор
*

Репутация: 772
Offline Offline

Пол: Мужской
API: Unity 3D
Сообщений: 3949


HellRoom Games


WWW
« Ответ #3 : Июль 30, 2013, 12:00:12 »

Интересное видео 
Записан
Sanec
Будущий рокер
GM Pro user
*

Репутация: 55
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: Game Maker 8.0 Pro
Деятельность: Люблю возиться в 3D
Сообщений: 194


$@}~{۩


« Ответ #4 : Август 02, 2013, 18:54:51 »

А выйдут примеры которые показаны в видео? Если да, то когда?

Вода классно получилась
Записан

@}}-}-- (Программист узник замка if)
Включи HardRock на все забей
И в жизни твоей всегда будет Окей!

PATCH
Посетитель
**

Репутация: 1
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Деятельность: разработчик
Сообщений: 45



« Ответ #5 : Август 05, 2013, 03:20:52 »

А выйдут примеры которые показаны в видео? Если да, то когда?

Вода классно получилась
юзайте поиск и оффицальный форум yoyogames http://gmc.yoyogames.com/index.php?showtopic=586380
Записан
Ринуэй
Новичок
*

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: Учусь
Сообщений: 2


« Ответ #6 : Август 14, 2013, 11:13:55 »

Отлично! Ваш перевод совсем не плох. И английский нормальный у вас, во всяком случае я прекрасно всё понял.Теперь я уже имею представление о том, что такое шейдер.
Записан

Выжить можно и виртуальной реальности главное знать,где находятся обстаклы и где пауэрапы!
Kazerex
Пользователь
***

Репутация: 4
Offline Offline

API: GameMaker Studio Free
Сообщений: 87


« Ответ #7 : Декабрь 09, 2013, 13:42:35 »

Большое спасибо, благодаря этой статье я понял что шейдеры очень хорошая вещь, а то думал до этого, что это какая-то не нужная ерунда)
Записан
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #8 : Февраль 06, 2015, 22:43:11 »

Хм, я пытаюсь использовать конструкцию вида

float rand = noise1(1.412378518) * 20.0;

На что мне отвечает

In Shader shader0 at line 7 : 'noise1': no matching overloaded function found

ЧТЯДНТ?
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #9 : Февраль 06, 2015, 23:02:14 »

Наверное вы забыли сделать функцию noise1, либо, если она есть, то у неё скорее всего установлены другие типы на входящие аргументы, либо на тип результата.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #10 : Февраль 06, 2015, 23:45:01 »

Хм, она подсвечивается как знакомая. Брал описание из этого мануала.
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #11 : Февраль 07, 2015, 07:56:40 »

Переключите тип шейдера с GLSL ES на GLSL
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #12 : Февраль 08, 2015, 08:35:49 »

А, точно, спасибо. А есть какие-нибудь хорошие мануалы на русском?
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #13 : Февраль 08, 2015, 09:17:55 »

А, точно, спасибо. А есть какие-нибудь хорошие мануалы на русском?
В принципе, просто гуглите изучение шейдеров. Навскидку ничего не подскажу.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.133 секунд. Запросов: 34.