2D Graphics

Двумерная графика. Графика, *действие* в которой происходит в одной плоскости. Например, пользовательский интерфейс.

3D Graphics

Трехмерная графика. Визуальное отображение трехмерной сцены или объекта. Для представления трехмерной графики на двумерном устройстве (дисплей) применяют рендеринг (см. Rendering).

3D Pipeline

3D конвейер. Процесс построения 3D-изображения можно разделить на три последовательных этапа. На первом этапе объект преобразуется в мозаичную модель, т.е. происходит его разделение на множество многоугольников (полигонов). Следующий этап включает в себя геометрические преобразования и установки освещения. Наконец, заключительный этап, так называемый “рендеринг” (rendering), который является наиболее важным для качества 3D-изображения, создает двумерное изображение из полученных на предыдущих этапах многоугольников.

Alpha

Коэффициент прозрачности. В описание цвета (RGB) может входить специальный канал, называемый альфа-каналом, который отвечает за прозрачность данного цвета. Т.о., цвет описывается как ARGB.

Alpha Blending (Alpha pixel blending)

Реальный мир состоит из прозрачных, полупрозрачных и непрозрачных объектов. Alpha Blending — это способ передачи информации о прозрачности полупрозрачным объектам. Эффект прозрачности и просвечивания достигается путем смешивания значений цветов исходного и результирующего пикселей. Разделение изображения на многоугольники производится с использованием маски, плотность которой зависит от прозрачности объекта. В результате цвет точки является комбинацией цветов переднего и заднего плана. Обычно, Alpha имеет нормализованное значение от 0 до 1 для каждого цветного пиксела. Новый пиксел = (alpha)(цвет пиксела А) + (1 – alpha)(цвет пиксела В)

Alpha Buffer

Альфа буфер. Дополнительный буфер, в котором содержится информация о прозрачности, таким образом, пиксел имеет четырехзначное представление (RGBA), и в 32-разрядном буфере содержится 24 бита информации о цвете, т.е. 8 бит на каждый из цветов (красный, зеленый и синий), и 8 бит на значение alpha.
См. также Transparency

Ambient

Световой источник, который светит одинаково во всех направлениях. Все объекты освещаются с равной интенсивностью.

Anti-aliasing

Анти-алиасинг. Способ обработки (интерполяции) пикселов для получения более четких краев (границ) изображения (объекта). Наиболее часто используемая техника для создания плавного перехода от цвета линии или края к цвету фона. В некоторых случаях результатом является смазывание (blurring) краев.

без Анти-алиасинга с Анти-алиасингом

Atmospheric Effect

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

Back buffer

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

Bitmap

Способ кодирования изображения пиксел за пикселом.

Bilinear (bi-linear) Filtering

Метод устранения искажений изображения (устранение “блочности” текстур при их увеличении). При медленном вращении или движении объекта (приближение/удаление) могут быть заметны перескакивания пикселов с одного места на другое, т.е. появляется блочность. Для снижения этого эффекта при билинейной фильтрации берется взвешенное среднее значение цвета четырех смежных текстурных пикселов (texels) и в результате определяется цвет текстуры.

BitBLTs

BitBLT = Bit Block Transfer. БитБлет. Наиболее важная функция для ускорения графики в средах, использующих оконный интерфейс GUI (Graphic User Interface). BitBLT – фактически означает просто перемещение блока данных из одного места в другое, которое производится с учетом требований графической памяти. Например, эта функция используется при каждом перемещении окна, таким образом BitBLT – просто передача блока пикселов. Более сложное использование этой функции связано с ситуациями, требующими некоторого преобразования исходных данных, например, когда каждый “одноцветный” бит исходных данных расширяется до “цветного” с использованием цветовых палитр переднего или заднего плана перед тем, как он будет выведен на экран.

Blending

Блендинг. Комбинирование двух или более объектов с использованием некоторого базиса пикселов.

Buffer

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

Bump Texture Mapping

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

Chroma Keying

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

Color

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

Colored lighting

Цветовое освещение. Освещение источниками разного цвета, при этом происходит смешение цвета. Совсем недавно цветовое освещение стало использоваться в новейших 3D играх (Quake2, Unreal, Prey, Half Life).

Computer graphics

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

Depth Cueing

Уменьшение интенсивности освещения текстур при удалении объекта от точки наблюдения.

Directional

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

Dithering

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

Double Buffering

Двойная буферизация. Представьте себе старый трюк аниматоров: нарисованный на уголках стопки бумаги персонаж мультика со слегка изменяемым положением на каждом следующем листе; затем, пролистав всю стопку, отогнув уголок, мы увидим плавное движение нашего героя. Практически такой же принцип работы имеет и Double Buffering в 3D анимации, т.е. следующее положение персонажа уже нарисовано до того, как текущая страница не пролистана. Без применения двойной буферизации движущееся изображение не будет иметь требуемой плавности, т.е. будет прерывистым. Для двойной буферизации требуется наличие двух областей, зарезервированных в буфере кадров трехмерной графической платы; обе области должны соответствовать размеру изображения, выводимого на экран.
Метод использования двух буферов для получения изображения: один для отображения картинки, другой для рендеринга. В то время, как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буфера переключаются (меняются местами). Таким образом наблюдатель все время видит отличную картинку. (см. Back Buffer)

Environment Map-Bump Mapping

Технология, являющаяся дальнейшим развитием Bump Mapping. В этом случае, помимо базовой текстуры объекта, применяется еще две текстуры:
1. Текстура, являющаяся отрендеренным вариантом трехмерной сцены вокруг объекта (environment map).
2. Текстура – карта рельефа (bump map).
Самостоятельно и совместно с Procedural Texturing данная технология позволяет получить такие натуральные эффекты, как отражение, отражение в кривом зеркале, дрожжание поверхностей, искажение изображения, вызываемое водой и теплым воздухом, трансформация искажений по шумовым алгоритмам, имитация туч на небе и др.

Flat Shading (Flat)

Метод затенения, называемый также постоянным затенением. Поверхность объекта, построенного с использованием этого метода, получается наиболее низкого качества, и изображение выглядит как бы поделенным на блоки. Flat Shading даёт (более) худший результат, чем, допустим, метод Gourad, но, в то же время, и работает значительно быстрее.

Fog

Вид blending для объекта с фиксированными цветом и пикселами, удаляющимися от точки наблюдения.

Fogging

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

FPS, frames per second

Частота смены кадров. Чтобы оценить быстродействие системы трехмерной визуализации, достаточно запустить приложение, динамически создающее трехмерные сцены, и подсчитать число кадров в секунду, которое система способна отобразить. Однако, единого, достаточно авторитетного теста такого рода еще не создано. Большинство имеющихся тестов, основаны на фрагментах трехмерных игр и проверяют поведение графической карты на весьма ограниченном наборе функций.
Например, известная фирма Ziff Davis, выпустила тестовый пакет 3D Winbench’98.

Frame buffer

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

Front buffer

Первичный буфер. Область памяти, из которой происходит вывод кадра на экран (расчет производится в back buffer).

Gamma

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

Gamma Correction

Перед выводом на дисплей линейные данные RGB должны быть обработаны (скорректированы) для компенсации гаммы (нелинейной составляющей) дисплея.

Gouraud Shading (Smooth shading)

Затенение методом Гуро (или плавное затенение), один из наиболее популярных алгоритмов затенения, который обеспечивает прорисовку плавных теней вокруг изображаемого объекта, что позволяет изображать трехмерные объекты на плоском экране.
Метод назван по имени его разработчика, француза Генри Гуро. Gouraud Shading, или цветовая интерполяция – процесс, с помощью которого цветовая информация интерполируется по поверхности многоугольника для определения цветов в каждом пикселе. Информация о цвете связывается с каждым пикселом каждого многоугольника, с использованием линейной интерполяции по всему множеству многоугольников.
Затенение Гуро также работает, считывая информацию о цвете каждого треугольника, на которые разбита поверхность объекта, и плавно интерполирует интенсивность красного, зеленого и голубого цветов по трем координатам.
Этот метод уменьшает “блочность” изображения (смотри  Flat Shading ) и используется для отображения металлических и пластиковых поверхностей.
В результате действия этого алгоритма должен создаваться эффект, заставляющий глаза зрителя экстраполировать информацию о глубине и кривизне поверхности изображаемого объекта.

Hidden Surface Removal

Удаление скрытых поверхностей. Метод определения видимых для наблюдателя поверхностей. Позволяет не отображать невидимые из данной точки поверхности объекта.

Interpolation

Интерполяция – математический способ восстановления отсутствующей информации. Например, необходимо увеличить размер изображения в 2 раза, со 100 пикселов до 200. Недостающие пикселы генерируются с помощью интерполяции пикселов, соседних с тем, который необходимо восстановить. После восстановления всех недостающих пикселов получается 200 пикселов вместо 100 существовавших, и, таким образом, изображение увеличилось вдвое.

