Depth Of Field (DOF) — Глубина Резко Изображаемого Пространства
Depth Of Field (DOF) — Глубина Резко Изображаемого Пространства (ГРИП) или Глубина Резкости — одномерная величина, определяющая разницу между максимальным и минимальным расстоянием до наблюдателя, которое определяется наблюдателем как резкое. Термин пришёл в компьютерную графику из фотографии, где резкое изображение получается на тех участках, где световое пятно от точки в пространстве меньше зерна светочувствительного элемента, в следствии чего у наблюдателя возникает ощущение «резкости».
На самом деле, в оптике возможно только одно расстояние, при котором точка в пространстве передаётся в виде точки на светочувствительный элемент, так что «глубина» резкости на самом деле физически не существует и является следствием несовершенства техники и глаза наблюдателя.
Частным случаем ГРИП является гиперфокал, когда в область резко изображаемого пространства попадает всё, начиная с определённого расстояния до бесконечности.
Основными техниками для получения эффекта ограниченной ГРИП в компьютерной графике являются следующие:
- Трассировка лучей (Ray-Traced Depth of Field)
- Использовнание накопляющего буфера (Accumulation-Buffer Depth of Field). В этой технике картинка рендерится из разных позиций, а затем накопленный результат смешивается.
- Использование слоёв (Layered Depth of Field). Пространство делится на блоки по расстоянию, каждый блок отдельно размывается и результат смешивается.
- Размывание пикселей в соответствии с данными Z-буфера (Forward-Mapped Z-Buffer Depth of Field, Reverse-Mapped Z-Buffer Depth of Field)
Релизация ГРИП методом накопляющего буфера.
void DisplayHelper(float xoff, float yoff) {
glClearColor(0.0,0.0,0.0,0.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(…);
glViewport(…);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(2.0+xoff,1.0,1.0+yoff, // немного изменяем положение камеры
0,1,0, // Но смотрим на ту-же точку в пространстве
0,1,0); // Сохраняя ориентацию камеры той-же
glEnable(GL_DEPTH_TEST);
.. // Рисуем сцену
}
void DisplayFunc() {
if (do_depth_of_field) {
glClear(GL_ACCUM_BUFFER_BIT);
for (i=0;i<3;i++) {
for (j=0;j<3;j++) {
DisplayHelper(0.02*(float)i,0.02*(float)j);
glAccum(GL_ACCUM, 1.0/9.0);
}
}
glAccum(GL_RETURN, 1.0);
} else {
DisplayHelper(0.0,0.0);
}
glutSwapBuffers();
} Что такое Depth Of Field (DOF) — Глубина Резко Изображаемого Пространства?
11 октября 2009 (Обновление: 19 ноя 2009)