Среди многочисленных демосценерских конкурсов, которые традиционно входят в программу различных demo party, незаслуженно недооценённым, на мой взгляд, является конкурс процедурной графики (procedural graphics). Смысл этого специфического вида компьютерного творчества - формирование статичного изображения при помощи короткой программы. Стандартные ограничения на размер — 4кб, 1кб, 256 байт.
Связана недооценка, думаю, с тем, что конкурс одновременно не вполне понятен как тем, кто любит демки (поскольку процедурная графика статична), так и тем, кто любит картинки (т.к. процедурная графика не позволяет нарисовать что хочешь). И всё же, его популярность хоть и медленно, но растёт.
Первые работы во многом были вызваны интересом к теме трассировки лучей (raytracing). Сам по себе алгоритм довольно простой, но требует много вычислений, поэтому работы стали возможны, когда распространились компьютеры с, во‑первых, достаточно высокой производительностью и, во‑вторых, с достаточным количеством отображаемых цветов (или, хотя бы, градаций серого). Я порылся на pouet и нашёл одну из первых работ в категории «procedural graphics» — Digital Phantasy by EG:
Эта 1кб работа под DOS вышла в 1997 году. Помню, в том же году мы с друзьями развлекались написанием простых программ для raytracing'a блестящих шариков на IBM PS/2 Model 30 286 с монохромным MCGA монитором. Совпадение по времени не случайно, на raytracing тогда вообще была мода — в рекламе компьютеров и мониторов часто можно было видеть подобные изображения.
Другой темой, популярность которой стала расти немного позднее, были фракталы. Скажем, вот 2-million‑Polys‑and‑some‑Moonlight by Apocalypse Inc (4кб, 2005 год, PC/Windows):
или Versus 4k by Fulcrum (4кб, 2008 год, PC/Windows):
Довольно впечатляющие, хоть и схематичные изображения можно получить даже просто кривыми — Blacklines by Calodox (4кб, 2007 год, PC/Windows):
И конечно, удобными объектами для визуализации являются те, которые содержат повторяющиеся элементы Klava by Quite & Youth Uprising (4kb, 2008 год, PC/Windows):
Из-за низкой скорости вычислений, формирования сложных реалистичных изображений поначалу приходилось ждать довольно долго. Однако, с ростом производительности компьютеров и возможностей видеокарт стали появляться намного более сложные и реалистичные работы. К примеру, в 2022 году 4кб работа Orders of Magnitude by Bitshifters Collective (PC, Windows) выглядела так (обратите внимание на текстуры и мелкие детали):
Можно сочетать сразу несколько подходов - разные геометрические примитивы, их повторение, искажение. А потом ещё и применить raymarching. Hoody by Rgba (4кб, 2020 год, PC/Windows):
Или вот I felt the earth breathing by Quite, тоже 4кб для PC/Windows (2009 год):
Фактически, работы занимающие единицы килобайт, становятся неотличимы от фотографий — RiverScape by Razor 1911 (4кб, 2023 год, PC/Windows):
Существует масса алгоритмов, которые могут быть использованы при создании интересных изображений — помимо упомянутых, это l-systems, генетические алгоритмы, metaballs, шум Перлина, диаграммы Вороного и другие.
Как и в случае с демками, у процедурной графики параллельно с прогрессом в плане реалистичности и качества изображения можно наблюдать и другую тенденцию, когда люди пытались и пытаются изобразить что-то совсем уж ограниченными средствами и на компьютерах, которые на момент создания работы уже устарели (и даже не всегда предназначены для показа изображений). К примеру, сравнительно свежая (2022) работа Necropolis 3071 a.d. by Haujobb под PC/DOS, занимающая всего лишь 256 байт:
А вот и вовсе работа для ZX Spectrum (Northern sunset s!lence by bfox), тоже занимающая 256 байт. Как видим, если цветов мало — можно, во‑первых, имитировать их большее, чем есть, количество, а во‑вторых, показывать лишь силуэт:
Другой подход — использование уже имеющихся в ПЗУ символов знакогенератора, как например в 4кб работе Unfall beim Bügeln by Metalvotze для Commodore 64 (используются символы PETSCII):
В работе Inanna by DreamWeb (4кб, Commodore Amiga, 2023 год) мы видим не просто схематичный рисунок, но сама схематичность стала идеей — летающие треугольники подчеркивают «нормальность» того, что изображение само состоит из полигонов:
Что можно запихнуть в 256 байт (работа Planet by Desire) на Apple II с крайне примитивной графикой? Ну, определённо космос — он же по большей части чёрный:
В целом суть в игре на аппаратных особенностях — на одном компьютере вы получите выигрыш от большого количества цветов или их имитации градиентом (Commodore Amiga, C64). На другом можно рисовать идеально гладкие кривые без всяких синусов (Vectrex). На третьем — использовать видеопроцессор для рисования полигонов (Sony Playstation 1) и т.д.
При этом у каждой из этих платформ есть также и свои недостатки — скажем, у RISC процессоров это большой объём кода, у ZX Spectrum или старых PC — отсутствие аппаратной поддержки рисования примитивов, у компьютеров с векторным устройством отображения — сложность сплошной заливки области и т. д.
Везде получается игра с возможностями и ограничениями. Для старых платформ ограничение размера в конкурсе процедурной графики обычно не более 1кб, поскольку в 4кб на некоторых платформах можно легко поместить готовую картинку даже без сжатия — т. е. теряется смысл конкурса. Кстати, пара работ из тех, что показаны выше — была представлена на Chaos Constructions в Питере. В этом году он проводится снова (24–25 августа в ДК Кирова) и мне, как автору одной из двух уже поданных туда (конкретно на procedural graphics) работ, хочется больше конкуренции. Приглашаю поучаствовать!
Большой вопрос во всей истории с процедурной графикой — где проходит черта между ней и обычной распаковкой сжатого изображения? Почему нельзя считать комбинацию из jpeg+распаковщик процедурной графикой? Чёткой границы конечно нет. С одной стороны, авторам просто нет особого смысла обманывать (да и всё равно рано или поздно, если работа станет известной, кто‑то это раскопает), с другой — упаковать качественное реалистичное изображение высокого разрешения в 4кб — весьма проблематично. Во многом ситуация тут схожа с запретом чистой анимации в демках.
В качестве иллюстрации — работа для Atari XE/XL, что называется, «на грани» с распаковкой — Mona by Ilmenit. Здесь в 256 байт умята Мона Лиза. Исходные данные для «мазков» были подобраны, фактически, перебором — за несколько дней работы мощного компьютера:
Комментарии (19)
haqreu
12.07.2024 18:57+5На самом деле, 4кб звучит здорово, а потом узнаешь, что можно линковать opengl и всякое другое, и резко становится неинтересно...
frog Автор
12.07.2024 18:57+4Вот в том числе по подобным причинам я лично предпочитаю старые платформы
haqreu
12.07.2024 18:57+19Для самостоятельного творчества старые платформы малодоступны, а эмуляторы неинтересны.
Я в последнее время развлекаюсь графикой в текстовой консоли при помощи эскейп-последовательностей.
73 строчки голого си:
Wesha
12.07.2024 18:57+773 строчки голого си
В студию!
haqreu
12.07.2024 18:57+20https://github.com/ssloy/tinycompiler/blob/main/test-programs/gfx/race.c
Там рядом и другая мелочь есть.
Dimsml
12.07.2024 18:57Эх, помнится 10 лет назад на Хабре все дружно писали маленькие приложения в 40 строк что ли.
Спасибо за ностальгию!
checkpoint
12.07.2024 18:57Офигенно круто! Но под фрей в видеотерминале (ttyv) почему-то не работает - отображает всякий мусор.
haqreu
12.07.2024 18:57+1Вот 256 байт apple ii (насколько я помню, там умножения в ассемблере не было) и Мона Лиза для атари - это круто!
ImagineTables
12.07.2024 18:57+7Очень смешно. 99% программистов, даже если им прилинковать все API в мире, да даже если снять ограничения на размер, такую дискету не нарисуют.
Я один из них, и особо не стесняюсь признаться. У меня мозги под это не заточены. Когда я вижу процедурную генерацию, то думаю, каким софтом заскалптить и отрендерить эту картинку, чтобы запихать в ресурсы (в наши дни, когда мы писали игры, то ценилось умение найти, что из рантайма ещё можно вычислить в дизайнтайме). Тем не менее, я увОжаю любое искусство... А это, безусловно, настоящее искусство!
haqreu
12.07.2024 18:57+7На самом деле, вы просто мало с графикой сталкивались. Там две с половиной техники в подавляющем большинстве случаев. Inigo Quilez, конечно, в этом мире один (создатель shadertoy и автор вон той девочки в капюшоне). Но его техники лично меня оставляют равнодушным, очень здорово, но нет там искры.
А вот этот бублик гениален:
https://github.com/BrunoLevy/TinyPrograms/blob/main/donut.c
Отрисовка квадрик в целочисленной арифметике - это огонь.
haqreu
12.07.2024 18:57+9На всякий случай ссылка на объяснение работы бублика (ну и собственно, анимация там тоже есть для тех, кому лень компилировать код)
perfect_genius
12.07.2024 18:57Надеюсь, в ближайшем будущем подобным начнёт удивлять нейросеть. Т.е. будет конкурировать с людьми и даже превзойдёт.
Wesha
12.07.2024 18:57+1Надеюсь, в ближайшем будущем подобным начнёт удивлять нейросеть.
Как бы помягче сказать...
RolexStrider
12.07.2024 18:57+6https://www.youtube.com/watch?v=G1Q9LtnnE4w - вот это было, есть и будет для меня эталоном. Графика, музыка, полноценный 3D-движок, ВЕСЬ контент генерируется процедурно, никаких зависимостей. Чистый DOS. 4K.
qiper
Идеальный архиватор - реализующий нечто подобное, но в обратную сторону)