Interactive

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

Lighting

Существуют разные методы, использующие реалистичные графические эффекты для отображения 3D объектов на двумерном дисплее. Один из них – освещение. Используются разные уровни яркости (“светло-темно”) при отображении объекта для придания ему объема.

Line Buffer

Линейный буфер – буфер памяти, используемый для хранения одной линии видеоизображения. Если горизонтальное разрешение дисплея установлено равным 640 и для кодирования цвета используется схема RGB, то линейный буфер будет иметь размер 640х3 байт. Линейный буфер обычно используется в алгоритмах фильтров.

MIP Mapping

Multum in Parvo – с латыни переводится как “много в одном”. Метод улучшения качества текстурных изображений при помощи использования текстур с разным разрешением для различных объектов одного и того же изображения, в зависимости от их размера и глубины. Таким образом, в памяти хранятся несколько копий текстурированного изображения в различных разрешениях. В результате этого изображение остается качественным при приближении к объекту и при удалении от него. При использовании этого метода Вы увидите изображение в высоком разрешении, находясь близко от объекта, и изображение в низком разрешении при удалении от объекта. MIP Mapping снижает мерцание и “зашумленность” изображения, возникающие при texture mapping.
Mip mapping использует некоторые умные методы для упаковки данных о текстурах изображения в памяти. Чтобы использовать Mip mapping, необходимо, взяв все размеры текстур и умножив это число на два, построить одну карту наибольшего размера. Все карты меньшего размера обычно фильтруются и становятся усредненными и уменьшенными версиями самой большой карты.

Occlusion

Эффект перекрытия в трехмерном пространстве одного объекта другим.

Palletized Texture

Формат хранения текстур в сжатом виде (1-, 2-, 4- и 8-битный формат вместо 24-битного). Обеспечивает возможность хранения большего числа текстур в меньшем объеме памяти.

Parallel point

Световой источник, который освещает равномерно все объекты параллельным пучком света.

Perspective Correction

Один из способов создания реалистичных объектов. Рассматриваются величины Z (глубина) при разделении объекта на многоугольники. При создании современных игр разработчики обычно используют довольно большого размера треугольники для описания поверхности объекта, и используют текстурные карты для более точного и детального изображения. Без этого качество картинки было бы гораздо хуже.
Если 3D объект движется от наблюдателя, то уменьшаются его линейные размеры (высота и ширина). Без использования функции perspective correction объект будет дергаться и двигаться нереалистично. С каждым уровнем скорректированной перспективы происходят изменения на пиксел в зависимости от глубины. Так как при этом происходит деление на пикселы, то требуются очень интенсивные вычисления.

Pipeline

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

Pixel

Пиксель. Комбинированный термин, обозначающий элемент изображения, который является наименьшим элементом экрана монитора. Другое название – pel.
Изображение на экране состоит из сотен тысяч пикселей, объединенных для формирования изображения. Пиксель является минимальным сегментом растровой строки, которая дискретно управляется системой, образующей изображение. С другой стороны, это координата, используемая для определения горизонтальной пространственной позиции пикселя в пределах изображения. Пиксели на мониторе – это светящиеся точки яркого фосфора, являющиеся минимальным элементом цифрового изображения. Размер пикселя не может быть меньше точки, которую монитор может образовать. На цветном мониторе точки состоят из групп триад. Триады формируются тремя различными фосфорами: красным, зеленым и синим. Фосфоры располагаются вдоль сторон друг друга. Пиксели могут отличаться размерами и формой, в зависимости от монитора и графического режима. Количество точек на экране определяются физическим соотношением ширины к высоте трубки.

Pixel blending

Метод смешивания цветов текущего пикселя и пикселя, находящегося уже в буфере кадра, для получения выходного пикселя. Если ввести следующие обозначения: R1, G1, B1, A1, где каждый из символов соответственно представляет красную, зеленую, синюю и альфа компоненты текущего пикселя. Тогда R2, G2, B2, A2 – аналогично для пикселя, уже находящегося в буфере.

Source Alpha Pixel Blending – добавление прозрачности, т.е. – (R1*A1+R2*(1-A1), G1*A1+G2*(1-A1), B1*A1+B2*(1-A1))

Add Pixel Blending – суммирование цветов, т.е. (R1+R2, G1+G2, B1+B2)

Modulate Pixel Blending – модуляция цветов, т.е. (R1*R2, G1*G2, B1*B2)

Phong Shading

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

Point

Световой источник, который светит одинаково во всех направлениях из одной точки (например, лампочка в комнате).

Procedural Texturing techniques (программное текстурирование)

Procedural Texturing techniques (или программное текстурирование) – это метод наложения реалистичных текстур “на лету”, т.е. путем математических аппроксимаций структуры таких материалов как дерево, мрамор , камень и др. (Сравните с простым текстурированием)

До последнего времени Procedural Texturing редко использовалось как в программных, так и акселерированных игровых и других движках реального времени. В первом случае, ввиду того, что подобные вычисления требуют колоссальных мощностей математического сопроцессора для приемлемой скорости рендеринга, а во втором случае – потому, что “шумовые” алгоритмы Перлина, которые используются для генерации таких текстур – не стандартны и имеют много вариаций. Более того, процесс генерации текстур, различных по типу, требует различных схемных подходов, в то время как традиционное наложение текстур требует одинакового схемного решения для загрузки любого изображения. После появления на свет технологии MMX от Intel ситуация изменилась, и уже существуют разработки программной реализации “шума” Перлина на основе этой технологии, которые позволяют накладывать текстуры “на лету” со скоростью, сравнимой с простым текстурированием.

Характерные особенности:

  • Доступны любые качество и разрешение текстур, возможна их моментальная смена “на лету” (+)
  • Трехмерность (+)
  • Высокие требования к производительности CPU (-)
  • Минимальные требования к количеству памяти компьютера (+)
  • Процесс сложноуправляем (-)
  • Ограниченность применения. Неприменим для имитации людей, картин, торговых марок и этикеток, рисунков и т.д. (-)

Projection

Процесс преобразования трех размерностей в две. Т.е. преобразование видимой части 3D объекта для отображения на двумерном дисплее.

Rasterization

Разделение объекта на пикселы.

Ray Tracing

“Трассировка лучей” – один из самых сложных и качественных методов построения реалистических изображений. Наиболее распространен вариант “обратной трассировки лучей”: от глаза наблюдателя, через пиксел строящегося изображения проводят луч и, учитывая все его отражения от объектов, вычисляют цвет этого пиксела.

RGB

Система цветообразования, в которой конечный цвет получается за счет смешения, с различной интенсивностью, трех основных цветов: красного (Red), зеленого (Green) и синего (Blue). Самое известное устройство, которое использует систему RGB, это цветной монитор.

Real-time

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

Rendering

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

Rendering Engine

Дословно – устройство рендеринга. Часть графической системы, которая рисует 3D- примитивы, такие как треугольники или другие простые многоугольники. Практически во всех реализациях системы rendering engine отвечает за интерполяцию краев (границ) объектов и заполнение пикселами многоугольников.

Resolution

Разрешение. Количество пикселей, представленное битами в видеопамяти, или адресуемое разрешение. Видеопамять может организовываться соотношением пикселов (битов) по оси x (пикселы на строке) к числу пикселов по оси y (столбцы) и к размеру отводимой памяти на представление глубины цвета. Стандартная видеопамять VGA 640 пикселов на 480 пикселов и, обычно, с глубиной представления цвета 8 бит. Чем выше разрешение, тем более детально изображение, и тем больше нужно хранить о нем информации. Но не вся хранимая информация может быть отображена на дисплее.

Scissors Clip (Scissoring)

Устанавливается положение контрольного пиксела относительно вырезаемых многоугольников, и многоугольник отбрасывается, если он находится вне отображаемой зоны. Т.е. сокращаются размеры буфера кадра, за счет вырезания “ненужных” многоугольников.

Set-up Engine

Set-up engine позволяет драйверам передавать многоугольники в rendering engine в виде информации об адресах их вершинах, в то время, как, обычно, информация предварительно обрабатывается центральным процессором и передается в терминах изменения (дельт) границ, цвета и текстуры. Таким образом, set-up engine переносит обработку соответствующих данных с центрального процессора на графический чипсет, сокращая таким образом требования к скорости шины на 30% для обработки маленьких, случайно расположенных треугольников, и на пропорционально большее значение для больших многоугольников.

Span

В растровой графике примитивы формируются с помощью преобразования линий развертки, каждая из которых пересекает примитив в двух точках (Р-левая и Р-правая). Последовательность пикселов на линии, расположенная между этими двумя точками, называется span. Каждый пиксел внутри span содержит значения величин Z, R, G, B.

Specular highlights

Световая характеристика, которая определяет то, как свет будет отражаться от объектов.

Spot

Световой источник, похожий на точечный. Он светит не во всех направлениях, а в пределах некого конуса. Освещаются только объекты, попадающие в этот конус.

Stippling

Создание контурных изображений, т.е. “рисование пунктиром”.

Tessellation

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

Texel

Элемент текстуры – определенный пиксель в текстуре.

Texture

Двумерное изображение хранящееся в памяти компьютера или графического акселератора в одном из пиксельных форматов. В случае хранения в сжатом виде на дисках компьютера текстура может представлять собой обычный бит-мап, который мы привыкли видеть в форматах bmp, jpg, gif и т.д. Перед использованием текстура разворачивается в памяти и может занимать объем в десятки раз больший первоначального размера. Существует порядка двух десятков более или менее стандартизированных пиксельных форматов текстур.

Texture Anti-aliasing

Удаление нежелательных искажений растровых изображений с помощью интерполяции текстурных изображений.

Texture Mapping

(Наложение текстур)

Традиционно термином texture mapping в трехмерном моделировании называют процесс наложения двухмерной текстуры на трехмерный объект (текстура как бы натягивается на объект) для придания ему соответствующего внешнего вида. Таким образом, например, производится “раскрашивание” моделей монстров и игроков в трехмерных играх типа Quake и др.

Характерные особенности простого наложения текстур:

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

Transformation

Изменение координат. Последовательность математических операций над выходными графическими примитивами и геометрическими атрибутами для преобразования их из рассчетных координат в системные координаты.

Transparency

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

triangle strip and fans

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

Tri-linear Filtering (Tri-linear MIP Mapping)

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

True color

Цвет с глубиной представления 24 или 32 бит.

Vertex

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

Z-buffer

Часть графической памяти, в которой хранятся расстояния от точки наблюдения до каждого пиксела (значения Z). Z-buffer определяет, какая из многих перекрывающихся точек наиболее близка к плоскости наблюдения.
Также, как большее число битов на пиксель для цвета в буфере кадра соответствует большему количеству цветов, доступных в системе изображения, так и количество бит на пиксель в z-буфере соответствует большему числу элементов. Обычно, z-буфер имеет не менее 16 бит на пиксел для представления глубины цвета. Аппаратные акселераторы 3D графики могут иметь собственный z-буфер на графической карте, чтобы избежать удвоенной нагрузки на системную шину при передаче данных. Некоторые реализации Z-buffer используют для хранения не целочисленное значение глубины а значение с плавающей запятой от 0 до 1.

Z-buffering

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

Z-sorting

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

В подготовке материала приняли участие:
Вадим Репин (vad@kostroma.org)
Сергей Клюсов ()
Алексей Лагуненко (),
Николай Комарков ()
Александр Драгунов ()
Алексей Кузнецов
Павел Соколов (pavel@ixbt.com)

Введение

Мир 3D графики, в том числе игровой, наполнен терминами. Терминами, которые не всегда имеют единственно правильное определение. Иногда одни и те же вещи называются по-разному, и наоборот, один и тот же эффект может называться в настройках игры то “HDR”, то “Bloom”, то “Glow”, то “Postprocessing”. Большинству людей из похвальбы разработчиков о том, что они встроили в свой графический движок, непонятно, что в реальности имелось в виду.

Статья призвана помочь разобраться, что же значат некоторые из этих слов, наиболее часто употребляемые в подобных случаях. В рамках этой статьи речь пойдет далеко не обо всех терминах 3D графики, а только о тех, которые получили большее распространение в последнее время в качестве отличительных особенностей и технологий, применяемых в игровых графических движках и в качестве наименований графических настроек современных игр. Для начала, настоятельно рекомендую ознакомиться с теоретическими статьями под авторством Александра Медведева.

Если что-то в этой статье и в статьях Александра вам не понятно, то есть смысл начать с самого раннего, с “Терминологии 3D-графики” и других теоретических статей из раздела “Видеосистема” нашего сайта. Эти статьи уже несколько устарели, конечно, но основные, самые начальные и важные данные там есть. Мы же с вами поговорим о более “высокоуровневых” терминах. Основные понятия о 3D графике реального времени и устройстве графического конвейера у вас должны быть. С другой стороны, не ждите математических формул, академической точности и примеров кода – статья предназначена совсем не для этого.

Термины

Список терминов, описанных в статье:


Shader (Шейдер)

Шейдером в широком смысле называется программа для визуального определения поверхности объекта. Это может быть описание освещения, текстурирования, постобработки и т.п. Шейдеры выросли из работ Кука (Cook’s shade trees) и Перлина (Perlin’s pixel stream language). Сейчас наиболее известны шейдеры RenderMan Shading Language. Программируемые шейдеры были впервые представлены в RenderMan компании Pixar, там определены несколько типов шейдеров: light source shaders, surface shaders, displacement shaders, volume shaders, imager shaders. Эти шейдеры чаще всего программно выполняются универсальными процессорами и не имеют полной аппаратной реализации. В дальнейшем, многие исследователи описывали похожие на RenderMan языки, но они уже были предназначены для аппаратного ускорения: система PixelFlow (Olano и Lastra), Quake Shader Language (применен id Software в графическом движке игры Quake III, который описывал многопроходный рендеринг), и другие. Peercy сотоварищи разработали технику для того, чтобы программы с циклами и условиями выполнять на традиционных аппаратных архитектурах при помощи нескольких проходов рендеринга. Шейдеры RenderMan разбивались на несколько проходов, которые комбинировались во фреймбуфере. Позднее появились языки, которые мы видим аппаратно ускоренными в DirectX и OpenGL. Так шейдеры были адаптированы для графических приложений реального времени.

Видеочипы раннего времени не были программируемы и исполняли только заранее запрограммированные действия (fixed-function), например, алгоритм освещения был жестко зафиксирован в железе, и нельзя было ничего изменить. Затем, компании-производители видеочипов постепенно ввели в свои чипы элементы программируемости, сначала это были очень слабые возможности (NV10, известный как NVIDIA GeForce 256, уже был способен на некоторые примитивные программы), которые не получили программной поддержки в Microsoft DirectX API, но со временем возможности постоянно расширялись. Следующий шаг был за и NV20 (GeForce 3) и NV2A (видеочип, примененный в игровой консоли Microsoft Xbox), которые стали первыми чипами с аппаратной поддержкой шейдеров DirectX API. Версия Shader Model 1.0/1.1, появившаяся в DirectX 8, была сильно ограничена, каждый шейдер (особенно это относится к пиксельным) мог быть сравнительно малой длины и сочетать весьма ограниченный набор команд. В дальнейшем, Shader Model 1 (SM1 для краткости) была улучшена с пиксельными шейдерами версии 1.4 (ATI R200), которые предлагали большую гибкость, но также имели слишком ограниченные возможности. Шейдеры того времени писались на так называемом assembly shader language, который близок к ассемблеру для универсальных процессоров. Его низкий уровень доставляет определенные сложности для понимания кода и программирования, особенно, когда код программы большой, ведь он далек от элегантности и структурированности современных языков программирования.

Версия Shader Model 2.0 (SM2), появившись в DirectX 9 (что было поддержано видеочипом ATI R300, ставшим первым GPU с поддержкой шейдерной модели версии 2.0), серьезно расширила возможности шейдеров реального времени, предложив более длинные и сложные шейдеры и заметно расширившийся набор команд. Была добавлена возможность расчетов с плавающей запятой в пиксельных шейдерах, что также стало важнейшим улучшением. DirectX 9, в лице возможностей SM2, также привнес и язык шейдеров высокого уровня – high-level shader language (HLSL), весьма похожий на язык Си. И эффективный компилятор, переводящий HLSL программы в низкоуровневый код, “понятный” для аппаратных средств. Причем, доступно несколько профилей, предназначенных для разных аппаратных архитектур. Теперь, разработчик может писать один код HLSL шейдера и компилировать его при помощи DirectX в оптимальную программу, для установленного у пользователя видеочипа. После этого выходили чипы от NVIDIA, NV30 и NV40, которые улучшили возможности аппаратных шейдеров еще на шаг, добавив еще более длинные шейдеры, возможности динамических переходов в вершинных и пиксельных шейдерах, возможность выборки текстур из вершинных шейдеров и др. С тех пор пока качественных изменений не было, они ожидаются ближе к концу 2006 года в DirectX 10…

