понедельник, 20 июня 2011 г.

Практическая обработка глубины резкости (Перевод) Часть 2

 

Эрл Хаммон,
Инфинити Уорд

28.4.3 Подход размытия
В Infinity Ward мы отдаем большее предпочтение качеству впечатлений пользователя, чем точному моделированию. Вот почему мы отказались от физических подходов при применении пятна рассеяния для близлежащих объектов. Вместо этого, мы решили ликвидировать все разрывы между сфокусированными объектами и несфокусированным передним планом с помощью грубого размытия. Нижнее правое изображение на рисунке 28-2 сравнивает этот метод с предыдущими подходами. Подход размытия, несомненно, имеет лучшее качество изображения, но он также является самым быстрым.
Мы применяем полноэкранный подход, который рассчитывает радиус пятна рассеяния для каждого пикселя переднего плана. Пиксели, которые находятся в фокусе или на заднем плане, используют CoC или ноль. Затем мы размываем CoC изображение для устранения любых границ. Мы используем гауссовское размытие, поскольку оно является вычислительно эффективным и дает удовлетворительные результаты. Мы также размываем CoC изображение одной четверти решения по каждой оси в качестве оптимизации, так что гауссовское размытие влияет только на одну шестнадцатую от общего числа пикселей в кадре.
Это само по себе не дает желаемых результатов для силуэта несфокусированного объекта. Если объект переднего плана максимально размыт, а задний объект не размыт полностью, то оба объекта будут размыты примерно на 50 процентов на их границе. Объект на переднем плане должен быть размыт на 100 процентов вдоль этой границы. Это выглядит не так плохо, как на предыдущих разрывах, однако это по-прежнему выглядит странно, когда размытие границы объекта на переднем плане изменяется в зависимости от объекта позади него.
Чтобы исправить это, мы измерили определенные пиксели, расположенные по обе стороны границы между CoC, которые имеют различные размеры, чтобы всегда использовать больше двух диаметров. Тем не менее, пиксел имеет множество соседних пикселов, и мы хотели бы избежать поиска всех соседних пикселов. Вместо этого, мы только вычислили CoC каждого пиксела, а затем использовали размытое CoC изображение, чтобы оценить CoC соседних пикселов.
Рассмотрим границу между двумя объектами, имеющими различные пятна рассеяния с диаметрами D 0 и D 1. Очевидно, в данном случае размытие диаметра D B определяется по формуле:
D B = clip_image001( D 0 + D 1 )
Это уравнение также дает точный диаметр размытия, когда градиент диаметра одинаков по обе стороны границы, а также для некоторых других случаев. Мы можем получить диаметр текущего пикселя D 0 и диаметр размытия D B за две текстурные инструкции. По ним мы оцениваем D 1 , решая предыдущее уравнение:
D 1 clip_image0022 D B - D 0
Таким образом, мы определяем наш новый диаметр пятна рассеяния D по уравнению:
D = max( D 0 , 2 D B - D 0 ) = 2 max( D 0 , D B ) - D 0
Пусть D 1 является наибольшим пятном рассеяния. Это уравнение будет плавно переходить от диаметра D 1 на границе двух областей к диаметру D 0 в пределах радиуса размытия внутри области 0. Это именно то, что мы хотим.
Максимальная функция является непрерывной, если ее входные сигналы непрерывны. D 0 фактически не является непрерывным. Эта функция была выбрана, чтобы быть непрерывной вдоль определенной прямой границы. Большинство границ совпадают, эти предположения допустимы в пределах радиуса размытия. Однако есть некоторые нежелательные разрывы, особенно в прямых углах, поэтому мы используем последнее небольшое размытие, чтобы устранить эту проблему.
Рисунки 28-3 и 28-4 иллюстрируют этот процесс, использованный на тестовом изображении. Каждая строка представляет собой отдельное тестовое изображение. Первая колонка является необработанным изображением, вторая колонка является изображением с фильтром, использованным без окончательного размытия. Третья колонка является окончательным результатом размытия. Белые пикселы на исходном изображении представляют максимальное пятно рассеяния; черные пиксели находятся в фокусе.
clip_image003
Рисунок 28-3 Расчет радиуса пятна рассеяния, использованный на некоторых тестовых изображениях
clip_image004
Рисунок 28-4 Увеличенная "W"
Первое изображение представляет собой простую черно-белую сцену. Визуально эти буквы находятся в пространстве очень близко к камере. Фильтр в целом работает хорошо, но есть еще несколько резких границ на углах букв, особенно в заглавной "I". Размытие изображения избавляет от жесткой границы. Оно по-прежнему оставляет градиент, но оно достаточно хорошо подходит для наших целей.
Вторая строка содержит небольшое гауссовское размытие первой строки изоражения до применения фильтра. Это приводит к четким контурам вокруг исходного изображения после применения фильтра. Окончательное размытие существенно уменьшает этот дефект, но не устраняет его полностью.
Заключительная строка содержит градиент исходного изображения. Это соответствует типичному случаю, когда объект постепенно удаляться. Радиус пятна рассеяния завышен в "минимумах" и занижен в “максимумах”, но он является непрерывным, и во второй колонке отсутствуют нежелательные дефекты. Окончательное размытие уменьшает этот дефект. Заметим, что градиент в тексте сохраняется.

28.5 Полный алгоритм

Наш полный алгоритм состоит из четырех этапов:
  1. Определить CoC для объектов на переднем плане.
  2. Размыть близлежащее CoC изображение.
  3. Расчитать CoC переднего плана размытого и неразмытого изображения.
  4. Применить к переднему и заднему плану CoC изображения в полноэкранном режиме размытие с переменной шириной.
28.5.1 Информация о глубине
Наш алгоритм реализуется с помощью DirectX 9 оборудования, которое не допускает чтения буфера глубины в качестве текстуры. Мы обошли это ограничение путем связывания с 32-битным буфером цвета в формате с плавающей точкой. Хотя мы не требуем полной 32-битной точности, мы выбрали этот формат, поскольку он является наименьшим общим знаменателем для всего нашего оборудования.
В шейдере мы аннулируем прозрачные пикселы для 1-битных текстур с использованием функции HLSL clip().
В вызове нашего метода "последующей обработки, которая может быть легко подключена к существующему процессору", мы предполагаем, что процессор уже генерирует эту информацию. Наш анализ технических характеристик также предполагает, что эта информация уже имеется в наличии.
28.5.2 Переменная ширина размытия

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

Два больших радиуса размытия рассчитаны на RGB каналах, в то же время сниженная CoC рассчитывается на альфа-канале. Самый малый радиус размытия находится с помощью пяти текстурных инструкций, в среднем составляет 17 пикселей в сетке 5x5, использованный шаблон на рисунке 28-5.
clip_image005
Рисунок 28-5 Пример позиций при малом размытии
Заметим, что центральный образец этого шаблона повторно использует текстурные инструкции для несфокусированного исходного цвета пиксела.
Это малое размытие имеет решающее значение для размытия близлежащего цвета. Мы также обнаружили, что простая линейная интерполяция дала лучшие результаты, чем полином сплайна, поскольку сплайны имеют склонность экстраполировать цвета некоторых пикселей.
28.5.3 Радиус пятна рассеяния

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

Тем не менее, мы вновь воспользуемя свободой в компьютерной симуляции, чтобы отказаться от физической достоверности в пользу художественной. Мы хотим, чтобы некоторый спектр глубины находился в фокусе с точными суммами до и после размытия. Неясно, каким образом перевести это в физические размеры камеры. Наилучший путь изменить это - кусочно-линейный график функции, как на рисунке 28-6. Художники установили ближний и дальний радиус размытия и начальные и конечные расстояния для каждого из трех регионов. Мы отменили размытие для любой области, которая имеет вырождающиеся значения яркости, поэтому художники могут размыть только передний или задний план, если они того пожелают.
clip_image006
Рисунок 28-6 График пятна рассеяния
На практике мы выбираем мировое ближнее конечное расстояние и мировое дальнее начальное расстояние, которое заключает все, что игрок найдет интересным. Затем мы устанавливаем мировое ближнее начальное расстояние, основанное на мировом ближнем конечном расстоянии. Подобным образом, мы установим мировое дальнее конечное расстояние, основанное на мировом дальнем начальном расстоянии.
28.5.4 Анализ оружия
Infinity Ward разрабатывает шутер игры от первого лица. Оружие игрока (вид модели) является очень важным в этих играх, поскольку оно всегда находится в поле зрения и является главным средством, с помощью которого игрок взаимодействует с окружающей средой. DOF параметры модели не имеют влияния на окружающую среду, в то время как DOF параметры близлежащей окружающей среде чрезмерно размывают оружие игрока.
Наше решение состоит в том, чтобы выделить отдельные параметры для размытия окружающей среды и оружия игрока. Это не имеет физического смысла, но дает лучшие впечатления игроку, возможно потому, что правильно передаются DOF эффекты, игрок сосредоточен на важных частях оружия или действиях в окружающей среде. Каждое оружие настраивает свои собственные ближние и дальние расстояния с отдельными значениями, используемыми, когда стрелок целится, и когда он или она держит оружие на бедре.
Для этого метода работы мы должны знать отношение каждого пикселя к оружию или окружающей среде. Наша информация глубины хранится в 32-битном формате c плавающей точкой. Использование отрицательных глубин оказалось наиболее удобным способом получения ценной информации. Обычный поиск требует независимого модификатора абсолютной величины. Это также приводит к эффективному сбору ближайшего пятна рассеяния. Мы можем одновременно рассчитать близлежащее CoC на 4 пиксела, используя одну инструкцию mad_sat. Мы рассчитываем близлежащее CoC для оружия и окружающей среды, и тогда мы получим соответствующий CoC для всех 4 пикселей с инструкцией min.
28.5.5 Листинг шейдера
Большая часть нашего алгоритма в листинге 28-1 используется для создания ближайшего пятна рассеяния, для того чтобы обеспечить непрерывность и мягкие границы объектов на переднем плане. Мы также хотим большой радиус гауссовского размытия, так что мы разделяем GPU вычисления на одновременные вычисления размытия сцены и близлежащего пятна рассеяния.
Мы определяем больший радиус размытия в пикселях на нормированном 480 разрешении, с тем, чтобы он не зависил от разрешения экрана. Тем не менее, два малых размытия основаны на разрешении экрана. Мы экспериментально установили, что 17-ое малое размытие соответствует 1,4 пикселям гауссовского размытия на родном разрешении, и среднее размытие соответствует 3,6 пикселям гауссовского размытия на родном разрешении.
Листинг приведён в следующей части перевода.

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

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