30 апреля 2007
Обновлено 17.05.2023

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

Косметика виртуальных миров. Технологии построения изображения, ч. 2 - изображение обложка

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

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

Фильтрация текстур

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

Самым простым способом фильтрации принято считать Point Sampling (то есть поточечную выборку). Алгоритм его работы прост до безобразия: цвет точки на экране определяется всего лишь одним текселем (пикселем в текстуре), расположенным ближе всего к центру пикселя. Понятно, что результат подобных расчетов далек от идеала и любая относительно сложная текстура таким образом превращалась в хаотичное нагромождение точек. На этом недостатки не заканчиваются: в движении все выглядит еще хуже, можно наблюдать мерцание и перескакивание пикселей с одного места на другое. Ну а если подойти к нашей виртуальной стене слишком близко, то размер текселей станет больше размера пикселей, в результате чего проявится эффект блочности. Подобное можно было наблюдать в старых играх вроде Heretic , Descent или DOOM. К счастью, в новых играх Point Sampling давно не используется.

Со временем на смену поточечной выборке пришла билинейная фильтрация ( Bilinear Filtering ), ставшая, по сути, усовершенствованным Point Sampling. Разница заключается в том, что данный метод фильтрации использовал для расчетов 4 текселя вместо одного, результирующий же цвет пикселя равнялся усредненному значению цветов четырех текселей, расположенных ближе всего к центру. В результате пропадала блочность, изображение становится более качественным, но все же далеким от идеала. Недостатки подобного метода очевидны: во-первых, текстура становится расплывчатой (особенно сильно заметно вблизи), а во-вторых — значительно увеличивается нагрузка на видеокарту.

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

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

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

Погоня за красотой привела к появлению анизотропной фильтрации ( Anisotropic Filtering ) — в ее алгоритмах учитывается то, как расположен объект относительно экрана, и, соответственно, цвета пикселей определяются наиболее корректно. Однако в реализации этого метода кроется множество нюансов, и алгоритмы, используемые ATI и NVIDIA , сильно различаются. Между этими компаниями развернулась настоящая битва; совершенствование анизотропной фильтрации продолжается до сих пор. Стоит заметить, что анизотропная фильтрация подразделяется на уровни, которые определяют число текселей, которые обрабатываются при вычислении конечного цвета пикселя. Различают следующие уровни: 2x (16 текселей), 4x (32 текселя), 8x (64 текселя) и 16x (128 текселей).

Чтобы как-то снизить влияние фильтрации текстур на быстродействие видеокарты, производители часто идут на ухищрения, которые они именуют «оптимизациями». К их числу относится так называемая брилинейная фильтрация (именно так, опечатки нет), при которой изображение обрабатывается по билинейным алгоритмам, а трилинейка применяется лишь в небольших областях, на которых граничат соседние MIP-уровни. NVIDIA применила этот тип фильтрации в видеокартах серии GeForce FX , однако это вызвало много негативных отзывов — качество картинки было хуже, чем у полноценной трилинейной фильтрации. ATI также использовала эту оптимизацию в Radeon 9600 и Radeon X800 , но тут дело дошло до смешного: компания отрицала факт ее использования, а при включении подкрашенных MIP-уровней драйвера автоматически переключались на честную трилинейную фильтрацию. Впрочем, это сказывалось на fps, так что скрыть оптимизацию не удалось. Во многих видеокартах также используется адаптивная анизотропная фильтрация, при которой поверхности 3D-изображения получают различный уровень анизотропии. Например, при взгляде на стену, параллельную экрану, нет смысла применять фильтрацию уровня 16х, так как она ничем не будет отличаться от фильтрации уровня 2х. Таким образом, оптимизация позволяет грамотно экономить вычислительную мощь. Качество при этом не теряется.

Сглаживание изображения

