Что такое рендер графического процессора
Эффективное использование GPU
Разработчику следует научиться эффективно использовать графический процессор устройства (GPU), чтобы приложение не тормозило и не выполняло лишнюю работу.
Настроить параметры GPU визуализации
Если ваше приложение тормозит, значит часть или все кадры обновления экрана обновляются больше чем 16 миллисекунд. Чтобы визуально увидеть обновления кадров на экране, можно на устройстве включить специальную опцию Настроить параметры GPU визуализации (Profile GPU Rendering).
У вас появится возможность быстро увидеть, сколько времени занимает отрисовка кадров. Напомню, что нужно укладываться в 16 миллисекунд.
Опция доступна на устройствах, начиная с Android 4.1. На устройстве следует активировать режим разработчика. На устройствах с версией 4.2 и выше режим по умолчанию скрыт. Для активации идёт в Настройки | О телефоне и семь раз щёлкаем по строке Номер сборки.
После активации заходим в Опции разработчика и находим пункт Настроить параметры GPU визуализации (Profile GPU rendering), который следует включить. В всплывающим окне выберите опцию На экране в виде столбиков (On screen as bars). В этом случае график будет выводиться поверх запущенного приложения.
Вы можете протестировать не только своё приложение, но и другие. Запустите любое приложение и начинайте работать с ним. Во время работы в нижней части экрана вы увидите обновляемый график. Горизонтальная ось отвечает за прошедшее время. Вертикальная ось показывает время для каждого кадра в миллисекундах. При взаимодействии с приложением, вертикальные полосы рисуются на экране, появляясь слева направо, показывая производительность кадров в течение какого-то времени. Каждый такой столбец представляет собой один кадр для отрисовки экрана. Чем выше высота столбика, тем больше времени уходит на отрисовку. Тонкая зелёная линия является ориентиром и соответствует 16 миллисекундам за кадр. Таким образом, вам нужно стремиться к тому, чтобы при изучении вашего приложения график не выбивался за эту линию.
Рассмотрим увеличенную версию графика.
Зелёная линия отвечает за 16 миллисекунд. Чтобы уложиться в 60 кадров в секунду, каждый столбец графика должен рисоваться ниже этой линии. В каких-то моментах столбец окажется слишком большим и будет гораздо выше зелёной линии. Это означает торможение программы. Каждый столбец имеет голубой, фиолетовый (Lollipop и выше), красный и оранжевый цвета.
Голубой цвет отвечает за время, используемое на создание и обновление View.
Фиолетовая часть представляет собой время, затраченное на передачу ресурсов рендеринга потока.
Красный цвет представляет собой время для отрисовки.
Оранжевый цвет показывает, сколько времени понадобилось процессору для ожидания, когда GPU завершит свою работу. Он и является источником проблем при больших величинах.
Существуют специальные методики для уменьшения нагрузки на графический процессор.
Отладить показатель GPU overdraw
Другая настройка позволяет узнать, как часто перерисовывается один и тот же участок экрана (т.е. выполняется лишняя работа). Опять идём в Опции разработчика и находим пункт Отладить показатель GPU overdraw (Debug GPU Overdraw), который следует включить. В всплывающим окне выберите опцию Показывать зоны наложения (Show overdraw areas). Не пугайтесь! Нкоторые элементы на экране изменят свой цвет.
Вернитесь в любое приложение и понаблюдайте за его работой. Цвет подскажет проблемные участки вашего приложения.
Если цвет в приложении не изменился, значит всё отлично. Нет наложения одного цвета поверх другого.
Голубой цвет показывает, что один слой рисуется поверх нижнего слоя. Хорошо.
Вы можете самостоятельно проверить своё приложение для поиска проблемных мест. Создайте активность и поместите на неё компонент TextView. Присвойте корневому элементу и текстовой метке какой-нибудь фон в атрибуте android:background. У вас получится следующее: сначала вы закрасили одним цветом самый нижний слой активности. Затем поверх неё рисуется новый слой от TextView. Кстати, на самом TextView рисуется ещё и текст.
В каких-то моментах наложения цветов не избежать. Но представьте себе, что вы таким же образом установили фон для списка ListView, который занимает все площадь активности. Система будет выполнять двойную работу, хотя нижний слой активности пользователь никогда не увидит. А если вдобавок вы создадите ещё и собственную разметку для каждого элемента списка со своим фоном, то вообще получите перебор.
Маленький совет. Поместите после метода setContentView() вызов метода, который уберёт перирисовку экрана цветом темы. Это поможет убрать одно лишнее наложение цвета:
Процессором (CPU) или видеокартой (GPU): чем рендерить?
Рендеринг трехмерных сцен — это основополагающая современных визуальных эффектов (VFX), графического дизайна, промышленного дизайна и анимации. Когда вы работаете в одной из этих отраслей, самым важным инструментом в вашем арсенале является ваша рабочая станция. Центральный процессор (CPU) является сердцем вашей рабочей станции и выполняет множество задач, таких как работа в приложениях, загрузка драйверов и т. д. Графические процессоры (GPU), представляющие собой специализированные типы микропроцессоров, которые работают параллельно с CPU, в последнее время переживают значительный рост использования, поскольку начинают расти объемы вычислений необходимые для одной задачи. Эти задачи, интенсивно использующие процессор, могут включать:
Чтобы не усложнять эту статью или ее цель, мы будем ссылаться исключительно на сравнение возможностей CPU и GPU, используемых для обработки изображений или, в данном случае, рендеринга изображений. Надеюсь, прочитав это, вы получите лучшее и более полное представление о том, какие варианты для рендеринга могут предложить вам и вашей студии эти технологии. Поможет вам принять более обоснованное решение о том, что лучше всего подходит для ваших проектов.
Первый и наиболее очевидный фактор, который необходимо рассмотреть — это скорость. В то время как CPU имеет ограниченное количество процессорных ядер (в среднем около 24), которые делают его эффективным при последовательных вычислениях и выполнении процессов в порядке очереди, GPU состоят из меньших ядер в большем количестве, чем у среднего компьютерного процессора, это позволяет им выполнять несколько задач одновременно.
Современные графические процессоры уже расширили свои возможности вывода с момента их первого появления. В то время как центральные процессоры обычно могут последовательно обрабатывать отдельные конкретные задачи, графические процессоры предлагают превосходную пропускную способность памяти, вычислительную мощность и скорость до 100 раз быстрее для решения нескольких задач, требующих нескольких параллельных вычислений и больших кешей данных.
Часы рендеринга могут превратится в минуты и упростят процесс создания изображений при использовании GPU. Если скорость является основным приоритетом в вашем рабочем процессе, предпочтительным решением будет рендеринг на основе графического процессора (GPU).
CPU vs GPU — Качество и точность графики
Рендеринг — это трудоемкий процесс, но с качеством нельзя торопиться. Хотя для завершения рендеринга изображения могут потребоваться часы (возможно, даже дни), традиционный рендеринг на базе процессора с большей вероятностью обеспечит более высокое качество изображения и более четкое, меньше шума.
У графического процессора (GPU) намного больше ядер, чем у CPU, но в целом каждое ядро работает медленнее, чем ядро процессора. Когда несколько процессоров CPU связаны между собой и используются например, в среде рендеринга, как на ферме. Они потенциально могут дать более изысканный конечный результат, чем рендеринг на основе графического процессора. В фильмах это обычный стандарт для создания высококачественных кадров и изображений, поскольку для рендеринга нет жестких ограничений во времени.
С другой стороны, с ростом доступной виртуальной реальности игры также становятся все более захватывающими, а при максимальных настройках приходит высококачественный рендеринг изображений и обработка в реальном времени, которые могут проверить вашу рабочую станцию на прочность. Проще говоря, современные игры и VFX теперь могут быть слишком нагружающими базовый CPU.
Если вы готовы не торопиться и не ограничены сроками для получения максимально лучшего изображения, тогда рендеринг на базе CPU может быть тем, что вы ищете.
CPU vs GPU — Стоимость
По мере того, как оборудование становится более эффективным, его цена также становится важным фактором.
В дополнение к скорости, мощность одного графического процессора может быть эквивалентна как минимум пятидесяти процессорам. Это означает, что мощность одной рабочей станции может выполнять задачи нескольких рабочих станций на базе CPU вместе взятых, что дает 3d визуализаторам и студиям свободу создавать, проектировать и разрабатывать изображения с высоким разрешением. Кроме того, GPU предлагают значительное снижение затрат на оборудование и устраняют необходимость в нескольких ПК или серверах для выполнения работы профессионального качества. Теперь можно выполнять все за минуты, имея одну небольшую станцию с видеокартами.
Без необходимости в дорогостоящих фермах рендеринга CPU, 3d художники могут позволить себе и полагаться на свои собственные компактные рабочие станции с графическими процессорами и получить работу студийного качества за невысокую цену.
CPU vs GPU — Визуализация в реальном времени
При определенных рабочих процессах, в частности, VFX, графическом дизайне и анимации, требуется много времени для настройки сцены и управления освещением, что обычно происходит в окне (вьюпорте) просмотра программного обеспечения. GPU может управлять производительностью вьюпорта в программном обеспечении вашей студии, позволяя в реальном времени просматривать и манипулировать вашими 3d моделями, источниками света и проекциями в трех измерениях. Некоторое программное обеспечение для рендеринга, предназначенное только для графического процессора, может даже позволить вам полностью работать в окне просмотра с включенным Real Time рендерингом, увеличивая результат и минимизируя возможные ошибки, которые могут возникнуть при рендеринге в другой программе.
Совершенно очевидно, что преимущества работы и рендеринга на машинах с GPU по сравнению с традиционными рабочими станциями на базе CPU могут замедлить производство или ограничить бюджет проекта из-за потенциально необходимых обновлений.
Делаем выбор между рендерингом на CPU и GPU
Имейте в виду, что графические процессоры не предназначены для полной замены рабочих станций с процессорами и рабочего процесса. Может показаться, что преимущества рендеринга на основе CPU бледнеют по сравнению с преимуществами рендеринга на основе GPU, но в конечном итоге это зависит от того, что нужно вам или вашей студии. Эти процессоры живут и работают в синергетической гармонии. Графический процессор предназначен не для замены, а для ускорения и оптимизации существующих практик и рабочих процессов, максимального увеличения производительности и компенсации ресурсоёмких вычислений в приложениях, которые без них могли бы вывести из строя систему.
Даже с самыми быстрыми и мощными графическими процессорами в вашем распоряжении процессор по-прежнему тянет свою долю веса. Неопытному пользователю просто покажется, что ваши приложения работают намного быстрее и плавнее. Использование этих инструментов в тандеме сделает гораздо больше для вашей работы и презентаций, а также значительно увеличит способность вашей машины быстро воплощать ваши творения в жизнь. Удачного рендеринга!
Ускорение вычислений и экономия на ресурсах: когда нужны графические процессоры
Когда графические процессоры (GPU) только появились, никто и не думал, что со временем их станут так широко применять. Сегодня их применяют при исследовании КТ-снимков, производстве мультфильмов и поиске новых лекарств.
Изначально графические процессоры использовали для отрисовки пикселей в графике, а их основным преимуществом была энергоэффективность. Никто не пытался использовать GPU для вычислений: они не способны обеспечить такую же точность, как центральные процессоры (CPU).
Но затем оказалось, что точность вычислений на графических процессорах вполне приемлема для машинного обучения. При этом GPU способны быстро обрабатывать большие объемы данных. Так что сегодня их применяют в разных сферах, о самых интересных рассказываем в статье.
В подготовке статьи нам помогли эксперты Академии больших данных MADE от Mail.ru Group. Кстати, сейчас у них открыт набор на бесплатное обучение, где в том числе учат работать с GPU.
Графический процессор (GPU) — разновидность микропроцессора. В отличие от центрального процессора (CPU), в нем не десятки, а тысячи ядер. Из-за такой архитектуры у графических процессоров есть несколько особенностей:
Посмотрим на основные сферы применения технологии.
Графические процессоры применяют на всех этапах машинного обучения — при подготовке данных, тренировке моделей машинного обучения и их промышленной эксплуатации.
Последние поколения графических процессоров от NVIDIA содержат тензорные ядра — новый тип вычислительных ядер. По сравнению с классическими GPU они выполняют меньше операций за единицу времени, но еще более энергоэффективны. Это важно для крупных компаний с собственными дата-центрами.
Сегодня машинное обучение используют в различных отраслях, например в медицине. Решения на базе ИИ проверяют КТ- и МРТ-снимки и находят на них патологические изменения. В итоге врачи тратят меньше времени на работу со снимками, а риск человеческой ошибки снижается.
«Цельс» — ИИ-платформа для анализа медицинских изображений, она обрабатывает поступающие из больниц снимки. Например, на КТ-снимках легких система способна распознать злокачественные новообразования и COVID-19. Обработка одного исследования занимает 60 секунд, точность выявления патологии — 95%.
Машинное обучение лежит в основе и компьютерного зрения — нейросети, которая умеет распознавать людей и объекты на фотографиях и видео.
Например, компьютерное зрение внедрили в «Инвитро» для решения проблемы очередей. Сотруднику регистратуры требуется время на поиск карточки пациента в базе данных — пока он ищет, очередь увеличивается. Чтобы сократить время ожидания, на входе в клинику пациента снимает камера видеонаблюдения. Она передает изображение в систему, где компьютерное зрение распознает его личность и заранее открывает для регистратора нужную карточку. В итоге пациенты меньше ждут в очередях, а их лояльность возрастает.
Подобные технологии лежат и в основе Valossa AI. Компания предоставляет различные ИИ-решения для работы с изображениями и видео. В частности, нейросети способны обнаруживать в видео нежелательный контент, чтобы его удалить, или распознавать эмоции людей.
Функцию распознавания эмоций, например, использовали в шоу финской телекомпании Yle. По правилам, его участники слушали шутки, стараясь сохранить нейтральное выражение лица. ИИ оценивал, насколько им это удалось.
GPU изначально разрабатывали для работы с графикой. Так что сегодня их используют в системах, которые обрабатывают большие массивы изображений, например снимки из космоса.
Такие снимки в том числе используют, чтобы следить за состоянием лесов или развитием половодья. Но в исходном виде в снимках невозможно разобраться, поэтому их предварительно обрабатывают: убирают все лишнее и наносят определенную разметку — GPU помогают ускорить этот процесс.
«Банк базовых продуктов» Роскосмоса предоставляет другим ведомствам и ученым снимки с космических аппаратов. Используя их, оценивают качество поверхностных вод, состояние лесов, следят за пожарной обстановкой и паводками. Чтобы на снимках можно было легко найти нужную информацию, система предварительно их обрабатывает.
С каждым годом фильмы и мультфильмы, созданные с помощью компьютерной графики, выглядят все реалистичнее. Это достигается с помощью рендеринга — процесса визуализации.
Чтобы компьютерная графика выглядела на экране естественно, современные программы для рендеринга учитывают множество деталей — например, как падает свет и выглядят тени. Это требует больших вычислительных мощностей, так что крупные студии, как правило, используют графические процессоры.
Для мультфильма «Город героев» в Walt Disney использовали Hyperion — симулятор глобального освещения, который создавали около двух лет. Он производит сложные вычисления, чтобы рассчитать, как будет выглядеть непрямой свет, многократно отраженный от всех поверхностей. Для отрисовки «Города героев» расчеты проводились с помощью кластера, состоящего из 55 000 вычислительных ядер.
Еще графические процессоры применяют в KVM — специальных программах для геймеров, например, к ним относится Playkey. Они позволяют запускать игры с хорошей графикой на маломощных компьютерах за счет переноса нагрузки в облако. Так что мощный компьютер не требуется.
Тяжелыми называют вычисления, в которых задействованы сложные алгоритмы, из-за чего они потребляют большое количество ресурсов. Пример таких вычислений — докинг. Это метод молекулярного моделирования, он позволяет подобрать молекулу, которая лучше всего взаимодействует с нужным белком.
Это трудоемкая и дорогая работа, например, в США на разработку одного нового лекарства уходит в среднем 985 млн долларов. Используя графические процессоры, фармкомпании экономят на вычислительных мощностях, ускоряют разработку и за счет этого тратят меньше денег.
Например, в начале пандемии ученые из Московского государственного университета стали искать вещества, которые могут оказаться полезными для лечения коронавируса. Чтобы найти лекарство, они подобрали перспективный белок, проанализировали его структуру и создали модели для докинга. Молекулярное моделирование запустили на суперкомпьютере «Ломоносов».
Другой пример тяжелых вычислений — анализ большого количества разнородных данных. Например, он требуется при обработке сейсмографических данных.
В регионах, где давно добывают нефть, стандартные методы сейсморазведки уже не справляются с поиском залежей в нужных объемах. Так, например, случилось в Башкортостане, где первая скважина появилась еще в 1930-х годах.
Поэтому для разведки нефтяных запасов в ООО НПЦ «Геостра» использовали облачные решения. Расчеты велись на платформе Mail.ru Cloud Solutions. Для сложных расчетов использовали графические процессоры NVIDIA Tesla V100. Пилотный проект оказался успешным: удалось спрогнозировать эффективность будущих скважин и определить места для бурения.
На промышленных предприятиях умные датчики собирают данные о работе оборудования и передают их в аналитическую систему. Используя эту информацию, компании могут следить за работой оборудования, предсказывать поломки, планировать профилактические работы и думать над оптимизацией производства. Для того чтобы данные обрабатывались быстрее, используют графические процессоры.
Например, WaveAccess на базе Mail.ru IoT Platform разработала решения для Единой платформы сбора и анализа данных, с помощью которой государство контролирует природопользование. Всего решений четыре: система мониторинга воздуха, дистанционного надзора за объектами культурного наследия, незаконной вырубкой лесов и зарастания сельхозземель. Платформа собирает данные с помощью датчиков IoT и выявляет инциденты в режиме реального времени. На основании этих данных государственные органы проводят проверки.
Еще решения в области интернета вещей используют для создания цифровых двойников — виртуальных копий станков или целых заводов. В таком случае система не просто анализирует данные с умных датчиков, а строит на их основе трехмерную модель оборудования. Фактически инженеры на компьютере видят, как работает тот или иной станок.
На передачу и обработку данных требуется время. Поэтому на предприятиях, которым важно узнавать о неполадках в режиме реального времени, для ускорения работы используют графические процессоры.
Например, благодаря цифровому двойнику Московской ТЭЦ-20 удалось повысить эффективность работы предприятия на 4%. Другой пример — виртуальный прототип завода КАМАЗ, где оцифровали почти 50 станков, а также манипуляторы, производственные роботы и другое оборудования. Благодаря этому на предприятии могут контролировать все этапы сборки автомобилей.
На заводе Siemens в Амберге выпускают 12 млн программируемых логических контроллеров в год, то есть одно изделие в секунду. На предприятии объединили виртуальное и реальное производство: на изделия нанесены коды, которые передают оборудованию его маршрут и требования к каждой операции — за процессом следят специальные программы.
В итоге новые заказы на заводе выполняются за сутки, 99,99885% выпускаемой продукции полностью соответствует стандартам качества, а себестоимость снизилась на 25%.
Чтобы повысить скорость вычислений, необязательно закупать графические процессоры — мощности можно арендовать у облачного провайдера. У GPU в облаке есть несколько особенностей:
На платформе Mail.ru Cloud Solutions к виртуальным машинам можно подключить графические процессоры NVIDIA Tesla V100. Это одно из последних поколений GPU, в каждом процессоре 640 тензорных ядер. К нужной виртуальной машине графические процессоры подключают по запросу, для этого нужно обратиться в техподдержку.
На платформе есть и другие решения для машинного обучения и работы с большими данными. Используя их, можно построить в облаке собственную аналитическую систему или решение для тренировки нейросетей.
3D рендеринг: как работает GPU
Всем привет. Меня зовут Глеб Булгаков, я — программист. Вместе с тех. артистом Романом Лещенко мы работаем в компании Fractured Byte и хотим поделиться нашими знаниями и опытом в деле оптимизации реалтаймового контент пайплайна.
Работая вместе в компании BWF, мы успели приложить руку ко множеству разных по жанру, целевой платформе и сложности проектов. Среди них было и портирование всемирно известных проектов на мобильные платформы (Life Is Strange, Brothers: A Tale of Two Sons), разработка собственных проектов на разные платформы (In Fear I Trust, Renoir), и даже прототипирование и R’n’D для VR игр. У нас 9 лет опыта работы с движком Unreal Engine, начинали с UE3. Мы успели поработать с такими компаниями как Square Enix, Disney, 505 Games, Framestore, Chillingo и т.д. Таким образом, мы почти никогда не сталкивались с одними и теми же задачами и нам всегда приходилось изыскивать возможности отрисовать много контента на экране за минимальное количество миллисекунд. Так что, можно сказать, что мы съели на этом пару собак 🙂
В этой статье мы разберем принцип работы и отрисовки простейшей сцены на GPU, а также познакомимся с базовыми понятиями, на которые будем впоследствии ссылаться. Надеемся, эта статья будет интересна как техническим специалистам, так и артистам, желающим понять, почему “злые программисты” говорят им уменьшать разрешение текстур.
Обзор
Перед тем как погрузиться с головой в оптимизацию, нужно разобраться в том, как работает GPU и процессах, которые происходят в движке.
В упрощенном виде конвейер рендера (именно конвейер, потому что многие последующие процессы зависят от результатов завершения предыдущих) работает по такому принципу:
Как вы могли заметить, основная “магия” происходит в четвертом пункте. Что это за сложные вычисления, как они влияют на производительность и как научится их контролировать? Этим мы сегодня и займемся, а начнём с того, какие объекты можно создавать и какие операции можно делать над ними, а потом плавно перейдем к отрисовке сцены.
Также перед тем, как начать, стоит сказать, что эта статья не описывает какой-то конкретный конвейер рендера в конкретном движке (хотя мы и будем приводить много примеров из UE4), а старается обобщить наши знания таким образом, чтобы вы могли понять откуда “растут ноги” у современных контент-пайплайнов и графических фич, а также поняли, почему количество полигонов в модели уже давно не является адекватным мерилом производительности.
Мы также хотим уточнить, что эта статья не затрагивает моменты оптимизации самого рендера, мы хотим научить локализовывать проблемные места в игре, показать способы их обхода, а также показать как бороться с ограничениями платформы — иногда это означает разработку нового пайплайна для создания или оптимизации контента, иногда замену эквивалентными решениями, а иногда — отказ от данной фичи.
Какие ресурсы можно создать на GPU?
Текстуры
Самый известный и самый объемный ресурс — это, наверное, текстура. Чисто для примера мы будем использовать простую текстуру 8х8 пикселей с призраком из игры Pac-man:
Текстура обладает рядом характеристик: размером, форматом, наличием мип мап. Это самые основные настройки текстуры, на которые стоит обращать внимание, поскольку они определяют объем памяти, занимаемый этим ресурсом, определяют — хранится ли текстура со сжатием и т. д. Стоит также разобраться в типах текстур — на удивление, их достаточно много. Итак, поехали:
Двумерные (в терминологии DirectX 11 — Texture2D).
Тут и рассказывать особо нечего — это самый распространенный тип текстур, который с большой вероятностью будет делать
90% картинки в вашем проекте. Текстуры объектов, интерфейса, служебные LUT, карты высот — как правило, это все Texture2D.
Трехмерные (в терминологии DirectX 11 — Texture3D).
Такие текстуры можно представить как массив или слои двумерных текстур. В редакторе создавать их как ассеты можно, но для этого их нужно включить ( r.AllowVolumeTextureAssetCreation 1 ). В основном, 3D текстуры используются самим движком для работы с Vector Fields, Distance Fields, Volumetric Lightmaps и т.д. То есть там, где необходимо пространственное представление данных.
Каждая текстура может обладать уменьшенными копиями самой себя — это так называемые мип-мапы (mip maps). Дело в том, что когда мы рисуем объект, он может находится как близко, так и далеко от игрока и соответственно иметь разный размер на экране. В результате, если объект имеет текстуру большего разрешения, чем его фактический размер на экране в этот момент — невозможно стабильно получить один и тот же цвет пикселя на экране с течением времени. В результате возникает эффект, известный под названием Муар (от фр. Moire).
Чтобы избежать этого, придумали мипмапы, которые по сути являются уменьшенными копиями оригинальной текстуры, из которых значительно проще получить стабильный цвет пикселя на удалении. GPU сам определяет, какую мипмапу ему лучше использовать для каждого пикселя в зависимости от расстояния до пикселя. Генерация мипмап поддерживается аппаратно и нам не нужно заботиться об их создании вручную.
8 Мб
Константные буферы
Следующий ресурс — константный буфер. Это просто участок памяти, который используется для хранения информации, например, для геометрии модели или же для параметров материалов.
Рассмотрим простейшую модель — куб. Как вам, возможно, известно — треугольник является наименьшим элементом, из которого состоят все 3D-модели. И чтобы описать модель способом, который будет понятен GPU, нам нужно 2 буфера — вершинный и индексный. Вершинный описывает, как ни странно, вершины модели: их позицию, нормали, текстурные координаты и т. д. Индексный буфер содержит индексы вершин, порядок соединения этих вершин, необходимый для построения на экране отдельного треугольника.
Шейдера и стейты
Вместе с ресурсами на GPU можно создавать дополнительные объекты: стейты и шейдера. Первые из них являются объектами, которые описывают правила взаимодействия с конкретным ресурсом, вторые же —отдельные программы для GPU.
SamplerState — стейт, который определяет, как GPU делает выборку с текстуры: фильтрацию, адресацию. Это, наверно, единственный стейт в UE4, на который мы явно можем влиять, когда устанавливаем текстуру в материале или в настройках самой текстуры. При описании текстур я избегал слова “сэмплить” (sample), под сэмплингом подразумевается вычисление цвета, именно вычисление, а не простая загрузка из памяти. Каждый раз, когда мы сэмплим из текстуры, GPU делает много вычислений, чтобы определить, с какой мипмапы брать цвет, возможен даже блендинг между мипмапами; для определенных типов фильтрации, таких как Anisotropic, в учет берется и положение треугольника в пространстве. Сэмплинг — достаточно сложная операция, и чем меньше текстур используется при рендеринге объекта, тем лучше.
А что будет, если мы попытаемся взять пиксель за пределами текстуры (напомним, что текстура находится в пределах 0. 1)? Для этого и была придумана адресация.
Хоть большую часть стейтов мы и не можем контролировать напрямую, понимание того, как они работают, может помочь нам при профайлинге кадра.
Шейдер — это программа, которая выполняется на GPU. Есть разные виды шейдеров, но мы остановимся только на двух основных: Vertex Shader (вершинный) и Pixel Shader (пиксельный). Основной задачей вершинного шейдера является трансформация объекта в пространстве (перемещение, поворот и масштабирование) и проецирование на экран. После того, как GPU спроецировала примитив на экран, вступает в работу пиксельный шейдер, который и вычисляет цвет пикселя.
В UE4 шейдеры создаются путём визуального программирования в Material Editor. Каждый материал имеет в себе предопределенные входы (инпуты) (Base Color, Metallic, Roughness, Emissive и т.д.), и мы, создавая ноды и соединяя их в определенной последовательности, генерируем код шейдера. Этот код является только частью шейдера и определяет основные параметры материала. В свою очередь, материал генерирует не один шейдер, а целое множество шейдеров для разных проходов материала.
Операции на GPU
На GPU есть особая текстура — Swapchain, которая представляет собой область экрана, где рисуется наша сцена. Swapchain состоит из нескольких буферов: front buffer — содержит то, что сейчас мы видим на экране, и back buffer — текстура, в которую мы рисуем следующий кадр. Когда наша сцена отрисована и находится в back buffer, мы вызываем команду Present — она меняет front buffer и back buffer местами. И отрисовка следующего кадра начинается снова.
Спасибо за внимание, надеемся, вы почерпнули новых знаний и лучше поняли возможности GPU и для чего они используются. Во второй части статьи мы рассмотрим на практическом примере процесс отрисовки сцены. До встречи на UE4 Daily!