Бесплатная реклама

Автор: Алексей Игнатенко

Опубликовано: 09.06.2006

Изменено: 19.06.2006

Постоянная ссылка

Комментарии [6]

Современные технологии улучшения качества 3D-изображений


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



Страницы: 1 2

В последнее время 3D игры стали выглядеть значительно лучше - более качественные изображения, более гладкие объекты, более красивые текстуры. И достигается это не в последнюю очередь за счет улучшения качества изображений, генерируемых играми, а не только за счет увеличения числа треугольников или повышения детализации текстур. Данная статья посвящена наиболее популярным алгоритмам из этой области.

Устранение ступенчатости (Antialiasing)

Одна из наиболее впечатляющих аппаратных технологий, все чаще находящая применение в игровых приложениях, - это устранение ступенчатости, или антиалиасинг (antialiasing).

Эта технология предназначена для устранения одной из ключевых проблем качества синтезированных изображений - лестничного эффекта (также часто называют алиасингом, aliasing). Часто этот эффект можно заметить на границах объектов или на линиях, близких к вертикальным или горизонтальным, но не строго вертикальных или, соответственно, горизонтальных. Несомненно, читатель много раз встречался с подобными эффектами, например, в трехмерных играх.

3D antialiasing 3D antialiasing
Рисунок 1. Левое изображение получено в стандартном режиме, правое - со включенным устранением ступенчатости. Обратите внимание на передачу мелких деталей и границы объектов (перила на мосту, фонари и т.д.)

Что является причиной лестничного эффекта? Опуская подробности, можно сказать, что главная причина - "сетка" пикселей на компьютерном мониторе. Эта сетка имеет конечное и весьма небольшое разрешение, а пиксели располагаются в строго фиксированных местах.

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

Рисунок 2.

Как же бороться с этим неприятным эффектом? Можно заметить, что размер одной "ступеньки" никогда не бывает больше, чем один пиксель. Поэтому наиболее естественный и простой путь - это увеличение экранного разрешения. То есть, увеличение разрешения уменьшает размер пикселя и, следовательно, заметность артефактов. Однако увеличить разрешение можно не всегда. Например, оно может быть ограничено максимальным разрешением монитора или его может ограничивать приложение.

Другой путь - увеличение так называемого эффективного разрешения, т.е. использование специального алгоритма для получения цвета пикселя таким образом, чтобы эмулировать несколько пикселей. Такие методы и называются методами устранения ступенчатости.

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

Суперсэмплинг

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

Степень изменения размера изображения определяется отношением числа пикселей в исходном изображении (высокого разрешения) к числу пикселей в выходном изображении. Например, 2x суперсэмплинг пишет в буфер кадра в два раза больше пикселей, 4x - в четыре и т.д. Чем больше это число, тем более качественное устранение ступенчатости можно получить.

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

Мультисэмплинг

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

Суперсэмплинг работает таким образом, что на этапе создания изображения графический процессор не делает различий между стандартным режимом и режим устранения ступенчатости. Как говорилось выше, это работает медленно.

Основная идея мультисэмплинга - сделать генерацию и обработку дополнительных сэмплов интеллектуальной, и встроить ее в основной графический конвейер. Это, конечно, усложняет сам графический процессор, но в то же время позволяет значительно ускорить процесс устранения ступенчатости. Например, значение текстуры ищется только один раз для "главного" пикселя, делается ряд других оптимизаций.

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

Алгоритмы мультисэмплинга различаются количеством сэмплов и их расположением (или, как говорят, шаблоном сэмплирования, sampling pattern), а также некоторыми приемами оптимизации.

Различные производители в своих аппаратных реализациях используют различные шаблоны сэмплирования. Примеры даны на рисунке:

Multisampling. NVidia 2x Multisampling. NVidia Quincunx
NVidia 2x NVidia Quincunx TM
Multisampling. NVidia 4x Multisampling. ATI Smoothvision
NVidia 4x ATI SmoothvisionTM
Рисунок 3.

NVidia 2x

