воскресенье, 19 июня 2011 г.

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


Исходная статья: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch28.html

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

28.1 Введение

В этой главе мы описываем алгоритм глубины резкости пространственного изображения, подходящий для игр от первого лица. В Infinity Ward мы гордимся богатыми графическими впечатлениями игроков. Для этого мы разработали метод для Call of Duty 4: Modern Warfare, который обеспечивает качественные функциональные возможности глубины резкости изображения на переднем плане и на заднем плане с минимальным воздействием на работу системы или машинную архитектуру. Наш метод требует аппаратного обеспечения с шейдерной моделью 2.0.

28.2 Проделанная работа

28.2.1 Обзор
Большая часть работы, начиная с Potmesil и Chakravarty 1981, создана для добавления глубины резкости к компьютерным изображениям. Demers (2004) в книге GPU Gems делит методы глубины резкости на эти пять классов:
  • методы трассировки лучей, которые направляют лучи из всей площади линзы
  • методы буфера накопления, которые смешивают изображения с нескольких точечных камер
  • методы композиции, которые соединяют несколько слоев с различными фокусными уровнями
  • методы прямо-отраженного z-буфера, которые рассеивают цвет пиксела с цветами соседних пикселов
  • методы обратно-отраженного z-буфера, которые собирают цвета соседних пикселов
Трассировка лучей, буфер накопления и композиция могут быть отнесены к методам “композиции”. Как Demers мы предпочитаем методы z-буфера (прямо-отраженного или обратно-отраженного). Как алгоритмы, основанные на анализе изображений, они особенно подходят для графических устройств. Кроме того, информация z-буфера полезна в других эффектах рендеринга, например, в мягких частицах, потому что она снижает стоимость получения глубины изображения. С другой стороны, методы композиции ограничены, потому что они не могут быть легко добавлены к существующему графическому процессору.
Методы Z-буфера часто используются для работы с набором независимых слоев вместо работы с единым изображением. Этот процесс может уменьшить дефекты от “кровотечения” и дать надлежащую видимость позади близлежащих полупрозрачных объектов.
28.2.2 Конкретные методы
Малдер и Ван Лири 2000 включают быстрый метод DoF, который разбивает оригинальное изображение на пикселы, находящиеся спереди и сзади фокальной плоскости. Они строят ряд размытых изображений из обоих наборов, каждый раз соединяя решения внахлестку. Наконец, они объединяют каждый из этих размытых уровней с исходной сценой, рисуя текстурированную плоскость на соответствующем расстоянии от камеры с тестированием глубины. Наш метод также смешивает размытые изображения с буфером кадра, но мы создаем их за меньшее количество шагов и применяем их к заключительному изображению. Мы достигаем более высокой эффективности, принимая больше дефектов от размытия изображения.
Демерс (2004) описывает метод собирающего z-буфера, который использует пятно рассеяния каждого пиксела (CoC) для смешения нескольких версий оригинального изображения. Наш метод наиболее близко соответствует этому, но мы также рассматриваем соседние пикселы, когда вычисляем CoC пиксела, чтобы наш метод также размывал объекты переднего плана.

Шейерманн (2004) описывает другой метод собирающего z-буфера, который использует фильтр Пуассона для экземпляра соседнего пиксела на основе своих собственных CoC. Он также использует глубину соседних пикселов, чтобы препятствовать смешению объектов переднего плана с несфокусированными объектами заднего плана. Этот метод хорошо работает при размытии отдаленных объектов, но это не распространяется на размытие изображений переднего плана.

Криванек и др. (2003) представляют метод рассеивающего z-буфера, использующий объекты, состоящие из точечных спрайтов, которые масштабируются на основе CoC. Они повышают производительность, используя более низкие уровни детализации для объектов, которые больше не находятся в фокусе. Это хороший метод для точечных спрайт моделей. Этот метод мог быть расширен для обработки рассмотрением каждого пиксела экрана как точечного спрайта, но такое действие непрактично в отношении вычислений.
Касс и др. (2006) достигают размытия изображения путем моделирования диффузии температуры, где размер пятна рассеяния соответствует "температуре" пиксела. Кроме того, они делят сцену на слои, чтобы изобразить объекты позади непрозрачного объекта переднего плана, который становится прозрачным, поскольку он является небольшим относительно апертуры камеры. Их метод достигает высокого качества при интерактивной работе со сценой, позволяющий художникам управлять параметрами DoF, используемыми позже в автономном режиме. Однако, этот метод слишком сложен при интенсивных вычислениях динамических сцен, которые должны быть предоставлены для каждого кадра.

