Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Термины / Depth Of Field (DOF) — Глубина Резко Изображаемого Пространства

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

2001—2017 © GameDev.ru — Разработка игр