В этом режиме изображение последовательно рисуется сразу в два буфера. Между двумя проходами происходит сдвиг изображения на половину пикселя. Затем два изображения усредняются. Таким образом, это чистая 2x схема мультисэмплинга, которая работает быстро, но качество получается не очень хорошее.

NVidia 4x

Этот режим работает аналогично 2x, за исключением того, что используются соответственно 4 буфера.

NVidia QuincunxTM

В режиме QuincunxT (читается - "квинканкс") каждый сэмпл из каждого прохода дополнительно фильтруется с четырьмя соседними из второго изображения. NVidia заявляет, что такая схема дает качество, практически равное 4x. Однако отметим, что улучшение происходит не столько за счет увеличения количества сэмплов (используется два сэмпла, аналогично 2x-шаблону), а размывания изображения за счет смешивания с соседними пикселями. Тем не менее, на практике это дает хороший результат. Существует также NVidia AccuviewT - модифицированная технология, в которой положения сэмплов слегка сдвигаются внутрь основного пикселя для улучшения качества.

ATI SmoothVisionTM

Эта технология реализована в графических процессорах ATI. В ней используются группы из 16 сэмплов, которые распределяются между различным количеством точек, в зависимости от желаемого качества устранения ступенчатости. В 2x-режиме сэмплы покрывают 8 точек, в 4x режиме - 4 точки и так далее. Каждый пиксель имеет 8 фиксированных псевдослучайных положений, в которые могут попасть сэмплы. Известно, что человеческий глаз хорошо замечает регулярные структуры, что в данном случае является нежелательным. Использование нерегулярного шаблона позволяет создавать более приятные глазу картинки.

a) без мультисэмплинга b) мультисэмплинг 2x
c) мультисэмплинг 4x d) мультисэмплинг 6x

Рисунок 4. Результат применения мультисэмплинга для устранения ступенчатости.

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

Эффект размывания при движении (Blur)

Размывание при движении (motion blur) - еще одна из множества технологий, которые используются для того, чтобы сделать картинки в 3D играх более реалистичными. Если камерой снимается реальный мир, можно заметить, что быстро движущиеся объекты как бы расплываются, размазываются на изображении. Этот эффект и называется размыванием при движении (иногда мы будем называть его размыванием движения). Его использование может заставить любую игру выглядеть "как в реальном мире".

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

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

Рисунок 5. Чем дольше длится экспозиция, тем темнее объект.

Природа компьютерной анимации такова, что объекты не движутся плавно, глаз может замечать скачки при движении объекта. Предположим, что игра работает со скорость 60 FPS, т.е. каждый новый кадр рисуется через 1/60 секунды. Однако время непрерывно и не обновляется только 60 раз в секунду. Также и монитор, и человеческий глаз не могут "обрабатывать" изображения непрерывно, им нужен некоторый интервал времени для обновления изображения. Эффект анимации "скачками", который неизбежен даже при самой быстрой аппаратуре, называется временной ступенчатостью (по аналогии с эффектом ступенчатости изображения, который мы уже рассматривали).

Основная идея технология устранения этого эффекта подобна той, которая использовалась для устранения ступенчатости изображения - суперсэмплинг. Только в данном случае это так называемый временной суперсэмплинг. Для того, чтобы представить непрерывное время в одном кадре, необходимо дополнительно нарисовать несколько кадров-сэмплов, затем усреднить их и таким образом получить нужный эффект. Это усреднение, кстати, и вызовет эффект размывания, причем чем быстрее движется объект, тем сильнее он сдвинется на кадрах-сэмплах и поэтому его размывание будет сильнее.

Например, для размывания движения с использованием 4-х сэмплов необходимо рисовать со скоростью 240 FPS, чтобы получить вывод со скоростью 60 FPS. Чем больше сэмплов используется, тем более качественное изображение получится.

Однако такой метод работает медленно. Для современной игры даже на самой лучшей аппаратуре 60 FPS - предел мечтаний, а про 240 можно и не говорить. Таким образом необходимы быть может менее качественные, но более быстрые решения.

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

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

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

 

Страницы: 1 2