Особенности моделирования света: Эффект "размытия" в движении
(Motion Blur)


Что такое Motion blur?

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

Почему это происходит?

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

Почему мы должны это учитывать?

За редкими исключениями вы можете найти примеры motion blur в любом фильме или телепрограмме. Однако очень вероятно, что вы даже не обратите внимания на этот эффект. Как и в случае со многими другими побочными эффектами фотографии, вы быстро заметите отсутствие привычных эффектов, в то время как их наличие просто дает вам ощущение реализма, хотя на сам эффект вы даже и не обращаете внимания.

Например, ставший столь популярным в последнее время эффект засвечивания линз (lens flare). В практике обычного фотографирования оператор всегда стремился уменьшить проявление этого побочного эффекта на фотоизображении, но с тех пор, как мы привыкли считать его атрибутом реализма, многие программисты стали имитировать его в своих программах. Подобная ситуация повторяется и с другими побочными эффектами — зернистость пленки, дрожание камеры, установленной на вертолете, эффекты фокусировки и многие др.

Взгляните на некоторые компьютерные анимации, в которых не применен эффект программный или аппаратный motion blur — движение в этом случае выглядит дерганным и очень нереалистичным. Вы также можете заметить этот эффект в случае с телевизионным обозрением спортивных событий. Обычная камера фиксирует 25 кадров в секунду. Специализированная, спортивная камера способна фиксировать до 1000 кадров в секунду. Тем не менее при телевещании в телесигнал вставляется только малая часть из этой последовательности, эффект motion blur заметно уменьшается, и при просмотре подобных роликов быстро движущийся объект мерцает.

Мы так привыкли к размазыванию изображения скоростных объектов на экране телевизора или в кино, что просмотр анимаций без этого эффекта вызывает чувство нереалистичности.

Четко отрисовываемое изображение в каждом кадре компьютерной анимации ведет к полному отсутствию эффекта motion blur, что, в свою очередь, приводит к потере реалистичности сцены. Поэтому без принятия специальных мер по имитации motion blur мы не сможем отобразить максимально правдоподобную сцену с движением объектов.

Более того, изображение с эффектом motion blur несет в себе несколько больше нужной для нашего мозга информации. Сравните два рисунка:

  

Это две совершенно одинаковых сцены, только одна отрендерена для случая, когда камера двигается вперед, а вторая — для движения камеры влево. Наверное, вы сразу поймете, где какой рисунок. :) При просмотре анимации ваш мозг получает эту дополнительную информацию о размытости, смена кадров представляется плавной, и, как результат, мы получаем значительно более реалистичную имитацию движения.

Поподробнее…

Хорошо, тогда давайте для начала рассмотрим, как работает кинокамера.

Основные элементы кинокамеры это:

  • Объектив — содержит линзы, обеспечивающие необходимое фокусное расстояние.
  • Затвор — открывается и закрывается на очень непродолжительное время с частотой 25 раз в секунду.
  • Кинопленка — имеет специальное светочувствительное покрытие.


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

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

Как только затвор закроется, пленка продвинется немного вниз, готовя следующий участок поверхности к формированию очередного кадра. Этот процесс повторяется многократно в процессе всей киносъемки.

А теперь произведем съемку того же шарика, только теперь он будет быстро двигаться в направлении стрелки.

Затвор открывается, и пленка начинает регистрировать свет от движущегося шарика. Процесс очень напоминает предыдущий, но теперь изображение шарика на пленке будет терять четкость и выглядеть размытым. Это размытость движения, или motion blur.

Можно поспорить, что если вы рассмотрите один любой из сформированных кадров, вы с точностью определите, что шарик двигается горизонтально. И все потому, что изображение с эффектом motion blur несет больше информации, чем изображение без него.

Имитация эффекта Motion Blur на изображениях

1. Пространственный (spatial) anti-aliasing

В общем смысле аnti-aliasing — это специальная технология по снижению видимости побочных эффектов дискретного (цифрового) преобразования. Вариантов проявления этих побочных эффектов (aliasing) много, например: проявление ступенчатости на прямых, расположенных под углами, отличными от 90 градусов, появление паразитных муаров на изображениях формата JPEG и т.д. Все эти проявления возникают в местах резкой смены информационного наполнения потока данных (например, резкие цветовые и яркостные переходы) и объясняются недостаточной частотой дискретизации.

Вероятно, вы уже знакомы с одним их вариантов реализации anti-alising на изображениях — это super sampling. Super sampling подразумевает собой рендеринг изображения в несколько раз большего, чем нам необходимо, а затем уменьшения его до нужного нам размера при усреднении цветности групп близлежащих пикселей в один.

Мы рассмотрим процесс создания изображения с super sampling anti-aliasing, потому что процедура создания motion blur очень его напоминает.

Для примера создадим изображение кольца размерностью 50х50 пикселей.

Для начала нам необходимо изображение с бОльшим количеством пикселей

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






Поделим изображение

Теперь представим, что мы разрезаем изображение на мелкие кусочки. Так как это изображение в 4 раза больше, то размер маленького кусочка выберем 4 х 4 пикселя






Усреднение

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






Уменьшение размера (Resize)

А теперь уменьшим полученное изображение до нужных нам размеров в 50 х 50 пикселей.

На полученном изображении (визуально) все переходы плавные, и мы едва ли сможем заметить ступенчатость изображения.



Motion blur или Temporal anti-aliasing (Переходное сглаживание)

   

   

