Какие типы фильтрации поддерживаются современными видеокартами
Издавна графические ускорители (ГПУ) были созданы для обработки изображения и видео. В какой то момент ГПУ стали использоваться для вычислений общего назначения. Но развитие центральных процессоров тоже не стояло на месте: компания Intel ведет активные разработки в сторону развития векторных расширений (AVX256, AVX512, AVX1024). В итоге, появляются разные процессоры — Core, Xeon, Xeon Phi. Обработку изображений можно отнести к такому классу алгоритмов, которые легко векторизуются.
Но как показывает практика, несмотря на довольно высокий уровень компиляторов и технологичность центральных процессоров и сопроцессоров Xeon Phi, сделать обработку изображения с использованием векторных инструкций не так просто, так как современные компиляторы плохо справляются с автоматической векторизацией, а использовать векторные intrinsic функции достаточно трудоемко. Также возникает вопрос о совмещении векторизованного вручную кода и скалярных участков.
В данной статье было разобрано, как можно использовать векторные расширения для оптимизации медианной фильтрации для центральных процессоров. Для чистоты эксперимента я взял все те же самые условия, что у автора: использовал алгоритм медианной фильтрации квадратом 3х3, данные картинки занимают 8 бит на пиксель, обработка рамки (в зависимости от размера квадрата фильтрации) не делается; и попробовал оптимизировать данное ядро на графическом процессоре. Также был рассмотрен алгоритм медианной фильтрации квадратов 5х5. Суть алгоритма в следующем:
- Для каждой точки исходного изображения берется некоторая окрестность (в нашем случае 3x3 / 5х5).
- Точки данной окрестности сортируются по возрастанию яркости.
- Средняя точка отсортированной окрестности записывается в итоговое изображение.
Для того, чтобы не заниматься "лишней" оптимизацией, воспользуемся некоторыми выкладками автора упомянутой статьи. И в итоге получится простой код вычислительного ядра:
Для каждой точки окрестность грузится согласно данной картинке (желтым выделен пиксель изображения, для которого требуется посчитать результат):
Время выполнения, ms | Относительно ускорение | ||||
---|---|---|---|---|---|
Скалярный ЦПУ | AVX2 ЦПУ | Version1 GPU | Скалярный / AVX2 | Скалярный / Version1 | AVX2 / Version1 |
24.814 | 0.424 | 0.372 | 58.5 | 66.7 | 1.13 |
Как видно из приведенных времен, просто "нативно" переписав код и запустив его на ГПУ, получаем неплохое ускорение, причем нет проблем с выравниванием по размеру картинки — код на ГПУ будет одинаково хорошо работать на любых размерах изображения (соответственно начиная с какого-то размера, когда ГПУ будет полностью загружен). Также не приходится думать о выравнивании памяти — все за нас сделает компилятор, достаточно выделить память с помощью специальных функций CUDA RunTime.
Многие, кто сталкивался с графическими ускорителями, сразу скажут, что необходимо загрузить данные и выгрузить их обратно. При скорости PCIe 3.0 в 15 ГБ/с для 2 МБ изображения получается порядка 130 микросекунд для передачи в одну сторону. Тем самым, если происходит потоковая обработка изображений, то загрузка + выгрузка будут занимать около 260 микросекунд, в то время как счет занимает около 372 микросекунды, что означает, что даже в самой "нативной" реализации передачи в ГПУ покрываются. Также можно сделать вывод, что быстрее, чем 260 микросекунд на одно изображение, обрабатывать поток картинок не получится. Но если этот фильтр применяется вместе с другим десятком фильтров во время обработки одной картинки, то дальнейшая оптимизация данного ядра становится полезной.
Для того, чтобы повысить эффективность операций сортировки, можно воспользоваться недавно добавленными SIMD инструкциями. Данные инструкции представляют собой intrinsics функции, которые позволяют за одну операцию вычислить некоторую математическую функцию для двух unsigned / signed short или для 4х unsigned / signed char. Список доступных функций можно посмотреть в документации Cuda ToolKit. Нам нужны две функции: vminu4(unsigned a, usnigned b) и vmaxu4(unsigned a, unsigned b); вычисляющие минимум и максимум для 4х без знаковых 8ми битных значений. Для загрузки четырех значений, разделим все изображение на 4 части по горизонтали и каждый блок будет загружать данные из 4х полос, объединяя 4 загруженных точки с помощью побитового сдвига в unsigned int:
Активная зона обработки — самый верхний квадрат размером 1920 х 270. Соответственно, оранжевым показан блок из 128 х 1 нитей, которые загрузят 128 * 4 элемента. Как известно, размер варпа на ГПУ состоит из 32х нитей. Все нити одного варпа выполняют одну инструкцию за такт одновременно. Так как каждая нить загрузит к себе 4 элемента типа unsigned char, то один варп в общей сложности выполнит обработку 128 элементов за одну инструкцию, то есть получается некая 1024 битная обработка. Для ЦПУ на данный момент доступны 256 битные AVX2 регистры (которые в будущем превратятся в 512 и 1024 битные). С данными оптимизациями код вычислительного ядра преобразуется к следующему виду:
В результате небольших изменений, мы увеличили количество обрабатываемых элементов до 4х (или 128 элементов за инструкцию). Сложность кода возросла и компилятор генерирует слишком много регистров, что не позволяет загрузить ГПУ на 100%. Так как у нас все-таки простые вычисления, мы скажем компилятору, что хотим запустить максимально возможное количество нитей на каждом потоковом процессоре (максимум для данного ГПУ — 2048 нитей) с помощью __launch_bounds (128, 16), что говорит о том, что будет запущена конфигурация из 16 блоков по 128 нитей в каждой. И еще одно нововведение — добавим ключевое слово restrict для использования текстурного кэша для загрузки повторяющихся данных (если провести анализ, то их достаточно много, большинство точек считывается по 3 раза). Чтобы текстурный кэш был задействован, необходимо также указание const. Все вместе указание будет выглядеть так:
Соответствующие времена второй версии:
Время выполнения, ms | Относительно ускорение | ||||||
---|---|---|---|---|---|---|---|
Скалярный ЦПУ | AVX2 ЦПУ | Version1 GPU | Version2 GPU | Скалярный / AVX2 | Скалярный / Version2 | AVX2 / Version2 | Version1 / Version2 |
24.814 | 0.424 | 0.372 | 0.207 | 58.5 | 119.8 | 2.04 | 1.79 |
Уже получили не плохое ускорение. Но можно заметить, что загружая 4 элемента с таким расстоянием, происходит слишком много повторных загрузок. Это значительно снижает быстродействие. Можно ли каким то образом использовать то, что мы уже загрузили непосредственно на регистры и улучшить локальность данных? Да, можно! Пусть эти 4 линии теперь располагаются близко друг к другу, а начала блоков будут "размазаны" по всей высоте с расстоянием 4. Таким образом, учитывая размер блока нитей по Y, приходим к следующему коду:
Время выполнения, ms | Относительно ускорение | ||||||
---|---|---|---|---|---|---|---|
Скалярный ЦПУ | AVX2 ЦПУ | Version1 GPU | Version2 GPU | Version2 GPU | Скалярный / AVX2 | Скалярный / Version3 | AVX2 / Version3 |
24.814 | 0.424 | 0.372 | 0.207 | 0.130 | 58.5 | 190.8 | 3.26 |
Далее оптимизировать уже довольно сложно, так как все таки вычислений здесь не так много. Здесь не был затронут вопрос использования разделяемой памяти. Были некоторые попытки использовать разделяемую память, но лучшее время я получить не смог. Если связать скорость обработки изображения с его размером, то в не зависимости от того, выровнена ли картинка по размеру или нет, можно получить порядка 15 GigaPixels / second.
Применив все оптимизации, можно с небольшими изменениями реализовать фильтр квадратом 5х5. Сложность данного кода состоит в правильной реализации частичной битонической сортировки для 25 элементов. По аналогии можно реализовывать фильтры любого размера (начиная с какого-то размера фильтра, наверняка, будет быстрым общий алгоритм сортировки).
Скорость обработки фильтра данного размера будет примерно в 5.7 раз больше при использовании AVX2, в то время как ГПУ версия замедлится всего в 3.8 раза (порядка 0.5 ms). Итоговое ускорение на ГПУ при медианной фильтрации квадратом 5х5 может достигнуть 5 раз по сравнению с AVX2 версией.
В заключении можно подвести некоторые итоги. Оптимизируя последовательную скалярную программу можно получить большие ускорения с помощью графического процессора. Для медианных фильтров в зависимости от радиуса фильтрации значения ускорений могут достигать 1000 раз! Конечно, очень оптимальная версия с использованием AVX2 инструкций резко сокращает разрыв между ГПУ и ЦПУ. Но лично по своему опыту могу сделать заключение, что векторизовывать код вручную не так просто, как на самом деле кажется. Напротив, даже самая "нативная" реализация на ГПУ дает достаточно высокие ускорения. И в большинстве случаев это бывает достаточно. И если учесть, что количество графических плат в одной материнской плате может быть больше одной, общее ускорение обработки потока изображений или видео может линейно возрасти.
Вопрос о том, стоит ли использовать ГПУ или нет, является риторическим. Безусловно, в задачах обработки изображений и видео ГПУ будет показывать лучшую производительность и с увеличением вычислительной нагрузки, разница между скоростью обработки на ЦПУ и ГПУ будет увеличиваться в пользу последнего.
Вы не знаете, что такое антиалиасинг и анизотропия? Вы считаете, что картинка в современных играх могла бы быть и получше? Тогда обязательно прочитайте этот материал – возможно, вы найдёте для себя много полезной информации.
На самом деле, статью с таким заголовком можно было бы начать с какой-либо банальности, вроде «каждый пользователь компьютера когда-либо мог наблюдать работу таких техник улучшения трехмёрного изображения, как антиалиасинг или анизотропная фильтрация». Либо такой: «пока наши корабли бороздят космические просторы, программисты NVIDIA и ATI ищут способы, чтобы улучшить работу известных техник улучшений изображения». Вторая банальность имеет куда больше шансов на жизнь в том плане, что она уже интригует неким подобием того, что мы будем заниматься расследованием вопроса о том, кто и каким образом «наоптимизировал» в своих драйверах.
Однако мы, пожалуй, обойдёмся вовсе без банальностей. Потому что куда более интересно порассуждать на тему того, насколько же стали доступны сейчас техники улучшения изображения для простого пользователя или, правильнее будет сказать, для простого геймера. Именно геймеры на сегодняшний день являются наиболее активными потребителями всех новых технологий и нововведений в 3D. По большому счёту, мощный 3D-акселератор на сегодняшний день нужен исключительно для игры в последние компьютерные игры с мощными 3D-движками, оперирующие сложными шейдерами различных версий. Сейчас никого уже не удивишь игрой с пиксельными шейдерами версии 2.0 – в игровом мире такие забавы потихоньку становятся повседневным явлением. Большинство игр по-прежнему выпускается на основе шейдерной модели 1.1 ввиду того, что для разработчиков игр наиболее важно добиться, чтобы их игра сносно работала на железе, которое стоит у подавляющего большинства игроков. Делать супернавороченный движок сейчас – это большое расточительство и даже риск. Судите сами: разработка движка класса «Doom 3» или «Half-Life 2» (ну и приплюсуем сюда первопроходца шейдеров 2.0 во всей красе, детище Crytek – «FarCry», чтобы получилась истинная вездесущая троица) занимает огромное количество времени, что привносит в разработку дополнительные трудности – необходимо разработать движок в такие сроки, чтобы нововведения и оригинальные наработки не устарели во время создания движка. Если вы сомневаетесь в том, что такое может быть, то совершенно зря – в случае с «Half-Life 2» всё именно так и было (да и «Doom 3» разрабатывался с оглядкой на GeForce 3, а вышел тогда, когда вовсю продавались GeForce FX). Также разработка движков подобного класса сопряжена с большими затратами на разработку: талантливые программисты стоят сегодня недёшево. А ещё в последнее время много внимания (даже больше, чем нужно) уделяется, если можно так выразиться, «политике» в отношении игровых движителей. Да-да, именно так, вы не ослышались, в сфере 3D уже давно есть своя политика, основанная, естественно, на интересах двух грандов строения графических процессоров: ATI и NVIDIA. Суровая Канада уже давно ведет борьбу против солнечной Калифорнии, и пока конца этому противостоянию не видно, что нам, простым потребителям, конечно, только на руку. Теперь разработать классный движок мало – чтобы иметь успех, нужно заручиться поддержкой либо калифорнийской дивы NVIDIA, либо канадской ATI, благо, теперь и у первой, и у второй есть свои партнёрские программы для разработчиков игр. У NVIDIA такая программа называется «The way it's meant to be played», а у ATI – «Get it in the game». Всё достаточно красноречиво и понятно: NVIDIA говорит, что «играть нужно так», а совсем не эдак, а ATI уверяет, что всё, что мы только ни пожелаем, мы обязательно получим в самой игре. Достаточно заманчиво, не правда ли? Движки же класса «Doom 3» и «Half-Life 2» (в случае последней движок называется Source, однако для простоты восприятия мы будем называть его именно «Half-Life 2», чтобы сохранить правильную ассоциацию) и вовсе изначально разрабатываются в тесном сотрудничестве с инженерами производителей графических чипов, чтобы игры лучше работали именно на GPU какого-то одного производителя.
Поэтому, как мы можем видеть, революции в области новых графических 3D-движков делать весьма проблематично, и поэтому случаются эти самые перевороты в мире игровых движков не так уж и часто. Однако улучшать качество изображения каким-то образом нужно. Если просто увеличивать количество полигонов в кадре, тем самым получая визуально более красивую для восприятия картинку, то в итоге мы придём к тому, что акселератор не сможет обрабатывать сцену с приемлемым уровнем частоты кадров, но в картинке всё равно будет чего-то не хватать. Лесенки из пикселей всё равно останутся, да и качество текстур не улучшится. Остаются менее явные способы по улучшению качества трёхмерной картинки на мониторе – это анизотропная фильтрация и антиалиасинг. Непосредственно к самому 3D-движку эти техники улучшения изображения не имеют никакого отношения, и сделать сам движок более красивым они, естественно, не могут, однако они могут работать с текстурами и изображением таким образом, что на выходе, то есть на мониторе, мы можем видеть визуально более красивую и мягкую картинку.
Именно на поприще анизотропной фильтрации и антиалиасинга проходит колоссальнейшее количество оптимизаций драйверов как со стороны NVIDIA, так и со стороны ATI. У компаний различные подходы и политика в отношении этих самых оптимизаций, порой не совсем справедливая по отношению к пользователям. Однако наша статья как раз и призвана разобраться с тем, что же хорошего и что же плохого в подходах обеих компаний-производителей GPU и что на сегодняшний день может улучшить качество изображения в 3D-играх.
Анизотропная фильтрация: мини-ликбез для начинающих
А теперь, чтобы вы лучше поняли, для чего нужна фильтрация, рассмотрим происходящие процессы на примере легендарной «Quake 3 Arena». Представьте какой какой-нибудь коридор с множеством квадратов и различных орнаментов (благо, в «Quake 3 Arena» этого хватает). Орнамент в начале коридора сильно детализирован, а ближе к концу коридора (горизонту) элементы орнамента становятся всё меньше и меньше, т.е. они отображаются меньшим числом пикселей. В результате теряются детали типа швов между элементами орнамента, что, соответственно, приводит к ухудшению качества изображения.
Проблема заключается в том, что драйвер графической карты не знает, какие детали в текстуре являются важными.
Tri-Linear filtering
Tri-Linear filtering – трилинейная фильтрация, представляет собой симбиоз билинейной фильтрации и mip-текстурирования. Прежде чем говорить об алгоритме работы трилинейной фильтрации, давайте выясним, что такое МIP-текстурирование. MIP-текстурирование, или mip-mapping, – это метод уменьшения объёма вычислений, необходимых для точного наложения текстурного изображения на полигон. По сути, мипмеппинг выполняет те же задачи, что и Point Sampling, но делает это на порядок лучше. MIP-текстурирование призвано избавить нас от ухудшений изображений, когда несколько текселей накладываются на один пиксель. Посмотрим на проблему глобальней и попробуем найти решение всему этому. Для того чтобы правильно вывести пиксель на экран, необходимо скомбинировать значения всех текселей, которые и будут накладываться на этот пиксель. Но пропускная способность памяти не бесконечна, а это огромнейший обьём работы, который неблагоприятно отразится на быстродействии вашей видеокарты. Mip-mapping способствует снижению объёмов этой работы. Метод MIP-текстурирования основан на генерации и хранении множества версий исходного текстурного изображения. Эти версии имеют большое количество разрешений, каждое из которых всё меньше и меньше исходного. Во время текстурирования пикселя вам достаточно выбрать версию текстурного изображения. В вашем распоряжении есть 4 близлежащих текселея из текстурного изображения, больших по размеру, чем пиксель, и столько же текселей, меньших по размеру, чем пиксель. По сути, mip-уровни представляют собой заранее рассчитанные, более маленькие версии исходной текстуры, из-за чего обеспечивается лучшая аппроксимация.
Итак, мы выяснили, что такое mip-mapping, теперь вернёмся к нашей трилинейной фильтрации. Как мы уже говорили, Tri-Linear filtering представляет собой симбиоз билинейной фильтрации и mip-текстурирования. По сути, билинейная фильтрация производится на двух mip-уровнях. А в итоге мы имеем 2 текселя, по одному для каждого mip-уровня. Цвет пикселя определяется при помощи интерполяции по цветам двух mip-текстур.
В итоге имеем несколько лучшее качество фильтрации, нежели у билинейной. Стоит отметить, что качество улучшается незначительно, а требования к ширине полосы пропускания памяти в сравнении с той же Bi-Linear Filtering удваиваются.
Карту GT 1060 топовой не назовёшь, но и не бюджетной. Средний класс. Я бы собрала примерно так:
- Процессор Не ниже I5 боксовый, для сокета 1151
- Материнская плата ASUS B250
- Оперативка 2700 мгц 8 - 16 гб Кингстон с радиаторами
- Корпус любой топ
- Блок питания Чифтек, Ин вин 550 - 600 ватт
- SSD 120 - 240 гиг. Самсунг, Кингстон
- Жёсткий диск 1 - 2 терабайта WD blue
- 2 - 4 корпусных вентилятора. Один, обязательно на обдув жёсткого, остальные на выдув или про запас
- И любой ДВД ром. На первое время и на пожарный случай.
Так как автор постеснялся указать для чего ему комп, то это средний вариант. Например, для игр несомненно процессор потребуется мощнее типа I7 7700.
Мультимедийный компьютер для стрима и 3д. ЖД 1 терабайт будет мало и желательно рейд 10. Два диска в зеркале для надёжности и парочки в страйпе для скорости.
Вообщето мною описан только системный блок без клавиутары, мыши видео и аудио системы, но с этим сложнее не зная для чего комп, я не подскажу. Впрочем, это скорее на вкус самого пользователя. Но монитор должен быть с IPC матрицей не ниже 24", лучше выше.
Действительно, на сегодняшний день (16.05.2018) курс Zcash вырос почти на треть.
Всё дело в том, что глава биржи Gemini Кэмерон Уинклвосс сделал заявление, что биржа запустит трейдинг криптовалютой 22 мая 2018 года. После этого заявления и начался резкий рост Zcash.
Знающие люди рекомендуют майнить на пуле 2Miners.
Попробуй обновить видеокарту,может все из за нее.У меня была такая проблема,но как говорится пока сам не посмотриш,то не узнаеш. Скачай более новенькую подходящую для ПК. Или посмотри требования к инре на самом диске,может твой ПК просто не тянет ее требования.
Это невозможно. Процесс майнинга связан всего лишь с вычислениями, что происходит и в процессе игр. Видеокарта сама по себе не ведет ни какой статистики своего использования. И если чип выдержал работу, то и дальше будет работать, пока основательно не перегреется.
Шина и память - DDR - 128 bit
Пиксельные конвейеры - 2
Текстуры за такт - 4
Анизотропная фильтрация - 2x (Max)
Объём памяти - 64/128 MB
Интерфейс - AGP 4x/8x
RAMDAC 2x350 MHz
В своё время была очень популярная видео-карта, стабильно работала, выходила из строя редко. Была как с пассивным охлаждением так и с активным. Дополнительного питания не требовалось.
Приветствую всех Стопгеймеров! Давайте начистоту, вы ведь тоже заходите в только купленную игру, но сперва кликаете на графические настройки? Кто ради чего, кому-то ради самоутверждения надо глянуть на ультра-автонастройку благодаря своему мощному «железу», а кто-то просто лезет туда ради интереса.Однако, задумывались ли вы, чем отличаются FXAA и TXAA, или 8х и 16х анизотропная фильтрация? Как-раз в этом блоге, группа Abuse Reviews сейчас вам расскажет и покажет, что же это за фильтрации такие, как они работают и с чем их едят. Поехали!
P.S.
прошлом блоге количество материала в ролике было урезано, здесь эта ошибка была учтена, очень старался для вас.Приятного просмотра)
Давайте начнём с самого-самого простого
Разрешение экрана
Мало кто не знает, что разрешение — это количество отображаемых пикселей по горизонтали и вертикали. От этой настройки также зависит качество картинки и то, как сильно будут выражены «лесенки» в переходах между разными плоскостями\поверхностями. Но почему же возникает этот графический артефакт? Дело в том, что все графические элементы в играх состоят из пикселей, но таких проблем с прямыми линиями не происходит, но стоит только чуть её наклонить, как появляются «лесенки». Возникает это из-за отсутствия плавного перехода между цветами, которое обеспечивает сглаживание, вот о нём мы сейчас и поговорим.
Сглаживание
Самое главное его предназначение — борьба с теми самыми «ступеньками», которые все так не любят. Сглаживание обеспечивает нам плавный переход между цветами, за счёт чего изображение получается куда комфортнее, устраняя «ступеньки». Да, картинка однозначно становится красивой, но всегда приходится чем-то жертвовать, а именно производительностью. За счёт появления новой задачи, процессору и видеокарте приходится рендерить(обрабатывать) все эти дополнительные оттенки, которое даёт нам сглаживание. Но, к счастью, существует много видов сглаживания, которые предоставляют нам разработчики в настройках. Их то мы сейчас и рассмотрим:
Этот вид сглаживания не слишком сильно нагружает процессор, потому что он обрабатывает лишь те части кадра, которые выглядели бы неровными, а выбирает он эти части независимо от того, где и как они располагаются. Это самый быстрый и менее затратный в плане ресурсов метод сглаживания. Отличие от прошлого метода сглаживания заключается в нескольких аспектах. В первую очередь, FXAA применяется к изображению в том разрешении, в котором вы играете, также размывает картинку сильнее, что выглядит совсем не лучше, чем MSAA, зато расходует на порядок меньше ресурсов, из-за чего этот вид сглаживания почти не вредит вашему FPS
Пожалуй, это лучший вид сглаживания, который сильно похож на MSAA, но с некоторыми дополнениями. Дело в том, что TXAA учитывает и берёт в расчёт предыдущие кадры и сглаживает последующие путём усреднения цветов.
Да, это не вид сглаживания, но избавляется от лесенок этот способ довольно неплохо, но при одном условии, которое свойственно не каждому пк. Ведь не у всех есть 2\4К мониторы, которые позволяют увеличить разрешение больше 1920х1080. За счёт уменьшения пикселей «лесенки» остаются, но становятся куда меньше, однако это влияет на производительность больше всего из перечисленных способов. Так что этот метод подойдёт только обладателям мониторов с очень высоким разрешением и мощным железом. Забавно слушать легенды о том, что если поставить 2к или 4к разрешение в игре на FullHD мониторе, то картинка станет лучше. Решил я это проверить на примере GTA V и что-то не увидел разницы до и после, ни в фреймрейте, ни качестве.
Проблем никогда не бывает мало. В этом случае нет никаких исключений, ведь кроме «ступенек» встречается такой артефакт, как разрыв картинки. Это происходит, когда ваши монитор и видеокарта пытаются работать синхронно, но по какой-то причине эти парни не могут этого сделать, причиной является частота кадров и частота обновления монитора. К примеру, вы находитесь в какой-то загруженной локации, а ваша видеокарта старается держать стабильную частоту, в то время как монитор обновляет изображение на одной и той же частоте. Если они не синхронизируются между собой, то как раз и появляется такой разрыв. И для решения этой проблемы предназначен следующий параметр:
Вертикальная синхронизация
Этот параметр заставляет работать видеокарту на той же частоте, что и монитор, однако из-за этого возникают уже другие проблемы, к примеру, частота кадров может сильно падать из-за того что в игре появляется слишком много объектов, которые приходится обрабатывать. Но и для этой беды есть решение, которое называется — горизонтальная синхронизация. Принцип действия заключается в том, что модуль, встроенный в монитор заставляет экран обновляться сразу же при получении нового кадра, что способствует идеальному совпадению частот видеокарты и монитора. Благодаря всему этому, производительность компьютера не уменьшается, а монитор и видеокарта работают максимально слаженно.
На этом о проблемах картинки и артефактах — всё
Тесселяция
Тут стоит обратить внимание на контур головы 47-го
А вот она создана не для того чтобы исправлять косяки в картинке, а улучшать её и делать более насыщенной и реалистичной. Многие из нас знают, что 3д-объекты в играх состоят из полигонов (мелких частиц). Тесселяция подразумевает разбиение полигонов на более мелкие части, чтобы генерировать больше деталей у объекта. Это особенно удобно для выделения высоты и глубины объектов. Также она способствует созданию более закругленных объектов без острых форм и углов.
Окклюзия окружения (Ambient Occlusion)
Лично я занимаюсь созданием 3д-моделей в Cinema 4D и довольно хорошо знаком с этой фичей. Она позволяет создавать искусственные тени, таким образом, в идеале, геймдизайнеры и создатели 3д-анимаций предпочитают использовать движки, поддерживающие функцию глобального освещения, которое позволяет создавать освещение идентичное реальному, а всё благодаря вычислениям точных оттенков каждого из пикселей, в зависимости от общего количества света, попадаемого на него. Знаю, что звучит это сложновато, но как же это преобразовывает картинку… словами не описать. Такое освещение очень подходит для различных кинематографичных сцен в мультфильмах или кат-сцен в играх, но это оказывает очень сильную нагрузку на железо, но на то у нас и есть окклюзия окружения, которая создаёт искусственные тени там, где они должны располагаться.
Для начала стоит разобраться с освещением в играх. В них источником света является естественное освещение, которое является упрощённой версией глобального освещения, где расположение теней зависит от того, есть ли перед источником естественного освещения какое-либо препятствие, но это даёт нам более плоские тени в меньшем количестве, чем хотелось бы. Тут и наступает триумф окклюзии окружения, ведь она определяет расположение дополнительных теней с поммощью трассировки лучшей, а именно вычисляет, сколько солнечных лучшей блокируется рядом со стоящими объектами. То есть, если один объект загораживает другой, то поверхность второго объекта, разумеется, будет находиться в тени. Впадины, углубления и тому подобное начинает больше выделяться с помощью окклюзии.В огромном большинстве случаев этот параметр уже «вшит» в графические настройки, что не позволяет включать и выключать его. Но это всё окклюзия окружения в общем. Наверняка вы все сталкивались с такими параметрами освещения как SSAO,HBAO и HDAO?
Она взяла своё начало со времён первого Crysis, благодаря компании Crytek, по-сути оно заключается в вычислении глубины каждого пикселя и пытается вычислить количество преград от каждой из выбранных точек. Алгоритм SSAO призван упростить вычислительную сложность алгоритма Ambient occlusion и сделать его подходящим для работы на графических процессорах в режиме реального времени. Вместе с тем качество результирующего изображения у SSAO является худшим, чем в первоначальном Ambient occlusion, так как SSAO использует упрощённые методики рендеринга(обработки изображения).
Имеет тот же принцип работы, что и SSAO но несколько усовершенствованный. Просто вычисления глубины производятся с большим числом выборок, но приходится жертвовать производительностью.
Одно основывается на другом. Таким же образом как SSAO отличается от HBAO, HDAO от HBAO отличается точно тем же, ну и ещё эта окклюзия была представлена нам компанией AMD.
Ну а что по кинематографичности?
Глубина резкости
Неплохо так нагружает вашу систему, но и так же неплохо придаёт картинке кинематографичности, а всё благодаря фокусу на конкретных объектах, благодаря чему, остальные объекты размываются. Но это может привнести неудобства, как например при игре в PUBG, во время выглядывания из окна (ну вы знаете, когда упираешься лицом в стену как идиот и видишь всё что происходит за ней) иногда замыливается вид в окне, а фокус идёт на стену или оконную раму. Очень раздражает. Однако кинематографичность, опять же, дарит нам положительные впечатления об игре.
Ну и последнее о чём хотелось бы рассказать
Анизотропная фильтрация
А вот этот параметр уж точно видел каждый, но далеко не все понимают как это работает. Объясню быстро и просто. Во имя сохранения FPS разработчики используют нехитрый трюк с понижением качества текстур и моделей по мере отдаления от них. Зачастую мы можем наблюдать размытие текстуры пола вдали от себя, но если мы включим фильтрацию, то границы между различными уровнями детализации размываются. Плюс такой фильтрации в том, что вы можете со спокойной душой ставить значение 16х, ведь этот параметр почти не оказывает давления на процессор и видеокарту.
Ну а на этом всё. Если вам понравился этот блог и вы узнали что-то новое, обязательно жмите на плюс, а также интересно узнать, нравится ли вам качество видеоформата, если вы его глянули? Большое спасибо вам за внимание, всем удачных каток и стабильного FPS!
Будь в курсе последних новостей из мира гаджетов и технологий
Что такое антиалиасинг и с чем его едят?
Перед тем как начать вдаваться в подробности относительно такой животрепещущей темы, как оптимизации антиалиасинга и различного типа фильтрации текстур, не помешает (и даже скажем больше – необходимо) приобрести некоторую порцию теоретических знаний по предмету нашего сегодняшнего разговора.
Итак, антиалиасинг – что же это такое и зачем он нужен. В первую очередь, в слове «антиалиасинг» необходимо выделить часть его – «анти». Предельно ясно, что это часть слова подразумевает то, что само явление «антиалиасинга» направлено на борьбу с чем-то. Как несложно догадаться, в нашем случае – с «алиасингом». Поэтому для нас на данный момент важно чётко разобраться в том, что же представляет из себя пресловутый «алиасинг».
Для начала нужно чётко понимать, что изображение, которое мы с вами можем ежедневно наблюдать на экранах наших с вами мониторов, состоит из так называемых мелких частичек, которые принято называть пикселями. Хорошей аналогией в этом смысле может послужить пример с бумагой в клеточку. Изображение на мониторе – это та же бумага в клеточку, только они в данном случае очень и очень мелкие. Если говорят, что разрешение экрана составляет 1024х768 при 32-битном цвете, то это означает, что по горизонтали на мониторе умещается 1024 точек, а по вертикали – 768. При этом каждая точка может быть закрашена одним цветом из доступных в 32-битной палитре. На данный момент 32-битный цвет – это предел того, чего мы можем добиться на экране компьютера. Лучшие умы человечества (тот же Кармак) уже поговаривают о необходимости перехода на 64-битный цвет и указывают на явные минусы 32-битной палитры. В своё время при переходе с 16-битного на 32-битный цвет данная необходимость была достаточно чётко обоснована и виделись реальные причины, по которым стоило бы перейти на 32 бит. Переход же на 64-битный цвет на сегодняшний день – это скорее излишество. Так же как и в случае с 16 и 32 битами, в своё время придётся достаточно долго ждать, когда акселераторы всех уровней смогут с приемлемой скоростью обрабатывать 64-битный цвет.
Подавляющее большинство статей, в которых затрагиваются тем или иным образом принципы построения изображений в 3D и где ведётся разговор об антиалиасинге, изобилуют простым, но вместе с тем наиболее действенным примером, на котором можно достаточно хорошо понять, что же такое антиалиасинг. Посмотрите на увеличенную надпись «Апгрейд», сделанную в Word’e, а затем просто увеличенную в фотошопе. Не очень хорошо выглядит, не правда ли? По бокам букв видна так называемая гребёнка или, как её ещё называют, «лесенка». В сущности, эта самая «гребёнка» или «лесенка» и есть алиасинг. Можно представить и другой пример в виде геометрического объекта, например, пирамиды. По её краям также хорошо видна всё та же «гребёнка». А теперь посмотрите на другое изображение той же пирамиды, но с увеличенным вдвое разрешением. Выглядит уже значительно лучше, и «гребёнка» практически незаметна. Как уже было сказано выше, данный эффект, сглаживающий «гребёнку», был достигнут за счёт того, что мы увеличили разрешение в 2 раза. Что это означает? Предположим, у нас была отрендерена пирамида с разрешением 200х200 пикселей (выше мы уже подробно прояснили вопрос о том, что такое пиксели и зачем они нужны). Мы увеличили количество точек по вертикали и по горизонтали ровно в 2 раза, то есть получили изображение с разрешением 400 точек по вертикали и 400 точек по горизонтали. Это также означает, что количество точек на нашем объекте, который находился на сцене, увеличилось вдвое. Что это дало применительно к нашему эффекту алиасинга? Очевидно, что он стал минимален, то есть сгладился – ведь количество точек по краям объекта также возросло вдвое. Именно слово «сгладился» является здесь ключевым. Ведь антиалиасинг по-иному называют сглаживанием, что отражает самую суть технологии, которая сглаживает ту самую «лесенку» по краям трёхмерных объектов.
На самом деле, после увеличения разрешения «лесенка» с края пирамиды никуда не делась – она остаётся там по-прежнему. Однако за счёт того, что мы увеличили разрешение (что означает увеличение точек, которые расходуются на отображение пирамиды), эффект «лесенки» сгладился благодаря особенностям человеческого зрения, которое уже менее чётко видит пиксели на крае объекта. Абсолютно понятно, что если увеличивать разрешение ещё и ещё, то эффект алиасинга будет наблюдаться всё в меньшей и меньшей степени. Точнее, человеческий глаз станет замечать его всё в меньшей и меньшей степени, поскольку сам эффект алиасинга никуда не денется. Но так же абсолютно понятно и то, что до бесконечности увеличивать разрешение не получится, ведь мониторы, пусть даже и самые современные, имеют конечные разрешения, причём не такие уж и большие, что не позволит нам постоянно увеличивать количество точек. Проще говоря, простейшего эффекта антиалиасинга можно добиться, всего лишь увеличив разрешение экрана, однако разрешение не может расти до бесконечности. Казалось бы, выхода нет? Однако в действительности он был найден, и основан он всё на той же особенности зрения человека.
Этого удалось достичь благодаря плавным переходам цветов на изображении. Фактически визуальное улучшение изображения производится не за счёт физического увеличения разрешения, а за счёт, если можно так выразиться, цветового увеличения разрешения. В данной статье мы не будем описывать алгоритмы вычисления этих точек и не будем вдаваться в глубины математических вычислений, а расскажем лишь о принципе работы такого антиалиасинга. Лесенка на границах объектов видна лишь потому, что чаще всего края трёхмерных объектов довольно сильно выделяются по цвету от остальной картинки и представляют собой тонкие линии в один пиксель. Это можно компенсировать, поставив некоторое количество точек с цветами, вычисляемыми по формуле из значений цвета самого края и точек рядом с этим краем. То есть, если край объекта чёрный, а фон белый, то дополнительная точка рядом с чёрной линией края станет серой. Чем больше этих дополнительных точек около края любого 3D-объекта, тем более гладко выглядят его края и тем меньше заметна лесенка. Данный способ называется краевым антиалиасингом. Качество антиалиасинга, задаваемое в драйвере видеокарты, как то: 2x, 4x, 6x, 8x означает количество проставляемых дополнительных пикселей вокруг линии, нуждающейся в сглаживании.
Bi-Linear Filtering
Bi-Linear Filtering – билинейная фильтрация, основанная на методе использования интерполяционной техники. Для определения нужных текселей используется основная форма светового пятна, то есть круг. В нашем примере с кругом последний аппроксимируется 4 текселями. Как видим, здесь дела обстоят несколько лучше, чем с Point Sampling. Билинейная фильтрация использует уже 4 текселя. Изображение получается более качественным, блочность отсутствует, однако близкие к экрану полигоны выглядят расплывчато, и связано это с тем, что для интерполяции необходимо большее количество текселей, нежели доступные четыре.
Расплывчатость – отнюдь не самая главная проблема билинейной фильтрации. Дело в том, что аппроксимация выполняется корректно лишь для объектов, расположенных параллельно экрану или точке наблюдения, в то время как 99% объектов в любой компьютерной игре расположены непараллельно к точке наблюдения. Отсюда можно сделать вывод, что 99% объектов будут аппроксимироваться неправильно. Возьмём, к примеру, наш круг – полигон расположен непараллельно относительно точки наблюдения, стало быть, мы должны аппроксимировать эллипс, а мы аппроксимируем круг, что крайне неверно. Ко всему прочему билинейная фильтрация значительно требовательней к пропускной полосе данных памяти, что, в общем-то, более чем логично, учитывая то, что билинейная фильтрация использует уже 4 текселя для определения цвета пикселя.
Как видим, билинейная фильтрация выглядит несколько лучше, нежели Point Sampling. И всё же она очень далека от идеала.
Point Sampling
Point Sampling (поточечная выборка) – самый простой способ определения цвета пикселя. Этот алгоритм основан на текстурном изображении: выбирается всего один тексель, который ближе всех расположен к центру светового пятна, и по нему происходит определение цвета пикселя. Нетрудно догадаться, что это совершенно не верно. Во-первых, цвет пикселя определяется несколькими текселями, а мы выбрали только один. Во-вторых, форма светового пятна может измениться, а алгоритм не принимает это во внимание. А зря!
Главным недостатком поточной выборки является тот факт, что когда полигон расположен близко к экрану, количество пикселей будет значительно выше, чем текселей, из-за чего качество изображения очень сильно пострадает. Так называемый эффект блочности, как мы полагаем, многие могли наблюдать в старых компьютерных играх, например, в том же легендарном «Doom».
У Point Sampling есть преимущество. Из-за того, что определение цвета пикселя осуществляется всего по одному текселю, данный метод не критичен к пропускной способности памяти, а это автоматически даёт данному способу фильтрации колоссальные диведенды в том плане, что на фильтрацию по данной схеме затрачивается очень мало ресурсов 3D-акселератора.
Что такое фильтрация текстур в играх
С появлением 3D-игр стали появляться проблемы, которых в 2D-играх не было: ведь теперь нужно на плоский монитор вывести трехмерную картинку. Если объект находится параллельно плоскости экрана вблизи его — проблем нет: одному пикселю соответствует один тексель (тексель – это пиксель двухмерного изображения, наложенного на 3D-поверхность). А вот что делать, если объект наклонен или находится вдали? Ведь тогда на один пиксель приходится несколько текселей, и поскольку монитор имеет ограниченное количество пикселей, то цвет каждого приходится рассчитывать из нескольких текселей путем определенного процесса — фильтрации.
Для упрощения понимания представим, что каждый пиксель — это квадратная «дырочка» в мониторе, из глаз мы пускаем «лучи света», а тексели расположены на квадратной решетке за монитором. Если мы расположим решетку параллельно монитору сразу за ним, то свет от одного пиксель накроет только один тексель. Теперь мы начнем отодвигать решетку — что мы получим? То, что наше пятно света от пикселя накроет уже больше, чем один тексель. Теперь повернем решетку — получим тоже самое: пятно от одного пикселя накроет множество текселей. Но ведь пиксель-то может иметь один цвет, и если в него попадает много текселей, то нужен алгоритм, с помощью которого мы будем определять его цвет — он называется фильтрацией текстур.
Point Sampling
Это самый простой алгоритм фильтрации: он основан на том, что за цвет пикселя мы берем цвет текселя, который находится ближе всего к центру светового пятна от пикселя. Плюс этого метода очевиден — он меньше всего нагружает видеокарту. Минусов тоже полно — цвет одного центрального текселя, может существенно отличаться от цвета десятков и даже сотен других текселей, которые попадают в пятно от пикселя. К тому же сама форма пятна может серьезно меняться, а его центр при этом может остаться на том же месте, и в итоге цвет пикселя не изменится. Ну и самый главный минус — проблема «блочности»: когда на один пиксель приходится мало текселей (то есть объект рядом с игроком), то мы получаем, что при таком способе фильтрации достаточно большая часть изображения заливается одним цветом, что приводит к явно видным «блокам» одного цвета на экране. Итоговое качество картинки получается. просто ужасным:
Так что не удивительно, что сейчас такая фильтрация больше не используется.
Билинейная фильтрация
С развитием видеокарт стала расти их мощность, так что разработчики игр пошли дальше: если брать за цвет пикселя один тексель, то получается плохо. Окей — а давайте возьмем средний цвет от 4 текселей и назовем это билинейной фильтрацией? С одной стороны, все станет лучше — блочность исчезнет. Зато придет враг номер два — расплывчатость картинки вблизи игрока: это получается из-за того, что для интерполяции требуется больше текселей, чем четыре.
Но главная проблема не в этом: билинейная фильтрация хорошо работает тогда, когда объект параллелен экрану: тогда всегда можно выбрать 4 текселя и получить «средний» цвет. Но вот 99% текстур наклонены по отношению к игроку, и получается, что мы аппроксимируем 4 прямоугольных параллелепипеда (или трапеции) как 4 квадрата, что неверно. И чем сильнее наклонена текстура, чем ниже точность цвета и сильнее размытие:
Трилинейная фильтрация
Окей, сказали разработчики игр — раз 4 текселей мало, возьмем два раза по четыре, и для более точного попадания в цвет будем использовать технологию MIP-текстурирования. Как я уже писал выше — чем дальше от игрока текстура, чем больше текселей будет в пикселе, и тем труднее видеокарте обработать картинку. MIP-текстурирование же подразумевает хранение одной и той же текстур в разных разрешениях: к примеру, если исходный размер текстуры 256х256, то в памяти хранятся ее копии в 128х128, 64х64 и так далее, вплоть до 1х1:
И теперь для фильтрации берется не только сама текстура, но и мипмап: в зависимости от того, дальше или ближе текстура от игрока берется или меньший, или больший мипмап текстуры, и уже на нем берется 4 текселя, ближайшие к центру пикселя, и проводится билинейная фильтрация. Далее берется 4 текселя, ближайших к пикселю, уже исходной текстуры, и опять получается «средний» цвет. После чего берется «средний» цвет уже от средних цветов мипмапа и исходной текстуры, и присваивается пикселю — так и работает алгоритм трилинейной фильтрации. В итоге видеокарту он нагружает несколько больше, чем билинейная фильтрация (нужно обработать еще и мипмап), но и качество картинки оказывается лучше:
Анизотропная фильтрация
Как видно, трилинейная фильтрация серьезно лучше билинейной и уж тем более точечной, но все еще картинка на дальних дистанциях «мылится». И нечеткой картинка получается из-за того, что мы не учитываем то, что текстура может быть наклонена относительно игрока — и именно эту проблему и решает анизотропная фильтрация. Вкратце принцип работы анизотропной фильтрации такой: берется MIP-текстура, установленная поперёк направления обзора, после чего происходит усреднение значений ее цветов с цветом некого количества текселей вдоль направления обзора. Количество текселей варьируется от 16 (для х2 фильтрации) до 128 (для х16). Говоря проще — вместо квадратного фильтра (как в билинейной фильтрации) используется вытянутый, что позволяет более качественно выбрать нужный цвет для экранного пикселя. Так как пикселей на экране может быть миллион и даже больше, а каждый тексель весит не менее 32 бит (32-битный цвет), анизотропная фильтрация требует огромной пропускной способности видеопамяти — десятки гигабайт в секунду. Столь большие требования к памяти уменьшают за счёт сжатия текстур и кэширования, но все еще на видеокартах с DDR-памятью или 64-битной шиной разница между трилинейной и х16 анизотропной фильтрацией может достигать 10-15% fps, но и картинка после такой фильтрации оказывается наилучшей:
Читайте также: