Глубина резкости в компьютерной графике

http://www.cs.berkeley.edu/~barsky/Blur/survey.pdf
  • Перевод
DoFВ отличии от человеческого глаза, компьютер рендерит всю сцену в фокусе. И камера, и глаз же имеют ограниченную глубину резкости вследствие конечного диаметра апертуры зрачка или объектива. Для достижения большего фотореализма рекомендуется использовать эффект глубины резкости в изображениях, получаемых на компьютере. Кроме того, управление глубиной резкости помогает раскрыть художественный замысел автора, выделив важный по смыслу объект.
До сих пор задача изображения реалистичной глубины резкости в компьютерной графике полностью не решена. Существует множество решений, обладающих плюсами и минусами, применимых в разных случаях. Мы рассмотрим самые популярные на сегодняшний момент.

В оптике

Свет, преломляясь в линзе, формирует изображение на светочувствительном элементе: плёнка, матрица, сетчатка. Чтобы света в камеру проникло достаточное количество, входная апертура (диаметр светового пучка на входе в оптическую систему) должна быть достаточного размера. Лучи от одной точки в пространстве всегда сходятся ровно в одну точку за линзой, но эта точка не обязательно совпадает с выбранной картинной плоскостью (полскостью сенсора). Поэтому изображения имеют ограниченную глубину резкости — то есть, объекты будут тем более размытыми, чем больше разница расстояния от объекта до линзы и фокусного расстояния. В результате, точку, находящуюся на определённом расстоянии, мы увидим как размытое пятно: пятно рассеяния (Circle of Confusion, CoC). Радиус размытия вычисляется по определённому закону:
Blur disk diameter formula
Определение диаметра размытия (более подробно см. в Википедии).

Методы, применяемые в рендерерах, используют модель камеры-пинхола (в которой входная апертура → 0, а следовательно, все объекты будут в фокусе). Симуляция апертуры конечного размера и, следовательно, глубины резкости, требует дополнительных усилий.

CoC
Точка в сцене проецируется на картинную плоскость в виде пятна рассеяния.

Общий обзор

Способы реализации глубины резкости можно разделить на две большие группы: методы пространства объектов (object space) и методы пространства изображения (image space).

Методы пространства объектов работают с 3D-представлением объектов сцены и таким образом применяются во время рендера. Методы пространства изображения, также известные как методы постобработки (postprocess), оперируют с растровыми изображениями, полученными при помощи стандартной модели камеры-пинхола (полностью в фокусе). Для достижения эффекта глубины резкости эти методы размывают участки изображения, учитывая карту глубины (depth map). Вообще, методы пространства объектов способны выдать более физически точный результат и обладают меньшим числом артефактов, нежели методы пространства изображения, в то время как методы пространства изображения значительно быстрее.
Методы пространства объектов бывают основаны или на геометрической оптике, или на волновой оптике. В большинстве приложений используется геометрическая оптика, чего достаточно для достижения подавляющего большинства целей. Однако в расфокусированных изображениях не последнюю роль могут играть дифракция и интерференция; для их учёта и необходимо применять законы волновой оптики.

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

Методы пространства объектов (object space approaches)


Распределённая трассировка лучей (distributed ray tracing)

Метод напрямую симулирует геометрическую оптику. Вместо трассировки одного луча на семпл (в оригинале — пиксель, но я счёл это неуместным, т.к. количество просчитанных лучей будет изменяться в зависимости от настроек AA и редко когда равняется одному пикселю), что симулирует камеру-пинхол, надо выбрать несколько лучей, чтобы получить аналог изображения, полученного на камеру с конечной апертурой. Лучи для каждого семпла исходят из одной точки на картинной плоскости, но направлены в разные участки линзы. После преломления линзой луч испускается в сцену.

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

Метод реализован в шейдере mia_lens_bokeh:
// параметры шейдера
struct depth_of_field {
    miScalar focus_plane_distance;
    miScalar blur_radius;
    miInteger number_of_samples;
};

