Олдскульная компьютерная графика, а именно демосцена, продолжает здравствовать усилиями приверженных энтузиастов. Один из участников этой киберкультуры подготовил подробный обзор аудиовизуального интро, созданного им в рамках демопати Revision 2021 года для системы Amiga. — прим. ред.
Время от времени меня спрашивают, чем я увлекаюсь. Обычно я отвечаю, что еще с 80-х годов работаю с компьютерами. После этого интересующийся иногда уточняет, что именно я с ними делаю. Но вместо того, чтобы объяснять понятия демосцены и демопати, я просто говорю, что участвую в конкурсах компьютерной графики на фестивалях цифрового искусства.
На этом вопросы обычно заканчиваются. Тем не менее на своей личной страничке я все же решил более подробно рассказать о том, как провел несколько свободных недель перед пасхой.
Из-за Covid почти все демопати стали проводиться онлайн. Это, конечно, скучновато, но все же лучше, чем ничего. Немецкая пати Revision на данный момент является самой крупной в своем роде, и я решил зарегистрироваться в конкурсе по созданию интро для Amiga.
Istari — Space Swap
Скриншот интро
Начнем с конца и сразу взглянем на результат моих усилий: он доступен на YouTube либо, если у вас есть Amiga или эмулятор, в виде исполняемого файла и образа ADF. Зрители YouTube, которые будут использовать не предложенную выше ссылку, а инструменты вроде youtube-dl, могут пропустить первые 23 секунды ролика. Длительное ожидание в начале обусловлено процессом распаковки, о котором я расскажу в конце статьи.
Целевой платформой является Amiga 500 с 1Мб памяти, ЦПУ 68000 с частотой 7МГц и кастомным чипсетом Commodore, отвечающем за обработку графики и звука. Произведение (так помпезно создатели демосцен зовут свои творения) представляет собой интро – компактную не интерактивную аудиовизуальную программу. Размер файла в этом конкретном конкурсе ограничивался 64Кб.
Я решил создать так называемый одноэкранник – произведение, в котором нет переключения между различными полноэкранными визуальными эффектами, и в течение всего ролика показывается один макет экрана. Это определенно нельзя назвать техническим чудом или творческим продуктом высшей лиги, но мне было интересно реализовать все именно так. В итоге я занял 7 место (из 11 участников), но при этом первое среди одноэкранных интро, что меня очень порадовало.
Если кому интересно, то Istari – это имя демогруппы, членом которой я являлся с 1996 года. Взято оно было из вселенной Толкиена: нас было пятеро, и мы стремились стать компьютерными волшебниками, так что название казалось подходящим. В конце 90-х мы даже сами организовали пару небольших демопати.
Фото с демопати, организованной Istari
Схема интро
Макет общего экрана состоит из трех основных частей: логотипа вверху, а также фонового изображения и текстового блока в середине.
Логотип отрисовывается при помощи классического эффекта жидкого текста, в результате которого он как бы отливается на свое место из верхней части экрана. При каждой очередной отливке цвет логотипа меняется.
При этом в сцене также присутствует несколько анимаций: космический корабль под логотипом, моргающие глаза инопланетянина, выглядывающий из земляной норы сурок и лава вулкана. Все анимации сделаны с помощью спрайтов.
Реализация
Многие, кто занимается созданием демок и программ для Amigo, работают на современных ПК, используя кросс-компиляторы, эмуляторы, графические планшеты и Photoshop. Я же намного глупее и упрямее, так как предпочитаю работать на реальном Amiga с ЭЛТ-монитором без лишних программных и аппаратных наворотов. Подобная страсть напоминает то, как люди любят слушать винил или водить ретро-автомобили. В этом есть особый дух!
Можете почуять запах нагретого пластика? А мерцание 50Гц? Ради такого стоит жить!
Моя основная рабочая лошадка – это Amiga A1200 с ЦПУ 68020, работающем на 14МГц, и 6МБ ОЗУ. Его скорости более, чем достаточно для запуска всех используемых мной приложений и переключения между ними.
Жаргон
Дальше я буду использовать несколько терминов, которые стоит пояснить.
Экран
В Amiga экран – это название базовой области, на которой компьютер рисует графику. Программа может одновременно открывать несколько разных экранов, каждый с разным разрешением и глубиной цвета.
Экраны могут иметь произвольные размеры и отображаться одновременно путем наложения так, что часть нижних выступает из-под верхнего. Это означает, что можно, к примеру, одновременно показать экран размером 320*20 пикселей в 32 цветах и «низком разрешении» (т.е. с квадратными пикселями) поверх экрана 640*256 пикселей в 16 цветах и «высоком разрешении» (т.е. с пикселями, высота которых вдвое больше ширины). Максимальная глубина цвета на Amiga 500 составляет 5 бит, что обеспечивает 32-цветную палитру.
Copper
Copper (сокращение от сопроцессор) – это кастомный графический процессор Amiga. Он отвечает за настройку и обработку экранов. Copper можно использовать для однократного или многократного изменения значения заданного индекса палитры в каждой строке растра. В результате сопроцессор формирует своеобразный градиент. По существу, это означает, что экран 320*256 с глубиной 1 бит (2 цвета) можно настроить на отображение градиента с несколькими сотнями разных значений цвета.
Блиттер
Блиттер – это часть графического сопроцессора, которая служит для быстрого перекопирования больших фрагментов изображений в памяти с применением к этим копиям различных правил, позволяющих добиться таких эффектов, как прозрачность фона. В Amiga данный аппаратный компонент присутствует и очень пригождается для перекопирования всего отдельного экрана или его частей. Эту возможность также можно использовать для быстрого рисования, например, закрашенных рамок.
Мультиплексирование спрайтов
На Amiga спрайтом является аппаратно управляемый элемент графики, который рисуется независимо от основного экрана. В результате этого спрайт может перемещаться между двумя накладывающимися экранами. К примеру, указатель мыши на Amiga является спрайтом.
Этот ПК может одновременно рисовать до 8 аппаратных спрайтов. При этом они могут быть не более 16 пикселей в ширину, но иметь неограниченную высоту. Каждый спрайт может использовать до трех цветов (плюс один прозрачный). Однако с помощью различных программных приемов можно как показывать более восьми спрайтов одновременно, так и совмещать несколько спрайтов в один, получая таким образом увеличенную ширину и большее количество цветов. Это и называется мультиплексированием спрайтов.
Графика
На Amiga мне очень нравится заниматься пиксельной графикой. Для этого я использую свою давнюю оригинальную копию Deluxe Paint IV, выпущенного Electronic Arts в 1991 году. Создавая Space Swap, я пытался добиться атмосферы аналогичных одноэкранных интро из 1993-94 годов.
Тогда все они отличались особенной эстетикой дизайна со множеством пастельных тонов, милой графикой, забавными шрифтами и, как правило, веселым настроением. Идеальный вариант для привнесения яркости в мрачные времена пандемии и локдаунов.
Выше показан скриншот DPaint IV. Вдоль верхнего края экрана располагается панель меню с выпадающими подменю, дающими доступ ко множеству функций программы. Вдоль правого края находится панель инструментов и палитра, где можно выбирать различные кисти, режимы рисования и инструменты.
Палитра отображает все доступные для текущего изображения цвета и позволяет выбирать их значения для переднего и заднего плана.
На скриншоте представлен режим увеличения, в котором увеличенный фрагмент изображения показан в правой части экрана, а общая картинка слева. Большинство художников пиксельной графики (включая меня) очень много времени проводят именно в режиме увеличения, поскольку почти весь дизеринг и сглаживание выполняются вручную.
На фото видно, что фон и логотип с использованием 32-цветной палитры. Экран представлен в разрешении 320*256 пикселей в режиме “lowres”, т.е. с квадратными пикселями.
Логотип
Логотип Istari был разработан достаточно просто. Сначала я набрал “Istari” собственным шрифтом, потом сгладил края и наклонил лого с помощью инструмента Perspective в DPaint. Эффект 3D я добавил, углубив его вдоль оси z, после чего заполнил градиентом. В последнюю очередь было выполнено сглаживание. Ниже показан логотип на разных стадиях своей разработки.
Фон
Фоновое изображение преимущественно состоит из звездного неба. Градиентный переход от темного к светлому линеен, что позволило избежать ощущения перенасыщенности, вызываемого чрезмерным дизерингом изображения.
Некоторые звезды выражены одним пикселем, а некоторые имеют более сложную структуру с использованием сглаживания для получения эффекта небольшого ореола.
Инопланетянин Джефф, горы и небольшой логотип “Space Swap” были нарисованы в DPaint с помощью инструмента freehand. Для рисования контура луны использовался инструмент circle. Все это в последствии закрашивалось, затенялось, а также подвергалось дизерингу и сглаживанию.
Цвет ярко-желтой области в нижней части неба, ярко-голубой лавы в вулкане, а также некоторых звезд в конечной программе изменится. При работе в DPaint я предпочитаю устанавливать контрастные значения, делая объекты более заметными.
Для желтой части неба в итоге будет использован градиент, формируемый сопроцессором. Именно поэтому горы остались не сглажены – отчасти из-за того, что на фоне цвета это сделать сложно, а отчасти из-за того, что не оставалось подходящих цветовых значений.
Синяя лава и звезды получат эффект цветного мигания и будут непрерывно затухать и разгораться в диапазоне от почти черного до ярко-красного с фиолетовым оттенком.
Анимации
Изначально я планировал создать только спрайт космического корабля. Но это мне показалось скучным, и я решил добавить маленького космосурка, который случайным образом будет появляться в разных частях экрана. В итоге я вошел во вкус и решил также добавить эффект подъема лавы в вулкане.
Последним делом я несколько оживил скучноватого инопланетянина Джеффа, добавив ему моргание глазами. При этом моргают они не синхронно, ведь именно так должна быть устроена физиология трехглазых пришельцев.
Все анимации также рисовались в DPaint с использованием соответствующего режима. Это очень продвинутая возможность, которая позволяет добавлять, вставлять и удалять кадры, переключаться между ними вперед и назад, а также задействовать режим light table. По завершении монтажа анимаций я копировал каждый кадр в сетку статичного изображения, подготавливая их к использованию в качестве спрайтов.
Кадры анимации для сурка, лавы и моргающих глаз Джеффа
Музыка
Печально это признавать, но у меня совершенно отсутствует музыкальное чутье. К счастью, есть много композиций в свойственном для Amiga формате MOD, которые можно использовать бесплатно при условии упоминания их авторства. Я выбрал Hot Fever от Grim of Digital, классику чиптюн-музыки, которая, на мой взгляд, хорошо вписалась в общее настроение интро.
Шрифт
Поскольку в программе также присутствует текстовый блок, нужно было подобрать шрифт. В итоге я разработал собственный, который назвал Istarfont. Для этих целей я использую программу FEd (Font EDitor), которая входила в AmigaOS 1.3, но по неясным причинам из последних релизов была исключена.
В итоге шрифт получился почти полностью завершенным – недоставало лишь некоторых диактрических знаков и прочих специальных символов. В остальном он вполне годен для большинства случаев вывода текста. Можете без проблем использовать его при условии указания авторства: скачать архив LhA.
Для использования этого шрифта в интро мне пришлось набрать в DPaint на изображении все символы, которые должны были использоваться в написании. В процессе я также добавил им падающие тени.
Компоновка сцены
Крутые парни пишут код для своих сцен на ассемблере. Сегодня это делается, потому что ассемблер быстр, в былые же времена существовало мнение, что программирование должно быть трудным, и если ты не идешь сложным путем, то и заниматься этим не достоин. Мне повезло, так как я никогда не был крутым парнем, поэтому сегодня могу спокойно использовать AMOS Professional.
Редактор кода AMOS Professional
AMOS – это диалект BASIC для Amiga, изначально выпущенный для Atari ST под названием STOS. AMOS Professional является последней и самой продвинутой версией, которая содержит очень много классных абстракций для работы с железом Amiga. В итоге даже возникает ощущение, что ты просто используешь скрипты современного мультимедиа пакета, а не занимаешься реальным программированием.
Хотите загрузить и отобразить файл изображения IFF? Просто используем Load lff
. Нужно загрузить и воспроизвести музыку? Выбираем Track Load
и Track Play
. Здесь также есть удобные функции для мультиплексирования спрайтов, работы с экранами с двойным буфером, управления значениями палитры и создания градиентов через сопроцессор.
REPL AMOS Professional, называемый Direct Mode
Помимо предоставления отличных абстракций для оборудования Amiga, на момент своего выпуска в 1992 году AMOS Professional являлся очень модным и перспективным программным продуктом.
В нем есть синтаксически-зависимый редактор с MDI, свертывание кода (процедур) и контекстно-зависимая гипертекстовая справка. Кроме этого, AMOS предлагает своеобразный режим REPL, визуальный отладчик и несколько инструментов для создания, редактирования, а также управления графикой и звуком.
Отладчик AMOS Professional, называемый Monitor
Текучесть логотипа и изменение палитры
Текучесть логотипа – это классический эффект интро для Amiga. Несмотря на то, что его можно реализовать с помощью сопроцессора, работать с ним в AMOS весьма затруднительно. Вместо этого я решил использовать блиттер. По факту логотип отображается на небольшом экране, размещенном в верхней части общего экрана, содержащего базовое фоновое изображение. Для создания эффекта «отливания» логотипа в невидимую форму я просто скопировал строку изображения логотипа во все оставшиеся над ним строки.
Поскольку логотип отображается на собственном экране, его палитру также можно менять, не влияя на фон. Перед каждой новой «отливкой» палитра изменяется между розовым, зеленым, синим и золотым тонами.
Текстовый блок
Текстовое окно рисуется в самом начале интро при помощи блиттера. Его мигающая рамка окрашивается в один цвет индексируемой палитры, интенсивность которого варьируется между разными значениями.
Такое же мигание используется в вулканической лаве и некоторых звездах. Сам текст окрашивается при помощи радужного градиента, получаемого через сопроцессор.
Редкий взгляд в разум психически нездорового человека: ручной подсчет символов в файле изображения с целью их перевода в соответствующие значения ASCII. Но не судите меня строго – вот вы что обычно делаете в субботу в 3 утра?
Весь текст сохранен в виде строк в массивах. В AMOS есть поддержка операторов ввода данных, но он также отлично работает с массивами, которые я использую для многих элементов, таких как значения палитры и идентификаторы кадров спрайтов.
Каждый символ был программно вырезан из описанного выше изображения шрифтов и с помощью абстракции AMOS под названием “banks” сохранен в памяти.
Далее при помощи блиттера эти символы вставляются в основной фон, а также происходит очистка окна от текста перед его очередным отображением.
Фон
Создание фона подразумевает простое использование встроенных в AMOS функций загрузки, упаковывания, сохранения и последующего отображения картинки. Нижняя часть неба для получения дополнительной живости закрашивается градиентом с помощью сопроцессора.
С учетом изменения палитры логотипа и радужного градиента, используемого в текстовом блоке, общее количество цветов на экране в любой момент интро находится в диапазоне от 60 до 80 уникальных значений. Не плохо для глубины в 5 бит. Такое возможно только на Amiga!
Так будет выглядеть фон, если логотип не отображать на собственном экране и применить к нему золотую палитру
Анимации
Также, как и шрифт для текстового блока, каждый кадр анимации программно вырезался из большого изображения и сохранялся в банке памяти AMOS. На экране они отображаются с помощью встроенного в AMOS мультиплексора спрайтов. При этом основная часть кода состоит из проверки значений различных таймеров и флагов для определения, какой и где отображать спрайт, а также какой кадр анимации этот спрайт должен содержать.
Доработка и тестирование
В процессе разработки важно систематически тестировать код. Исполняемый файл создается компилятором AMOS Professional. После этого я записываю его на дискету и на флэшку. Дискету я использую для тестирования программы на Amiga 500, а флешку для ее проверки через эмулятор на ПК с Linux.
В ходе этого процесса возникают новые идеи, а старые отбрасываются или уточняются. К примеру, за последнюю неделю разработки количество анимированных спрайтов сильно увеличилось.
Сжатие
После того, как я доработал интро до результата, который меня устроил, его нужно было сжать до установленного условиями конкурса размера. В данном случае речь идет о создании самораспаковывающегося архива.
Если бы я писал интро на ассемблере, то сжатия можно было избежать, но AMOS встраивает в исполняемый файл свою библиотеку поддержки, и программатор не может исключить ее неиспользуемые части. Проще говоря, размер файла оказывается намного больше допустимых 64Кб.
При этом сжатие оказалось единственным процессом, который я полностью проделал на ПК с Linux: на Amiga бы это происходило слишком медленно.
В случае с Amiga для этой задачи можно выбрать один из трех распространенных упаковщиков, которые создают исполняемые файлы. Они все асимметричны, то есть сжатие файла происходит намного медленнее, чем его распаковка.
Вот список этих инструментов:
- Titanics Cruncher от Titanics. Старый и работает с ошибками.
- Shrinkler от Blueberry. Очень хорошо справляется со сжатием, но предназначен для небольших интро (4Кб и меньше), в связи с чем довольно медленно выполняет распаковку.
- Cranker от Bifat. Предлагает неплохой компромисс между скоростью и размером.
Сперва я попробовал сжать программу с помощью Cranker, но к моему огорчению файл получился на 10Кб больше допустимого размера. Единственным вариантом оставался Shrinker, который вписался в лимит по размеру, но очень медленно выполнял распаковку.
Чтобы сделать ожидание не столь утомительным для пользователя, я добавил небольшой текст, отображаемый во время распаковки. В его качестве я использовал несколько измененную версию монолога из фильма «На игле» о выборе жизни:
Choose scene. Choose a platform. Choose coding, pixeling or composing. Choose a fucking big television, choose disk drives, hard drives, CD-ROMs and three button mice. Choose bad health, high cholesterol and bleary eyes.
Choose a cross compiler. Choose your elite boards. Choose leisure wear and matching mouse mats. Choose a mechanical keyboard on hire purchase in a range of fucking colours. Choose DYCP and wondering why the fuck you're awake on a Sunday midnight.
Choose sitting on that sofa, watching mind-blowing, spirit-lifting demos, stuffing junk food into your mouth. Choose gaining some skills at the end of it all, pouring your might into a majestic compo winner, listening to the roaring crowd as you finally hit the big leagues.
Choose your future. Choose scene.
Перевод:
Выбери сцену. Выбери платформу. Выбери написание кода, пиксельную графику или музыку. Выбери чертов огромный телевизор, дисководы, жесткие диски, CD-ROM и трехкнопочные мыши. Выбери плохое здоровье, высокое содержание холестерина и помутневший взгляд.
Выбери кросс-компилятор, топовые платы, домашнюю одежду и гармонирующий с ней коврик для мыши. Выбери механическую клавиатуру в рассрочку. Выбери DYCP (развитие креативности) и задайся вопросом, какого черта тебе не спится в полночь воскресенья.
Выбери диванную жизнь за просмотром крышесносных вдохновляющих роликов и поеданием нездоровой пищи. Выбери обрести в итоге всего этого нужные навыки и применить свое могущество для грандиозной победы в конкурсе, сопровождаемой громкими возгласами толпы по случаю твоего выхода в высшую лигу.
Выбери свое будущее. Выбери сцену.
Релиз
После всего этого оставалось лишь записать готовый бинарник на загрузочную дискету, создать ее образ ADF и отправить в конкурсную систему Revision.
Скриншот с соревнования!
Исходный код
Что касается исходного кода, то он ужасен, и я это говорю не из скромности. Именно так и получается, когда ты лихо прописываешь флаги и условия для анимаций спрайтов вплоть до последней минуты.
Порядок я в нем наводить не стал, но решил добавить несколько комментариев, примерно поясняющих, что вообще происходит.
Если вы умеете программировать, то можете смело тыкать пальцем и усмехаться. Если же нет, то ни в коем случае не ориентируйтесь на этот код в обучении.
Скачать здесь на свой страх и риск.
Заключение
Как я писал выше, техническим прорывом мой продукт назвать никак нельзя. Я не эксперт по ассемблеру, который умеет программировать микросхемы, добиваясь от них невероятных вещей. Мне просто нравится возиться с пикселями, анимациями и цветами, чем я в полной мере и занимался, реализуя Space Swap. Конечный результат мне понравился, а еще больше понравился сам веселый процесс его достижения.
Автор: Дмитрий Брайт