28.3 Глубина резкости

Как теоретическое обоснование для нашего метода мы отталкиваемся от мнимой линзы, которая сосредотачивает поступающий свет на плоскости изображения. Эта линза характеризуется фокусным расстоянием и апертурой. Фокусное расстояние – расстояние от плоскости изображения до главного фокуса. Апертура - диаметр линзы, пропускающей свет. Уравнение тонкой линзы показывает отношение расстояния объекта до линзы u к расстоянию до линзы, которая имеет фокус v и фокусное расстояние f:

clip_image001
Геометрия простой линзы показана на рисунке 28-1. Радиус диафрагмы линзы равен D. Точка u o находится в фокусе для плоскости изображения, которая находится в v o . Точки u n или u f будут находится в фокусе, если плоскость изображения находится в v f или v n соответственно, обе точки нанесены на окружность диаметра с, плоскость изображения находится в v o . Эта окружность называется пятном рассеяния. Глубина резкости камеры – диапазон значений, для которых CoC является достаточно небольшим.
clip_image002
Рисунок 28-1 Пятно рассеяния для тонкой линзы
Используя подобные треугольники, мы обнаружим, что
clip_image003
Таким образом, для любой точки в пространстве p, фокус которой находится в v p, мы можем определить пятно рассеяния
clip_image004
Мы можем найти приближение тонкой линзы к v и заменить его в этом уравнении, чтобы найти диаметр пятна рассеяния для любой точки в пространстве как функцию от физических свойств камеры, как и в уравнении 1:
Уравнение 1
clip_image005
Мы в первую очередь заинтересованны качественными свойствами этого равнения для выражения ограниченной глубины резкости. В частности, мы отмечаем следующее:
  • А "точечная" модель камеры устанавливает d в 0. В этом случае, с всегда равно 0, так что каждая точка в пространстве всегда находится в фокусе. Любые большие значения d послужат причиной того, что части изображения не будут находиться в фокусе. Все реальные линзы, в том числе человеческий глаз, имеют D больше 0.
  • Существует верхняя граница диаметра пятна рассеяния для точек, находящихся за фокальной точкой.
  • Не существует более близкой верхней границы пятна рассеяния, чем фокальная точка.
  • Пятно рассеяния увеличивается намного быстрее на переднем плане, чем на заднем.

28.4 Эволюция алгоритма

Очевидно, что размытие объектов вблизи камеры имеет решающее значение для каких-либо алгоритмов глубины резкости. Наш алгоритм развивался через различные попытки размытия близлежащих объектов.
28.4.1 Первоначальный стохастический подход

Мы начали с метода, описанного Шейерманном в 2004. Мы рассчитываем пятно рассеяния для каждого пиксела и используем его при расширении выборки пуассоновского распределения исходного изображения. Как Шейерманн мы также измеряем глубину для каждой выборочной точки, отбраковывая слишком близкие к камере точки.