Для получения motion blur нужно проделать операции, подобные описанным выше. Метод для сглаживания готовых изображений называется spatial anti-aliasing, что означает сглаживание всего изображения. А метод, применяемый для motion blur, называется temporal anti-aliasing, означающий сглаживание переходных процессов во времени.

Суть производимых операций остается одинаковой.

a. Создаем избыточное количество кадров

Подобно тому, как мы раньше делали более крупное изображение, здесь мы произведем большее количество кадров. Например, для финальной анимации длительностью в 4 секунды нам нужно 100 кадров. Поэтому мы первоначально создадим в 4 раза больше кадров для тех же 4 секунд анимации, т.е. 400. (просто произведем съемку с повышенной частотой 100 кадров в секунду)

б. Поделим анимацию

Просто разделим последовательную анимацию на группы по 4 кадра.

в. Усреднение

Внутри каждой группы кадров произведем смешивание кадров в один.

г. Составим новую анимацию из этих кадров

Все сделано. У нас останется ровно 100 кадров для 4 секунд просмотра. Как раз то, что нам нужно, но теперь на каждом кадре будет иметь место переходное сглаживание (motion blur).

Особенности программирования motion blur

Итак, вы готовы использовать motion blur в своем проекте. Насколько точно его моделировать? Ответ — все зависит от поставленных задач.

Осуществление полномасштабного motion blur в реальном времени — это очень трудная задача. Вы должны суметь в несколько раз увеличить скорость вывода на экран (framerate), и для подавляющего большинства приложений единственный способ достичь этого — это существенное снижение детализации. Во многих случаях это просто неприемлемо.

В некоторых компьютерных играх motion blur реализуется путем соединения текущего кадра с предыдущими таким образом, чтобы предыдущие кадры оставались видимыми в течение некоторого, короткого промежутка времени. Это не является motion blur в принципе, выглядит очень неуклюже и просто отнимает драгоценное процессорное время.

Корректная реализация
motion blur
Неправильная реализация
motion blur

Вероятно, за счет снижения уровня детализации, вы сможете достичь приемлемого motion blur, но чаще всего немного motion blur вы все же сможете добавить без существенных жертв. Вы можете обеспечить эффектом motion blur только объекты с самой большой скоростью перемещения. Более того, вы можете пойти на некоторые ухищрения, чтобы сымитировать motion blur. Например, разлетающиеся частички раскаленного вещества в месте взрыва можно рендерить в виде коротких линий, а не в виде точек. Это создаст впечатление motion blur. То же самое можно отнести и к процессу визуализации водопадов и выстрелов из оружия. Часто, когда играешь в автосимуляторы, можно к огорчению заметить, что вращение колес автомобиля выглядит очень неестественно. Колеса автомобиля вращаются с такой бешеной скоростью, что какие-либо детали обода и покрышек просто не должны быть различимы. (Взгляните на колеса мчащихся автомобилей в NFS III или IV. Их неестественное движение очень портит вид. В этом отношении очень реалистично выглядят модели в авиасимуляторе Viper Racing, например) Очень удобным решением в этом случае может быть предварительная подготовка нескольких текстур колес, просчитанных с различным количеством переходного сглаживания. И по мере все более и более быстрого вращения колес использовать все более и более "размытые" текстуры. Это не отнимет много времени у процессора. Такой же подход необходим и к текстуре дороги. Это значительно прибавит реализма игре при небольшом влиянии на производительность в целом.

Если же вы подготавливаете анимацию заранее, и она не будет просчитываться в реальном игровом времени, тогда вам определенно стоит потратить некоторое время на реализацию motion blur в своем проекте. Это особенно важно, если вы визуализируете быстро перемещающиеся объекты. Однако, опять же, все зависит от тех целей, которых вы хотите достигнуть. Например, если вам жизненно необходимо иметь возможность делать четкие стоп- кадры из анимации, то вам, наверное, следует оказаться от применения motion blur; но в этом случае вы должны представлять, что сама анимация будет выглядеть несколько дергано, и у зрителя создастся впечатление мерцания.

Motion blur Demo

Вы можете загрузить себе на компьютер и просмотреть программу демонстрации эффекта motion blur отсюда: motion.zip.

Программа имеет следующие клавиши управления:

  • S: Toggle slow motion (медленное движение, Вкл/Выкл)
  • M: Toggle between correct and false motion blur (Неправильный motion blur, Вкл/Выкл)
  • 3: Toggle Red/Blue 3D mode (Красный/Синий режим 3D, Вкл/Выкл)
  • up/down arrows: more/less motion blur accuracy (Точность реализации motion blur)
  • left/right arrows: adjust background brightness (Яркость фона)
  • ESC: quit (Выход)


Пример анимации с применением motion blur

Каждый кадр этой анимации был изготовлен при помощи Terragen

Spatial и Temporal anti-aliasing (motion blur) наложены с помощью Bitty

Окончательная анимация и объединение кадров в последовательность были произведены при помощи Bink!

Вам необходим Bink Player для просмотра этой анимации.

  • Формат: Bink (*.BIK)
  • Разрешение: 320 × 240 pix
  • Кол-во кадров: 160
  • Скорость вывода (FPS): 25 кадров/сек
  • Размер файла: 1379 кбайт


[ Читайте по этой теме: Просчет теней ]



Материал для данной статьи любезно предоставил Hugo Elias




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.