miBoolean depth_of_field (
    miColor *result, miState *state, struct depth_of_field *params )
{
    // получаем параметры
    miScalar focus_plane_distance = *mi_eval_scalar(&params->focus_plane_distance);
    miScalar blur_radius = *mi_eval_scalar(&params->blur_radius);
    miUint number_of_samples = *mi_eval_integer(&params->number_of_samples);

    miVector camera_origin, camera_direction, origin, direction, focus_point;
    double samples[2], focus_plane_z;
    int sample_number = 0;
    miColor sum = {0,0,0,0}, single_trace;

    // переводим в другую систему координат
    miaux_to_camera_space(state, &camera_origin, &camera_direction);

    // ищем точку пересечения
    focus_plane_z = state->org.z - focus_plane_distance;
    miaux_z_plane_intersect(&focus_point, &camera_origin, &camera_direction, focus_plane_z);

    // считаем заданное количество семплов
    while (mi_sample(samples, &sample_number, state, 2, &number_of_samples)) {
        miaux_sample_point_within_radius(&origin, &camera_origin, samples[0], samples[1], blur_radius);
        mi_vector_sub(&direction, &focus_point, &origin);
        mi_vector_normalize(&direction);
        miaux_from_camera_space(state, &origin, &direction);
        mi_trace_eye(&single_trace, state, &origin, &direction);
        miaux_add_color(&sum, &single_trace);
    }
    // нормализуем результат
    miaux_divide_color(result, &sum, number_of_samples);
    return miTRUE;
}

DoF shader
Результат применения шейдера (код взят из мануала mental ray, картинка оттуда же).

Реалистичные модели камеры (realistic camera models)

В предыдущем методе преломнелие в линзе рассчитывалось по одному закону. Однако же, это не всегда так. Объективы состоят из групп линз, обладающих разными свойствами:
Lens model
Группы линз в объективе (картинка Pat Hanrahan).

Оптические спецификации объектива, предоставляемые производителями, корректно реализуются в виде математической модели. Модель включает в себя симуляцию групп линз и предоставляет также модель выходного отверстия (в пределах которого рендерер будет испускать лучи для одного семпла). Попадающие в выходное отверстие лучи просчитываются, учитывая оптические свойства групп линз, через которое они проходят.

Метод позволяет физически корректно симулировать как глубину резкости, так и искажения, вносимые линзой.
Different lens models
Объективы с разным фокусным расстоянием: с изменением фокусного расстояния и модели линзы меняется перспектива и могут появляться искажения (например, как на верхней картинке) — картинка Pat Hanrahan.

Пример шейдера, реализующего объектив-фишай:
struct fisheye {
    miColor outside_color;
};

miBoolean fisheye (miColor *result, miState *state, struct fisheye *params )
{
    miVector camera_direction;
    miScalar center_x = state->camera->x_resolution / 2.0;
    miScalar center_y = state->camera->y_resolution / 2.0;
    miScalar radius = center_x < center_y ? center_x : center_y;
    miScalar distance_from_center = miaux_distance(center_x, center_y, state->raster_x, state->raster_y);

    if (distance_from_center < radius) {
        mi_vector_to_camera(state, &camera_direction, &state->dir);
        camera_direction.z *= miaux_fit(distance_from_center, 0, radius, 1, 0);
        mi_vector_normalize(&camera_direction);
        mi_vector_from_camera(state, &camera_direction, &camera_direction);
        return mi_trace_eye(result, state, &state->org, &camera_direction);
    } else {
        *result = *mi_eval_color(&params->outside_color);
        return miTRUE;
    }
}

Fish eye
Результат применения шейдера (код взят из мануала mental ray, картинка оттуда же).

Буфер накопления (accumulation buffer)

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

Симуляция распространения волн (wawe propagation)

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

Разброс (splatting) [Krivanek]

При рендере сцена представляется не как набор геометрических примитивов с текстурами, а в виде набора точек. Точки разбрасываются по определённому закону, чаще всего по Гауссовскому. Для достижения большей скорости, при разбросе точек используется операция свёртки, учитывающая функцию размытия точки (point spread function, PSF). В случае размытия по Гауссу, параметром PSF является стандартное отклонение.

Полученные точки хранятся в дереве и при выборе точки из размытой области поиск производится в определённом радиусе. Это позволяет просчитывать меньшее количество семплов в расфокусированных областях изображения.

Логично предположить, что довольно жёстким ограничением метода является возможность представления сцены в требуемом виде.
Splatting
Изображение, полученное методом разброса. В размытых областях плотность семплирования меньше (картинка Jaroslav Krivanek).

Аналитическая видимость (analytical visibility) [Catmull]

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

Методы пространства изображения (image-space approaches)


