Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5) • Makusha
Продолжим коллекцию рисунков по GTA 5 и теперь займемся другим главным персонажем игры. Пожалуй теперь самое время посмотреть, как рисовать Майкла де Санта из ГТА 5 поэтапно.Это его полное имя – Майкл Де Санта, и он лучший друг Тревора Филипса.
Майкл очень похож на Рэя Лиотту. Обожаю этого парня с его гангстерскими ролями, и кто знает, может быть, этот персонаж и был основан на дизайне его героев и его ролях.
Каждый персонаж игры имеет различные супер способности, будь то сильные или слабые стороны. Для Майкла выделили способность замедлять время, пока он с кем-то ведет перестрелку. Нарисовать Майкла де-Санту может оказаться немного посложнее, чем Тревора с нашего предыдущего урока, но в конце концов вы добьетесь результата и получите отличный рисунок Майкла из ГТА 5 .
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 1.
Чтобы не менять наш стиль начала рисунка, набросайте голову для Майкла де Санты и добавьте простую изогнутую для форму его плеч. На лице скрещиваются линии для помощи в рисовании черт его лица.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 2.
Здесь вы должны обрисовать реальную структуру и контур лица Майкла, затем нарисовать линию роста волос на его лбу так, как это принято у серьезных итальянских парней.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 3.
Затем нарисуем простые уши, добавим детализацию внутри.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 4.
На этом шаге мы будет работать над лицом Майкла. Впервые воспользуемся вспомогательные линиями лица, чтобы нарисовать форму его глаз. Он смотрит на нас слегка опущенной головой, так что брови должны выглядеть тяжелыми опущенными. Нарисуйте и закрасьте брови, добавьте форму его носа с последующими линиями рта и хмурого выражения лица, благодаря складкам. Нарисуйте детализацию на щеках и определите их так, как вы видите здесь у нас на рисунке, а затем добавьте складки на лоб.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 5.
Все, что вам нужно сделать здесь, это нарисовать зачесанные назад волосы Майкла из ГТА 5 /
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 6.
Почти готово. Нарисуйте вид шеи Майкла,так, чтобы получился свободный воротник. Рисуем простой разворот рубашки с видимой пуговицей.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 7.
За последний этап рисунка Майкла из новой версии ГТА, мы наметим плечи, рукава рубашки, а затем прорисуем на ней детализацию, чтобы получился ремень, лежащий через плечо и ряд простых складок. Чистим рисунок.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Шаг 8.
Мы нарисовали Майкла Де Санту! Парень крайне харизматичен и стоит того, чтобы я узнал ваше мнение об игре и его персонаже в комментариях.
Как рисовать Майкла де Санта из GTA 5 (Grand Theft Auto 5)
Рисование для Детей — Рисуем животных. Рисовалка APK (Android Game)
Рисование для самых маленьких, учимся рисовать животных 🐇. Это обучающие игры для 5 лет на русском.
Наиболее популярным развлечением для малышей можно назвать рисунки для детей , которое способно вызвать у ребенка интерес к художественному творчеству в самом раннем возрасте. Поэтому наша мобильная игра раскраски онлайн детские на русском языке — полезная игра детские раскраски, способствующие развитию ребенка ранних возрастов, таких как, для малышей 3 года, для девочек 3 лет, развивающие приложения для самых маленьких.
Тяга творить появляется у каждого ребенка и данная рисовалка даст возможность получить начальные навыки, освоить рисование для детей 5 лет 🎨 раскраска. Даже малыши детские разукрашки без художественных способностей рисование для малышей сумеют в минимальные сроки научиться рисовать картинки для детей простых и забавных с эффектами животных рисовать, прилагая для этого совсем немного усилий 👦 живые раскраски.
Обычно ребенок рисует рисунки по клеточкам, что видит, поэтому большинство дети в детские приложения детям стремится рисовать по клеточкам окружающую природу играть с ее обитателями. В связи с этим девиз разукрашки для малышей учимся рисовать животных — выглядит совершенно реалистично рисунки для детей. И в данной развивающей игре “Раскраски для малышей” каждый маленький художник раскраски получает возможность рисование для детей 5 лет нарисовать рисуем животных на выбор любых зверей животные для малышей, как 🐰🐐 домашние животные для самых маленьких или учим цвета, дикие животные: лев 🦁, слон, носорог 🦏 и зебра 🦓 рисовалка. На радость художникам игра для 5 лет рисунки, всякий персонаж, после того, как его нарисуют с помощью наших детских игр онлайн, оживает. К примеру, рисование для самых маленьких бабочки начинают летать и весело хохотать.

Кроме того, рисовашки для детей 5 лет к основным достоинствам мобильного приложения рисунки по клеточкам для мальчиков 4 лет «Рисовалка» игры без интернета следует отнести превосходную озвучку раскраски для малышей, выполненную на высоком качественном уровне игра для 5 лет, прекрасные звуки и звуковые эффекты раскраска учим цвета, рисуем животных.
Если говорить об играх для самых маленьких детские приложения детям учим цвета онлайн, в ней есть много достоинств учимся изображать животных, и развитие логического мышления у ребенка. Игры для девочек 5 лет на русском языке Учимся рисовать — это еще и целый ряд достоинств, среди которых стоит отметить:
😊 развитие мелкой моторики у детворы за счет использования раскраски онлайн;
😊 развитие у ребенка навыков: память, внимание и мелкая моторика т.д. в детские игры для мальчиков;
😊 ряд полезных игр и животные для самых маленьких, способствующих развитию у ребенка разнообразных творческих возможностей учим цвета для малышей 🌈 учимся рисовать.

Скачать эту детскую игру для малышей легко. Тем более живые разукрашки, спрос на развивающие игры, к числу которых относятся и рисовашки для детей, детские игры для девочек бесплатно.
Подробнее…
GTA V — Исследование графики
Серия Grand Theft Auto прошла долгий путь с тех пор первый опус вышел еще в 1997 году. Около 2 лет назад Rockstar выпустила GTA V. Игра имела мгновенный успех, было продано 11 миллионов копий за первые 24 часа и мгновенно было побито 7 мировых рекордов.
Поиграв на PS3, я был весьма впечатлен уровнем полировки и техническим качеством игры.
Ничто так не убивает погружение, как загрузочный экран: в GTA V можно играть часами, проезжая сотни километров по огромному открытому миру
без единого перерыва.
Учитывая интенсивную потоковую передачу ресурсов и характеристики PS3 (256 МБ ОЗУ и 256 МБ видеопамяти), я поражен тем, что игра не вылетает через 20 минут, это настоящее техническое мастерство.
Здесь я буду говорить о версии для ПК в режиме DirectX 11, который съедает несколько ГБ памяти как из оперативной памяти, так и из графического процессора. Даже если мои наблюдения касаются ПК, я полагаю, что многие из них применимы к PS4 и, в некоторой степени, к PS3.
- Часть 1: Препарирование рамы
- Часть 2: LOD и отражения
- Часть 3: Постэффекты
Итак, вот кадр, который мы рассмотрим: Майкл перед своим воображением Rapid GT , красивый город Лос-Сантос на заднем плане.
В GTA V используется конвейер отложенного рендеринга, работающий со многими буферами HDR . Эти буферы не могут правильно отображаться на мониторе как есть, поэтому я обработал их простым оператором Рейнхарда, чтобы вернуть их к 8-битному на канал.
Кубическая карта окружающей среды
В качестве первого шага игра визуализирует кубическую карту окружающей среды. Эта кубическая карта генерируется в реальном времени для каждого кадра.
его цель — помочь позже отобразить реалистичные отражения. Эта часть визуализируется вперед.
Как визуализируется такая кубическая карта? Для тех, кто не знаком с этой техникой, это точно так же, как в реальном мире при съемке панорамы:
поставьте камеру на штатив, представьте, что вы стоите прямо в центре большого куба и снимаете по 6 граням куба одну за другой, каждый раз поворачивая на 90°.
Именно так и происходит в игре: каждое лицо визуализируется в текстуру HDR 128×128. Первая грань визуализируется следующим образом:
Тот же процесс повторяется для 5 оставшихся граней, и в итоге мы получаем кубическую карту:
Куб, вид снаружи |
Вид изнутри куба (Перетащите, чтобы изменить направление взгляда) |
Каждое лицо рендерится примерно за 30 вызовов отрисовки, меши очень низкополигональные, прорисовываются только «декорации» (рельеф, небо, отдельные здания), персонажи и машины не рендерятся.
Вот почему в игре ваша машина хорошо отражает окружающую среду, а другие машины не отражают, как и персонажи.
Кубическая карта в карту двойного параболоида
Полученная кубическая карта среды затем преобразуется в карту двойного параболоида.
Куб просто проецируется в другое пространство, проекция похожа на сферическое отображение, но с двумя «полусферами».
Карта двойного параболоида |
Почему такое преобразование? Я предполагаю, что это (как всегда) об оптимизации: с кубической картой фрагментный шейдер потенциально может получить доступ к 6 граням текселей 128×128, здесь карта с двумя параболоидами приносит
до 2-х «полушарий» 128×128.
Еще лучше: поскольку камера большую часть времени находится на крыше автомобиля, большинство доступов будет осуществляться к верхней полусфере.
Проекция двойного параболоида сохраняет детали правильного отражения
вверху и внизу, за счет бортов.
Кроме того, кубические карты могут быть проблематичными по краям: если каждая грань мип-мапится независимо, некоторые швы будут заметны по краям, а графические процессоры старшего поколения не поддерживает фильтрацию по лицам. Двойная параболоидная карта не страдает такими проблемами, ее можно легко мипмапить, не создавая швов.
Обновление: Как указано в комментариях ниже, кажется, что GTA IV также полагалась на карту с двойным параболоидом, за исключением того, что она не выполнялась как постобработка кубической карты: сетки были искажены непосредственно вершинный шейдер.
Отбор и уровень детализации
Этот шаг обрабатывается вычислительным шейдером, поэтому у меня нет для него иллюстрации.
В зависимости от расстояния до камеры объект будет отрисовываться с низкополигональной или высокополигональной сеткой или вообще не отрисовываться.
Например, за пределами определенного расстояния трава или цветы никогда не визуализируются. Таким образом, этот шаг вычисляет для каждого объекта, будет ли он визуализирован и на каком уровне детализации .
На самом деле здесь конвейер отличается между PS3 (отсутствует поддержка вычислительных шейдеров) и ПК или PS4: на PS3 все эти вычисления должны выполняться на Cell или SPU.
G-Buffer Generation
Здесь происходит «основной» рендеринг. Все видимые меши отрисовываются один за другим, но вместо немедленного расчета затенения вызовы отрисовки просто выводят
некоторую информацию, связанную с затенением, в разные буферы, называемые
Позже все эти буферы объединяются для расчета окончательного затенения каждого пикселя. Отсюда и название «отложенный» в отличие от «вперед», для которого каждый вызов отрисовки вычисляет окончательное значение затенения пикселя.
На этом этапе отрисовываются только непрозрачные объекты, прозрачные сетки, такие как стекло, требуют специальной обработки в отложенном конвейере и будут обработаны позже.
Генерация G-буфера: 15%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 30%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 50%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 75%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 100%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Все эти цели рендеринга представляют собой LDR-буферы (RGBA, 8 бит на канал), в которых хранится различная информация, используемая позже при расчете окончательного значения затенения.
Буферы:
- Диффузная карта : хранит «внутренний цвет» меша. Это свойство материала, теоретически на него не влияет освещение.
Но вы заметили белые блики на капоте автомобиля? Интересно, что GTA V вычисляет затенение от направленного солнечного света перед выводом на диффузную карту.
Альфа-канал содержит специальную информацию о «смешивании» (подробнее об этом позже). - Карта нормалей : сохраняет вектор нормалей для каждого пикселя (R, G, B). Альфа-канал тоже используется, хотя я не уверен, каким именно образом: он выглядит как бинарная маска для определенных растений рядом с камерой.
- Карта бликов : содержит информацию, связанную с бликами/отражениями:
- Красный: интенсивность отражения
- Зеленый: глянец (гладкость)
- Синий: интенсивность Френеля (обычно постоянная для всех пикселей, принадлежащих одному и тому же материалу)
- Карта освещенности : красный канал, кажется, содержит освещенность, которую каждый пиксель получает от солнца (на основе нормали и положения пикселя, а также направления солнечного света).
Я не на 100% уверен в Зеленом канале, но это похоже на излучение от второго источника света. Синий — это свойство пикселя излучать (отличное от нуля для неона, лампочек). Большая часть альфа-канала не используется, за исключением маркировки пикселей, соответствующих коже персонажа или растительности.
Итак, я говорил раньше о выводе одновременно на 5 целей рендеринга, но я представил только 4 из них.
Последней целью рендеринга является специальный буфер трафарета глубины . Вот как это выглядит в конце этого прохода:
Глубина |
Трафарет |
- Карта глубины : хранит расстояние каждого пикселя от камеры.
Интуитивно вы ожидаете, что дальние пиксели будут белыми (глубина 1), а ближние пиксели будут темнее. Это не случай здесь: GTA V, кажется, использует логарифмический Z-буфер, обращая Z. Зачем это делать? Из-за того, как они закодированы, числа с плавающей запятой имеют гораздо большую точность, когда ближе к 0.Здесь изменение Z приводит к большей точности при сохранении глубины очень удаленных объектов, что значительно снижает Z-борьбу. Учитывая большую дальность прорисовки игре нужен был такой трюк. Впрочем, ничего нового, 9Например, 0005 Just Cause 2 использовала аналогичную технику.
- Трафарет : используется для идентификации различных нарисованных сеток, присваивая одинаковый идентификатор всем пикселям определенной категории сеток.
Например, некоторые значения трафарета:
-
0x89
: персонаж, которым управляет игрок -
0x82
: транспортное средство, управляемое игроком -
0x01
: NPC -
0x02
: транспортные средства, такие как автомобили, велосипеды… -
0x03
: растительность и листва -
0x07
: небо
-
Все эти буферы были сгенерированы примерно за 1900 вызовов отрисовки.
Обратите внимание, что сцена визуализируется «спереди назад», это способ оптимизировать визуализацию благодаря «раннему отклонению Z»: по мере отрисовки сцены все больше и больше фрагментов терпят неудачу.
тест глубины, потому что они закрыты более близким пикселем, нарисованным ранее. Когда известно, что пиксель не пройдет тест глубины, графический процессор может автоматически отбросить его.
даже без выполнения пиксельного шейдера. Когда у вас есть тяжелые пиксельные шейдеры, рендеринг «сзади наперед» (или алгоритм Painter) — худший выбор.
С другой стороны, с точки зрения производительности, «спереди назад» является оптимальным.
Теперь небольшое отступление, чтобы объяснить роль альфа-канала в диффузной карте. Взгляните на скриншот ниже:
Увеличьте карту диффузии
Вы заметили, что некоторые пиксели отсутствуют? Особенно это видно по деревьям, как будто их спрайтам не хватает некоторых текселей.
Я несколько раз замечал подобные артефакты на PS3 и тогда был озадачен. Может ли это быть сглаживание, когда спрайт текстуры становится очень маленьким?
Теперь я вижу, что все они правильно мип-мапированы, так что это не так.
Этот паттерн действительно специфичен, как шахматная доска, может быть… игра пропускает рендеринг 1 из 2 пикселей?
Чтобы убедиться, я изучил байт-код D3D. И, конечно же, он был здесь:
1 2 3 | dp2 r1.y, v0.xyxx, l(0.5, 0.5, 0.0, 0.0) // Скалярное произведение пикселей (x,y) на (0.5, 0.5) frc r1.y, r1.y // Сохраняет только дробную часть: всегда 0.0 или 0.5 lt r1.y, r1.y, l(0.5) // Проверить, меньше ли дробная часть 0,5 |
Альфа-канал Diffuse
Все эти инструкции просто эквивалентны тесту (x + y) % 2 == 0
, который всегда проходит 1 из 2 пикселей. ( x и y являются координатами пикселя)
Это всего лишь одно из нескольких условий, ведущих к отбрасыванию пикселя (другое условие имеет альфа < 0,75), но этого достаточно, чтобы объяснить паттерн дизеринга.
Чтобы запомнить, какие сетки были нарисованы в таком «смешанном режиме», информация сохраняется в альфа-канале.
канал диффузной карты, который выглядит как на картинке справа.
Так почему же некоторые модели нарисованы именно так? Может быть, чтобы сэкономить на скорости заполнения или расчете затенения? Не совсем потому, что у графических процессоров нет такой детализации: пиксели закрашиваются квадратом 2×2,
не индивидуально. Дело не в производительности, а в переходе LOD: этот шаблон сглаживания делает непрозрачные сетки немного прозрачными при переходе между LOD.
Этот метод на самом деле называется альфа-точечной штриховкой.
Тени
В игре используется CSM (каскадные карты теней): 4 карты теней генерируются в 1024×4096 текстуры. Каждая карта теней создается для отдельной усеченной пирамиды камеры, усеченная пирамида становится больше и охватывает более высокую часть сцены по ходу итерации. Это гарантирует, что тени рядом с игроком сохраняются с более высоким разрешением, а тени дальше имеют меньше деталей. Вот обзор информации о глубине 4-х карт:
Карты теней
Этот шаг потенциально может иметь большие затраты, поскольку сцену необходимо перерендерить 4 раза, но отсечение усеченной пирамиды позволяет избежать рендеринга ненужных полигонов. Здесь генерация CSM достигается примерно за 1000 вызовов отрисовки.
Из этой информации о глубине мы можем рассчитать тень, отбрасываемую на каждый пиксель. Движок сохраняет информацию о тенях в цели рендеринга: тени, отбрасываемые направленным солнцем светом.
находятся в красном канале, те, которые отбрасываются облаками в атмосферу, находятся как в красном, так и в зеленом каналах.
Карты теней сэмплируются с использованием шаблона дизеринга (если вы внимательно посмотрите на текстуру ниже, красный канал отображает некоторые артефакты, похожие на шахматную доску), это сделано для того, чтобы сделать границы теней более гладкими.
Затем эти артефакты исправляются: тени от солнца и облаков объединяются в один буфер, выполняется некоторое размытие с учетом глубины, и результат сохраняется в альфа-канале.
зеркальной карты.
Тени от солнца (зеленый оттенок)
Тени от облаков (серый оттенок)
Размытые тени
Небольшое замечание об операции размытия: она довольно дорогая, поскольку требует много нажатий от нескольких текстур.
Таким образом, чтобы уменьшить нагрузку, непосредственно перед выполнением размытия создается текстура «раннего выхода»: буфер теней уменьшается до 1/8, а пиксельный шейдер выполняет легкое размытие.
сделать 4 звонка на
Собрать()
. Это может дать приблизительную оценку того, какие пиксели полностью освещены.
Затем, когда выполняется полное размытие с учетом глубины, первый шаг состоит в чтении
этот «ранний выходной» буфер: если текущий пиксель кажется полностью освещенным, пиксельный шейдер немедленно выводит 1 и пропускает все сложные вычисления размытия.
Planar Reflection Map
Я не буду вдаваться в подробности, так как отражения более подробно объясняются в Часть 2 и эффект едва заметен в этой сцене, но на этом шаге создается карта отражения для океана поверхность.
В основном сцена снова рисуется (за 650 вызовов отрисовки) в крошечную текстуру 240×120, но «вверх ногами», чтобы она выглядела как отражение на поверхности воды.
Затенение окружающего пространства экрана
Вычисляется линейная версия буфера глубины, а затем из нее создается карта SSAO. Генерируется первая зашумленная версия, затем за 2 последовательных прохода (по горизонтали и по вертикали) применяется размытие с учетом глубины, чтобы сгладить результат. Вся работа выполняется с половиной исходного разрешения для увеличения производительности. |
Карта SSAO (зашумленная) Карта SSAO (размытая) |
Комбинация G-буферов
Пришло время, наконец, объединить все эти сгенерированные буферы!
Пиксельный шейдер извлекает данные из разных буферов и вычисляет окончательное значение затенения пикселя в HDR.
В случае с ночной сценой, огни и их освещенность теперь также будут добавляться один за другим в верхней части сцены.
Рассеянный |
Обычный |
Зеркало + Тень |
Освещенность |
Глубина |
Трафарет |
ССАО |
Отражение |
Комбинация G-буферов
Все начинает обретать форму, хотя нам все еще не хватает океана, неба, прозрачных объектов…
Но обо всем по порядку: внешний вид Майкла нужно улучшить.
Подповерхностное рассеяние
SSS (До)
SSS (После)
Цвет кожи Майкла немного нарушен: на его лице есть очень темные участки, как будто его тело было сделано из толстого пластика, а не из плоти.
Поэтому выполняется проход SSS, имитирующий транспорт света в коже. Посмотрите на его уши или губы: после прохождения SSS свет теперь просачивается сквозь них, придавая красный оттенок, чего и следовало ожидать в реальном мире.
Как SSS применялся только к Майклу? Сначала извлекается только его силуэт. Это возможно благодаря сгенерированному ранее буферу трафарета:
все пиксели Майкла имеют значение 0x89
.
Итак, мы можем получить пиксели Майкла, отлично, но мы хотим применить SSS только к коже, а не к одежде.
На самом деле, когда все G-буферы были объединены, в дополнение к данным затенения, хранящимся в RGB, некоторые данные записывались и в альфа-канал.
Точнее, альфа-каналы карты освещенности и карты бликов использовались для создания бинарной маски: пиксели, принадлежащие коже Майкла и некоторым растениям, установлены в 1 в альфа-канале. Другие пиксели, такие как
у одежды альфа 0.
Таким образом, SSS можно применять, предоставляя в качестве входных данных просто объединенную цель G-буфера и буфер трафарета глубины.
Теперь вы можете подумать, что для небольшого локального улучшения требуется много вычислений. И вы были бы правы, но не забывайте, что, играя в игру, мы, люди, инстинктивно склонны много смотреть на лицо персонажа — любое улучшение рендеринга лица может стать большой победой для ощущения погружения. В игре SSS применяется как к вашему персонажу, так и к NPC.
Вода
В этой сцене не так много воды, но тем не менее у нас есть океан сзади, несколько бассейнов тут и там.
Рендеринг воды в GTA V обрабатывает как отражение, так и преломление.
Созданный ранее логарифмический Z-буфер используется для создания второй версии: на этот раз линейной, с половинным разрешением.
Океан и бассейны отрисовываются по одному, в режиме MRT с выводом сразу на несколько целей:
Рассеиватель воды |
Непрозрачность воды |
- Water Diffuse map : это собственный цвет воды.
- Карта непрозрачности воды : красный канал, кажется, хранит некоторое свойство непрозрачности воды (например, океан всегда 0,102, бассейны всегда 0,129).
Зеленый канал хранит информацию о том, насколько далеко пиксель от поверхности воды (глубокие пиксели имеют более непрозрачную воду с сильным вкладом диффузной карты, тогда как вода для мелких пикселей почти прозрачна).
Обратите внимание, что все пулы рендерятся безоговорочно, даже если они оказываются скрытыми за другим мешем в сцене, все они отображаются в красном канале. Однако для зеленого канала вычисляются только действительно видимые пиксели, единственные «водяные» пиксели, которые попадают в окончательное изображение.
Теперь мы можем объединить созданные нами предыдущие буферы и создать карту преломления:
Карта преломления воды
На этой карте преломления бассейны заполнены водой (чем глубже вода, тем голубее), также добавлены каустики.
Теперь мы можем перейти к окончательному рендерингу воды: снова все меши океана, поверхности бассейна рисуются один за другим, но на этот раз объединяя отражение
и преломление вместе с некоторыми картами бампа, чтобы нарушить нормали поверхности.
Плоское отражение |
Преломление |
Рельефные карты |
Вода (До)
Вода (После)
Атмосфера
Световой вал
Создается карта светового вала, также называемая «объемными тенями». атмосфера/туман, не освещаемый солнцем.
Карта создается с половинным разрешением путем трассировки лучей для каждого пикселя и сопоставления с картой теней от солнца.
После получения первого зашумленного результата буфер размывается.
Следующий шаг заключается в добавлении в нашу сцену эффекта тумана: он удобно скрывает отсутствие деталей низкополигональных зданий вдалеке.
Этот проход считывает карту светового вала (которая мало влияет на этот кадр) и буфер глубины для вывода информации о тумане.
Затем рендерится небо, а затем облака.
База
База + Туман
База + Туман + Небо
База + Туман + Небо + Облака
Купол неба
Небо фактически визуализируется в одном вызове отрисовки: используемая сетка представляет собой огромный купол охватывая всю сцену. (см. справа)
Этот шаг использует в качестве входных данных некоторые текстуры, похожие на шум Перлина.
Облака рендерятся аналогичным образом: большая сетка, на этот раз в форме кольца, рендерится на горизонте. Для рендеринга облаков используются одна карта нормалей и одна карта плотности: это большие текстуры 2048×512, которые также являются бесшовными (они зацикливаются слева и справа).
Плотность облаков |
Облако Обычное |
Прозрачные объекты
Этот шаг визуализирует все прозрачные объекты сцены: очки, лобовое стекло, частицы пыли, летающие вокруг…
Прозрачные объекты (до)
Прозрачные объекты (после)
Все это выполняется всего за 11 вызовов отрисовки, экземпляры интенсивно используются для частиц.
Дизеринг Сглаживание
Помните наше небольшое отступление о том, что некоторые деревья были дизерингованы на диффузной карте?
Пришло время исправить эти артефакты: эффект постобработки выполняется с помощью пиксельного шейдера, считывая исходный цветовой буфер и альфа-канал диффузной карты, чтобы знать, какие пиксели
были разбавлены. Для каждого пикселя можно взять до 2 соседних пикселей, чтобы определить окончательное «сглаженное» значение цвета.
Сглаживание (До)
Сглаживание (После)
Это хороший трюк, потому что всего за один проход изображение «исцеляется»: стоимость постоянна, она не зависит от количества
геометрии в сцене.
Обратите внимание, что этот фильтр не идеален: как на PS3, так и на ПК я заметил на экране некоторую шахматную доску, которую фильтр не улавливал в некоторых ситуациях.
Tone Mapping и Bloom
До сих пор наше изображение для рендеринга сохранялось в формате HDR: каждый из каналов RGB хранится как 16-битное число с плавающей запятой. Это позволяет иметь огромные вариации интенсивности света.
Но мониторы не могут отображать такой широкий диапазон значений, они выводят только цвета RGB с 8 битами на канал.
Tone Mapping состоит в преобразовании этих цветовых значений из пространства HDR в пространство LDR.
Существует несколько функций для сопоставления одного диапазона с другим.
Классический, который широко используется, это Reinhard , и именно его я использовал при создании всех предыдущих скриншотов.
это дает результаты, близкие к финальному рендеру игры.
Но действительно ли в GTA V используется Reinhard ? Пришло время снова изменить байт-код некоторого шейдера:
Сборка фрагмента шейдера — Тональное отображение 1 2 3 4 5 6 7 8 9 10 11 12 | // Предположим, что r0 — цвет HDR, r1.xyzw — (A, B, C, D), а r2.yz — (E, F) mul r3.xy, r1.wwww, r2.yzyy // (DE, DF) mul r0.w, r1.y, r1.z // ВС [...] div r1.w, r2.y, r2.z // E/F [...] mad r2.xyz, r1.xxxx, r0.xyzx, r0.wwww // Ax+BC mad r2.xyz, r0.xyzx, r2.xyzx, r3.xxxx // x(Ax+BC)+DE mad r3.xzw, r1.xxxx, r0.xxyz, r1.yyyy // Ax+B mad r0.xyz, r0.xyzx, r3.xzwx, r3.yyyy // x(Ax+B)+ DF div r0.xyz, r2.xyzx, r0.xyzx // (x(Ax+BC)+DE) / (x(Ax+B)+DF) добавить r0.xyz, -r1.wwww, r0.xyzx // (x(Ax+BC)+DE) / (x(Ax+B)+DF) - (E/F) |
Ну-ну-ну… что у нас тут?
(x(Ax+BC)+DE) / (x(Ax+B)+DF) - (E/F)
— это типичное уравнение оператора тональной компрессии, которое Джон Хейбл использовал в 2009 году в Naughty Dog.
Это метод кинематографического тонального отображения, разработанный Хаармом-Питером Дукером в 2006 году, когда он работал в EA.
Оказывается, в GTA V используется не Reinhard , а оператор Uncharted 2 , который не так сильно обесцвечивает черные области.
Процесс преобразования в LDR выглядит следующим образом:
- буфер HDR уменьшен до 1/4 разрешения.
- вычислительный шейдер используется для вычисления средней яркости буфера, выводя результат в текстуру 1×1.
- рассчитывается новая экспозиция, она определяет, насколько яркой/темной выглядит сцена.
-
Яркий буфер
светофильтр используется для извлечения только тех пикселей, яркость которых выше определенного порога (определяемого по экспозиции).
В этой сцене только несколько пикселей выдерживают фильтр: некоторые пятна автомобиля, которые имеют сильное отраженное свечение. -
Bloom
буфер яркости многократно уменьшается и размывается вверх до 1/16 исходного размера, а затем несколько раз масштабируется снова, пока не достигнет половины исходного размера. - Блум добавляется к исходным пикселям HDR, а затем оператор тональной карты Uncharted 2 преобразует цвет в LDR, одновременно применяя гамма-коррекцию, оставив линейное пространство для пространства sRGB.
Конечный результат во многом зависит от экспозиции. Вот несколько примеров, иллюстрирующих влияние этого параметра:
Низкая экспозиция |
Среднее воздействие |
Высокая экспозиция |
Экспозиция на самом деле медленно изменяется кадр за кадром, резких изменений не бывает.
Это предназначено для имитации поведения человеческого глаза: вы замечали, что после вождения в темном туннеле и внезапного выхода на солнечный свет все вокруг выглядит слишком ярким в течение нескольких кадров?
Затем он постепенно возвращается от «слепого» к «нормальному», в то время как экспозиция настраивается на новое значение.
Похоже, в GTA V даже переходы «Темный → Яркий» адаптируются быстрее, чем переходы «Яркий → Темный», точно так же, как вел бы себя человеческий глаз.
Сглаживание и дисторсия объектива
Если используется метод сглаживания FXAA, теперь он выполняется для сглаживания зубчатых краев мешей.
Затем, чтобы имитировать реальную камеру, к изображению применяется искажение объектива с помощью небольшого пиксельного шейдера. Он не только искажает изображение, но и вносит небольшие хроматические аберрации.
по краям кадра, слегка искажая красный канал по сравнению с зеленым и синим.
Искажение объектива (до)
Искажение объектива (после)
Пользовательский интерфейс
Последний штрих: пользовательский интерфейс, который здесь представляет собой мини-карту в нижнем левом углу экрана. Карта фактически разделена на несколько квадратных тайлов, движок рисует только тот набор тайлов, который потенциально появляется на экране. Каждая плитка рисуется через один вызов отрисовки. Я раскрасил плитки, чтобы вы могли лучше видеть структуру:
Мини-карта
Тест ножниц включен, чтобы разрешить рендеринг только в нижнем левом углу и отбросить все за его пределами. Все дороги на самом деле векторизованы (см. каркас на скриншоте выше), они отрисованы в виде мешей.
и может отлично выглядеть практически на любом уровне масштабирования.
Затем мини-карта переносится в основной буфер изображения, а поверх нее добавляются несколько небольших значков и виджетов.
Ну, это заняло некоторое время, но вот оно: финальный кадр во всей красе!
Всего было 4155 вызовов отрисовки, задействовано 1113 текстур и 88 целей рендеринга.
UI (до)
UI (после)
Все еще хотите узнать больше? Перейдите к Часть 2 — Уровень детализации и отражения .
GTA V — Исследование графики
Серия Grand Theft Auto прошла долгий путь с тех пор первый опус вышел еще в 1997 году. Около 2 лет назад Rockstar выпустила GTA V. Игра имела мгновенный успех, было продано 11 миллионов копий за первые 24 часа и мгновенно было побито 7 мировых рекордов.
Поиграв на PS3, я был весьма впечатлен уровнем полировки и техническим качеством игры.
Ничто так не убивает погружение, как загрузочный экран: в GTA V можно играть часами, проезжая сотни километров по огромному открытому миру
без единого перерыва.
Учитывая интенсивную потоковую передачу ресурсов и характеристики PS3 (256 МБ ОЗУ и 256 МБ видеопамяти), я поражен тем, что игра не вылетает через 20 минут, это настоящее техническое мастерство.
Здесь я буду говорить о версии для ПК в режиме DirectX 11, который съедает несколько ГБ памяти как из оперативной памяти, так и из графического процессора. Даже если мои наблюдения касаются ПК, я полагаю, что многие из них применимы к PS4 и, в некоторой степени, к PS3.
- Часть 1: Препарирование рамы
- Часть 2: LOD и отражения
- Часть 3: Постэффекты
Итак, вот кадр, который мы рассмотрим: Майкл перед своим воображением Rapid GT , красивый город Лос-Сантос на заднем плане.
В GTA V используется конвейер отложенного рендеринга, работающий со многими буферами HDR .
Эти буферы не могут правильно отображаться на мониторе как есть, поэтому я обработал их простым оператором Рейнхарда, чтобы вернуть их к 8-битному на канал.
Кубическая карта окружающей среды
В качестве первого шага игра визуализирует кубическую карту окружающей среды. Эта кубическая карта генерируется в реальном времени для каждого кадра.
его цель — помочь позже отобразить реалистичные отражения. Эта часть визуализируется вперед.
Как визуализируется такая кубическая карта? Для тех, кто не знаком с этой техникой, это точно так же, как в реальном мире при съемке панорамы:
поставьте камеру на штатив, представьте, что вы стоите прямо в центре большого куба и снимаете по 6 граням куба одну за другой, каждый раз поворачивая на 90°.
Именно так и происходит в игре: каждое лицо визуализируется в текстуру HDR 128×128. Первая грань визуализируется следующим образом:
Тот же процесс повторяется для 5 оставшихся граней, и в итоге мы получаем кубическую карту:
Куб, вид снаружи |
Вид изнутри куба (Перетащите, чтобы изменить направление взгляда) |
Каждое лицо рендерится примерно за 30 вызовов отрисовки, меши очень низкополигональные, прорисовываются только «декорации» (рельеф, небо, отдельные здания), персонажи и машины не рендерятся.
Вот почему в игре ваша машина хорошо отражает окружающую среду, а другие машины не отражают, как и персонажи.
Кубическая карта в карту двойного параболоида
Полученная кубическая карта среды затем преобразуется в карту двойного параболоида.
Куб просто проецируется в другое пространство, проекция похожа на сферическое отображение, но с двумя «полусферами».
Карта двойного параболоида |
Почему такое преобразование? Я предполагаю, что это (как всегда) об оптимизации: с кубической картой фрагментный шейдер потенциально может получить доступ к 6 граням текселей 128×128, здесь карта с двумя параболоидами приносит
до 2-х «полушарий» 128×128.
Еще лучше: поскольку камера большую часть времени находится на крыше автомобиля, большинство доступов будет осуществляться к верхней полусфере.
Проекция двойного параболоида сохраняет детали правильного отражения
вверху и внизу, за счет бортов. Для GTA нормально: крыши машин и капоты обычно обращены вверх, им в основном нужно отражение сверху, чтобы хорошо смотрелось.
Кроме того, кубические карты могут быть проблематичными по краям: если каждая грань мип-мапится независимо, некоторые швы будут заметны по краям, а графические процессоры старшего поколения не поддерживает фильтрацию по лицам. Двойная параболоидная карта не страдает такими проблемами, ее можно легко мипмапить, не создавая швов.
Обновление: Как указано в комментариях ниже, кажется, что GTA IV также полагалась на карту с двойным параболоидом, за исключением того, что она не выполнялась как постобработка кубической карты: сетки были искажены непосредственно вершинный шейдер.
Отбор и уровень детализации
Этот шаг обрабатывается вычислительным шейдером, поэтому у меня нет для него иллюстрации.
В зависимости от расстояния до камеры объект будет отрисовываться с низкополигональной или высокополигональной сеткой или вообще не отрисовываться.
Например, за пределами определенного расстояния трава или цветы никогда не визуализируются. Таким образом, этот шаг вычисляет для каждого объекта, будет ли он визуализирован и на каком уровне детализации .
На самом деле здесь конвейер отличается между PS3 (отсутствует поддержка вычислительных шейдеров) и ПК или PS4: на PS3 все эти вычисления должны выполняться на Cell или SPU.
G-Buffer Generation
Здесь происходит «основной» рендеринг. Все видимые меши отрисовываются один за другим, но вместо немедленного расчета затенения вызовы отрисовки просто выводят
некоторую информацию, связанную с затенением, в разные буферы, называемые G-буфер . GTA V использует MRT
поэтому каждый вызов отрисовки может выводить одновременно на 5 целей рендеринга.
Позже все эти буферы объединяются для расчета окончательного затенения каждого пикселя. Отсюда и название «отложенный» в отличие от «вперед», для которого каждый вызов отрисовки вычисляет окончательное значение затенения пикселя.
На этом этапе отрисовываются только непрозрачные объекты, прозрачные сетки, такие как стекло, требуют специальной обработки в отложенном конвейере и будут обработаны позже.
Генерация G-буфера: 15%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 30%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 50%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 75%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Генерация G-буфера: 100%
Рассеянный |
Обычный |
Зеркальный |
Освещенность |
Все эти цели рендеринга представляют собой LDR-буферы (RGBA, 8 бит на канал), в которых хранится различная информация, используемая позже при расчете окончательного значения затенения.
Буферы:
- Диффузная карта : хранит «внутренний цвет» меша. Это свойство материала, теоретически на него не влияет освещение.
Но вы заметили белые блики на капоте автомобиля? Интересно, что GTA V вычисляет затенение от направленного солнечного света перед выводом на диффузную карту.
Альфа-канал содержит специальную информацию о «смешивании» (подробнее об этом позже). - Карта нормалей : сохраняет вектор нормалей для каждого пикселя (R, G, B). Альфа-канал тоже используется, хотя я не уверен, каким именно образом: он выглядит как бинарная маска для определенных растений рядом с камерой.
- Карта бликов : содержит информацию, связанную с бликами/отражениями:
- Красный: интенсивность отражения
- Зеленый: глянец (гладкость)
- Синий: интенсивность Френеля (обычно постоянная для всех пикселей, принадлежащих одному и тому же материалу)
- Карта освещенности : красный канал, кажется, содержит освещенность, которую каждый пиксель получает от солнца (на основе нормали и положения пикселя, а также направления солнечного света).
Я не на 100% уверен в Зеленом канале, но это похоже на излучение от второго источника света. Синий — это свойство пикселя излучать (отличное от нуля для неона, лампочек). Большая часть альфа-канала не используется, за исключением маркировки пикселей, соответствующих коже персонажа или растительности.
Итак, я говорил раньше о выводе одновременно на 5 целей рендеринга, но я представил только 4 из них.
Последней целью рендеринга является специальный буфер трафарета глубины . Вот как это выглядит в конце этого прохода:
Глубина |
Трафарет |
- Карта глубины : хранит расстояние каждого пикселя от камеры.
Интуитивно вы ожидаете, что дальние пиксели будут белыми (глубина 1), а ближние пиксели будут темнее. Это не случай здесь: GTA V, кажется, использует логарифмический Z-буфер, обращая Z. Зачем это делать? Из-за того, как они закодированы, числа с плавающей запятой имеют гораздо большую точность, когда ближе к 0.Здесь изменение Z приводит к большей точности при сохранении глубины очень удаленных объектов, что значительно снижает Z-борьбу. Учитывая большую дальность прорисовки игре нужен был такой трюк. Впрочем, ничего нового, 9Например, 0005 Just Cause 2 использовала аналогичную технику.
- Трафарет : используется для идентификации различных нарисованных сеток, присваивая одинаковый идентификатор всем пикселям определенной категории сеток.
Например, некоторые значения трафарета:
-
0x89
: персонаж, которым управляет игрок -
0x82
: транспортное средство, управляемое игроком -
0x01
: NPC -
0x02
: транспортные средства, такие как автомобили, велосипеды… -
0x03
: растительность и листва -
0x07
: небо
-
Все эти буферы были сгенерированы примерно за 1900 вызовов отрисовки.
Обратите внимание, что сцена визуализируется «спереди назад», это способ оптимизировать визуализацию благодаря «раннему отклонению Z»: по мере отрисовки сцены все больше и больше фрагментов терпят неудачу.
тест глубины, потому что они закрыты более близким пикселем, нарисованным ранее. Когда известно, что пиксель не пройдет тест глубины, графический процессор может автоматически отбросить его.
даже без выполнения пиксельного шейдера. Когда у вас есть тяжелые пиксельные шейдеры, рендеринг «сзади наперед» (или алгоритм Painter) — худший выбор.
С другой стороны, с точки зрения производительности, «спереди назад» является оптимальным.
Теперь небольшое отступление, чтобы объяснить роль альфа-канала в диффузной карте. Взгляните на скриншот ниже:
Увеличьте карту диффузии
Вы заметили, что некоторые пиксели отсутствуют? Особенно это видно по деревьям, как будто их спрайтам не хватает некоторых текселей.
Я несколько раз замечал подобные артефакты на PS3 и тогда был озадачен. Может ли это быть сглаживание, когда спрайт текстуры становится очень маленьким?
Теперь я вижу, что все они правильно мип-мапированы, так что это не так.
Этот паттерн действительно специфичен, как шахматная доска, может быть… игра пропускает рендеринг 1 из 2 пикселей?
Чтобы убедиться, я изучил байт-код D3D. И, конечно же, он был здесь:
1 2 3 | dp2 r1.y, v0.xyxx, l(0.5, 0.5, 0.0, 0.0) // Скалярное произведение пикселей (x,y) на (0.5, 0.5) frc r1.y, r1.y // Сохраняет только дробную часть: всегда 0.0 или 0.5 lt r1.y, r1.y, l(0.5) // Проверить, меньше ли дробная часть 0,5 |
Альфа-канал Diffuse
Все эти инструкции просто эквивалентны тесту (x + y) % 2 == 0
, который всегда проходит 1 из 2 пикселей. ( x и y являются координатами пикселя)
Это всего лишь одно из нескольких условий, ведущих к отбрасыванию пикселя (другое условие имеет альфа < 0,75), но этого достаточно, чтобы объяснить паттерн дизеринга.
Чтобы запомнить, какие сетки были нарисованы в таком «смешанном режиме», информация сохраняется в альфа-канале.
канал диффузной карты, который выглядит как на картинке справа.
Так почему же некоторые модели нарисованы именно так? Может быть, чтобы сэкономить на скорости заполнения или расчете затенения? Не совсем потому, что у графических процессоров нет такой детализации: пиксели закрашиваются квадратом 2×2,
не индивидуально. Дело не в производительности, а в переходе LOD: этот шаблон сглаживания делает непрозрачные сетки немного прозрачными при переходе между LOD.
Этот метод на самом деле называется альфа-точечной штриховкой.
Тени
В игре используется CSM (каскадные карты теней): 4 карты теней генерируются в 1024×4096 текстуры. Каждая карта теней создается для отдельной усеченной пирамиды камеры, усеченная пирамида становится больше и охватывает более высокую часть сцены по ходу итерации. Это гарантирует, что тени рядом с игроком сохраняются с более высоким разрешением, а тени дальше имеют меньше деталей. Вот обзор информации о глубине 4-х карт:
Карты теней
Этот шаг потенциально может иметь большие затраты, поскольку сцену необходимо перерендерить 4 раза, но отсечение усеченной пирамиды позволяет избежать рендеринга ненужных полигонов. Здесь генерация CSM достигается примерно за 1000 вызовов отрисовки.
Из этой информации о глубине мы можем рассчитать тень, отбрасываемую на каждый пиксель. Движок сохраняет информацию о тенях в цели рендеринга: тени, отбрасываемые направленным солнцем светом.
находятся в красном канале, те, которые отбрасываются облаками в атмосферу, находятся как в красном, так и в зеленом каналах.
Карты теней сэмплируются с использованием шаблона дизеринга (если вы внимательно посмотрите на текстуру ниже, красный канал отображает некоторые артефакты, похожие на шахматную доску), это сделано для того, чтобы сделать границы теней более гладкими.
Затем эти артефакты исправляются: тени от солнца и облаков объединяются в один буфер, выполняется некоторое размытие с учетом глубины, и результат сохраняется в альфа-канале.
зеркальной карты.
Тени от солнца (зеленый оттенок)
Тени от облаков (серый оттенок)
Размытые тени
Небольшое замечание об операции размытия: она довольно дорогая, поскольку требует много нажатий от нескольких текстур.
Таким образом, чтобы уменьшить нагрузку, непосредственно перед выполнением размытия создается текстура «раннего выхода»: буфер теней уменьшается до 1/8, а пиксельный шейдер выполняет легкое размытие.
сделать 4 звонка на
Собрать()
. Это может дать приблизительную оценку того, какие пиксели полностью освещены.
Затем, когда выполняется полное размытие с учетом глубины, первый шаг состоит в чтении
этот «ранний выходной» буфер: если текущий пиксель кажется полностью освещенным, пиксельный шейдер немедленно выводит 1 и пропускает все сложные вычисления размытия.
Planar Reflection Map
Я не буду вдаваться в подробности, так как отражения более подробно объясняются в Часть 2 и эффект едва заметен в этой сцене, но на этом шаге создается карта отражения для океана поверхность.
В основном сцена снова рисуется (за 650 вызовов отрисовки) в крошечную текстуру 240×120, но «вверх ногами», чтобы она выглядела как отражение на поверхности воды.
Затенение окружающего пространства экрана
Вычисляется линейная версия буфера глубины, а затем из нее создается карта SSAO. Генерируется первая зашумленная версия, затем за 2 последовательных прохода (по горизонтали и по вертикали) применяется размытие с учетом глубины, чтобы сгладить результат. Вся работа выполняется с половиной исходного разрешения для увеличения производительности. |
Карта SSAO (зашумленная) Карта SSAO (размытая) |
Комбинация G-буферов
Пришло время, наконец, объединить все эти сгенерированные буферы!
Пиксельный шейдер извлекает данные из разных буферов и вычисляет окончательное значение затенения пикселя в HDR.
В случае с ночной сценой, огни и их освещенность теперь также будут добавляться один за другим в верхней части сцены.
Рассеянный |
Обычный |
Зеркало + Тень |
Освещенность |
Глубина |
Трафарет |
ССАО |
Отражение |
Комбинация G-буферов
Все начинает обретать форму, хотя нам все еще не хватает океана, неба, прозрачных объектов…
Но обо всем по порядку: внешний вид Майкла нужно улучшить.
Подповерхностное рассеяние
SSS (До)
SSS (После)
Цвет кожи Майкла немного нарушен: на его лице есть очень темные участки, как будто его тело было сделано из толстого пластика, а не из плоти.
Поэтому выполняется проход SSS, имитирующий транспорт света в коже. Посмотрите на его уши или губы: после прохождения SSS свет теперь просачивается сквозь них, придавая красный оттенок, чего и следовало ожидать в реальном мире.
Как SSS применялся только к Майклу? Сначала извлекается только его силуэт. Это возможно благодаря сгенерированному ранее буферу трафарета:
все пиксели Майкла имеют значение 0x89
.
Итак, мы можем получить пиксели Майкла, отлично, но мы хотим применить SSS только к коже, а не к одежде.
На самом деле, когда все G-буферы были объединены, в дополнение к данным затенения, хранящимся в RGB, некоторые данные записывались и в альфа-канал.
Точнее, альфа-каналы карты освещенности и карты бликов использовались для создания бинарной маски: пиксели, принадлежащие коже Майкла и некоторым растениям, установлены в 1 в альфа-канале. Другие пиксели, такие как
у одежды альфа 0.
Таким образом, SSS можно применять, предоставляя в качестве входных данных просто объединенную цель G-буфера и буфер трафарета глубины.
Теперь вы можете подумать, что для небольшого локального улучшения требуется много вычислений. И вы были бы правы, но не забывайте, что, играя в игру, мы, люди, инстинктивно склонны много смотреть на лицо персонажа — любое улучшение рендеринга лица может стать большой победой для ощущения погружения. В игре SSS применяется как к вашему персонажу, так и к NPC.
Вода
В этой сцене не так много воды, но тем не менее у нас есть океан сзади, несколько бассейнов тут и там.
Рендеринг воды в GTA V обрабатывает как отражение, так и преломление.
Созданный ранее логарифмический Z-буфер используется для создания второй версии: на этот раз линейной, с половинным разрешением.
Океан и бассейны отрисовываются по одному, в режиме MRT с выводом сразу на несколько целей:
Рассеиватель воды |
Непрозрачность воды |
- Water Diffuse map : это собственный цвет воды.
- Карта непрозрачности воды : красный канал, кажется, хранит некоторое свойство непрозрачности воды (например, океан всегда 0,102, бассейны всегда 0,129).
Зеленый канал хранит информацию о том, насколько далеко пиксель от поверхности воды (глубокие пиксели имеют более непрозрачную воду с сильным вкладом диффузной карты, тогда как вода для мелких пикселей почти прозрачна).
Обратите внимание, что все пулы рендерятся безоговорочно, даже если они оказываются скрытыми за другим мешем в сцене, все они отображаются в красном канале. Однако для зеленого канала вычисляются только действительно видимые пиксели, единственные «водяные» пиксели, которые попадают в окончательное изображение.
Теперь мы можем объединить созданные нами предыдущие буферы и создать карту преломления:
Карта преломления воды
На этой карте преломления бассейны заполнены водой (чем глубже вода, тем голубее), также добавлены каустики.
Теперь мы можем перейти к окончательному рендерингу воды: снова все меши океана, поверхности бассейна рисуются один за другим, но на этот раз объединяя отражение
и преломление вместе с некоторыми картами бампа, чтобы нарушить нормали поверхности.
Плоское отражение |
Преломление |
Рельефные карты |
Вода (До)
Вода (После)
Атмосфера
Световой вал
Создается карта светового вала, также называемая «объемными тенями». атмосфера/туман, не освещаемый солнцем.
Карта создается с половинным разрешением путем трассировки лучей для каждого пикселя и сопоставления с картой теней от солнца.
После получения первого зашумленного результата буфер размывается.
Следующий шаг заключается в добавлении в нашу сцену эффекта тумана: он удобно скрывает отсутствие деталей низкополигональных зданий вдалеке.
Этот проход считывает карту светового вала (которая мало влияет на этот кадр) и буфер глубины для вывода информации о тумане.
Затем рендерится небо, а затем облака.
База
База + Туман
База + Туман + Небо
База + Туман + Небо + Облака
Купол неба
Небо фактически визуализируется в одном вызове отрисовки: используемая сетка представляет собой огромный купол охватывая всю сцену. (см. справа)
Этот шаг использует в качестве входных данных некоторые текстуры, похожие на шум Перлина.
Облака рендерятся аналогичным образом: большая сетка, на этот раз в форме кольца, рендерится на горизонте. Для рендеринга облаков используются одна карта нормалей и одна карта плотности: это большие текстуры 2048×512, которые также являются бесшовными (они зацикливаются слева и справа).
Плотность облаков |
Облако Обычное |
Прозрачные объекты
Этот шаг визуализирует все прозрачные объекты сцены: очки, лобовое стекло, частицы пыли, летающие вокруг…
Прозрачные объекты (до)
Прозрачные объекты (после)
Все это выполняется всего за 11 вызовов отрисовки, экземпляры интенсивно используются для частиц.
Дизеринг Сглаживание
Помните наше небольшое отступление о том, что некоторые деревья были дизерингованы на диффузной карте?
Пришло время исправить эти артефакты: эффект постобработки выполняется с помощью пиксельного шейдера, считывая исходный цветовой буфер и альфа-канал диффузной карты, чтобы знать, какие пиксели
были разбавлены. Для каждого пикселя можно взять до 2 соседних пикселей, чтобы определить окончательное «сглаженное» значение цвета.
Сглаживание (До)
Сглаживание (После)
Это хороший трюк, потому что всего за один проход изображение «исцеляется»: стоимость постоянна, она не зависит от количества
геометрии в сцене.
Обратите внимание, что этот фильтр не идеален: как на PS3, так и на ПК я заметил на экране некоторую шахматную доску, которую фильтр не улавливал в некоторых ситуациях.
Tone Mapping и Bloom
До сих пор наше изображение для рендеринга сохранялось в формате HDR: каждый из каналов RGB хранится как 16-битное число с плавающей запятой. Это позволяет иметь огромные вариации интенсивности света.
Но мониторы не могут отображать такой широкий диапазон значений, они выводят только цвета RGB с 8 битами на канал.
Tone Mapping состоит в преобразовании этих цветовых значений из пространства HDR в пространство LDR.
Существует несколько функций для сопоставления одного диапазона с другим.
Классический, который широко используется, это Reinhard , и именно его я использовал при создании всех предыдущих скриншотов.
это дает результаты, близкие к финальному рендеру игры.
Но действительно ли в GTA V используется Reinhard ? Пришло время снова изменить байт-код некоторого шейдера:
Сборка фрагмента шейдера — Тональное отображение 1 2 3 4 5 6 7 8 9 10 11 12 | // Предположим, что r0 — цвет HDR, r1.xyzw — (A, B, C, D), а r2.yz — (E, F) mul r3.xy, r1.wwww, r2.yzyy // (DE, DF) mul r0.w, r1.y, r1.z // ВС [...] div r1.w, r2.y, r2.z // E/F [...] mad r2.xyz, r1.xxxx, r0.xyzx, r0.wwww // Ax+BC mad r2.xyz, r0.xyzx, r2.xyzx, r3.xxxx // x(Ax+BC)+DE mad r3.xzw, r1.xxxx, r0.xxyz, r1.yyyy // Ax+B mad r0.xyz, r0.xyzx, r3.xzwx, r3.yyyy // x(Ax+B)+ DF div r0.xyz, r2.xyzx, r0.xyzx // (x(Ax+BC)+DE) / (x(Ax+B)+DF) добавить r0.xyz, -r1.wwww, r0.xyzx // (x(Ax+BC)+DE) / (x(Ax+B)+DF) - (E/F) |
Ну-ну-ну… что у нас тут?
(x(Ax+BC)+DE) / (x(Ax+B)+DF) - (E/F)
— это типичное уравнение оператора тональной компрессии, которое Джон Хейбл использовал в 2009 году в Naughty Dog.
Это метод кинематографического тонального отображения, разработанный Хаармом-Питером Дукером в 2006 году, когда он работал в EA.
Оказывается, в GTA V используется не Reinhard , а оператор Uncharted 2 , который не так сильно обесцвечивает черные области.
Процесс преобразования в LDR выглядит следующим образом:
- буфер HDR уменьшен до 1/4 разрешения.
- вычислительный шейдер используется для вычисления средней яркости буфера, выводя результат в текстуру 1×1.
- рассчитывается новая экспозиция, она определяет, насколько яркой/темной выглядит сцена.
-
Яркий буфер
светофильтр используется для извлечения только тех пикселей, яркость которых выше определенного порога (определяемого по экспозиции).
В этой сцене только несколько пикселей выдерживают фильтр: некоторые пятна автомобиля, которые имеют сильное отраженное свечение. -
Bloom
буфер яркости многократно уменьшается и размывается вверх до 1/16 исходного размера, а затем несколько раз масштабируется снова, пока не достигнет половины исходного размера. - Блум добавляется к исходным пикселям HDR, а затем оператор тональной карты Uncharted 2 преобразует цвет в LDR, одновременно применяя гамма-коррекцию, оставив линейное пространство для пространства sRGB.
Конечный результат во многом зависит от экспозиции. Вот несколько примеров, иллюстрирующих влияние этого параметра:
Низкая экспозиция |
Среднее воздействие |
Высокая экспозиция |
Экспозиция на самом деле медленно изменяется кадр за кадром, резких изменений не бывает.
Это предназначено для имитации поведения человеческого глаза: вы замечали, что после вождения в темном туннеле и внезапного выхода на солнечный свет все вокруг выглядит слишком ярким в течение нескольких кадров?
Затем он постепенно возвращается от «слепого» к «нормальному», в то время как экспозиция настраивается на новое значение.
Похоже, в GTA V даже переходы «Темный → Яркий» адаптируются быстрее, чем переходы «Яркий → Темный», точно так же, как вел бы себя человеческий глаз.
Сглаживание и дисторсия объектива
Если используется метод сглаживания FXAA, теперь он выполняется для сглаживания зубчатых краев мешей.
Затем, чтобы имитировать реальную камеру, к изображению применяется искажение объектива с помощью небольшого пиксельного шейдера. Он не только искажает изображение, но и вносит небольшие хроматические аберрации.
по краям кадра, слегка искажая красный канал по сравнению с зеленым и синим.
Искажение объектива (до)
Искажение объектива (после)
Пользовательский интерфейс
Последний штрих: пользовательский интерфейс, который здесь представляет собой мини-карту в нижнем левом углу экрана. Карта фактически разделена на несколько квадратных тайлов, движок рисует только тот набор тайлов, который потенциально появляется на экране. Каждая плитка рисуется через один вызов отрисовки. Я раскрасил плитки, чтобы вы могли лучше видеть структуру:
Мини-карта
Тест ножниц включен, чтобы разрешить рендеринг только в нижнем левом углу и отбросить все за его пределами.