суббота, 9 февраля 2013 г.

режим смешивания изображений game maker

draw_set_blend_mode(bm_normal);Добавьте в комнату этот объект и какой-нибудь фон, чтобы видеть разницу. Вот так это будет выглядеть:

draw_sprite(sprLight, 0, 0, 0);

Сурфейсы и режимы смешивания | Game Maker | Статьи | Inside Games игрострой для новичка Сообщение           / / / Сурфейсы и режимы смешивания Автор: Обновлено: 9 May 2008Рейтинг: 4.0 (2) Сурфейсы и режимы смешиванияСтатья описывает принципы создания surface и принципы использования режимов смешивания. В конце статьи рассматривается пример создания светового движка.В версиях Game Maker выше пятой есть поддержка очень интересных функций рисования сурфейсы и установка режимов смешивания. Невероятно мощный инструмент, который в неумелых руках только хуже делает. В этой статье мы рассмотрим не только описание этих инструментов, но и рассмотрим типичные примеры их применения, например, напишем небольшой световой движок.Сурфейсы или поверхностиЕсли вдаваться в подробности, то окажется, что сурфейс вовсе и не так называется. В каждом графическом приложении, которое использует DirectX, есть так называемые render target, в которых хранится необходимая информацая о том, в какую область видеопамяти необходимо поместить текущий кадр. Такая структура создается как минимум одна для каждого приложения, чтобы указать параметры дисплея, ведь нам нужно отрисовывать на нем кадры игры. Принцип сурфейсов заключается в том, чтобы создать своими руками такой render target, а затем менять текущую структуру на свою собственную и обратно. Когда мы это сделаем,то, что мы рисуем, будет отрисовываться уже не на экран, а в определенную область памяти, хотя сама семантика рисования не меняется. Так, например, можно весь кадр игры рисовать в текстуру, а затем использовать ее как спрайт или фон.Создать новую поверхность очень просто для этого есть функция surface_create(w,h), где в параметрах вы указываете ширину и высоту текстуры. Есть одно важное условие для размеров текстур они должны быть степенью двойки. Например, 32, 64, 128, 256 и так далее. Многие этим пренебрегают, а потом удивляются, почему у них появляются разного рода ошибки сурфейс может попросту не создаться. Многие современные видеокарты легко обрабатывают текстуры любого размера, но вот модели постарше просто застревают и выдают непонятные ошибки. Поэтому стоит всегда использовать текстуры размером степени двойки. Функция возвращает идентификатор созданного сурфейса. Также, частой ошибкой является то, что люди забывают удалять структуры после их использования, и из-за этого видеопамять переполняется, и в следующей комнате вы вообще не сможете создать текстур. Но разработчики не всегда виноваты: дело в том, что при смене комнаты, в объектах старой комнаты не вызывается событие Destroy, где, в основном, и вызывается удаление поверхности. Поэтому нужно не забывать про событие Room End.Чтобы установить устройство на новую поверхность, нужно использовать функцию surface_set_target(), а чтобы отменить surface_reset_target().Сурфейс, как и все остальные текстуры, поддерживают прозрачность. Сурфейсу можно указать прозрачность функцией очистки draw_clear_alpha(), а потом рисовать на нем полупрозрачные спрайты. Используя это, можно отрисовыватьстатические элементы ландшафта, а потом рисовать их на каком-нибудь фоне, и при этом будет казаться, что эти элементы рисуются каждый отдельно, но на самом деле они все вместе. Например, так можно отрисовывать кучу крови, как в Crimsonland, а можно таким образом «сохранять» большое количество текста, ведь рисование текста самое медленное действие из всех в Game Maker.ПримечаниеВсе функции приводятся без описания параметров. Все описание, причем достаточно подробное, вы найдете в стандартной справке Game Maker.Некоторые советыКогда вы переходите в рисование на сурфейс, то текущий вид полностью сбрасывается. Вернее, параметры вида не сбрасываются они не применяются. Все уже привыкли, что если вы рисуете спрайт, то его координаты автоматически преобразуются в соответствии с текущим видом. Чтобы это точно также и происходило, стоит воспользоваться функциями d3d_transform. Например, так: d3d_transform_set_translation(-view_xview, -view_yview, 1); Таким образом, координаты всех объектов будут преобразовываться в соответствии с текущим видом.Не стоит создавать слишком большие текстуры. Если новые видеокарты легко обрабатывают текстуры размером 8138х8138, то карты постарше не потянут больше 2048х2048.Blend Modes (Режимы смешивания)Режимы смешивания позволяют устанавливать соотношение между рисуемым пикселем, пикселем на экране и результирующем пикселем.Код:новый_пиксель = рисуемый_пиксель * src_blend + пиксель_на_экране * dest_blendУ каждого пикселя есть четыре компоненты цвета: красная (R), зеленая (G), синяя (B) компоненты и компонента прозрачности (A). Каждая компонента это число с плавающей точкой от 0 до 1. Единица означает максимальную интенсивность компоненты. Например, цвет (0, 0, 0, 1) полностью черный, (1, 0, 0, 1) чисто красный. В справке Game Maker есть расшифровка всех значений src_blend и dest_blend: bm_zero, bm_one, bm_src_color и так далее. Внимательно изучите их!Если, например, выполнить такой код: draw_set_blend_mode_ext(bm_one, bm_zero), то теперь все объекты будут рисоваться нормально, только прозрачные области будут черными (пиксель на экране умножается на 0, то есть становится черным, а рисуемый пиксель умножается на единицу, то есть остается без изменений). Стандартный режим смешивания (bm_src_alpha, bm_inv_src_alpha): интенсивность рисуемого пикселя меняется в соответствии с его прозрачностью, а пиксель на экране в соответствии с инвертированной прозрачностью рисуемого пикселя. Если рисовать прозрачность как изображение, то получится черно-белое изображение, где белый цвет полностью непрозрачные области. Вот пример действия этого режима смешивания:Пример использованияКажется, не найдется более подходящего примера, который бы показывал принципы использования поверхностей и режимов смешивания, чем световой движок. Вы наверняка видели уже множество таких движков которые, правда, не очень быстро работают. Один из них вы найдете на нашем сайте. Мы разберем простую версию системы без поддержки теней. В нашей комнате можно будет располагать несколько источников света разной формы и цвета.Для начала разберемся, какой нам нужен режим смешивания, и как это все работает. Можно заметить, что все источники света хранятся в основном в черно-белом формате. Светлые области обозначают сам источник света. Это все похоже на альфа-канал: там тоже черно-белое изображение, в котором светлые области определяют видимые части изображения с некоторой интенсивностью. Но если там у нас некая абстрактные числа, которые мы, по сути, не видим, то здесь у нас вполне видимое изображение. Если вы вспомните, то черный цвет имеет код (0,0,0) в системе RGB, а белый (1,1,1). Нам нужно, чтобы там, где светлые области, были видны объекты, а где темные невидны. Довольно очевидно, что нам каким-либо образом нужно «умножить» цвет на экране на изображение источника света. Ведь если умножить на нуль (черный цвет), то цвет станет черным. То есть то, что нужно. Если умножить на белый цвет, то цвет останется без изменения, а вот если умножить на серый, то цвет изменит интенсивность. Это то, что нам нужно! Теперь осталось придумать для этого режим смешивания. Раз уж мы будем умножать пиксель на экране на пиксель на изображение, то у нас как минимум режим смешивания будет (*,bm_src_color), когда мы будем рисовать источник света. Осталось определиться с первым параметром. На самом деле, здесь не много вариантов bm_zero или bm_dest_color. В втором случае изображение будет казаться ярче в месте свечения источника света.Давайте теперь попробуем это сделать в ГМ. Создайте любой черно-белый спрайт с именем sprLight, который был бы похож на источник света и добавьте его в Game Maker. Вот я такое нарисовал: Далее создайте объект objLight и в событие рисования поместите такой код:Код на языке GML:draw_set_blend_mode_ext(bm_zero, bm_src_color);

Комментариев нет:

Отправить комментарий