Увы, но проблемы на этом не заканчиваются. Еще одним препятствием на пути к качеству является алиасинг (aliasing), прозванный в народе «лесенкой». Под этим термином подразумеваются неровные края объектов, которые вместо прямой линии выглядят как совокупность множества углов. Увы, но любая негоризонтальная и невертикальная линия порождает этот тип искажений. За примерами далеко ходить не надо: достаточно запустить Paint (в нем сглаживание не реализовано) и нарисовать несколько наклонных прямых — результат будет далек от идеала. С этим надо бороться, наиболее логичными выходами из ситуации являются либо увеличение разрешения экрана, либо адаптация картинки под особенности человеческого зрения. Первый вариант, безусловно, хорош, но труднореализуем: чтобы среднестатистический пользователь перестал различать подобные дефекты, разрешение 17-дюймового монитора должно составлять около 4000х3000 пикселей! Сомнительно, что подобные устройства станут доступны в ближайшее время, да и нагрузка на видеокарту при этом будет непомерной.

А поскольку нельзя увеличить размер картинки, то менять придется саму картинку. При этом используется следующее свойство зрения: оно мгновенно замечает резкие цветовые переходы между пикселями, но не реагирует или слабо реагирует на плавные. Если по краям черной линии, изображенной на белом фоне, разместить серые пиксели, то «лесенку» практически не будет заметно — это пример простейшего сглаживания (антиалиасинга), наблюдать его можно при рисовании линий в MS PowerPoint или Adobe Photoshop. Однако алгоритмы сглаживания, реализованные в видеокартах, более сложны и разнообразны. Рассмотрим их подробнее.

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

Первым способом борьбы с пресловутой «лесенкой» стал метод сглаживания, именуемый суперсэмплингом ( Supersampling ): кадр строится в увеличенном разрешении, а перед выводом на экран сжимается до необходимых размеров. Уровень сглаживания (чаще всего 2х или 4х) показывает, во сколько раз увеличивается разрешение относительно начального. Таким образом, если кадр, имеющий размеры 800х600 пикселей, сглаживается 2х-суперсэмплингом, то в действительности он будет иметь разрешение 1600х1200 пикселей, и лишь в последний момент размер вернется к прежнему значению. Очевидно, что подобный способ борьбы с неровностями крайне ресурсоемок: скорость уменьшается в разы, а это слишком дорогая плата за красоту. У суперсэмплинга есть интересный эффект: помимо сглаживания происходит и своеобразная фильтрация текстур, хотя и не особо эффективная. Этого мало, чтобы оправдать его прожорливость.

Суперсэмплинг не учитывал одной важной детали: «лесенка» образовывается только на границах полигонов, а не внутри текстур. Следовательно, и обрабатывать необходимо лишь границы. Осознание этого факта привело к созданию нового алгоритма сглаживания — мультисэмплинга ( Multisampling ), впервые реализованного в GeForce 3. В новом методе кадр все так же строился в увеличенном разрешении, но расчеты проводились лишь для крайних пикселей, а цвета внутренних записывались в буфер без какой-либо обработки. Это позволило в значительной степени снизить нагрузку на видеокарту, при этом «лесенки» уничтожались не хуже, чем при суперсэмплинге. К минусам можно отнести два факта: во-первых, исчезла побочная фильтрация текстур, а во-вторых — буфер кадра все также требовал много места в памяти: в разрешении 1600х1200 с включенным HDR и 4х-сглаживанием промежуточное изображение будет занимать около 90 Мб.

Впрочем, в GeForce 3 классическим мультисэмплингом дело не ограничилось. Помимо 2х- и 4х-сглаживания, у видеокарты были еще два режима — Quincunx и 4х 9-tap. В них при расчете цвета пикселя учитывались не только цвета субпикселей данного пикселя, но и цвета субпикселей соседних пикселей (представьте себе, в этой фразе есть смысл!). То есть на конечный цвет оказывали влияние соседние пиксели, хотя и в меньшей степени: у каждого субпикселя был свой коэффициент влияния. В режиме Quincunx учитывались цвета пяти субпикселей (из них только два располагались внутри искомого пикселя), а в 4х 9-tap — девяти (4 внутри). Картинка в результате получалась очень красивой, но слегка расплывчатой.

NVIDIA долго оставалась лидером в области сглаживания изображения, но все изменилось, когда ATI выпустила в свет Radeon 9700 , использовавшую технологию SmoothVision 2.0. Фактически в ней был реализован «классический» мультисэмплинг — и никаких вам «заимствований» в стиле Quincunx, однако изменилось само расположение ключевых субпикселей внутри пикселя. Если ранее в режиме 4х они располагались в форме квадрата (то есть являлись центрами пикселей, появившихся в результате увеличения разрешения в четыре раза), то теперь применялась повернутая опорная решетка расположения субпикселей. Польза от этого была просто огромной. Дело в том, что хуже всего сглаживанию поддаются линии, являющиеся почти вертикальными и почти горизонтальными: именно дефекты при их отображении бросаются в глаза в первую очередь. Кроме того, таких линий в кадрах традиционно больше, чем диагональных. Повернутое расположение субпикселей сглаживает подобные линии гораздо лучше, а «неудобные» углы наклона для этого метода сглаживания встречаются довольно редко. Кроме того, мультисэмплинг от ATI поддерживал режим 6х, чем не могла похвастаться NVIDIA.

Успех технологии SmoothVision 2.0 привел к тому, что ее аналог стал применяться и в видеокартах серии GeForce, начиная с модели 6800 , правда, решетка в данном случае была повернута в противоположную сторону. Именно мультисэмплинг с повернутой решеткой расположения субпикселей используется в большинстве сегодняшних видеокарт как основной способ сглаживания.

С тех пор технологии сглаживания долго стояли на месте (лишь слегка модифицировались решетки), и единственным важным событием можно считать появление методик сглаживания прозрачных текстур. Впервые они появились в GeForce 7800 и Radeon X1800 , но позже были добавлены и в более ранние модели видеокарт (благодаря драйверам).

С выходом GeForce 8800 компания NVIDIA вновь вернула себе первенство благодаря новому способу сглаживания, названному Coverage Sampling. Инженеры компании пришли к выводу, что при определении цвета пикселя совсем не обязательно знать цвета всех субпикселей — куда важнее знать соотношение площадей частей пикселя, расположенных в разных треугольниках. Таким образом, необязательно каждому субпикселю передавать полную информацию о цвете — вместо этого часть из них может выполнять иную функцию, а именно — сигнализировать о том, где они расположены (вне или внутри треугольника). Такие субпиксели называются coverage-значениями. Для передачи информации о цвете одного субпикселя при включенном HDR затрачивается 64 бита, для передачи информации о местоположении можно обойтись и одним битом (например, 0 — внутри, 1 — снаружи). Кроме того, количество coverage-значений не влияет на разрешение промежуточного изображения. Ну а в случае, если в пикселе граничат более двух треугольников, его сглаживание просто возвращается к стандартному мультисэмплингу, ведь Coverage Sampling всего лишь надстройка, действия которой можно прекратить в любой момент. Одни преимущества. Единственная проблема — кривая реализация настроек сглаживания в драйверах ForceWare , но это уже претензии к программистам, а не к самой видеокарте. Кстати, в GeForce 8800 также появился мультисэмплинг 8х — благо мощности для его реализации хватает.

* * *

Возможность создания фотореалистичных кадров с нуля существует далеко не первый день: сейчас каждый второй фильм в большей или меньшей степени пестрит различными спецэффектами, созданными на компьютерах. Порой мы их даже не замечаем, приписывая многое гениальности оператора и сложным постановкам сцен. Увы, но компьютерные игры долгое время не могли похвастаться подобными красотами по одной простой причине: для них слишком важен такой параметр, как скорость. Если Голливуд может позволить себе потратить на построение одного кадра хоть час, хоть сутки, то персональный компьютер вынужден выдавать не менее 30—50 кадров в секунду, чтобы удовлетворить наши потребности.

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

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь