Что такое однопоточный рендеринг в контракт варс

Что такое однопоточный рендеринг в контракт варс

Deus Ex Human Revolution — это компьютерная игра 2011 года, которая является более успешным продолжением оригинальной Deus Ex, чем Invisible War. Но этот пост не о качестве игры, а о демонстрации её технических принципов. Адриан Курреж провёл несколько часов за реверс-инжинирингом, пытаясь понять с помощью инструмента Renderdoc, как происходит обработка каждого из кадров Human Revolution. Затем Адриан изложил результаты в своём блоге.

Игра построена на основе модифицированного проприетарного движка Crystal от компании Crystal Dynamics. Human Revolution была одной из первых игр, которая использовала 11 версию DirectX. На момент выхода уровень графики был на отличном уровне, похождения Адама Дженсена по вентиляционным каналам неплохо смотрятся и сейчас. При этом игра была не слишком требовательной к аппаратной составляющей компьютера.

Для рассмотрения Адриан выбрал этот кадр. Так его видит игрок.

На первый взгляд может показаться, что Human Revolution использует технику рендеринга Forward+. Но популяризация этого метода случилась куда позже выхода игры, и «Человеческая революция» обходится схемой Light Pre-Pass.

Всё начинается с построения карты нормалей и карты глубины. Движок рендерит все объекты, пропуская прозрачные. В зависимости от сетки, каждый из треугольников либо будет представлен как плоская поверхность, либо будет использовать собственную карту нормалей. К примеру, здесь у статуи в виде руки есть своя карта нормалей.


Карта нормалей, готово 10 %


Карта нормалей, готово 40 %


Карта нормалей, готово 70 %

Карта нормалей, готово 100 %

Одновременно происходит рендеринг карты глубин. Всего для производства обеих компонент потребовалось 166 вызовов отрисовки.

Тени генерируются с помощью Parallel-Split Shadow Maps. Каждая из теней рендерится единожды для каждого из источников света, которые могут при взаимодействии с объектами создавать тень. В данной сцене таких источников два: один в офисе справа, другой на вершине скульптуры-руки. Каждая из карт теней представляет из себя квадрат 1024×1024 внутри текстуры 4096×3072.

Мелкие объекты пропускаются, возможно, часть невидимых для источника света не учитывается, поэтому этот проход требует всего 52 вызова отрисовки. Карты теней и карта глубин собираются для создания текстуры маски теней. Читается каждый тексель из карты глубин, и его видимость считается для каждого из источников света. Конечный результат выдаётся в 8-битной текстуре RGBA, которая работает как маска. Значение по умолчанию — белый цвет (1, 1, 1, 1), которое означает, что тексель ничем не затемнён. Если тексель попадает в тень какого-либо источника света, то отвечающий за него байт приравнивается нулю. Так можно обрабатывать 4 источника света.

Конечно, использовать байт для хранения только единицы и нуля слишком затратно, поэтому во время этого прохода также выполняется percentage close filtering (PCF), и в этих байтах хранится значение между 0 и 1, а не только крайние значения. Это нужно, чтобы края теней имели плавные переходы.

По буферу глубины создаётся карта преграждения окружающего света в экранном пространстве (Screen Space Ambient Occlusion, SSAO). Если видеоускоритель поддерживает DirectX 11, то шейдером создаётся размытие с ядром 19×19. На старых карточках это делается пиксельным шейдером.


SSAO, первый проход


Конечный результат с размытием

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

Каждый из точечных источников света обрабатывается по одному. Используется только карта нормалей с SSAO и буфер глубины. Эффект на пиксели зависит только от радиуса света и интенсивности. На этой стадии отражение света различными материалами пока неважно, карта освещения показывает, сколько и какого цвета потенциально отражается. Реальные отражения будут посчитаны позже на основе характеристик материалов. В конкретно этой сцене 45 точечных источников света.


Готово 10 %


Готово 40 %


Готово 70 %


Готово 100 %

Наконец происходит «реальный» рендеринг, в котором выводится сетка каждого объекта. Цвет каждого пикселя определяется картой нормалей и данными SSAO, масками теней и картами теней, картой освещения, текстурами объектов и свойствами материалов, иногда также используется карта для улучшения отражений. Сначала рендерятся непрозрачные объекты. При рендере используются данные буфера глубины, полученные при составлении карты нормалей.


Готово 10 %


Готово 40 %


Готово 70 %


Готово 100 %

Затем добавляются декали (таблички на стенах, следы от пуль), прозрачные объекты (стекла в окнах) и искусственные объёмные эффекты освещения.


Добавлены прозрачные объекты и декали


Добавлены эффекты освещения

Эффекты освещения являются группой спрайтов, которые отрендерены в 3D. Это не просто плоские объекты, постоянно обращённые к камере, это двадцатигранники специального масштаба. Свечение обсчитывается полностью процедурно.

Рендер непрозрачных и прозрачных объектов был выполнен с помощью 253 вызовов отрисовки.

Для добавления эффекта засвечивания bloom нужно знать, какие области очень яркие. Human Revolution использует LDR, буфера HDR нет. При предыдущем проходе в альфа-канал передавались данные по интенсивности.

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

Важной составляющей является сглаживание, иначе изображение будет выглядеть плохо из-за «лесенок» границ. Human Revolution поддерживает множество методов: DLAA, MLAA, FXAA и так далее. В примере Адриана используется FXAA.


Без сглаживания


Результат применения FXAA

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


До коррекции цвета


После коррекции цвета

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

Читайте также:  N power pro vision

Вот соотношение времени, которое требуется для выполнения каждого из шагов.

Но есть и другие интересные детали. В катсценах и диалогах используется эффект глубины резкости (Depth of Field, DoF), когда элементы не в фокусе размыты.


Изображение оригинальной сцены уменьшается в два раза


Горизонтальное размытие


Вертикальное размытие


Карта глубин


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

В Human Revolution неплохой эффект силуэта. Это подсветка интерактивных элементов игрового пространства, в конкретном случае золотой обводкой выделяется один объект, с которым игрок может взаимодействовать. В некоторых играх этот эффект реализован примитивно, к примеру, силуэт может отрисовываться уже после рендера всей сцены. Но в Human Revolution силуэт рисуется таким образом, что любой посторонний объект перед подсвечиваемым тоже обводится. В примере, который привёл Адриан, жёлтая линия описывает не только форму мусорного контейнера, но и проходит по фигуре полицейского.

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

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


Силуэт: до


Силуэт: после

В War Thunder мы всегда уделяли особое внимание визуальной составляющей. Уже сейчас можно видеть, что все модели техники и предметы окружения состоят из различных материалов и совершенно по-разному выглядят. Вот — P-51D-5, его красивая неокрашенная алюминиевая обшивка ярко сверкает в солнечном свете. Вот — ГАЗ ММ с 25-мм зенитной пушкой, слабо поблёскивающий на свету своей зелёной краской. А вот — деревянная коробка, прикреплённая к левому борту Pz.IVG.

Совсем скоро мы введём в игру новую графическую технологию, которая позволит сделать картинку в игре War Thunder красивее и реалистичнее. Встречайте: Physically Based Rendering — физически корректный рендеринг изображения.

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

Внимание! Это относительно серьезная статья, рекомендуется к прочтению только интересующимся технологиями в области современной компьютерной визуализации.

PBR Physically Based Rendering

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

Однако, можно представить какое количество материалов и отражаемого ими света ежесекундно присутствует на ваших мониторах в боях War Thunder.

Рассчитывать освещение с таким уровнем детализации не под силу даже офлайн-рендерам для кино, и оно слишком сложное в настройке (Как выглядят привычные предметы под электронным микроскопом). Именно поэтому используются необходимые статистические параметры материалов, такие как “шершавость” (roughness), коэффициент преломления, “металличность” (статическое содержание диэлектрика/проводника в пикселе). Это позволяет уже на этапе создания моделей и соответствующих им материалам оперировать физическими значениями этих материалов, учитывая сочетания необходимых параметров, без последующей корректировки в условиях готовой сцены.

Bi-directional Reflection Distribution Function

Двулучевая функция отражательной способности (ДФОС, англ. Bidirectional reflectance distribution function — BRDF) — четырёхмерная функция, определяющая, как свет отражается от непрозрачной поверхности, позволяет рассчитать количество энергии, отражаемой или рассеиваемой в сторону наблюдателя при заданном входящем излучении. Логично, что металлические, тканевые или деревянные поверхности в игре в разной степени влияют на освещение — рассеивание, преломление и отражение света.

Для подобного расчёта используется математическая модель Microfacet Theory, которая представляет поверхность в виде множества микрограней, ориентированных в разные стороны. При этом каждая из микрограней отражает свет под равным углом. Для того чтобы рассчитать освещение в конкретной точке, нам нужно рассчитать сумму вклада отражённого микрогранями света.

Примечание: Функция отраженного света Кука-Торренса. l — направление света v — направление взгляда наблюдателя n — нормаль к поверхности h — вектор между векторами l и v (half vector) D(h) — функция распределения микро граней F(v,h) — функция Френеля, G(l, v, h) — функция затенения микро граней. Все параметры данной функции достаточно простые и имеют физический смысл. Но какой физический смысл имеет half-vector? Half-vector нужен, чтобы отфильтровать те микрограни, которые вносят свой вклад в отражение света для наблюдателя. Если нормаль микрограни равна half-vector, значит данная микрогрань вносит вклад в освещение при направлении взгляда V.

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

Читайте также:  Лучшие светодиодные лампы для дома рейтинг 2018

В построении финального изображения участвуют несколько ключевых функций. О некоторых из них ниже:

Распределения отражений микрограней D(h) позволяет задать процент энергии, для которого происходит отражение света и распределение энергии в зависимости от того, насколько гладкая или шероховатая поверхность. В War Thunder используется так называемая модель GGX (Microfacet Models for Refraction through Rough Surfaces)

Распределения самозатенения микрограней G(l,v,h) определяет, насколько (при пологих углах отражения), поверхность затеняет сама себя. В игре используется функция самозатенения Смита адаптированная для модели GGX (Eric Heitz. “Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs".

Функция Френеля F(v,h) определяет интенсивность отраженной и преломленной электромагнитной волны при прохождении через границу двух сред. Этот эффект очень заметен на воде, если смотреть на поверхность воды под острым углом, то вода отражает большинство света и мы видим отражение. Если же смотреть на воду сверху-вниз, то отражения мы практически не видим, а видим то, что находится на дне.

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

Благодаря этой функции отражение света меняется в зависимости от угла падения для различных материалов с различном коэффициентом преломления (функция Френеля на самом деле комплексная, и для металлов обладает ещё и мнимой частью, и результат различен для различных длин волн. Поэтому металлы имеют цветной блик). Это особенно заметно на просторных танковых локациях, где практически не осталось тёмных участков — свет везде имеет реалистичную и разнообразную структуру — “в тени” на самом деле всегда тоже есть блики, это отражение света от неба, и других поверхностей. Действительно “темным объектом” бывает лишь щель, отверстие или трещина — ведь попавший туда свет не отражается. В игре для апроксимации функции Френеля используется давно зарекомендовавшая себя в кино и играх “апроксимация Шлика”.

Рассеивание света

Кроме отражения, свет на диэлектриках ещё и рассеивается.

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

Что нового эта технология привнесёт в War Thunder?

Технология Physically Based Rendering учитывает особенности каждого материала и с помощью математических формул, в которых указываются свойства рельефа его поверхности, высчитывает и отображает правильное поведение света, который столкнулся с объектом. Таким образом, самолёты и танки стали выглядеть более естественно и вариативно, особенно в разное время суток и при смене погоды. Металлические потёртые фюзеляжи самолётов отражают свет играя бликами в манёврах. На высоких настройках графики, каждая, даже самая мелкая деталь в навесном оборудовании танка теперь не однородно скрыта в тени, а отражает свет от расположенных рядом объектов.

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

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

Что такое рендеринг? (для программистов)

Итак, Википедия дает такое определение: Ре́ндеринг (англ. rendering — «визуализация») — термин в компьютерной графике, обозначающий процесс получения изображения по модели с помощью компьютерной программы.

Довольно неплохое определение, продолжим с ним. Рендеринг — это визуализация. В компьютерной графике и 3д-художники и программисты под рендерингом понимают создание плоской картинки — цифрового растрового изображения из 3д сцены.
То есть, неформальный ответ на наш вопрос «Что такое рендеринг?» — это получение 2д картинки (на экране или в файле не важно). А компьютерная программа, производящая рендеринг, называется рендером (англ. render) или рендерером (англ. renderer).

Рендер

В свою очередь словом «рендер» называют чаще всего результат рендеринга. Но иногда и процесс называют так же (просто в английском глагол — render перенесся в русский, он короче и удобнее). Вы, наверняка, встречали различные картинки в интернете, с подписью «Угадай рендер или фото?». Имеется ввиду это 3D-визуализация или реальная фотография (уж настолько компьютерная графика продвинулась, что порой и не разберешься).

Виды рендеринга

В зависимости от возможности сделать вычисления параллельными существуют:

  • многопоточный рендеринг — вычисления выполняются параллельно в несколько потоков, на нескольких ядрах процессора,
  • однопоточный рендеринг — в этом случае вычисления выполняются в одном потоке синхронно.

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

Читайте также:  Драйвер 3d sound звуковая карта

В чем суть методов? Как работает растеризация и трасировка лучей? Начнем с растеризация.

Растеризация полигональной модели

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

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

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

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

Сложная модель персонажа состоит из мельчайших треугольников и растеризатор генерирует из неё вполне достоверную картинку. Почему тогда заморачиваться с трассировкой лучей? Почему не растеризовать и все? А смысл вот в чем, растеризатор знает только своё рутинное дело, треугольники — в пиксели. Он ничего не знает об объектах рядом с треугольником.

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

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

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

Трасировка лучей (англ. ray tracing)

Помните о корпускулярно волновом дуализме? Напомню в чем суть: свет ведёт себя и как волны и как поток частиц — фотонов. Так вот трассировка (от англ «trace» прослеживать путь), это симуляция лучей света, грубо говоря. Но трассирование каждого луча света в сцене непрактично и занимает неприемлемо долгое время.

Мы ограничимся относительно малым количеством, и будем трассировать лучи по нужным нам направлениям.
А какие направления нам нужны? Нам надо определять какие цвета будут иметь пиксели в результирующей картинке. Тоесть количество лучей мы знаем, оно равно количеству пикселей в изображении.

Что с направлением? Все просто, мы будем трассировать лучи в соответствии с точкой наблюдения (то как наша виртуальная камера направлена). Луч встретится в какой-то точке с объектом сцены (если не встретится, значит там темный пиксель или пиксель неба из скайбокса, например).

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

Рендеринг для художников

Но рендеринг это не только программная визуализация! Хитрые художники тоже используют его. Так что такое рендеринг с точки зрения художника? Примерно то же самое, что и для программистов, только концепт-художники выполняют его сами. Руками. Точно так же как рендерер в видео-игре или V-ray в Maya художники учитывают освещение, подповерхностное рассеивание, туман и др. факторы, влияющие на конечный цвет поверхности.

К примеру картинка выше, поэтапно прорабатывается таким образом: Грубый скетч — Лайн — Цвет — Объем — Рендер материалов.

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

Растеризация векторной графики

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

Читайте дальше

Статьи из рубрики «Ликбез для начинающих разработчиков игр«, скорее всего окажутся очень для Вас полезными, позвольте-с отрекомендовать:

  • Что такое шейдеры? — простое объяснение сложных и страшных шейдеров
  • Партиклы — система частиц — Полезный обзор частиц и подборка видео-уроков, по созданию спецэффектов в Unity3d

Послесловие

В этой статье, я надеюсь, вы осили столько букв, вы получили представление о том, что такое рендеринг, какие виды рендеринга существуют. Если какие-то вопросы остались — смело задавайте их в комментариях, я обязательно отвечу. Буду благодарен за уточнения и указания на какие-то неточности и ошибки.

Дорогой друг! Тебе есть что сказать? Понравился пост? Не стесняйся! Оставь комментарий, нам очень важно ТВОЕ мнение

Ссылка на основную публикацию
Характеристики процессора интел пентиум 4
Количество ядер - 1. Благодаря технологии Hyper-Threading, количество потоков 2, что вдвое больше числа физических ядер и увеличивает производительность многопоточных...
Сканер ricoh sp 220snw
Компания Ricoh — далеко не новичок на рынке печатающих устройств. Это глобальная корпорация со штаб-квартирой в Токио и представительствами во...
Сколько дают на ютубе за 1000 просмотров
Многих пользователей YouTube, а также начинающих видеоблогеров справедливо интересует вопрос: «А сколько YouTube платит за тысячу или миллион просмотров?» Если...
Хлебопечка мулинекс ow1101 инструкция и рецепты
Инструкция MOULINEX OW 1101 на русском языке в формате pdf для устройства: хлебопечь. Прочитайте инструкцию для ознакомления с функциями и...
Adblock detector