Это дает размытие объектов, находящихся за фокальной плоскостью. К сожалению, объекты, находящиеся перед фокальной плоскостью, по-прежнему имеют резкие силуэты. Ближайшие объекты не находятся в фокусе, они просто имеют низкокачественные текстуры. Эта плохая текстура снижает впечатления игрока, поэтому было бы лучше ограничить себя размытием удаленных объектов, чем использовать этот метод для размытия переднего плана.
Этот метод размытия объектов переднего плана представлен в правом верхнем углу изображения Рисунок 28-2. Заметим, что силуэт персонажа не изменился по отношению к изображению. Этот скриншот использует 33 выборочных положения для 66 текстурных инструкций на пиксел, но он все еще содержит дефекты, особенно в районе подбородка, ремешка, воротника и глаз. Это контрастирует с мягким силуэтом и гладким размытием в правом нижнем углу изображения.
clip_image006
Рисунок 28-2 персонаж, измененный различными методами DOF
28.4.2 Подход рассеивания и собирания
Мы рассмотрели проблему размытия фона, поэтому мы направили наши усилия на “кровотечение” размытых объектов переднего плана за пределами их силуэтов. Наш первый алгоритм делал сборку из соседних пикселей, в основном исходя из того, что каждый соседний пиксел имел CoC, который был таким же, как нынешний. Логично, что мы бы предпочли, чтобы каждый пиксель был размыт со своими соседями на основе своего собственного пятна рассеяния.
Это выборочного размера размытие является операцией рассеивания, которая не подходит для современных GPU. Мы инвертировали эту операцию рассеивания в операцию сбора поиском в окрестности каждого пикселя пикселей, которые рассеяны на него. Мы вновь делаем выборку с помощью распределения Пуассона, так как мы искали соседние пикселы, которые “кровоточат” на центральный пиксел, мы всегда должны использовать максимальное пятно рассеяния.
Мы нашли CoC для каждого соседнего экземпляра и рассчитали взвешенную сумму только тех экземпляров, которые дублируют этот пиксель. Каждый вес экземпляра был обратно пропорционален его площади. Мы нормализовали окончательное значение цвета делением на сумму всех использованных весов.
К сожалению, этот метод не соответствует вычислительным и визуальным требованиям. Мы заметили, что использование менее чем одной четвертой части пикселей максимально возможного пятна рассеяния приводит к безобразным дефектам. Метод рассчитывает до 24 выборочных точек с 2 текстурами, считывает максимальное пятно рассеяния 5 пикселей (диаметр будет равен 11 пикселям вместе с центральной точкой). Эти расходы могут быть уменьшены путем использования информации об известных соседних пикселах, чтобы разумно отобрать выборочные пикселы.
Тем не менее, мы оставили этот подход, поскольку он сохранил нежелательные разрывы между соседними несфокусированными пикселями и более отдаленными сфокусированными пикселями. Чтобы понять, почему это произошло, нужно рассмотреть границу между красными пикселями с большим CoC и синими пикселями в фокусе. На изображении, красные пиксели будут задевать синие пиксели, но не наоборот. Несфокусированный красный объект будет иметь резкий силуэт на фиолетовом фоне, который исчезает в синем, вместо ожидаевого нами непрерывного красно-фиолетово-синего перехода.
Еще две проблемы, связанные с этим методом, могут привести к нежелательному поведению. Во-первых, вес каждого пиксела должен плавно перейти к нулю по периметру окружности, без этого изображение всегда будет иметь разрывы, где радиус размытия изменяется. Во-вторых, пиксели не могут быть объединены с использованием простой нормализованной суммы их весов. Чтобы получить желаемое поведение, пиксели необходимо итерировать задом наперед, где цвет на данном шаге является переходом цвета на предыдущем шаге к текущему цвету пиксела, в зависимости от веса текущего пиксела. Эти два изменения делают метод равносильным по рендерингу отсортированных спрайтов глубины для каждого пикселя диаметром, равным CoC пикселя, последующей обработке Криванек 2003. К сожалению, они делают шейдер пикселя слишком дорогим. Даже при таком решении проблем, шейдер не может надлежащим образом прорисовать сцену за какими-нибудь объектами переднего плана, которые размыты до прозрачности.
Нижнее левое изображении Рисунка 28-2 сгенерировано этим методом с помощью 64 выборочных точек с радиусом 12 пикселей. Дополнительные экземпляры дают лучшее размытие персонажа, чем стохастический подход. Тем не менее, 64 выборочные точки все еще слишком малы для этого радиуса размытия, который приводит к дефектам, которые можно увидеть на антенне, шеи и шлеме. Заметим, что силуэт по-прежнему имеет жесткие границы с фоном; большее количество экземпляров это не устранит.

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

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