Идеальный метод постобработки должен обладать следующими свойствами:
  • Выбор функции разброса точки (point spread function, PSF)
    Вид размытия зависит от PSF, определяющей, какое пятно рассеяния мы получим от одной точки. Так как в разных оптических системах данная характеристика будет разной, хороший метод должен позволять выбрать вид PSF.
    PSF choice
    Разные PSF позволяют получить разный характер размытия.
  • Попиксельный контроль над размытием
    В каждой точке изображения размер и характер пятна рассеяния отличается. Обычно методы пост-обработки не позволяют изменять характер размытия в зависимости от положения точки. Это обусловлено ещё и тем, что часто в методах используются или сепарабельные фильтры, или преобразование Фурье, что делает подобный выбор затруднительным для реализации.
    PSF transformation
    На первом изображении PSF одинаковая; на втором меняется, что более точно симулирует Гелиос-44 особенности некоторых линз.
  • Отсутствие артефактов нехватки интенсивности (intensity leakage artifacts)
    Размытый объект на заднем плане никогда не заходит за границы объекта в фокусе. Однако примитивные линейные фильтры могут не учитывать этот факт; проявляемые в результате этой ошибки артефакты нехватки интенсивности уменьшают реалистичность изображения.

    На изображении зелёная фигура в фокусе, следовательно, размытие объекта на заднем плане не должно распространяться на её.
  • Отсутствие артефактов, обусловленных ненепрервыной глубиной (depth discontinuity artifacts)
    В реальности размытие объекта на переднем плане будет мягким, у объекта не будет видимого жёсткого контура. Часто фильтры размывают объект так, что он одновременно имеет и размытие, и силуэт, что неправильно. Такое поведение обусловлено особенностями сглаживания карты глубины, в результате чего на границе объекта глубина меняется ступенчато (и получается, что на краю объекта, как и за его пределами, пиксели смешанных цветов).
    Depth discontinuity artifact
    Результат применения разных фильтров. Из-за того, что изображение (beauty map) сглажено, а карта глубины (depth map) — нет, могут возникнуть подобные артефакты.
  • Корректная симуляция частичного пересечения объектов (partial occlusion)
    В реальности у расфокусированных объектов на переднем плавно размытые границы, через которые видно объекты, находящиеся сзади. Этот эффект называется частичным пересечением, потому что задний объект только частично заблокирован передним. Эти видимые участки объекта на заднем плане мы бы не смогли увидеть, если бы мы смотрели через камеру-пинхол. Геометрическое объяснение эффекта см. на рисунке. Т.к. методы постобработки работают с изображениями, полученными на камеру-пинхол, симуляция частичного пересечения — сложная задача: цвет невидимых точек надо экстраполировать по имеющимся данным.
    Partial occlusion
    Частичное пересечение объектов (картинка Barsky).
  • Высокая производительность
    Производительность фильтров, применяемых «напрямую» в пространстве изображения (имеется в виду самая простая реализация фильтра), падает с ростом радиуса размытия. Для больших радиусов процесс может длиться несколько минут. В идеале хочется, чтобы фильтр можно было применять в реальном времени, что не всегда возможно.


Линейная фильтрация (linear filtering) [Potmesil и Chakravarty]

Один из первых методов получения DoF на этапе постобработки. В зависимости от глубины точки (определяется по карте глубины) меняются параметры функции размытия (PSF). Чем больше радиус PSF, тем более низкая производительность фильтра. Фильтр можно выразить формулой:
Linear filter formula
где B — размытое изображение, psf — ядро фильтра, x и y — координаты в выходном изображении, S — исходное изображение, i и j — координаты во входном изображении.

PSF может в некотором смысле учитывать оптические эффекты, такие как дифракцию и интерференцию. Недостатки метода: нехватка интенсивности, ненепрерывная глубина.

Буфер распределения лучей (ray distribution buffer) [Shinya]

В методе предлагается учитывать видимость объектов, тем самым мы можем избавиться от нехватки интенсивности. Вместо создания размытого изображения, сначала для каждой точки создаётся буфер распределения лучей, исходящих из неё. В такой буфер входят возможные координаты, в какие может прийти свет от точки, с глубиной. После просчёта буферов распределения лучей для всех точек вычисляется среднее значение цвета. Метод работает с видимостью объектов достаточно корректно, но требует больше памяти и вычислений, в сравнении с линейной фильтрацией. Заметим, что набор карт, полученных методом RDB, называется световым полем (light field).

Послойная глубина резкости (layered DoF) [Scofield]

Метод предназначен для частного случая расположения объектов: объекты должны быть параллельны картинной плоскости. Объекты делятся на слои, слои размывается по отдельности в частотном домене (используя быстрое преобразование Фурье). FFT позволяет использовать PSF больших радиусов без влияния на производительность. Метод не имеет недостатка нехватки интенсивности и работает очень быстро, но область его применения сильно ограничена.

Пересечение и дискретизация (occlusion and discretization) [Barsky]

Ограничение, накладываемое предыдущим методом, очень строгое. Изображение делится на слои, таким образом глубина семплов изображения округляется до выбранной глубины ближайшего слоя. Полученное изображение будет иметь артефакты дискретизации в форме полос или жёстких границ по линиям пересечения слоёв. В данном методе проблема таких артефактов решается при помощи использования ID объектов, полученных методом нахождения границ (или по карте ObjectId). Если один объект принадлежит двум слоям, слои объединяются. Ещё одна проблема метода — частичное пересечение. Для размытия объектов на заднем плане используется аппроксимация по видимым семплам.
Layered DoF
На верхнем изображении видны чёрные полосы — артефакты, происходящие от применения послойного размытия без использования ObjectId (картинка Barsky).

Размытие, учитывающее особенности глаза человека (vision-realistic rendering) [Kolb]

Глаз человека сложно описать в виде аналитической модели, состоящей из нескольких линз — как это можно сделать для объектива. В данном методе при помощи специального прибора, называемого wavefront aberrometer (я не решился это перевести) определяется набор PSF, соответствующих глазу человека. Далее используется размытие по слоям в соответствии с полученными PSF. Метод позволяет получать изображения, видимые людьми с заболеваниями зрения.
Vision realistic DoF
Изображение, учитывающее особенности глаза человека, больного кератоконусом (картинка Barsky).

Упорядочение по важности (importance ordering) [Fearing]

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

Гибридный перцептивный метод (perceptual hybrid method) [Mulder и van Lier]

Особенности восприятия изображения человеком таковы, что детали в центре более важны, чем детали по краям изображения. Центр изображения можно размыть более медленным и точным способом, в то время как для периферии используется быстрая аппроксимация размытия. Для быстрого размытия используется пирамида Гаусса, уровень размытия выбирается в зависимости от глубины пикселя; результат обладает артефактами.

Повторяемая свёртка (repeated convolution) [Rokita]

Метод предназначен для быстрого применения в интерактивных приложениях. Работает на аппаратных устройствах, где можно эффективно реализовать операцию свёртки с ядром размера 3x3 пикселя. Свёртка выполняется несколько раз, тем самым достигается большая величина размытия. Производительность падает с ростом радиуса размытия. На PSF накладывается ограничение: она должна быть Гауссовской.

Глубина резкости на GPU [Scheueremann and Tatarchuk]

Глубину резкости можно считать и на GPU. Один из методов преложили Scheueremann и Tatarchuk.
Учитывая глубину пикселя, по законам оптики определяем величину пятна рассеяния, и в пределах пятна выбираем семплы, которые и формируют цвет пикселя в результате. В целях оптимизации памяти, в участках изображения, где CoC имеет большой радиус, берутся пиксели не входного изображения, а уменьшенного в несколько раз. Для уменьшения количества артефактов нехватки интенсивности, в расчёт берётся ещё и глубина пикселей. Метод обладает артефактам ненепрервыности глубины.

Интегральная матрица (summed area table) [Hensley]

В качестве альтернативы семплирования в пределах CoC, усреднённый цвет области пикселей изображения можно найти, используя интегральную матрицу (SAT). В данном случае скорость вычислений высока и не падает с увеличением радиуса размытия, к тому же нет необходимости в генерации изображения меньшего разрешения. Изначально метод предназначался для сглаживания текстур, но в дальнейшем был адаптирован и для глубины резкости, в том числе и на GPU. Метод обладает практически всеми видами артефактов.

Метод пирамид (pyramidal method) [Kraus и Strengert]

Сцена разделяется на слои, в зависимости от глубины. Пиксели, находящиеся близко к границе слоёв, относятся не к ближайшему слою, а частично к нескольким слоям: таким образом исключаются артефакты дискретизации на границах слоёв. Затем экстраполируются значения пикселей, отсутствующих в слоях (тех, которые закрыты объектами на переднем плане). После этого каждый слой размывается методом пирамид, для исключения артефактов используется вес точки. Полученные слои смешиваются с учётом прозрачности слоёв. Метод быстрее послойных методов, использующих FFT, но накладывает ограничения на используемую PSF.
Pyramidal blur
Изображение было размыто с использованием метода пирамид (картинка Magnus Strengert).

Сепарабельное размытие (separable blur) [Zhou]

Точно так же, как и в методах классического размытия, не учитывающего глубину (box blur, gaussian blur), в расчёте глубины резкости можно применять сепарабельные PSF. Сначала изображение размывается по горизонтали, затем по вертикали — в результате мы получаем скорость, зависимую не от площади пятна не резкости, а от его диаметра. Метод поддаётся реализации на GPU и может быть применён в реальном времени. Идея применения сепарабельных функций проиллюстрирована на рисунке:
Separable blur
При сепарабельном размытии производительность зависит не от площади PSF, а от её диаметра.
Стоит заметить, что в другой работе Barsky подчёркивает, что правильное размытие, учитывающее глубину, не может быть сепарабельным: при использовании этого метода в некоторых случаях возможны артефакты.

Симуляция рассеяния тепла (simulated heat diffusion) [Barsky, Kosloff, Bertalmio, Kass]

Рассеяние тепла — физический процесс, в котором тоже можно наблюдать размытие (хотя он и не связан с оптикой). Если в веществе-проводнике тепла температура распределена неравномерно, со временем мы будем наблюдать размытие. Дифференциальные уравнения, описывающие эффект такого размытия, можно использовать для симуляции глубины резкости. Даже для достаточно больших радиусов размытия метод может быть применён на GPU в реальном времени.
Position map
Карта position map, используемая вместо карты глубины в этом методе, содержит информацию о трёх измерениях точки, а не только о глубине (картинка Barsky).

Обобщённая и семантическая глубина резкости

До сих пор мы описывали методы, симулирующие глубину резкости так, как это происходит в природе. Однако размытие может быть и не таким, как мы привыкли его наблюдать. В компьютерной графике мы не ограничены физически реализуемыми моделями линз, поэтому область размытия может быть задана произвольно — например, мы можем выделить из толпы несколько человек. Метод можно реализовать как вариацию метода симуляции рассеяния тепла, используя в качестве карты размытия законы, отличные от физических.
Generalized DoF
Физически неправильное размытие (картинка Kosloff и Barsky)

Световые поля (light fields)

Световые поля изначально были описаны как метод, описывающий изображение сцены с разных точек, не зависящий от сложности сцены. Стандартный способ кодирования световых полей — двухплоскостная параметризация (two-plane parametrization). Выбираются две параллельные плоскости; каждый луч описывается точкой на обеих плоскостях. В результате получается четырёхмерная структура данных. С полученными данными можно производить манипуляции, такие как изменение плоскости фокусировки или глубины резкости.

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

Кроме того, мы можем сфокусироваться на разных участках изображения, применяя быстрое преобразование Фурье в четырёхмерном пространстве.

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

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

Light field
Световое поле: маленькая часть RAW-изображения с сенсора Lytro. Мы видим микролизны, расположенные перед матрицей.

Пятнистия (dappled) фотография

Способ, описанный выше, требует много точек матрицы для кодирования одного пикселя, следовательно, обладает низким разрешением. Действительно, разрешение этой камеры где-то 800 пикселей по большей стороне при матрице 11MPix. Проблема может быть решена использованием сенсоров с очень высоким разрешением (но это приведёт к удорожанию сенсоров и запредельно большому размеру структуры данных).

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

Увеличение расфокусировки (defocus magnification)

Хорошо было бы уметь применять эффект глубины резкости и в «обычной» фотографии, без светового поля (где, в отличие от рендера, нет карты глубины). Данный метод предполагает определение размытия и его увеличение (в методе предполагается, что размытие в фотографии уже есть, но недостаточное — например, фотография сделана на мыльницу, где из-за размера матрицы невозможно достичь большого радиуса размытия). Чем больше размытие, уже присутствующее в изображении, тем ещё большее размытие будет применено дополнительно.

Автофокус

При использовании глубины резкости в приложениях виртуальной реальности и видеоиграх, так же как и в фотографии, необходим автофокус, то есть задача определения глубины, пиксели на которой находятся в фокусе. В центре изображения выделяется область, семплы из этой области участвуют в определении глубины фокусировки. В расчёт берётся как средневзвешенное значение глубины, так и известная для изображаемых объектов присущая им важность (скажем, можно сфокусировать «взгляд» на одном их персонажей, но нельзя на деревянном ящике или стене) — это называется семантический вес объекта. Также необходимо учитывать процесс аккомодации взгляда (фокусировка меняется во времени плавно), для этого используется, например, low-pass фильтр.

