Как я пытался сделать подобие Datamosh-эффекта

По мотивам моей статьи о глитч-арте

Как я пытался сделать подобие Datamosh-эффекта

Привет. Это вторая часть моей статьи о моих похождениях в глитч-арт, но уже менее удачная, поэтому напишу её в личный блог.

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

Datamosh - особый подвид искажений, основанный на потерях данных в сжатом видео. В семействе стандартов MPEG есть свой собственный алгоритм сжатия видео, основанный на делении видео на особую последовательность I-кадров и P-кадров (ну и есть много разных модификаций, но это не очень важно в нашем случае). I-кадр отражает обычный кадр без какого либо сжатия. А P-кадр - это некоторая разница между текущим кадром и предыдущим I-кадром. То есть, если мы возьмём I-кадр, а потом наложим весь список изменений, заложенных в P-кадре, то получим новый кадр. Сам P-кадр при этом хранит минимальное количество данных.

Как я пытался сделать подобие Datamosh-эффекта

P-кадр хранит два типа информации. Первый - это появление новых цветовых данных на изображении. Например, если на картинке был только лес, а потом там появилась птица, то P-кадр будет хранить только координаты птицы и саму птицу. Второй же тип информации немного сложнее - это сдвиги старой информации. То есть, если у нас есть лес и птица, а потом птица куда-то полетела, то P-кадр будет хранить старые координаты птицы, новые координаты птицы, что появится на старом месте птицы, но не саму птицу.

Суть datamosh эффекта заключается в том, что мы берём сжатое видео и удаляем из него случайный I-кадр, чтобы информация с P-кадров в итоге накладывалась на предыдущее изображение. Например, если сначала у нас была сцена на улице, потом сцена в помещении, а потом у нас в помещении начал ходить человек, то мы можем взять и пропустить смену сцены с одной на другой так, что человек в итоге появится на улице из ниоткуда и начнёт по ней ходить, оставляя за собой чужеродный след.

Теперь посмотрите клип и соотнесите его с новыми знаниями

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

Да и к тому же, шейдер не имеет никакого доступа ко всем предыдущим кадрам. Я, конечно, могу их ему предоставить, но тогда придётся каждый раз их фоткать и передавать шейдеру кучу текстур. Мне представляется это потенциально очень плохой идеей.

Поэтому datamosh у меня будет кастрированный. Результат, которого я в итоге достиг, в принципе меня устраивает.

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

Результат можно увидеть ниже (на гифке моя неанонсированная игра):

Да, выглядит намного слабее оригинала, но тоже неплохо. Правда, эффект не затухает со временем, в отличии от datamosh. Поэтому с течением эффекта максимальный порог изменений снижается до 0, то есть чем дольше длится эффект, тем чувствительнее он к изменениям, тем больше информации поступает с текущего кадра, а не с исходного. Так эффект длится недолго и не раздражает, а только добавляет изюминки.

Если вдруг кому интересно, исходный код эффекта:

Как я пытался сделать подобие Datamosh-эффекта
99
1 комментарий

Сложно, но безумно интересно)

Ответить