В целом, шейдеры добавили к графическому конвейеру множество новых возможностей по трансформации и освещению вершин и индивидуальной обработке пикселей так, как этого хотят разработчики каждого конкретного приложения. И все-таки, возможности аппаратных шейдеров до сих пор не раскрыты в приложениях полностью, а ведь с увеличением их возможностей в каждом новом поколении “железа”, мы скоро увидим уровень тех самых шейдеров RenderMan, которые когда-то казались недостижимыми для игровых видеоускорителей. Пока в шейдерных моделях реального времени, поддерживаемых на сегодняшний день аппаратными видеоускорителями, определено лишь два типа шейдеров: Vertex Shader и Pixel Shader (в определении DirectX 9 API). В будущем DirectX 10 к ним обещает добавиться еще и Geometry Shader.

Vertex Shader (Вершинный Шейдер)

Вершинные шейдеры – это программы, выполняемые видеочипами, которые производят математические операции с вершинами (vertex, из них состоят 3D объекты в играх), иначе говоря, они предоставляют возможность выполнять программируемые алгоритмы по изменению параметров вершин и их освещению (T&L – Transform & Lighting). Каждая вершина определяется несколькими переменными, например, положение вершины в 3D пространстве определяется координатами: x, y и z. Вершины также могут быть описаны характеристиками цвета, текстурными координатами и т.п. Вершинные шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе своей работы, например, вычисляя и записывая новые координаты и/или цвет. То есть, входные данные вершинного шейдера – данные об одной вершине геометрической модели, которая в данный момент обрабатывается. Обычно это координаты в пространстве, нормаль, компоненты цвета и текстурные координаты. Результирующие данные выполняемой программы служат входными для дальнейшей части конвейера, растеризатор делает линейную интерполяцию входных данных для поверхности треугольника и для каждого пикселя исполняет соответствующий пиксельный шейдер. Очень простой и грубый (но наглядный, надеюсь) пример: вершинный шейдер позволяет взять 3D объект сферы и вершинным шейдером сделать из него зеленый куб :) .

До появления видеочипа NV20 у разработчиков было два пути, либо использовать собственные программы и алгоритмы, изменяющие параметры вершин, но тогда все расчеты делал бы CPU (software T&L), либо полагаться на фиксированные алгоритмы в видеочипах, с поддержкой аппаратной трансформации и освещения (hardware T&L). Первая же шейдерная модель DirectX означала большой шаг вперед от фиксированных функций по трансформации и освещению вершин к полностью программируемым алгоритмам. Стало возможным, например, выполнять алгоритм скининга полностью на видеочипах, а до этого единственной возможностью было их исполнение на универсальных центральных процессорах. Теперь, с сильно улучшенными со времен упомянутого чипа NVIDIA возможностями, с вершинами при помощи вершинных шейдеров можно делать уже очень многое (кроме их создания, разве что)…

Примеры того, как и где применяются вершинные шейдеры:

  • Скининг (skinning). Matrix pallete skinning для скелетной анимации персонажей с большим количеством “костей”. Примеры вы видите практически во всех играх. Но приведу один скриншот из Call of Duty 2, над вершинами каждого из персонажей поработал алгоритм скининга. Причем, с шейдерами версии 3.0 сделать скининг стало заметно проще, для шейдеров версии 1.1 нужно было писать несколько шейдеров для каждого вида скининга (с определенным количеством “костей”).Call of Duty 2
  • Деформация объектов. Как самый явный и эффектный пример – создание реалистичных волн в динамике. Примеры подобных решений наблюдаются в играх F.E.A.R. и Pacific Fighters, причем в последнем сделана, пожалуй, самая реалистичная вода реального времени, применяются вершинные шейдеры 3.0 и доступ к текстурам из них, настоящий Displacement Mapping в дополнение к Bump Mapping:F.E.A.R. Pacific Fighters
    Конечно, похожий эффект волн в динамике, как в F.E.A.R., может быть запрограммирован и на пиксельном уровне (Morrowind), но в данном случае речь об изменении реальной геометрии, что всегда реалистичнее выглядит.
  • Анимация объектов. Например, травы и деревьев в одном из первых применений – 3DMark 2001 SE, алгоритм анимации был значительно улучшен в следующем 3DMark 03:3DMark 2001 SE 3DMark 03
  • Toon shading/Cel shading. Используется в некоторых играх для создания специального эффекта “мультяшного” изображения:TMNT XIII
  • Имитация ткани (Cloth Simulation) – для имитации поведения подобных ткани материалов, которой очень не хватает в большинстве игр. Наиболее просто понять, о чем речь, по такой картинке:Cloth Demo

Pixel Shader (Пиксельный Шейдер)

Пиксельные шейдеры – это программы, выполняемые видеочипом во время растеризации для каждого пикселя изображения, они производят выборку из текстур и/или математические операции над цветом и значением глубины (Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются попиксельно, после того, как операции с трансформированием и освещением геометрии завершены. Пиксельный шейдер в итоге своей работы выдает конечное значение цвета пикселя и Z-значение для последующего этапа графического конвейера, блендинга. Наиболее простой пример пиксельного шейдера, который можно привести: банальное мультитекстурирование, просто смешение двух текстур (diffuse и lightmap, например) и наложение результата вычисления на пиксель.

До появления видеочипов с аппаратной поддержкой пиксельных шейдеров, у разработчиков были лишь возможности по обычному мультитекстурированию и альфа-блендингу, что существенно ограничивало возможности по многим визуальным эффектам и не позволяло делать многое из того, что сейчас доступно. И если с геометрией еще что-то можно было делать программно, то с пикселями – нет. Ранние версии DirectX (до 7.0 включительно) всегда выполняли все расчеты повершинно и предлагали крайне ограниченную функциональность по попиксельному освещению (вспоминаем EMBM – environment bump mapping и DOT3) в последних версиях. Пиксельные шейдеры сделали возможным освещение любых поверхностей попиксельно, используя запрограммированные разработчиками материалы. Появившиеся в NV20 пиксельные шейдеры версии 1.1 (в понимании DirectX) уже могли не только делать мультитекстурирование, но и многое другое, хотя большинство игр, использующих SM1, просто использовали традиционное мультитекстурирование на большинстве поверхностей, выполняя более сложные пиксельные шейдеры лишь на части поверхностей, для создания разнообразных спецэффектов (все знают, что вода до сих пор является наиболее частым примером использования пиксельных шейдеров в играх). Сейчас, после появления SM3 и поддерживающих их видеочипов, возможности пиксельных шейдеров доросли уже до того, чтобы с их помощью делать даже трассировку лучей (raytracing), пусть пока с некоторыми ограничениями.

Примеры применения пиксельных шейдеров:

Procedural Textures (Процедурные Текстуры)

Процедурные текстуры – это текстуры, описываемые математическими формулами. Такие текстуры не занимают в видеопамяти места, они создаются пиксельным шейдером “на лету”, каждый их элемент (тексель) получается в результате исполнения соответствующих команд шейдера. Наиболее часто встречающиеся процедурные текстуры: разные виды шума (например, fractal noise), дерево, вода, лава, дым, мрамор, огонь и т.п., то есть те, которые сравнительно просто можно описать математически. Процедурные текстуры также позволяют использовать анимированные текстуры при помощи всего лишь небольшой модификации математических формул. Например, облака, сделанные подобным образом, выглядят вполне прилично и в динамике и в статике.

Clouds Clouds

Преимущества процедурных текстур также включают в себя неограниченный уровень детализации каждой текстуры, пикселизации просто не будет, текстура как бы всегда генерируется под необходимый для ее отображения размер. Большой интерес представляет и анимированный Normal Mapping, с его помощью можно сделать волны на воде, без применения предпросчитанных анимированных текстур. Еще один плюс таких текстур в том, что чем больше их применяется в продукте, тем меньше работы для художников (правда, больше для программистов) над созданием обычных текстур.

К сожалению, процедурные текстуры не получили пока должного применения в играх, в реальных приложениях до сих пор зачастую проще загрузить обычную текстуру, объемы видеопамяти растут не по дням, а по часам, в самых современных ускорителях ставят уже 512 мегабайт выделенной видеопамяти, которую надо чем-то занимать. Более того, до сих пор чаще делают наоборот – для ускорения математики в пиксельных шейдерах используют lookup tables (LUT) – специальные текстуры, содержащие заранее просчитанные значения, получаемые в результате вычислений. Чтобы не считать для каждого пикселя несколько математических команд, просто читают заранее вычисленные значения из текстуры. Но чем дальше, тем сильнее акцент должен смещаться именно в сторону математических вычислений, взять те же видеочипы ATI нового поколения: RV530 и R580, у которых на каждые 4 и 16 текстурных блоков приходится 12 и 48 пиксельных процессоров, соответственно. Тем более, если речь о 3D текстурах, ведь если двухмерные текстуры без проблем можно разместить в локальной памяти ускорителя, то 3D текстуры требуют ее намного больше.

Примеры процедурных текстур:

D3D RightMark Lightwave

Bump Mapping/Specular Bump Mapping

Бампмаппинг – это техника симуляции неровностей (или моделирования микрорельефа, как больше нравится) на плоской поверхности без больших вычислительных затрат и изменения геометрии. Для каждого пикселя поверхности выполняется вычисление освещения, исходя из значений в специальной карте высот, называемой bumpmap. Это обычно 8-битная черно-белая текстура и значения цвета текстуры не накладываются как обычные текстуры, а используются для описания неровности поверхности. Цвет каждого текселя определяет высоту соответствующей точки рельефа, большие значения означают большую высоту над исходной поверхностью, а меньшие, соответственно, меньшую. Или наоборот.

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

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

Для продолжения необходимо напомнить о составляющих освещения. Цвет точки поверхности рассчитывается как сумма ambient, diffuse и specular составляющих от всех источников света в сцене (в идеале от всех, зачастую многими пренебрегают). Вклад в это значение от каждого источника света зависит от расстояния между источником света и точкой на поверхности.

Составляющие освещения:

Lighting А теперь добавим к этому бампмаппинг:

Bumpmapping

Равномерная (ambient) составляющая освещения – аппроксимация глобального освещения, “начальное” освещение для каждой точки сцены, при котором все точки освещаются одинаково и освещенность не зависит от других факторов.
Диффузная (diffuse) составляющая освещения зависит от положения источника освещения и от нормали поверхности. Эта составляющая освещения разная для каждой вершины объекта, что придает им объем. Свет уже не заполняет поверхность одинаковым оттенком.
Бликовая (specular) составляющая освещения проявляется в бликах отражения лучей света от поверхности. Для ее расчета, помимо вектора положения источника света и нормали, используются еще два вектора: вектор направления взгляда и вектор отражения. Specular модель освещения впервые предложил Фонг (Phong Bui-Tong). Эти блики существенно увеличивают реалистичность изображения, ведь редкие реальные поверхности не отражают свет, поэтому specular составляющая очень важна. Особенно в движении, потому что по бликам сразу видно изменение положения камеры или самого объекта. В дальнейшем, исследователи придумывали иные способы вычисления этой составляющей, более сложные (Blinn, Cook-Torrance, Ward), учитывающие распределение энергии света, его поглощение материалами и рассеивания в виде диффузной составляющей.

Итак, Specular Bump Mapping получается таким образом:

Bumpmapping

И посмотрим то же самое на примере игры, Call of Duty 2:

Call of Duty 2
Первый фрагмент картинки – рендеринг без бампмаппинга (нормалмаппинга) вообще, второй (справа-сверху) – бампмаппинг без бликовой составляющей, третий – с бликовой составляющей нормальной величины, какая используется в игре, и последний, справа-снизу – с максимально возможным значением specular составляющей.

Что касается первого аппаратного применения, то некоторые виды бампмаппинга (Emboss Bump Mapping) стали использовать еще во времена видеокарт на базе чипов NVIDIA Riva TNT, однако техники того времени были крайне примитивны и широкого применения не получили. Следующим известным типом стал Environment Mapped Bump Mapping (EMBM), но аппаратной его поддержкой в DirectX в то время обладали только видеокарты Matrox, и опять применение было сильно ограничено. Затем появился Dot3 Bump Mapping и видеочипы того времени (GeForce 256 и GeForce 2) требовали три прохода для того, чтобы полностью выполнить такой математический алгоритм, так как они ограничены двумя одновременно используемыми текстурами. Начиная с NV20 (GeForce3), появилась возможность делать то же самое за один проход при помощи пиксельных шейдеров. Дальше – больше. Стали применять более эффективные техники, такие как Normal Mapping.

Примеры применения бампмаппинга в играх:

Evolva RSC

Displacement Mapping

Наложение карт смещения (Displacement Mapping) является методом добавления деталей к трехмерным объектам. В отличие от бампмаппинга и других попиксельных методов, когда картами высот правильно моделируется только освещенность точки, но не изменяется ее положение в пространстве, что дает лишь иллюзию увеличения сложности поверхности, карты смещения позволяют получить настоящие сложные 3D объекты из вершин и полигонов, без ограничений, присущих попиксельным методам. Этот метод изменяет положение вершин треугольников, сдвигая их по нормали на величину, исходя из значений в картах смещения. Карта смещения (displacement map) – это обычно черно-белая текстура, и значения в ней используются для определения высоты каждой точки поверхности объекта (значения могут храниться как 8-битные или 16-битные числа), схоже с bumpmap. Часто карты смещения используются (в этом случае они называются и картами высот) для создания земной поверхности с холмами и впадинами. Так как рельеф местности описывается двухмерной картой смещения, его относительно легко деформировать при необходимости, так как это потребует всего лишь модификации карты смещения и рендеринга на ее основе поверхности в следующем кадре.

Наглядно создание ландшафта при помощи наложения карт смещения представлено на картинке. Исходными были 4 вершины и 2 полигона, в итоге получился полноценный кусок ландшафта.

Displacement Mapping

Большим преимуществом наложения карт смещения является не просто возможность добавления деталей к поверхности, а практически полное создание объекта. Берется низкополигональный объект, разбивается (тесселируется) на большее количество вершин и полигонов. Вершины, полученные в результате тесселяции, затем смещаются по нормали, исходя из значения, прочитанного в карте смещения. Получаем в итоге сложный 3D объект из простого, используя соответствующую displacement карту:

Displacement Mapping
Количество треугольников, созданных при тесселяции, должно быть достаточно большим для того, чтобы передать все детали, задаваемые картой смещений. Иногда дополнительные треугольники создаются автоматически, используя N-патчи или другие методы. Карты смещения лучше использовать совместно с бампмаппингом для создания мелких деталей, где достаточно правильного попиксельного освещения.

Наложение карт смещения впервые получило поддержку в DirectX 9.0. Это была первая версия данного API, которая поддержала технику Displacement Mapping. В DX9 поддерживается два типа наложения карт смещения, filtered и presampled. Первый метод был поддержан забытым уже видеочипом MATROX Parhelia, а второй – ATI RADEON 9700. Filtered метод отличается тем, что позволяет использовать мип-уровни для карт смещения и применять для них трилинейную фильтрацию. В таком методе мип-уровень карты смещения выбирается для каждой вершины на основе расстояния от вершины до камеры, то есть уровень детализации выбирается автоматически. Таким образом достигается почти равномерное разбиение сцены, когда треугольники имеют примерно одинаковый размер.

Наложение карт смещения можно по существу считать методом сжатия геометрии, использование карт смещения снижает объем памяти, требуемый для определенной детализации 3D модели. Громоздкие геометрические данные замещаются простыми двухмерными текстурами смещения, обычно 8-битными или 16-битными. Это снижает требования к объему памяти и пропускной способности, необходимой для доставки геометрических данных к видеочипу, а эти ограничения являются одними из главных для сегодняшних систем. Или же, при равных требованиях к пропускной способности и объему памяти, наложение карт смещения позволяет использовать намного более сложные геометрически 3D модели. Применение моделей значительно меньшей сложности, когда вместо десятков или сотен тысяч треугольников используют единицы тысяч, позволяет еще и ускорить их анимацию. Или же улучшить, применив более сложные комплексные алгоритмы и техники, вроде имитации тканей (cloth simulation).

Другое преимущество в том, что применение карт смещения превращает сложные полигональные трехмерные сетки в несколько двухмерных текстур, которые проще поддаются обработке. Например, для организации Level of Detail можно использовать обычный мип-маппинг для наложения карт смещения. Также, вместо сравнительно сложных алгоритмов сжатия трехмерных сеток можно применять привычные методы сжатия текстур, даже JPEG-подобные. А для процедурного создания 3D объектов можно использовать обычные алгоритмы для двухмерных текстур.

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

В качестве примера из реальных игр приведу игру, в которой используется выборка текстур из вершинного шейдера, возможность, появившаяся в видеочипах NVIDIA NV40 и шейдерной модели 3.0. Вершинное текстурирование можно применить для полностью выполняемого видеочипом простого метода наложения карт смещения, без тесселяции (разбиения на большее количество треугольников). Применение такому алгоритму ограничено, они имеют смысл, только если карты будут динамическими, то есть, будут изменяться в процессе. Например, это рендеринг больших водных поверхностей, что и сделано в игре Pacific Fighters:

DM off DM on

Normal Mapping

Нормалмаппинг – это улучшенная разновидность техники бампмаппинга, описанной ранее, расширенная ее версия. Бампмаппинг был разработан Блинном (Blinn) еще в 1978 году, нормали поверхности при этом методе наложения рельефа изменяются на основе информации из карт высот (bump map). В то время как бампмаппинг всего лишь изменяет существующую нормаль для точек поверхности, нормалмаппинг полностью заменяет нормали при помощи выборки их значений из специально подготовленной карты нормалей (normal map). Эти карты обычно являются текстурами с сохраненными в них заранее просчитанными значениями нормалей, представленными в виде компонент цвета RGB (впрочем, есть и специальные форматы для карт нормалей, в том числе со сжатием), в отличие от 8-битных черно-белых карт высот в бампмаппинге.

В общем, как и бампмаппинг, это тоже “дешевый” метод для добавления детализации к моделям сравнительно низкой геометрической сложности, без использования большего количества реальной геометрии, только более продвинутый. Одно из наиболее интересных применений техники – существенное увеличение детализации низкополигональных моделей при помощи карт нормалей, полученных обработкой такой же модели высокой геометрической сложности. Карты нормалей содержат более подробное описание поверхности, по сравнению с бампмаппингом и позволяют представить более сложные формы. Идеи по получению информации из высокодетализированных объектов были озвучены в середине 90-х годов прошлого века, но тогда речь шла об использовании для Displacement Mapping. Позднее, в 1998 году, были представлены идеи о перенесении деталей в виде карт нормалей от высокополигональных моделей в низкополигональные.

Normal Mapping

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

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

Карты нормалей изначально были представлены в виде обычных RGB текстур, где компоненты цвета R, G и B (от 0 до 1) интерпретируются как координаты X, Y и Z. Каждый тексель в карте нормалей представлен как нормаль точки поверхности. Карты нормалей могут быть двух видов: с координатами в model space (общей системе координат) или tangent space (термин на русском – “касательное пространство”, локальная система координат треугольника). Чаще применяется второй вариант. Когда карты нормалей представлены в model space, то они должны иметь три компоненты, так как могут быть представлены все направления, а когда в локальной системе координат tangent space, то можно обойтись двумя компонентами, а третью получить в пиксельном шейдере.

Bump Maps - Normal Maps

Современные приложения реального времени до сих пор сильно проигрывают пререндеренной анимации по качеству изображения, это касается, прежде всего, качества освещения и геометрической сложности сцен. Количество вершин и треугольников, рассчитываемых в реальном времени, ограничено. Поэтому очень важны методы, позволяющие снизить количество геометрии. До нормалмаппинга были разработаны несколько таких методов, но низкополигональные модели даже с бампмаппингом получаются заметно хуже более сложных моделей. Нормалмаппинг хоть и имеет несколько недостатков (самый явный – так как модель остается низкополигональной, это легко видно по ее угловатым границам), но итоговое качество рендеринга заметно улучшается, оставляя геометрическую сложность моделей низкой. В последнее время хорошо видно увеличение популярности данной методики и использование ее во всех популярных игровых движках. “Виной” этому – комбинация отличного результирующего качества и одновременное снижение требований к геометрической сложности моделей. Техника нормалмаппинга сейчас применяется почти повсеместно, все новые игры используют ее максимально широко. Вот лишь краткий список известных ПК игр с использованием нормалмаппинга: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, F.E.A.R., Quake 4. Все они выглядят намного лучше, чем игры прошлого, в том числе из-за применения карт нормалей.

Quake 4 UT2007

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

Parallax Mapping/Offset Mapping

После нормалмаппинга, разработанного еще в 1984 году, последовало рельефное текстурирование (Relief Texture Mapping), представленное Olivera и Bishop в 1999 году. Это метод для наложения текстур, основанный на информации о глубине. Метод не нашел применения в играх, но его идея способствовала продолжению работ над параллаксмаппингом и его улучшении. Kaneko в 2001 представил parallax mapping, который стал первым эффективным методом для попиксельного отображения эффекта параллакса. В 2004 году Welsh продемонстрировал применение параллаксмаппинга на программируемых видеочипах.

У этого метода, пожалуй, больше всего различных названий. Перечислю те, которые встречал: Parallax Mapping, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. В статье для краткости применяется первое название.
Параллаксмаппинг – это еще одна альтернатива техникам бампмаппинга и нормалмаппинга, которая дает еще большее представление о деталях поверхности, более натуралистичное отображение 3D поверхностей, также без слишком больших потерь производительности. Это техника похожа одновременно на наложение карт смещения и нормалмаппинг, это нечто среднее между ними. Метод тоже предназначен для отображения большего количества деталей поверхности, чем есть в исходной геометрической модели. Он похож на нормалмаппинг, но отличие в том, что метод искажает наложение текстуры, изменяя текстурные координаты так, что когда вы смотрите на поверхность под разными углами, она выглядит выпуклой, хотя в реальности поверхность плоская и не изменяется. Иными словами, Parallax Mapping – это техника аппроксимации эффекта смещения точек поверхности в зависимости от изменения точки зрения.

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

Parallax Mapping

Но использование обычного параллаксмаппинга ограничено картами высот с небольшой разницей значений. “Крутые” неровности обрабатываются алгоритмом некорректно, появляются различные артефакты, “плавание” текстур и пр. Было разработано несколько модифицированных методов для улучшения техники параллаксмаппинга. Несколько исследователей (Yerex, Donnelly, Tatarchuk, Policarpo) описали новые методы, улучшающие начальный алгоритм. Почти все идеи основаны на трассировке лучей в пиксельном шейдере для определения пересечений деталей поверхностей друг другом. Модифицированные методики получили несколько разных названий: Parallax Mapping with Occlusion, Parallax Mapping with Distance Functions, Parallax Occlusion Mapping. Для краткости будем их все называть Parallax Occlusion Mapping.

Методы Parallax Occlusion Mapping включают еще и трассировку лучей для определения высот и учета видимости текселей. Ведь при взгляде под углом к поверхности тексели загораживают друг друга, и, учитывая это, можно добавить к эффекту параллакса больше глубины. Получаемое изображение становится реалистичнее и такие улучшенные методы можно применять для более глубокого рельефа, он отлично подходит для изображения кирпичных и каменных стен, мостовой и пр. Нужно особенно отметить, что главное отличие Parallax Mapping от Displacement Mapping в том, что расчеты все попиксельные, а не повершинные. Именно поэтому метод имеет названия вроде Virtual Displacement Mapping и Per-Pixel Displacement Mapping. Посмотрите на картинку, трудно поверить, но камни мостовой тут – всего лишь попиксельный эффект:

Parallax Mapping

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

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

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

F.E.A.R. TES4

Postprocessing (Постобработка)

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

Простой пример из фотографии: вы сфотографировали красивое озеро с зеленью при ясной погоде. Небо получается очень ярким, а деревья – слишком темными. Вы загружаете фотографию в графический редактор и начинаете изменять яркость, контраст и другие параметры для участков изображения или для всей картинки. Но вы уже не имеете возможности изменить настройки фотоаппарата, вы делаете обработку готового изображения. Это и есть постобработка. Или другой пример: выделение заднего плана в портретной фотографии и применение blur фильтра к этой области для эффекта depth of field с большей глубиной. То есть, когда вы изменяете или подправляете кадр в графическом редакторе, вы и делаете постобработку. То же самое может делаться и в игре, в реальном времени.

Существует множество разных возможностей по обработке изображения после его рендеринга. Все видели, наверное, в графических редакторах множество так называемых графических фильтров. Это как раз то, что называется постфильтрами: blur, edge detection, sharpen, noise, smooth, emboss и др. В применении к 3D рендерингу в реальном времени это делается так – вся сцена рендерится в специальную область, render target, и после основного рендеринга это изображение дополнительно обрабатывается при помощи пиксельных шейдеров и только потом выводится на экран. Из эффектов постобработки в играх чаще всего используют Bloom, Motion Blur, Depth Of Field. Существует и множество других постэффектов: noise, flare, distortion, sepia и др.

Вот парочка ярких примеров постобработки в игровых приложениях:

Xpand Rally Silent Hill 2

High Dynamic Range (HDR)

High Dynamic Range (HDR) в применении к 3D графике – это рендеринг в широком динамическом диапазоне. Суть HDR заключается в описании интенсивности и цвета реальными физическими величинами. Привычной моделью описания изображения является RGB, когда все цвета представлены в виде суммы основных цветов: красного, зеленого и синего, с разной интенсивностью в виде возможных целочисленных значений от 0 до 255 для каждого, закодированных восемью битами на цвет. Отношение максимальной интенсивности к минимальной, доступной для отображения конкретной моделью или устройством, называется динамическим диапазоном. Так, динамический диапазон модели RGB составляет 256:1 или 100:1 cd/m2 (два порядка). Эта модель описания цвета и интенсивности общепринято называется Low Dynamic Range (LDR).

Возможных значений LDR для всех случаев явно недостаточно, человек способен видеть гораздо больший диапазон, особенно при малой интенсивности света, а модель RGB слишком ограничена в таких случаях (да и при больших интенсивностях тоже). Динамический диапазон зрения человека от 10-6 до 108 cd/m2, то есть 100000000000000:1 (14 порядков). Одновременно весь диапазон мы видеть не можем, но диапазон, видимый глазом в каждый момент времени, примерно равен 10000:1 (четырем порядкам). Зрение приспосабливается к значениям из другой части диапазона освещенности постепенно, при помощи так называемой адаптации, которую легко описать ситуацией с выключением света в комнате в темное время суток – сначала глаза видят очень мало, но со временем адаптируются к изменившимся условиям освещения и видят уже намного больше. То же самое случается и при обратной смене темной среды на светлую.

Итак, динамического диапазона модели описания RGB недостаточно для представления изображений, которые человек способен видеть в реальности, эта модель значительно уменьшает возможные значения интенсивности света в верхней и нижней части диапазона. Самый распространенный пример, приводимый в материалах по HDR, – изображение затемненного помещения с окном на яркую улицу в солнечный день. С RGB моделью можно получить или нормальное отображение того, что находится за окном, или только того, что внутри помещения. Значения больше 100 cd/m 2 в LDR вообще обрезаются, это является причиной тому, что в 3D рендеринге трудно правильно отображать яркие источники света, направленные прямо в камеру.

Debevec

Сами устройства отображения данных пока что серьезно улучшить нельзя, а отказаться от LDR при расчетах имеет смысл, можно использовать реальные физические величины интенсивности и цвета (или линейно пропорциональные), а на монитор выводить максимум того, что он сможет. Суть представления HDR в использовании значений интенсивности и цвета в реальных физических величинах или линейно пропорциональных и в том, чтобы использовать не целые числа, а числа с плавающей точкой с большой точностью (например, 16 или 32 бита). Это снимет ограничения модели RGB, а динамический диапазон изображения серьезно увеличится. Но затем любое HDR изображение можно вывести на любом средстве отображения (том же RGB мониторе), с максимально возможным качеством для него при помощи специальных алгоритмов tone mapping.

HDR рендеринг позволяет изменять экспозицию уже после того, как мы отрендерили изображение. Дает возможность имитировать эффект адаптации человеческого зрения (перемещение из ярких открытых пространств в темные помещения и наоборот), позволяет выполнять физически правильное освещение, а также является унифицированным решением для применения эффектов постобработки (glare, flares, bloom, motion blur). Алгоритмы обработки изображения, цветокоррекцию, гамма-коррекцию, motion blur, bloom и другие методы постобработки качественней выполнять в HDR представлении.

HDR  Motion Blur

В приложениях 3D рендеринга реального времени (играх, в основном) HDR рендеринг начали использовать не так давно, ведь это требует вычислений и поддержки render target в форматах с плавающей точкой, которые впервые стали доступны только на видеочипах с поддержкой DirectX 9. Обычный путь HDR рендеринга в играх таков: рендеринг сцены в буфер формата с плавающей точкой, постобработка изображения в расширенном цветовом диапазоне (изменение контраста и яркости, цветового баланса, эффекты glare и motion blur, lens flare и подобные), применение tone mapping для вывода итоговой HDR картинки на LDR устройство отображения. Иногда используются карты среды (environment maps) в HDR форматах, для статических отражений на объектах, весьма интересны применения HDR в имитации динамических преломлений и отражений, для этого также могут использоваться динамические карты в форматах с плавающей точкой. К этому можно добавить еще лайтмапы (light maps), заранее рассчитанные и сохраненные в HDR формате. Многое из перечисленного сделано, например, в Half-Life 2: Lost Coast.

Half-Life 2: Lost Coast

HDR рендеринг очень полезен для комплексной постобработки более высокого качества, по сравнению с обычными методами. Тот же bloom будет выглядеть реалистичнее при расчетах в HDR модели представления. Например, как это сделано в игре Far Cry от Crytek, там используются стандартные методы HDR рендеринга: применение bloom фильтров, представленные Kawase и tone mapping оператор Reinhard.

Far Cry

К сожалению, в некоторых случаях разработчики игр могут скрывать под названием HDR просто фильтр bloom, рассчитываемый в обычном LDR диапазоне. И хотя большая часть в том, что сейчас делают в играх с HDR рендерингом, как раз и есть bloom лучшего качества, выгода от HDR рендеринга не ограничивается одним этим постэффектом, просто его сделать легче всего.

Другие примеры применения HDR рендеринга в приложениях реального времени:

The Project 3DMark 06

Tone Mapping

Tone mapping – это процесс преобразования диапазона яркостей HDR к LDR диапазону, отображаемому устройством вывода, например, монитором или принтером, так как вывод HDR изображений на них потребует преобразования динамического диапазона и цветового охвата модели HDR в соответствующий динамический диапазон LDR, чаще всего модель RGB. Ведь диапазон яркости, представленный в HDR, очень широк, это несколько порядков абсолютного динамического диапазона единовременно, в одной сцене. А диапазон, который можно воспроизвести на привычных устройствах вывода (мониторах, телевизорах), составляет лишь около двух порядков динамического диапазона.

Преобразование из HDR в LDR и называется tone mapping, оно выполняется с потерями и имитирует свойства человеческого зрения. Такие алгоритмы принято называть операторами tone mapping. Операторы разделяют все значения яркости изображения на три разных типа: с темной, средней и яркой освещенностью. На основе оценки яркости средних тонов, корректируется общая освещенность, значения яркости пикселей сцены перераспределяются для того, чтобы войти в выходной диапазон, темные пиксели осветляются, а светлые затемняются. Затем, наиболее яркие пиксели изображения приводятся к диапазону устройства вывода или выходной модели представления. На следующей картинке изображено самое простое приведение HDR изображения к LDR диапазону, линейное преобразование, а к фрагменту в центре применен более сложный оператор tone mapping, работающий так, как было описано выше:

Tone   Mapping

Видно, что только с применением нелинейного tone mapping можно получить максимум деталей в изображении, а если приводить HDR к LDR линейно, то многие мелочи просто теряются. Единственно правильного алгоритма tone mapping нет, существует несколько операторов, дающих хорошие результаты в разных ситуациях. Вот наглядный пример двух разных операторов tone mapping:

Tone   Mapping

Совместно с HDR рендерингом, с недавнего времени tone mapping начали применять в играх. Стало возможным опционально имитировать свойства человеческого зрения: потерю остроты в темных сценах, адаптацию к новым условиям освещения при переходах от очень ярких областей к темным и наоборот, чувствительность к изменению контраста, цвета… Вот так выглядит имитация способности зрения к адаптации в игре Far Cry. Первый скриншот показывает изображение, которое видит игрок, только что повернувшийся от темного помещения к ярко освещенному открытому пространству, а второй – то же изображение через пару секунд, после адаптации.

Far Cry Far Cry

Bloom

Bloom – это один из кинематографических эффектов постобработки, при помощи которого наиболее яркие участки изображения делаются еще более яркими. Это эффект очень яркого света, проявляющийся в виде свечения вокруг ярких поверхностей, после применения bloom фильтра такие поверхности не просто получают дополнительную яркость, свет от них (ореол) частично воздействует и на более темные области, соседствующие с яркими поверхностями в кадре. Проще всего показать это на примере:

NFS: Most Wanted

В 3D графике Bloom фильтр делается при помощи дополнительной постобработки – смешивания смазанного фильтром blur кадра (всего кадра или отдельных ярких его областей, фильтр обычно применяется несколько раз) и исходного кадра. Один из наиболее часто применяемых в играх и других приложениях реального времени алгоритм постфильтра bloom:

  • Сцена рендерится во фреймбуфер, интенсивность свечения (glow) объектов записывается в альфа-канал буфера.
  • Фреймбуфер копируется в специальную текстуру для обработки.
  • Разрешение текстуры уменьшается, например, в 4 раза.
  • К изображению несколько раз применяются фильтры сглаживания (blur), на основе данных об интенсивности, записанных в альфа-канал.
  • Полученное изображение смешивается с оригинальным кадром во фреймбуфере, и результат выводится на экран.

Как и другие виды постобработки, bloom лучше применять при рендеринге в широком динамическом диапазоне (HDR). Дополнительные примеры обработки конечного изображения bloom фильтром из 3D приложений реального времени:

3DMark 05 Splinter Cell

Motion Blur

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

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

Motion Blur

По изображению без смазывания нельзя даже сказать, движутся сферы или нет, в то время как motion blur дает четкое представление о скорости и направлении движения объектов. Кстати, отсутствие смазывания при движении служит и причиной того, почему движение в играх при 25-30 кадрах в секунду кажется дерганым, хотя кино и видео при этих же параметрах частоты кадров смотрится прекрасно. Для компенсации отсутствия смазывания в движении желательна или высокая частота кадров (60 кадров в секунду или выше) или использование методов дополнительной обработки изображения, для эмуляции эффекта motion blur. Это применяется и для улучшения плавности анимации и для эффекта фото- и кинореалистичности одновременно.

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

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

NFS: Most Wanted SW: Republic Commando

Depth Of Field (DOF)

Depth of field (глубина резкости), вкратце, это размывание объектов в зависимости от их положения относительно фокуса камеры. В реальной жизни, на фотографиях и в кино мы видим одинаково четко не все объекты, это связано с особенностью строения глаза и устройства оптики фото- и киноаппаратов. У фото- и кинооптики есть определенное расстояние, объекты, расположенные на таком расстоянии от камеры находятся в фокусе и выглядят на картинке резкими, а более удаленные от камеры или приближенные к ней объекты выглядят, наоборот, размытыми, резкость снижается постепенно при увеличении или снижении расстояния.

Depth of Field

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

Одним из распространенных методов при рендеринге в реальном времени является смешивание оригинального кадра и его смазанной версии (несколько проходов blur фильтра) на основе данных о глубине для пикселей изображения. В играх, для эффекта DOF есть несколько применений, например, это игровые ролики на движке игры, повторы в спортивных и гоночных играх. Примеры depth of field в реальном времени:

The Assassin Silent Hill 3

Level Of Detail (LOD)

Уровень детализации (level of detail) в 3D приложениях – это метод снижения сложности рендеринга кадра, уменьшения общего количества полигонов, текстур и иных ресурсов в сцене, общее снижение её сложности. Простой пример: основная модель персонажа состоит из 10000 полигонов. В тех случаях, когда в обрабатываемой сцене он расположен близко к камере, важно, чтобы использовались все полигоны, но на очень большом расстоянии от камеры в итоговом изображении он будет занимать лишь несколько пикселей, и смысла в обработке всех 10000 полигонов нет никакого. Возможно, в этом случае будет достаточно сотни полигонов, а то и пары штук и специально подготовленной текстуры для примерно такого же отображения модели. Соответственно, на средних расстояниях имеет смысл использовать модель, состоящую из количества треугольников большего, чем у самой простой модели, и меньшего, чем у наиболее сложной.

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

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

Level of Detail

Кроме расстояния от камеры, для LOD могут иметь значение и другие факторы – общее количество объектов на экране (когда один-два персонажа в кадре, то используются сложные модели, а когда 10-20, они переключаются на более простые) или количество кадров в секунду (задаются пределы значений FPS, при которых изменяется уровень детализации, например, при FPS ниже 30 снижаем сложность моделей на экране, а при 60, наоборот, повышаем). Другие возможные факторы, влияющие на уровень детализации – скорость перемещения объекта (ракету в движении вы рассмотреть вряд ли успеете, а вот улитку – запросто), важность персонажа с игровой точки зрения (тот же футбол взять – для модели игрока, которым управляете вы, можно использовать более сложную геометрию и текстуры, вы его видите ближе всего и чаще всего). Тут все зависит от желаний и возможностей конкретного разработчика. Главное – не переборщить, частые и заметные изменения уровня детализации раздражают.

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

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

LFS

Но на данном примере все же видно, что ближайшая модель автомобиля имеет максимальную детализацию, следующие две-три машины тоже очень близки к этому уровню, а все дальние имеют видимые упрощения, вот лишь самые значительные: отсутствуют зеркала заднего вида, номерные знаки, стеклоочистители и дополнительная светотехника. А от самой дальней модели нет даже тени на дороге. Это и есть алгоритм level of detail в действии.

Global Illumination

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

Алгоритмы освещения можно разделить на две модели: прямое или локальное освещение и глобальное освещение (direct или local illumination и global illumination). Локальная модель освещения использует расчет прямой освещенности, свет от источников света до первого пересечения света с непрозрачной поверхностью, взаимодействие объектов между собой не учитывается. Хотя такая модель пытается компенсировать это добавлением фонового или равномерного (ambient) освещения, но это самая простая аппроксимация, сильно упрощенное освещение от всех непрямых лучей источников света, которое задает цвет и интенсивность освещения объектов в отсутствии прямых источников света.

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

Local vs global

В глобальной модели освещения, global illumination, рассчитывается освещение с учетом влияния объектов друг на друга, учитываются многократные отражения и преломления лучей света от поверхностей объектов, каустика (caustics) и подповерхностное рассеивание (subsurface scattering). Эта модель позволяет получить более реалистичную картинку, но усложняет процесс, требуя заметно больше ресурсов. Существует несколько алгоритмов global illumination, мы вкратце рассмотрим radiosity (расчет непрямого освещения) и photon mapping (расчет глобального освещения на основе карт фотонов, предрассчитанных при помощи трассировки). Есть и упрощенные методы по симуляции непрямого освещения, такие, как изменение общей яркости сцены в зависимости от количества и яркости источников света в ней или использование большого количества точечных источников света, расставленных по сцене для имитации отраженного света, но все же это далеко от настоящего алгоритма GI.

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

Еще один метод расчета глобальной освещенности предложен Henrik Wann Jensen, это метод фотонных карт photon mapping. Использование фотонных карт – это другой алгоритм расчета глобального освещения, основанный на трассировке лучей и используемый для имитации взаимодействия лучей света с объектами сцены. Алгоритмом рассчитываются вторичные отражения лучей, преломление света через прозрачные поверхности, рассеянные отражения. Этот метод состоит в расчете освещенности точек поверхности в два прохода. В первом выполняется прямая трассировка лучей света с вторичными отражениями, это предварительный процесс, выполняемый перед основным рендерингом. В этом методе рассчитывается энергия фотонов, идущих от источника света к объектам сцены. Когда фотоны достигают поверхности, точка пересечения, направление и энергия фотона сохраняются в кэш, называемый фотонной картой. Фотонные карты могут сохраняться на диске для последующего использования, чтобы не просчитывать их каждый кадр. Отражения фотонов просчитываются до тех пор, пока работа не останавливается после определенного количества отражений или при достижении определенной энергии. Во втором проходе рендеринга выполняется расчет освещения пикселей сцены прямыми лучами, с учетом данных, сохраненных в фотонных картах, энергия фотонов добавляется к энергии прямого освещения.

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

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

Существуют и приемлемые алгоритмы для имитации глобального освещения в динамике. Например, есть такой простой метод для использования в приложениях реального времени, для расчета непрямого освещения объекта в сцене: упрощенный рендеринг всех объектов с пониженной детализацией (за исключением того, для которого считают освещение), в кубическую карту низкого разрешения (ее также можно использовать для отображения динамических отражений на поверхности объекта), затем фильтрация этой текстуры (несколько проходов blur фильтра), и применение для освещения этого объекта данных из рассчитанной текстуры в качестве дополнения к прямому освещению. В случаях, когда динамический расчет слишком тяжел, можно обойтись статическими radiosity картами. Пример из игры MotoGP 2, на котором хорошо видно благотворное влияние даже такой простой имитации GI:

MotoGP 2

Напоследок еще один пример direct illumination против global illumination рендеринга, чтобы развеять оставшиеся сомнения о полезности вторичного освещения (источник света один, ambient освещение отсутствует):

Direct Illumination Global Illumination

Дополнительная информация

Теоретические статьи на нашем сайте под авторством Александра Медведева:

DX Current – Настоящее аппаратного ускорения графики
http://www.ixbt.com/video2/dx-current.shtml

DX Next – Ближайшее и ближнее будущее аппаратного ускорения графики
http://www.ixbt.com/video2/dx-next.shtml

DirectX.Update – Ускорители графики: полшага вперед
http://www.ixbt.com/video2/dx-update.shtml

Longhorn – Microsoft улучшает графику на 55%
http://www.ixbt.com/video2/longhorn.shtml

VN:F [1.9.3_1094]
Rating: 10.0/10 (3 votes cast)
VN:F [1.9.3_1094]
Rating: +3 (from 3 votes)
Терминология 3D графики. Глоссарий., 10.0 out of 10 based on 3 ratings

4 комментария на «Терминология 3D графики. Глоссарий.»

  1. Антон Павлович

    Flat Shading (Flat) Fog Fogging FPS, frames per second Frame buffer Front buffer Gamma Gamma Correction Gouraud Shading (Smooth shading) Hidden […….

    Я конечно, прошу прощения, но мне необходимо немного больше информации….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  2. Armando

    lewisohn@dora.progandist” rel=”nofollow”>.…

    спс….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  3. raul

    soloists@irrevocably.spectrophotometric” rel=”nofollow”>.…

    благодарствую!…

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  4. Larry

    writer@emerge.pseudynom” rel=”nofollow”>.…

    спс за инфу!…

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

Ваш отзыв

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



Страница 1 of 0