Заключение

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

Ссылки

Ссылки на почитать
Остальные работы Brian A.Barsky
Accurate Depth of Field Simulation in Real Time (Tianshu Zhou, Jim X. Chen, Mark Pullen) — один из методов расчёта DoF
An Algorithm for Rendering Generalized Depth of Field Effects Based on Simulated Heat Diffusion (Todd Jerome Kosloff, Brian A. Barsky) — полное описание рассмотренного выше метода
Investigating Occlusion and DiscretizationProblems in Image Space Blurring T echniques (Brian A. Barsky, Michael J. Tobias, Daniel R. Horn, Derrick P. Chu) — описание ещё одного метода
Quasi-Convolution Pyramidal Blurring (Martin Kraus) — метод пирамид
Focus and Depth of Field (Frédo Durand, Bill Freeman) — понятия и определения, имеющие отношение к глубине резкости: cheat sheet. Много полезных формул в одном месте.

От переводчика

Эту и остальные работы Brian A. Barsky (университет Беркли) можно почитать на его сайте. Везде, где встречаются какие-то термины и общеизвестные названия алгоритмов, я оставил их в скобках на английском, фамилии не переводил. Если где-то неправильно перевёл — пишите в личку, поправлю (я изучал всю терминологию на английском, поэтому могу ошибаться с переводом). В [квадратных скобках] после названий методов указаны имена работавших над ними. Ради наглядности и интереса я дополнил публикацию примерами и некоторыми картинками.
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 38
    0
    В mass effect 3, кстати, у меня у одного вся сцена в фокусе? ни одного размытого объекта, глаза косятся в разные стороны
      0
      Мне казалось, что там эффект работает только при прицеливании, когда на цели фокус, а все остальное размывает. Ну или когда просят на что либо конкретное посмотреть.
        0
        Возможно у вас стояли низкие настройки качества графики, DOF прилично может отнимать FPS.
        +4
        В мемориз. Очень приятная статья. Еще чуть больше бы кода с реализациями и былоб супер.
          0
          В трехмерных редакторах можно отредерить т.н. depth-channel, т.е. канал глубины. В нем яркость пикселя означает степень приближенности к камере (белый — совсем рядом, черный — бесконечно далеко).
          Имея обычное изображение и канал глубины, можно менять фокус и степень размытия динамически.
          Получается не так качественно, но быстро.
            0
            Да-да, как раз об этом и говорится в «image-space методах». Некоторые методы используют position map вместо depth map.
              0
              Благодаря этой статье я вспомнил, как 3 часа тупил в 3d-максе, пытаясь настроить глубину камеры в динамичной сцене. А потом плюнул, просчитал сцену в два канала (цвет + глубина) и собрал в Аффтер Эффектах.
                0
                Ещё, кстати, сложно сказать, что будет смотреться лучше: отрендерить depth pass и посчитать DoF при постобработке или сидеть, ждать, рендера раз в 10 дольше и получить шумную картинку. Кстати, размытие по каналу глубины в PS и AE, на мой взгляд, не очень: если вдруг кто не знает, упомяну здесь плагин LensCare.
                  +1
                  Мне кажется, нативный DoF рендерера будет более корректным. Канал глубины не содержит информации о пикселях, заслоненных другими объектами, а, скажем, Vray делает несколько проходов рендера с разным фокусным расстоянием, что позволяет это учесть. Хотя при этом время рендера увеличивается буквально на порядки, в десятки раз.
                    +1
                    Да, будет более корректным (особенно если в сцене много стекла). Тут вопрос в том, что требуется: сделать быстро и в принципе красиво или сделать физически точно — цели и задачи бывают разные. Это тот же случай, что размытые отражения иногда проще интерполировать, чем ждать. Но при этом надо, конечно, быть внимательным, чтобы не допустить ляп.
                      0
                      Помню, когда работал в дизайн студии, решили попробовать DoF, я уже не помню чем именно это делалось в 3dsmax, но суть процесса была такова:
                      -Используется камера с точкой наведения (TargetCamera)
                      -Точка наведения камеры выставлена на объект, находящийся в фокусе
                      -Рендер ведется в N проходов
                      -Первый проход ведется с необходимого ракурса
                      -Остальные проходы рендера ведутся со сдвигом камеры на некоторое расстояние
                      -При сборке изображения на основе сдвигов камеры накладывался эффект MotionBlur, соответственно то что находилось в точке наведения оставалось недвижимым — не размазывалось, остальное размазывалось в зависимости от удаленности.
                      Эффект в принципе получился, но для живости не хватало у бликов размытых объектов изменения формы (например как в фото объективах по лепесткам диафрагмы).
                      Рендерилась данная картинка несколько суток, потому решили не использовать.
                      Было это лет 6-7 назад, т.ч. качества рендера с Vray «хватало» и без эффектов, а времени было на заказ не так много.
            +3
            Вообще-то, «pinhole camera» это «камера обскура» по-русски. «Pinhole», это именно что «дырка от булавки», а не фамилия творца ;) А так статья интересная, спасибо.
              +2
              Я перевёл «pinhole» пинхолом по аналогии, как многие переводят: «камера-пинхол». Правильнее, по идее, «камера-обскура», да.
                +1
                Как раз многие фотографы, как любители, так и профессионалы, не заморачиваются переводом. В речи уже устоялось русское слово «пинхол».
                  0
                  Ну если у кого-то оно устоялось, то тогда будет таки камера-пинхол. А не камера пинхола.
                    0
                    Но в родительном падеже «камеры-пинхола»
                      0
                      Мне кажется, что лучше будет звучать «пинхол-камеры». Кстати, на том форуме вроде такой вариант и используют
                0
                Счастливое детство — свинцовые игрушки… Помнится была в журнале «Юный техник» (если журнал не спутал, много разных тогда вещей делали по журналам) статья как сделать фотоаппарат из спичечного коробка: коробок, 2 кассеты для пленки (одна разматывается, в другую заматывается) пропускаем через коробок, в котором сделана по центру одной из бОльших сторон дырка булавкой, и кусок черной бумаги с вырезом, который протягиваем (в момент протяжки вырез открывает дырку булавки и закрывает). При определенной сноровке и прямых руках получались очень неплохие снимки =)
                +5
                Пока что в играх это меня чаще раздражает, разве что в медленных мувиках сгодится.
                  +3
                  Вот-вот. Я думал, это я один такой странный, что предпочитаю видеть абсолютно четкую картинку, без подобных «спецэффектов». Да, глаз имеет ограниченную глубину резкости и в жизни картинка не была бы абсолютно четкой, но зачем ограничиваться тем, что возможно в жизни? Раз уж вся сцена рендериться в фокусе, то лучше воспользоваться этой технической особенностью, а не пытаться скрыть ее.

                  Тем более, что мы смотрим на экран, который довольно близко к глазам, чтобы возникал эффект расфокусировки… да, пытаются симулировать реализм, мол смотрим не на экран, в него, словно «в окно». Это один из тех случаев, когда попытки обмануть ощущения для достижения «большего реализма» скорее бесят. Подобная ситуация в играх еще и с motion blur — делают вроде как для кинематографичности, при этом никто не задумывается, а нормально ли это, что в 2012 году в кино такое низкое количество кадров в секунду, что любая динамическая сцена начинает смазываться? Лично я бы предпочел кино с 30-60 кадрам секунду. Еще понимаю когда motion blur используют во всю на игровых консолях для «деликатного» сокрытия убогого фреймрейта (ну старые они уже по начинке, понятно), но смешно видеть его при малейших движения, когда FPS стабильно находиться на отметке в 60, уперевшись в v-sync.
                    0
                    Хоббита, вроде, засняли на 48 кадрах в секунду.
                      0
                      Есть такое. Видевшие картинку очень хвалят. Есть еще мнение, что для стерео DOF вообще не нужен, ибо мешает глазу фокусироваться и создает неприятные ощущения при просмотре.
                        0
                        >> Видевшие картинку очень хвалят.
                        А другие наоборот, ругают, потому что уж слишком похоже на реальную жизнь.
                        Хотя тоже в какой-то степени похвала.
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Вспоминаю DOOM, от того, что в нем не было предусмотрено shif камеры которая бы рендерила вертикальные линии вертикальными

                        А что это за камера, у которой все вертикальные линии всегда вертикальны?
                        • НЛО прилетело и опубликовало эту надпись здесь
                          +1
                          Это как с зерном, «добавляющим реалистичности». К тому, что видит глаз, отношения имеет мало, просто имитация косяков кинокамеры
                            +1
                            Зерно имеет определенный смысл — глаз очень прилично шумит, особенно при низкой освещенности. Эффект стоит симулировать потому, что монитор сам по себе не бывает достаточно темным, чтобы этот эффект появился (из-за узкого динамического диапазона).
                            0
                            А, так вот в чём дело с Думом было. Можно поподробнее об этих вертикальных линиях?
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Примерно так это и обосновывается в книгах: глаз (или мозг, неважно) человека устроен так, что он стремится воспринимать мир как наиболее простые известные ему паттерны. Именно поэтому искажённый квадрат (даже нарисованный без оттенки) мы представляем повёрнутым в пространстве (а не фигурой с разными углами). Или, скажем, пересечённые квадрат и круг мы видим как именно эти две фигуры, а не как круг, из которого вырезан прямой кусочек, и квардат с полукруглой дыркой.
                          +4
                          Основная проблема с размытием глубины в играх в том, что игра не знает на каком объекте сейчас сфокусирован наш взгляд.
                          В игре размывается по условным признакам — например по объекту в центре экрана/перекрестии прицела и т.д. Мы же можем в этот момент смотреть на объект совсем другой «глубины», который увы будет размыт.
                          По этой причине в играх надо быть очень аккуратным с этой технологией… а получить реальный эффект глубины сцены возможно только отследив направление взгляда игрока. Причем точность нужна очень высокая, т.к. объекты стоящие на экране в 10 пикселях могут на сцене находится в «виртуальном километре» друг от друга по глубине, а ошибка недопустима.
                            +2
                            Напрашивается использовать веб-камеру для отслеживания глаз(и головы), но нужно высокое разрешение.

                            Одно дело — выделить темные пятна глаз на фоне светлого пятна лица (у кого наоборот — не обижайтесь пожалуйста), а другое — отследить положение глаз при неподвижном лице, а особенно сумму положения головы и глаз — это еще сложнее.

                            Кстати, есть идея эту камеру сделать в инфракрасном свете и использовать и/ф подсветку. Тогда можно ловить «эффект инфракрасных глаз»: на месте хрусталиков будут яркие точки. Еще нужно наклеить/надеть на виски маркеры, которые хорошо отражают и/ф диапазон. Софт измеряет расположение крайних точек(маркеров) и точек-хрусталиков относительно маркеров, этого достаточно(?) для определения направления взгляда.

                            Зная направление взгляда — можно «наводить резкость» в той области, по идее будет эффектно.

                            Но как быть с аккомодацией? Хрусталик будет пытаться сам настроить резкость в нужном месте. Наверное глаза и голова будут болеть.
                              0
                              Трекинг направления взгляда обычно делается по черному кругу зрачка и блику на роговице.

                          0
                          Хорош разбор полётов.
                            0
                            >>Для достижения большего фотореализма рекомендуется использовать эффект глубины резкости в изображениях, получаемых на компьютере.

                            Дело не в реализме, а в похожести на картинку, которую дает объектив камеры. Глаз как раз фокусируется сам автоматически и в нем такой лютый DOF не возникает
                              +4
                              Вот ведь же как интересно получилось. Придумали было камеру обскура (пинхол). Изображения резкие получались, хорошие. Но, к сожалению, темноватые были. Решили фотографы усилить свет при помощи линзы. Ну, да, пожертвовали искажением линий и расфокусировкой. Много лет думали как бы так линзы поставить, чтобы уменьшить аберрации (те самые искажения прямых линий). И так к этому всему за 100 лет привыкли, что теперь, когда компьютер чёткую картинку им нарисовал, начинают придумывать как бы этот самый костыль с линзой обратно прикрутить.
                              И вроде уже фотоаппарат даже придумали, который о фокусе позволяет забыть. Так укомплектовали его программой, которая фокус обратно прикручивает. Что примечательно в топике упомянуто название этой камеры Lytro но как-то вскользь. Вообще поиск показывает, что тема пленоптической фотографии практически не развита на Хабре.
                                0
                                Ага. Тут интересно написано про эту самую диалектику вокруг резкости/нерезкости.
                                > в топике упомянуто название этой камеры Lytro но как-то вскользь.
                                Вот приедет она ко мне через недельку, тогда если ещё будет актуально, напишу обзор — будет не вскользь.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое