Разное

Рендерится это: Что такое рендеринг? И что такое рендер? Словарь разработчиков компьютерных игр!

Содержание

Что такое рендеринг? И что такое рендер? Словарь разработчиков компьютерных игр!

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

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

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

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

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

Рендер

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Послесловие

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

Rendering: Теория

«Частотный словарь», выданный Google:

3D — 333 000 000, render — 59 100 000, rendering — 43 200 000, modeling — 88 100 000, computer graphics — 274 000 000, computer animation — 83 700 000.

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

Render в переводе с английского означает «визуализировать, формировать изображение». Что же «визуализируется» в процессе рендеринга? А «визуализируется» та самая модель, которая получается в результате моделирования (а что еще, как не модель, могло получиться при моделировании? — да все, что угодно, «умельцы» получать «не совсем то» или «совсем не то» встречаются не так уж редко ;)). Описание модели представляется или в виде инструкций на каком-нибудь языке, специально для этого предназначенном, или в виде структур данных вроде массивов, всевозможных списков и т. д. Само описание содержит геометрические данные в виде трехмерных координат точек модели, а также параметры всевозможных «трансформаций» (перемещение, масштабирование, поворот, сдвиг), координаты и параметры «виртуальной» камеры, через которую мы «созерцаем» трехмерную сцену, координаты и параметры источников света, свойства поверхностей объектов (цвет, материал, текстуры и т.п.). Используя эти данные, специальная программа («фамилия» которой, естественно, RENDER, а «имя» может быть совершенно любым — вы не поверите, но «семейка» RENDER насчитывает более полутысячи «членов»! Этот сайт, скорее всего, просто однофамилец :)) производит «визуализацию» трехмерной модели в виде «двухмерного» изображения, например, на экране компьютера. Исследованием того, КАК она это делает, мы сейчас и займемся. Поскольку рендеринг — это некий «симбиоз» всевозможных «методик» из разных наук и дисциплин (физика света, математика, вычислительная геометрия, физиология и «психология» зрения, программирование и др. , а также изрядная доля магии, позволяющая практически из ничего, из каких-то там «абстракций» создавать нечто, вызывающее в нас порой целую бурю эмоций), то знание этих «методик» имеет как теоретическую (в плане расширения наших познаний об окружающем мире), так и вполне практическую (рендеринг у всех «компьютерных графиков» занимает бОльшую часть «рабочего времени») ценность.

Теоретические основы современного рендеринга заложены более 300 лет назад (а вы думали, что все придумано «на днях»?) Исааком Ньютоном (Isaac Newton), предложившем корпускулярную теорию света и обосновавшему с помощью этой теории такие ключевые для рендеринга явления, как отражение (reflection), преломление (refraction), рассеяние (diffusion, dispersion, scattering). Другим «краеугольным камнем» в рендеринге является закон сохранения энергии (в данном случае энергии света). По сути дела рендеринг — это попытка решения (с разной степенью точности) некоего уравнения, описывающего распространение света в трехмерной сцене, причем уравнение это учитывает только корпускулярные свойства света. Уравнение так и называется — уравнение рендеринга. В математическом представлении оно выглядит так:

где Lo — свет, излучаемый поверхностью в точке x в направлении вектора w, Le обственные «излучательные способности» поверхности в той же точке и в том же направлении, а выражение под знаком интеграла — это бесконечная сумма излучений, пришедших в точку поверхности из пространственной полусферы и отраженных поверхностью в соответствии с ее «отражательной способностью», описываемой с помощью функции fr — функция эта настолько важна, что получила в теории рендеринга собственное название — bidirectional reflectance distribution function (BRDF), что в вольном переводе означает «двунаправленная функция распределения отражений». BRDF описывает отражательные оптические свойства поверхности, но будучи математической абстракцией не имеет «физических» измерений, так что для практического применения приходится использовать упрощенные математические модели вроде отражательной модели Фонга (не путать с затенением методом Фонга) или отражательной модели Фонга-Блинна. В «словесной» интерпретации уравнение рендеринга выглядит так: освещенность в точке поверхности складывается из энергии лучей, пришедших напрямую от источников света (direct illumination), и энергии лучей от тех же источников, но претерпевших отражения (в общем случае — бесконечное число отражений) от других поверхностей в трехмерной сцене (indirect illumination). Плюс, конечно, собственные свойства поверхности, как источника света — в 3D-программах (и, соответственно, их рендерах) «последнего поколения» источником света может быть не только «специальный» объект (как правило, или совсем не имеющий, или имеющий очень простую «геометрию»), но вообще ЛЮБОЙ объект в сцене (можно только представить, какой «напряг» на процессор оказывает «реалистичный» рендеринг сцен с такими источниками света).

Но вычисление цвета пиксела двухмерного изображения на экране — самая последняя «стадия» рендеринга (хотя при «реалистичном» рендеринге — самая трудоемкая), что же происходит с описанием трехмерной модели до этого? А происходит следующее: данные из описания модели проходят по своеобразному «конвейеру» или «каналу» (который так и называется — graphics pipeline), подвергаясь зачастую довольно изощренной «обработке».

 

[ Этапы «обработки» могут выполняться как центральным процессором компьютера (CPU), так и специализированными процессорами графических карт или специальных «ускорителей» (GPU, DSP и т.п. — стишок :)!). Зачастую «вклад», вносимый в рендеринг процессором видеокарты, настолько ничтожен, что у большинства «пользователей» складывается впечатление, что видеокарта вообще не участвует в рендеринге. Это, конечно же, не так: рендеринг настолько требовательный к ресурсам компьютера процесс, что игнорировать «вычислительные» возможности современных видеокарт просто неразумно и этого не может себе позволить ни один разработчик программ рендеринга. Другое дело, что видеокарты, «ориентированные» в основном на игровые приложения, с «геометрическими», например, вычислениями справляются гораздо хуже, чем CPU, но все совсем по-другому с «профессиональными» видеокартами с аппаратным OpenGL-ускорением. Правда, и цена таких «решений» очень высока, гораздо эффективней »экстенсивный» путь — простое увеличение задействованных при рендеринге CPU путем использования «многоядерных» процессоров или сетевого рендеринга, а еще лучше того и другого вместе. ]

 

Типичный graphics pipeline практически не отличается в realtime и в не-realtime рендеринге и включает в себя следующие «стадии»:

преобразования в «мировой» системе координат, учитывающие такие «трансформации» объектов, как перемещение, вращение, масштабирование, сдвиг;

преобразования в координатном простанстве «виртуальной» камеры (в пространстве «наблюдателя трехмерной сцены»), которые переводят «мировые» координаты объектов в координаты «поля зрения» наблюдателя;

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

Математический аппарат первых трех «стадий» основан на матричных преобразованиях — именно матрицы (возможно, «младшие братья и сестры» той самой The MATRIX — кто знает?) размерностью 4х4 и выполняют все эти фокусы с трехмерными координатами точек объектов, переводя их в двухмерные координаты пикселов будущего «отрендеренного» изображения.

Матрица, «ответсттвенная» за перемещение объекта на расстояние x, y, z вдоль соответствующих координатных осей:

 

А эти матрицы выполняют вращение объекта на соответствующий угол вокруг осей x, y, z:

 

Для полноты картины надо добавить еще матрицу масштабирования вдоль осей x, y, z. Вот она:

 

Чтобы не возиться с каждым преобразованием по отдельности, матрицы перемножают согласно правилам матричной алгебры и в результате получают матрицу «мировых» преобразований:

Не пугайтесь ее «грозного» вида — это пока только теория, на практике все выглядит гораздо проще.

 

Подобные матрицы существуют и для преобразований в координатном пространстве камеры (наблюдателя) и для перспективных преобразований. Не будем себе забивать голову, а сразу приведем «результирующее» преобразование точки с координатами x, y, z в трехмерном виртуальном пространстве сцены в пиксел с координатами x’, y’, z’, w’ (координата w’ используется для придания координатной системе «однородности» с размерностью матриц, а координата z’ используется для построения «карты глубины» (или Z-буфера), которая понадобится на следующих стадиях рендеринга):

 

На практике, конечно, все эти формулы с синусами-косинусами преобразуют к более удобному для вычислений виду, например, такому:

 

Таким образом, после первых трех стадий (которые на практике объединяются в одну) рендеринга в дополнение к описанию модели получается «черновик» (в прямом смысле, потому как цвет вычисленных пикселов еще не определен) будущего «отрендеренного образа» и карта глубины. Теперь самое время заняться решением проблемы видимости (или удалением невидимых поверхностей), которая заключается в следующем: объекты располагаются в виртуальном пространстве сцены на разном удалении от «наблюдателя» (виртуальной камеры), поэтому одни объекты могут полностью или частично «заслонять» другие от «наблюдателя» (или, говоря языком вычислительной геометрии, две точки в пространстве называются видимыми друг для друга, если соединяющий их отрезок прямой не встречает никаких «препятствий»).Алгоритмы удаления невидимых поверхностей (hidden surface removal — HSR) можно разделить на «работающие» в координатном пространстве «наблюдателя» (в этом случае точность алгоримов ограничена разрешением получаемой «картинки») и на «работающие» в виртуальном пространстве трехмерной сцены (в этом случае получается геометрически точное описание видимых примитивов, не зависящее от разрешения конечной «картинки» и именно эти методы используются при рендеринге сцен с высоким уровнем реалистичности и детализации). К первой группе методов относятся painter’s algorithm, scanline method и z-buffering, ко второй — метод трассировки лучей (ray tracing). Все методы имеют достоинства и недостатки: главные недостатки painter’s algorithm и scanline — низкая точность и ошибки в некоторых «специфических» случаях, самый большой недостаток ray tracing — вычислительная «трудоемкость», z-buffering располагается где-то между ними, имея достаточно высокую скорость работы и программируемую точность, зависящую от разрядности z-буфера, поэтому z-buffering получил самое большое распространение среди методов HSR.

 

[ Матричные преобразования и методы HSR, работающие в координатном пространстве «наблюдателя», с вычислительной точки зрения довольно тривиальны и с успехом выполняются GPU современных видеокарт, освобождая CPU для решения более сложных задач рендеринга. ]

 

Наконец все предварительные стадии завершены и настал черед самой «трудоемкой» с вычислительной точки зрения стадии рендеринга — определение цвета пикселов «отрендеренного» изображения. Точное решение уравнения рендеринга (прослеживание распространения ВСЕХ лучей света в трехмерной сцене) практически невозможно (или нецелесообразно, так как потребует бесконечного времени), все существующие методы — приближение с той или иной погрешностью к точному решению. В современных рендерах используются (порознь или в комбинациях друг с другом) четыре основных метода: rasterization (и его разновидность — scanline rendering), ray casting, radiosity и ray tracing. А что же Global Illumination, спросите вы, с ней-то как? Дело в том, что Global Illumination — это обобщенное название алгоритмов решения уравнения рендеринга, учитывающих как прямое излучение источников света (direct illumination), так и отраженное другими поверхностями в сцене (indirect illumination) (в некоторых рендерах Global Illumination — синоним метода radiosity). Для расчета глобальной освещенности кроме основных методов используют и «вспомогательные», как то: beam tracing, cone tracing, path tracing, metropolis light transport, ambient occlusion, photon mapping и некоторые другие. Процесс изобретения методов решения уравнения рендеринга далеко не закончен, каждый год добавляется что-то новенькое (а «старенькое» отмирает), но уже достигнутой сейчас точности решения уравнения рендеринга (помноженной на все возрастающую мощность компьютеров) вполне достаточно для получения высокореалистичных «отрендеренных» изображений за «приемлемое» время.

 

Растеризация (rasterization) в общем случае — процесс преобразования векторного описания объекта (той же трехмерной модели или, к примеру,»плоского» набора кривых, описывающих форму буквы алфавита) в набор пикселов (растр). Трехмерная модель состоит из множества треугольников, положение и форма треугольника в виртуальном пространстве задается трехмерными координатами его вершин. При рендеринге используют две «разновидности» растеризации. Первая «разновидность» учитывает тот факт, что треугольник — плоская фигура (все точки треугольника лежат в одной плоскости, а проекция треугольника на любую плоскость — тоже треугольник), поэтому нет никакой нужды «обсчитывать» все точки треугольника, достаточно выполнить преобразования над его вершинами, а все «промежуточные» точки вычисляются методами интерполяции. Scanline rendering (этот метод попутно еще удаляет невидимые поверхности) создает «отрендеренное» изображение построчно, для чего все примитивы в сцене сортируются в соответствии со значениями координат X и Y. «Сканирующая строка» перемещается сверху вниз, по дороге определяя, какие примитивы она пересекает (для повышения эффективности этого процесса примитивы и сортируют). Ежели пересечений не обнаруживается, то в качестве цвета соответствующего пиксела берется цвет фона, в противном случае пиксел будет окрашен в цвет примитива. «Оттенок» (shade) цвета пиксела может «уточняться» с использованием разнообразных методов, вроде метода «затенения» Гуро (Gouraud shading) или Фонга (Phong shading).

 

Ray casting (метод «бросания» луча) используется в realtime-рендеринге (например, в компьютерных играх), где скорость «создания картинок» важнее их «качества». Суть метода в следующем: из «точки наблюдения» в направлении пиксела, цвет которого определяется, «выстреливается» воображаемый луч. Если луч пересекает какой-нибудь примитив, то этот примитив «окрашивает» соответствующий пиксел в свой цвет. Существуют вариации метода, когда «бросаются» дополнительные лучи от примитива в «точку наблюдения» или от источника света в сторону примитива (для вычисления освещенности и теней). Для вычисления освещенности примитива могут использоваться и данные, полученные методом radiosity.

 

Radiosity (или метод излучения) часто называют Global Illumination, хотя, сторого говоря, radiosity всего лишь один из алгоритмов вычисления этой самой «глобальной освещенности», который используется, как правило, в сочетании с другими алгоритмами. Методом radiosity пытаются моделировать путь отраженного от поверхности света, который в реальности отражается не в одном направлении («угол отражения равен углу падения»), а рассеивается (diffusion) в простанственную полусферу, «освещая» целую область вокруг точки падения, при этом цвет рассеянного света изменяется в соответствии с цветом поверхности в точке падения луча. Сложность и точность метода radiosity варьируется в очень широких пределах. В realtime-рендеринге и при рендеринге outdoor-сцен глобальную освещенность имитируют с помощью нехитрого трюка, слегка «освещая» всю сцену воображаемым источником света, называемым ambiance (окружающая среда). А вот в сочетании с методом трассировки лучей (ray tracing) radiosity позволяет получить очень реалистичные изображения, особенно при рендеринге indoor-сцен, правда, ценой увеличения во много раз времени рендеринга :(. Впрочем, многие 3D-программы позволяют «вручную» дать «указания» рендеру, какие объекты будут участвовать в рассчете глобальной освещенности, а какие нет, при этом можно получить очень хороший (в смысле реалистичности) результат гораздо быстрей.

[ Различных способов имитировать глобальную освещенность придумано довольно много, некоторые дают весьма неплохой результат, но резкое увеличение производительности процессоров (за счет «многоядерности» прирост получается не 5-10-20%, а буквально В РАЗЫ) при весьма умеренном их удорожании делает использование «окольных путей» для высокореалистичного рендеринга нецелесообразным — «сравнительно честные» способы решения уравнения рендеринга («абсолютно честных» способов не существует) дают более точный результат при тех же временнЫх затратах, что и у «нечестных способов». ]

Математическим аппаратом расчета глобальной освещенности методом radiosity является метод конечных элементов. Если говорить популярно, то при решении уравнения рендеринга методом radiosity в расчет принимаются только те лучи, которые будучи испущены источником света и диффузно отразившись некоторое количество раз (или ни разу) от поверхностей в сцене, попадают в глаз «наблюдателя» (объектив «виртуальной» камеры). Поэтому правильнее говорить, что метод radiosity дает не «общее», а «частное» решение уравнения рендеринга, этот метод не «просчитывает», например, зеркальные отражения (specular), преломления лучей, «жесткие» (hard) тени, его «конек» — исключительно диффузные отражения.

Как же «функционирует» алгоритм radiosity? Если выражаться корректно, то алгоритм «оперирует» не лучами, а световой энергией, «циркулирующей» в трехмерной сцене. В общем случае трехмерная сцена состоит их бесконечного множества точек, «обменивающихся» световой энергией. Проследить все эти «взаимодействия» не представляется возможным, поэтому бесконечное множество точек заменяют на конечное число «участков» (patches) поверхностей, образующих трехмерную сцену. Способов «разбиения» на участки довольно много, но универсального, пригодного «на все случаи жизни», пока не изобрели. Алгоритм radiosity многопроходный, на каждом проходе для каждого «участка» вычисляется световая энергия, пришедшая к нему от других участков. Часть этой энергии поглощается участком, остальное «отражается» обратно в сцену и учитывается при следующем проходе. В математическом виде это выглядит так:

Bi — это энергия, излучаемая i-тым участком, Ei — собственные «излучательные способности» участка, Ri — «отражательные способности», n — количество участков в сцене (в разных реализациях метода может изменяться «по ходу дела»). Самая интересная часть в этом достаточно тривиальном уравнении — Fij, называется она «коэффициентом формы» (form factor), и учитывает взаимное расположение в пространстве двух участков. Способов вычисления коэффициента формы тоже достаточно много, но наибольшее распространение получили способы, использующие проецирование одного участка на другой. Но именно проецированием текстур на полигоны (texture mapping) и занят GPU любой современной видеокарты! Это может показаться невероятным, но один из самых «зрелищных» алгоритмов «реалистичного» рендеринга легко обсчитывается самой дешевенькой видеокартой.

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

А как же одни объекты умудряются окрашивать в свой цвет соседние (одна из самых «прикольных фенечек» метода radiosity)? А очень просто: приведенное выше уравнение — «монохромное», оно вычисляется для каждой из трех цветовых составляющих RGB, только и всего. (Ну скажите после этого, что магия здесь не присутствует :)!).

По уравнению излучения видно, что его решение никак не зависит от положения «наблюдателя» («виртуальной» камеры). Это означает, что если единственным движущимся объектом в сцене является камера, то достаточно просчитать «диффузную часть» глобальной освещенности один раз в первом кадре анимации и использовать результаты просчета во всех последующих кадрах. (И практически все рендеры, используемые для «реалистичного» рендеринга, позволяют это делать). Знание этой «особенности» метода radiosity позволяет значительно сократить время получения нескольких «ракурсов» одной модели, например, модели помещения при «визуализации» интерьеров. (Да вот только большинство «визуализаторов» интерьеров, «огорчившись» большим временем рендеринга первого кадра, редко отваживаются на «продолжение», ограничиваясь «прелюдией», а зря — анимированные «интерьерные» сцены смотрятся куда как интересней).

Как уже упоминалось, метод radiosity дает «частное» решение уравнения рендеринга, поэтому при «реалистичном» рендеринге radiosity используется в компании с другими методами, в первую очередь с ray tracing.

 

Ray tracing (трассировка лучей) — самый «трудоемкий» в плане вычислений алгоритм «реалистичного» рендеринга, но без него просто никуда: геометрически точное удаление невидимых поверхностей, отражения, преломления, дисперсия, «жесткие» тени, anti-aliasing, «объемные эффекты» — вот только некоторые (впрочем, самые важные) его «амплуа». А в паре с radiosity метод этот составляет львиную долю всего «реалистичного» рендеринга.

Вычислительная «трудоемкость» метода ray tracing связана прежде всего с тем, что он, по сути дела, является попыткой решить уравнение рендеринга «в лоб», с как можно меньшей погрешностью. Зато «наградой» за эту попытку является очень высокий уровень «реализма» отрендеренных сцен (в основном благодаря «учету» таких оптических явлений, которые не попадают в «поле зрения» других алгоритмов рендеринга). Проследить все лучи в сцене не представляется возможным ввиду их бесконечного числа, поэтому «трассируются» не все лучи, а только те, которые участвуют в «формировании» пиксела «отрендеренного» изображения. И самыми естественными «кандидатами» на трассировку являются лучи, попадающие в глаз «наблюдателю» (объектив «виртуальной» камеры). Метод трассировки лучей как бы «вывернут наизнанку»: прослеживаются не лучи, «испущенные» источником света, а воображаемые лучи, «испущенные» глазом «наблюдателя» (объективом камеры). Именно из-за этого «базовый» метод трассировки не учитывает «диффузные» отражения, при которых направление отраженного от поверхности луча непредсказуемо, а учитывает только «зеркально» отраженные и преломленные лучи (а в последних версиях многих рендеров еще и «дисперсно» преломленные (dispersion), а также «подповерхностно рассеянные» (subsurface scattering)). Трассировка лучей, исходящих от источника света, тоже используется — для «уточнения» результатов трассировки лучей от глаза «наблюдателя», из-за этого возникла путаница в терминологии: что считать «прямой», а что «инверсной» трассировкой. В большинстве рендеров ray tracing «имеет в виду» именно лучи, исходящие от глаза «наблюдателя», а лучи, исходящие от источника света, трассируются алгоритмами с другими названиями (хотя программа «трассер» у них одна и та же).

Для того, чтобы метод трассировки лучей мог работать, все поверхности в сцене должны быть математически описаны (в виде формул). «Забота» по математическому описанию возложена на программы моделирования, хотя можно делать и «вручную» на «встроенных» языках 3D-программ. Рассмотрим на примере сферы, как работает типичный «трассер». На языке аналитической геометрии это «звучит» так: найти точки пересечения сферы радиусом Sr и центром (Sx, Sy, Sz), описываемой уравнением

и прямой, проходящей через точку (0, 0, 0) и описываемой уравнениями x = d * lx, y = d * ly, z = d * lz, в котрых l — направление прямой, d — расстояние вдоль прямой от точки (0, 0, 0). Опустим, как говорят математики, промежуточные «выкладки» ввиду их тривиальности и сразу приведем результат:

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

 

[ Как видим, найти точки пресечения луча с самой замысловатой поверхностью с «вычислительной» точки зрения не представляет никаких трудностей. По крайней мере, для центрального процессора (CPU). Попытки возложить «тяготы» трассировки на специализированные устройства («усовершенствованную» видеокарту, например) предпринимаются постоянно, достигнуты определенные успехи, но до «широкого внедрения» подобных устройств пока далеко. И опять же, для чего нужен будет CPU, если всю работу за него будут выполнять «подмастерья» :)? ]

 

Итак, мы (вернее, алгоритм трассировки лучей) «бабахнули» воображаемым лучом из камеры (нашего «глаза» в виртуальном пространстве) в направлении пиксела, цвет которого хотим определить. Если этот луч никого (ничего) не «заденет», то цветом пиксела будет цвет фона. (Аналогичное происходит в методе ray casting, «развитием» которого ray tracing, собственно говоря, и является). Ежели какой нибудь поверхности не повезло (вернее, не повезло в этом случае нам — лучи начинают «размножаться» со скоростью снежной лавины, что самым «драматичным» образом сказывается на времени рендеринга), то в точке «попадания» происходит следующее луч «расщепляется» в общем случае на три — отраженный (reflection), преломленный (refraction) и «теневой» (shadow). «Теневой» луч, как понятно из названия, используется для формирования теней: «теневым» лучом «выстреливают» в направлении источника света и если по дороге попадется какой-нибудь объект, то стало быть наша поверхность (вернее, точка «попадания» «исходного» луча) лежит в тени этого объекта. С отраженным лучом тоже все понятно — он отразился «зеркально» от поверхности и пошел «блуждать» по трехмерной сцене. Преломленный луч «ушел» вглубь объекта под углом, определяемым коэффициентом преломления материала объекта. Преломление (refraction), естественно, имеет смысл только для прозрачных (transparent) объектов. Но есть еще материалы, которые ведут себя по другому, не как transparent — называются они translucent («просвечивающий», «полупрозрачный»). В чем же состоит их «полупрозрачность»? Та «часть» «упавшего» на поверхность луча, которая «пошла» вглубь объекта, начинает совершать под поверхностью объекта в слое определенной толщины хаотичные движения, «выскакивая» обратно на поверхность в точке, отличной от точки «падения» исходного луча, т. е. луч внутри «транслюцентного» материала претерпевает диффузное рассеяние (как в методе radiosity). Рассеяние это моделируется с помощью вероятностных методов (метод Монте-Карло, еще называемый методом русской рулетки — хоть здесь нам удалось «засветиться»:)) и называется subsurface scattering («подповерхностное рассеяние») или SSS. К транслюцентным материалам относят воск, некоторые вязкие жидкости, молоко, мрамор, а что самое важное — человеческую кожу. Именно придание материалу кожи «транслюцентных» свойств позволяет добиться поразительного реализма при рендеринге (увы, за счет того самого «драматического» увеличения времени этого самого рендеринга :(, но результат превосходит самые смелые ожидания :)).

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

Но в таком виде метод ray tracing дает в конечном изображении много «артефактов», поэтому для более точного («правильного») определения цвета пиксела используют дополнительно «выстреливаемые» лучи. По существу сцена рендерится с разрешением, бОльшим заданного, а полученная «картинка» потом «ужимается» до нужных размеров с помощью самых разнообразных способов. Алгоритмы «генерации» дополнительных лучей носят общее название anti-aliasing, количество их достаточно велико и в разных рендерах они используются во всевозможных сочетаниях (например, дополнительные лучи могут «генерироваться» не для всех пикселов, а только для соответствующих контурам объектов — так называемый Object anti-aliasing, или, наоборот, для пикселов внутри контура — Texture anti-aliasing, причем количество «дополнительных» лучей (samples) может задаваться в настройках рендера).

Дополнительные лучи «генерятся» также для «обсчета» таких эффектов, как «трехмерный» motion blur, Depth of Field, «объемных» эффектов и других.

В «базовом» методе ray tracing мы (вернее, разработчики метода) заменили лучи, идущие от источника света (как оно имеет место в природе), на лучи, «испускаемые» глазом «наблюдателя». Замена эта, сторого говоря, не совсем эквивалентная, поэтому в «реалистичном» рендеринге «трассируются» также лучи, испускаемые источником света, только лучи эти, в отличие от «испускаемых» глазом «наблюдателя», имеют внутреннюю «структуру» — они «состоят» из фотонов. Фотон — «частица света» — обладает определенными «свойствами», вроде энергии, цвета, направления движения и некоторыми другими. При столкновении с поверхностью «свойства» фотона изменяются, а «точки столкновения» регистрируются в фотонных картах. Фотоны «живут», пока не покинут сцену, «поглотятся» какой-нибудь поверхностью или пока их «энергия» не упадет до определенного «порога». Полученные фотонные карты используются затем для формирования «окончательной засветки» «отрендеренной» сцены.

Методом фотонных карт (photon mapping) моделируются такие оптические явления, как каустические пятна (caustics), диффузные «межотражения» (как в методе radiosity) и некоторые другие. Как и в методе radiosity, «засветка» трехмерной сцены фотонами не зависит от положения «наблюдателя» и этот факт можно использовать для «реалистичной» анимации сцен, единственным движущимся объектом в которых является камера. А вот «картинка», получаемая методом ray tracing, целиком зависит от положения «наблюдателя», поэтому при рендеринге анимации трассировку в каждом кадре приходится начинать «по новой».

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

 

© by Yuri Buyskikh 2007
[email protected]
www.VirtualVision.ru

Рендеринг — Википедия

Фотореалистичное изображение, созданное POV-Ray 3.6. Модели кувшина, стаканов и пепельницы созданы при помощи Rhinoceros 3D, модель игральной кости — в cinema 4D.

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

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

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

Часто в компьютерной графике (художественной и технической) под рендерингом (3D-рендерингом) понимают создание плоской картинки — цифрового растрового изображения — по разработанной 3D-сцене. Синонимом в данном контексте является визуализация.

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

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

Компьютерная программа, производящая рендеринг, называется рендером (англ. render) или рендерером (англ. renderer).

Методы рендеринга (визуализации)

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

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

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

  • Растеризация (англ.  rasterization) совместно с методом сканирования строк (Scanline rendering (англ.)). Визуализация производится проецированием объектов сцены на экран без рассмотрения эффекта перспективы относительно наблюдателя.
  • Ray casting (рейкастинг) (англ. ray casting). Сцена рассматривается, как наблюдаемая из определённой точки. Из точки наблюдения на объекты сцены направляются лучи, с помощью которых определяется цвет пиксела на двумерном экране. При этом лучи прекращают своё распространение (в отличие от метода обратного трассирования), когда достигают любого объекта сцены либо её фона. Возможно использование каких-либо очень простых способов добавления оптических эффектов. Эффект перспективы получается естественным образом в случае, когда бросаемые лучи запускаются под углом, зависящим от положения пикселя на экране и максимального угла обзора камеры.
  • Трассировка лучей (англ. ray tracing) похожа на метод бросания лучей. Из точки наблюдения на объекты сцены направляются лучи, с помощью которых определяется цвет пиксела на двумерном экране. Но при этом луч не прекращает своё распространение, а разделяется на три луча-компонента, каждый из которых вносит свой вклад в цвет пикселя на двумерном экране: отражённый, теневой и преломлённый. Количество таких компонентов определяет глубину трассировки и влияет на качество и фотореалистичность изображения. Благодаря своим концептуальным особенностям, метод позволяет получить очень фотореалистичные изображения, однако из-за большой ресурсоёмкости процесс визуализации занимает значительное время.
  • Трассировка пути (англ. path tracing) использует похожий принцип трассировки распространения лучей, однако этот метод является наиболее приближённым к физическим законам распространения света. Также является самым ресурсоёмким.

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

Математическое обоснование

Реализация механизма рендеринга всегда основывается на физической модели. Производимые вычисления относятся к той или иной физической или абстрактной модели.
Основные идеи просты для понимания, но сложны для применения. Как правило, конечное элегантное решение или алгоритм более сложны и содержат в себе комбинацию разных техник.

Основное уравнение

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

Lo(x,w→)=Le(x,w→)+∫Ωfr(x,w→′,w→)Li(x,w→′)(w→′⋅n→)dw→′{\displaystyle L_{o}(x,{\vec {w}})=L_{e}(x,{\vec {w}})+\int \limits _{\Omega }f_{r}(x,{\vec {w}}’,{\vec {w}})L_{i}(x,{\vec {w}}’)({\vec {w}}’\cdot {\vec {n}})d{\vec {w}}’}

Неформальное толкование таково:
Количество светового излучения (Lo), исходящего из определённой точки в определённом направлении есть собственное излучение и отражённое излучение. Отражённое излучение есть сумма по всем направлениям приходящего излучения (Li), умноженного на коэффициент отражения из данного угла.
Объединяя в одном уравнении приходящий свет с исходящим в одной точке, это уравнение составляет описание всего светового потока в заданной системе.

Таблица сравнения свойств рендереров

RenderManmental rayYafaRayV-RayfinalRenderBrazil R/STurtleMaxwell RenderFryrenderIndigo RendererLuxRenderKerkytheaGelato (разработка прекращена)
совместим с 3ds MaxДа, через MaxManвстроенНетДаДаДаНетДаДаДаДаДаДа
совместим с MayaДа, через RenderMan Artist ToolsвстроенНетДаДаНетДаДаДаДаДаДа
совместим с SoftimageДа, через XSIManвстроенНетДаНетНетНетДаДаДаДаНет
совместим с HoudiniДаДаНетНетНетНетНетНетДаДаНетНет
совместим с LightWaveНетНетНетНетНетНетНетДаДаНетНетНет
совместим с BlenderНетНетДаДаНетНетНетНетНетДаДаДаНет
совместим с SketchUpНетНетНетДаНетНетНетДаДаДаДаДаНет
совместим с Cinema 4DДа (начиная с 11-й версии)ДаНетДаДаНетНетДаДаДаДаНет, замороженНет
платформаMicrosoft Windows, Linux, Mac OS XMicrosoft Windows, Mac OS XMicrosoft Windows, Linux, Mac OS X
физическая корректность моделиНетНетНетНетНет

Рендер пасы и рендер слои

Alex Alvarez, основатель Gnomon, школы визуальных эффектов, рассказывает о том, что такое рендер пасы и слои.

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

Моей же целью будет обзор различных рендер элементов и того, как их отрендерить в Maya и вписать в пайплайн. Вы можете заметить, что при этом я не упоминаю Render Layer Manager. Причина этого заключается в том, что он довольно громоздкий и далеко не всегда полезный.

Пасы

Рендер по пасам – это процесс рендера различных атрибутов объектов по отдельности, различные виды рендер пасов приводятся ниже.

Beauty пас – сочетание всех рендер пасов. Не содержит отражений, бликов, теней и пр., которые обычно рендерятся отдельно.

Colour пас пас с цветом материала.

Diffuse пас – Direct illumination умножается на цвет поверхности в обратном порядке.

Diffuse Raw пас – пас только с Direct illumination.

Specular/Highlight пас содержит блики от всех объектов. Highlight пас рендерится путем отключения всех Ambient light, при этом на объект назначается шейдер черного цвета или цвет шейдера изменяется на черный. Таким образом, рендерятся все блики в сцене, на черном фоне, без каких-либо других шейдеров. При рендере этого паса у всех светильников также выкручивается параметр Emit diffuse.

Reflection пас содержит отражения от всех объектов, а также окружения, может дополнять или заменять Highlight пас. Для корректного рендера этого паса можно создать шейдер типа хром (blinn, цвет=черный, diffuse=0, specular = белый, reflectivity = 1) и назначить его на объект, для которого необходимо отрендерить Reflection пас. Силу и интенсивность отражений, их прозрачность и блюр можно отрегулировать уже на этапе композа.

Refraction пас содержит результат рефракции в сцене.

Matte пас – фактически является альфой материала. В сочетании с объектом и самим материалом можем творить чудеса при создании масок груп объектов и материалов на композе. В случае необходимости пас Occlusion matte можно получить путем редактирования шейдера таим образом, чтобы альфа канал отвечал за объекты, расположенные позади. Этого можно достичь, если использовать Black Hole для Opacity Control шейдера.

Ambient пас – свет, у которого нет какого-то определенного источника, помогает освещать сцену и отрендеренный объект.

Translucency пас – просвечиваемость материала core_mia_material.

Sub Surface Scatter пас – свет, который отражается от поверхности кожи и рассеивается под ней.

Subsurface Front пас – первый слой подповерхностного рассеивания при использовании шейдеров core_simple_sss или core_skin_sss.

Subsurface Mid пас – средний слой подповерхностного рассеивания при использовании шейдера core_skin_sss.

Subsurface Back пас – нижний слой подповерхностного рассеивания при использовании шейдеров core_simple_sss или core_skin_sss.

Incandesence – самосвечение объекта.

Rim light пас используется для того, чтобы выгодно подчеркнуть объект на переднем плане, выделив его на фоне заднего.

Shadow пас – показывает расположение теней в сцене. Обычно выглядит как белая область на черном фоне или черная область на белом фоне, или тени, включенные в альфа канал.

Floor shadow пас содержит тени, которые объекты отбрасывают на пол.

Effects пас обычно содержит такие элементы, как Fur, Smoke, погодные условия (дождь) и пр., которые рендерятся отдельно от остальных элементов.

Depth пас – Z-depth может быть отрендерен как отдельный пас, чтобы более гибко использоваться на посте. С помощью него можно также создать туман. Кроме того, Depth пас можно использовать для того, чтобы понять, какое отношение один объект имеет к другому. Так, если в центре тора у вас есть сфера, вследствие чего часть сферы перед тором, а часть за, вы можете отрендерить эти объекты по отдельности и все также успешно их скомпозить.

Этот рендер пас является изображением с одним каналам, ограниченным 256 оттенками серого в стандартном 8-битном канале. Обычно, Z-depth рендерится как 16-битное изображение, чтобы улучшить качество паса.

Оттенки серого паса Z-depth отвечают за расстояние от камеры, при этом белый цвет означает близкое расстояние, черный далекое.

Normal World пас – Surface-нормали в мировом пространстве в промежутке от -1 до 1.

Normal World (Normalized) пас — Surface-нормали в мировом пространстве в промежутке от 0 до 1. Пас имеет то же самое значение, что и Normal World пас, за исключением масштаба и атрибутов Offset паса, которые устанавливаются для нормализации результата.

Normal Camera пас — Surface-нормали в пространстве камеры в промежутке от -1 до 1.

Normal Camera (Normalized) пас — Surface-нормали в пространстве камеры в промежутке от 0 до 1. Пас имеет то же самое значение, что и Normal World пас, за исключением масштаба и атрибутов Offset паса, которые устанавливаются для нормализации результата.

Point World пас – Значение XYZ с плавающей запятой каждого пикселя в мировом пространстве.

Point Camera пас — Значение XYZ с плавающей запятой каждого пикселя в пространстве камеры.

Motion Vector пас – 2D-моушн векторы с плавающей запятой. Используется в приложении для композитинга для создания моушн блюра.

Motion Vector (Normalized) пас – 2D-моушн векторы в промежутке от 0 до 1. Пас имеет то же самое значение, что и Motion Vector пас, за исключением масштаба и атрибутов Offset паса, которые устанавливаются для нормализации результата.

Opacity пас – прозрачность геометрии.

UV пас – пас, содержащий UV-развертку.

Material ID пас – Каждому материалу в сцене рандомно назначается цвет. Используется для создания масок конкретных материалов в приложении для композитинга для дальнейшей настройки.

Object ID пас – Каждому объекту в сцене рандомно назначается цвет. Используется для создания масок конкретных объектов в приложении для композитинга для дальнейшей настройки.

Слои

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

Для того, чтобы отрендерить объекты по отдельности, можно использовать несколько техник. Например, настроить видимость того или иного объекта. Также можно использовать слои Render-layer manager в Maya. При этом я предпочитаю больше работать со слоями сцены.  

Вывод

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

Читайте в нашей предыдущей статье о том, как создать рендер ферму дома.

Хотите знать больше? Приходите на наш фундаментальный курс по Nuke.

Журналист: Алена

Источник

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 и процессах, которые происходят в движке.

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

  1. Загружаем ассеты (модели, шейдера, текстуры, партиклы и т.д.) в RAM-память и память видеокарты.
  2. С помощью Culling систем на CPU (детально про них ниже) отбрасываем невидимые в данный момент из камеры объекты, формируя тем самым список объектов, которые мы должны отрисовать.
  3. Вызываем команды для отрисовки этих объектов на GPU.
  4. GPU делает ряд сложных вычислений, проецируя 3D-объекты на 2D экран, беря в учет условия освещения в сцене и материалы объектов.
  5. Применяем пост-эффекты (пост-процессы).

Как вы могли заметить, основная “магия” происходит в четвертом пункте. Что это за сложные вычисления, как они влияют на производительность и как научится их контролировать? Этим мы сегодня и займемся, а начнём с того, какие объекты можно создавать и какие операции можно делать над ними, а потом плавно перейдем к отрисовке сцены.

Также перед тем, как начать, стоит сказать, что эта статья не описывает какой-то конкретный конвейер рендера в конкретном движке (хотя мы и будем приводить много примеров из UE4), а старается обобщить наши знания таким образом, чтобы вы могли понять откуда “растут ноги” у современных контент-пайплайнов и графических фич,  а также поняли, почему количество полигонов в модели уже давно не является адекватным мерилом производительности.

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

Какие ресурсы можно создать на GPU?

Текстуры

Самый известный и самый объемный ресурс — это, наверное, текстура. Чисто для примера мы будем использовать простую текстуру 8х8 пикселей с призраком из игры Pac-man:

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

Одномерные (в терминологии DirectX 11 — Texture1D).
По своей природе одномерные текстуры лучше всего подходят для градиент-маппинга. UE4 не использует этот вид текстур, но предоставляет альтернативу — Curve Atlas, который является оберткой над двумерной текстурой и позволяет работать со множеством одномерных текстур сразу. Детальнее с ними можно ознакомиться тут.

Одномерная текстура. Чтобы взять какой-то пиксель из этой текстуры, нужно указать смещение этого пикселя U (по умолчанию текстура находится в пределах 0…1) вдоль единственной стороны текстуры.

Двумерные (в терминологии DirectX 11 — Texture2D).
Тут и рассказывать особо нечего — это самый распространенный тип текстур, который с большой вероятностью будет делать ~90% картинки в вашем проекте. Текстуры объектов, интерфейса, служебные LUT, карты высот — как правило, это все Texture2D.

Двумерная текстура. Для указания конкретного пикселя стоит указать смещение вдоль осей U и V.

Трехмерные (в терминологии DirectX 11 — Texture3D).
Такие текстуры можно представить как массив или слои двумерных текстур. В редакторе создавать их как ассеты можно, но для этого их нужно включить (r.AllowVolumeTextureAssetCreation 1). В основном, 3D текстуры используются самим движком для работы с Vector Fields, Distance Fields, Volumetric Lightmaps и т.д. То есть там, где необходимо пространственное представление данных.

Трехмерная текстура. Тут чтобы взять пиксель нужно указать уже 3 смещения — U, V и W.

Самый последний тип и, наверное, самый интересный — куб текстуры (CubeMaps, в терминологии DirectX 11 — TextureCube).
В памяти они представлены как 6 двухмерных текстур, которые соответствуют граням куба (+x -x +y -y +z -z). По сути, куб текстура — это способ сделать привязку пикселя к направлению. Самый яркий пример — скайбокс. В UE4 эта текстура отображается как Ра

Рендеринг что это такое, и какие особенности имеет процесс (2019)

Выбор редакции

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

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

Рисование модели происходит в несколько этапов, одним из заключительных из них является рендеринг – что это такое и как он осуществляется, рассказано в данном материале.

Содержание:

Определение

Рендеринг (или как его еще называют, рендер) – один из заключительных процессов в обработке и отрисовке определенной объемной трехмерной компьютерной модели.

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

Также иногда на этом этапе в процессе «сбора» модели могут применяться и некоторые трехмерные элементы.

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

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

Они оказывают значительную нагрузку на «железо» компьютера.

<Рис. 1 Процесс>

к содержанию ↑

Сфера применения

В каких же сферах применимо данное понятие и необходимо проведение такого процесса?

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

Компьютерное проектирование применяется в:

  • Проектировании зданий и сооружений;
  • Ландшафтной архитектуре;
  • Проектировании городской среды;
  • Дизайне помещений;
  • Почти каждая произведенная материальная вещь когда-то была компьютерной моделью;
  • Видеоиграх;
  • Производстве кинофильмов и др.

При этом, данный процесс, по своей сути, является завершающим.

Он может быть последним или предпоследним при проектировании модели.

Отметим, что рендерингом часто называют и не сам процесс составления модели, а его результат – готовую компьютерную трехмерную модель.

<Рис. 2 В дизайне>

к содержанию ↑

Технология

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

Этот этап сопровождается сложными техническими вычислениями, которые выполняет движок программы – математические данные о сцене и объекте на этом этапе переводятся в окончательное двухмерное изображение.

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

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

<Рис. 3 Создание модели>

к содержанию ↑

Виды

В зависимости от особенностей технологии и работы выделяются два основных типа такого процесса – это рендеринг в реальном времени и предварительный.

Далее рассказано о том, чем они отличаются и какие особенности имеют.

В реальном времени

Такой типа имеет широкое распространение, преимущественно, в компьютерных играх.

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

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

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

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

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

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

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

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

Именно от качества оптимизации движка рендера во многом зависит то, насколько стабильно работает игра, и насколько реалистично смотрится все происходящее.

<Рис. 4 В реальном времени>

Предварительный

Такой тип используется в ситуациях, когда интерактивность не важна.

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

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

<Рис. 5 Предварительный>

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

определение от The Free Dictionary

Предполагается даже, что последний имеет оттенок красноватого песчаника, как и многое из того, что известно в нашем мире, но более определен по оттенку, в то время как два блестящих белых пятна на его полюсах считаются отражением света. из снегов тех регионов, которые становятся более заметными или исчезают, когда они впервые появляются после двенадцатимесячной зимы, или тают летом равной продолжительности. «Буквально« не называть их своими », но можно переводить по-гречески» Чтобы не раскрыть твое.»Рвение к различным взглядам на религию, правительство и многие другие вопросы, а также к спекуляциям и практике; привязанность к различным лидерам, амбициозно борющимся за превосходство и власть; или к лицам других категорий, чьи судьбы были интересны к человеческим страстям, в свою очередь, разделили человечество на партии, воспламенили их взаимной неприязнью и сделали их гораздо более склонными досадить и угнетать друг друга, чем сотрудничать для их общего блага. Поскольку первая часть «Старомодной девушки» была написана в 1869 году, потребность в сиквеле в виде просьб о маленьких письмах, делавших невозможным отказ, вынудила мою героиню смело продвигаться на шесть или семь лет вперед. Теперь я говорю, что «со шпорами он идет своим путем». Если он доберется до места назначения, я думаю, что окажу некоторую услугу вашему превосходительству, так как со многих сторон меня просят отправить его, чтобы развеять ненависть и отвращение, вызванные другим Дон Кихотом, который под именем Второй части бегать в маскараде по всему миру.По бокам у них были короткие мечи и посохи в руках, и теперь Гурт мог заметить, что все шестеро носили козырьки, что делало их занятие бесспорным, даже если их прежние действия оставляли это под сомнением. что сцена этого рассказа и большая часть информации, необходимой для понимания его намеков, достаточно очевидны для читателя в самом тексте или в сопроводительных примечаниях. Воспринимаются в том же настроении, которое породило «Безумие Альмайера» и «Ан». Изгой Островов », — говорится на одном дыхании (с тем, что от него осталось, то есть после конца« Изгоя »), увиденным тем же видением, воспроизведенным тем же способом — если такой вещь как метод тогда действительно существовала в моем сознательном отношении к этому новому приключению письма для печати.Я с удовольствием отмечу огромную помощь, которую я получил от нескольких других естествоиспытателей в ходе этой и других моих работ; но я должен быть разрешен здесь выразить мою самую искреннюю благодарность преподобному профессору Хенслоу, который, когда я был студентом в Кембридже, был одним из главных средств приобщения меня к естественной истории, — который во время моего отсутствия взял руководил коллекциями, которые я отправлял домой, и его перепиской руководил моими усилиями, — и который с момента моего возвращения постоянно оказывал мне всяческую помощь, какую мог предложить самый добрый друг.Сердечно поцеловав жену и не менее сердечно пожав руку Николасу, Джон сел на лошадь и поскакал, оставив миссис Броуди готовиться к гостеприимным блюдам, а своему юному другу прогуляться по окрестностям и снова посетить места, которые Были ему знакомы многие жалкие ассоциации. Вторжение с востока было новым и внезапным прорывом народа, который выдержал кратковременную сдержанность после того, как успех практически лишил его сопротивления. упражняться в методе, который я предписал; ибо, помимо общей заботы о том, чтобы вести все свои мысли в соответствии с его правилами, я выделял время от времени несколько часов, которые я специально посвящал применению этого метода при решении математических трудностей или даже при решении аналогичным образом некоторых вопросы, относящиеся к другим наукам, но которые, поскольку я отделил их от таких принципов этих наук, которые не имели достаточной уверенности, стали почти математическими: истинность этого будет очевидна из многочисленных примеров, содержащихся в этом томе.

Правильный способ заставить Vue повторно визуализировать компонент

Иногда системы реактивности Vue недостаточно, и вам просто нужно повторно визуализировать компонент.

Или, может быть, вы просто хотите удалить текущий DOM и начать все сначала.

Так как же заставить Vue правильно перерисовать компонент ?

Лучший способ заставить Vue повторно визуализировать компонент — это установить для компонента : ключ . Когда вам нужно повторно отрисовать компонент, вы просто меняете значение ключа, и Vue повторно отрендерит компонент.

Это довольно простое решение, правда?

Вы будете рады узнать, что есть много других способов сделать это:

  • Ужасный способ: перезагружаем всю страницу
  • Ужасный способ: использование хака v-if
  • Лучший способ: использовать встроенный в Vue метод forceUpdate
  • Лучший способ: смена ключей на вашем компоненте

Вот только вот где я тебе все испорчу.

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

Вероятно, вы неправильно поняли одну из следующих хитрых вещей:

  1. Реактивность Vue
  2. Стойка расчетная
  3. Смотрел реквизит (иногда)
  4. Не используется : ключевой атрибут с v-для

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

Ужасный способ: перезагрузить всю страницу

Это эквивалентно перезагрузке компьютера каждый раз, когда вы хотите закрыть приложение. .

Я, , думаю, иногда сработает, но это довольно плохое решение.

Больше нечего сказать об этом. Не делай этого.

Давайте поищем способ получше.

Ужасный способ: взлом v-if

Vue поставляется с директивой v-if , которая будет отображать компонент только тогда, когда она истинна.Если это false, компонент вообще не будет существовать в DOM.

Вот как мы настроили его, чтобы взлом v-if работал.

В свой шаблон вы добавите директиву v-if :

 <шаблон>
  
 

В свой сценарий вы добавите этот метод, который использует nextTick :

 <сценарий>
  экспорт по умолчанию {
    данные() {
      возвращение {
        renderComponent: правда,
      };
    },
    методы: {
      forceRerender () {
        
        этот. renderComponent = false;

        this. $ nextTick (() => {
          
          this.renderComponent = true;
        });
      }
    }
  };
 

Вот что здесь происходит:

  1. Первоначально для renderComponent задано значение true , поэтому визуализируется my-component
  2. Когда мы вызываем forceRerender , мы сразу устанавливаем renderComponent на false
  3. Мы прекращаем рендеринг my-component , потому что директива v-if теперь оценивается как false
  4. На следующем тике renderComponent возвращается к true
  5. Теперь директива v-if оценивается как true , поэтому мы снова начинаем рендеринг my-component

Есть две вещи, которые важны для понимания того, как это работает.

Сначала надо дождаться следующего тика , иначе мы не увидим никаких изменений.

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

Во-вторых, Vue создаст совершенно новый компонент при втором рендеринге.Vue уничтожит первый и создаст новый. Это означает, что наш новый my-component будет проходить все свои жизненные циклы как обычно — создан , установлен и так далее.

Кстати, вы можете использовать nextTick с обещаниями, если хотите, чтобы :

 forceRerender () {
  
  this.renderComponent = false;

  
  
  this. $ nextTick (). then (() => {
    
    this.renderComponent = true;
  });
} 

Тем не менее, это не лучшее решение.Я называю это взломом, потому что мы взламываем то, что хочет от нас Vue.

Итак, вместо давайте сделаем то, что Vue хочет, чтобы мы делали !

Лучший способ: вы можете использовать forceUpdate

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

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

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

Если Vue автоматически обновляется, когда что-то меняется, зачем нам принудительно обновлять ?

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

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

Существует два разных способа вызова forceUpdate , как в самом экземпляре компонента, так и глобально:

импортировать Vue из vue;
Vue.forceUpdate ();


экспорт по умолчанию {
  методы: {
    methodThatForcesUpdate () {
      
      это. $ forceUpdate ();
      
    }
  }
} 

Важно : Это не приведет к обновлению каких-либо вычисленных свойств, которые у вас есть.Вызов forceUpdate приведет только к повторной визуализации представления.

Лучший способ: смена ключей

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

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

Именно то, что нам нужно!

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

Зачем нам нужно использовать ключ во Vue?

Как только вы это поймете, это довольно маленький шаг к пониманию того, как принудительно выполнить повторный рендеринг надлежащим образом.

Допустим, вы визуализируете список компонентов, который имеет одно или несколько из следующих:

  • Собственный местный округ
  • Какой-то процесс инициализации , обычно в создается или монтируется крючки
  • Нереактивное Манипуляции с DOM через jQuery или стандартные API

Если вы отсортируете этот список или обновите его каким-либо другим способом, вам потребуется повторно отрисовать части списка.Но вы не захотите повторно визуализировать все в списке, только то, что изменилось.

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

Вот пример списка, который у нас есть:

 const people = [
  {имя: 'Эван', возраст: 34},
  {имя: 'Сара', возраст: 98},
  {имя: 'Джеймс', возраст: 45},
]; 

Если отрендерить его с помощью индексов, мы получим:

 
  • {{ человек.имя}} - {{индекс}}
Эван - 0 Сара - 1 Джеймс - 2

Если убрать Сару, получим:

 Эван - 0
Джеймс - 1 

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

Итак, здесь мы хотим использовать какой-то уникальный идентификатор , однако в конечном итоге мы его генерируем.

 const people = [
  {id: 'this-is-an-id', имя: 'Эван', возраст: 34},
  {id: 'unique-id', имя: 'Сара', возраст: 98},
  {id: 'другой-уникальный-идентификатор', имя: 'Джеймс', возраст: 45},
];

  • id "> {{person.name}} - {{person.id}}

До того, как мы удалили Сару из нашего списка, Vue удалил компоненты для Сары и Джеймса, а затем создал новый компонент для Джеймса. Теперь Vue знает, что он может сохранить два компонента для Эвана и Джеймса, и все, что ему нужно сделать, это удалить компонент Сары.

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

Может быть, этот обход был не таким коротким. Но нужно было объяснить, как работают ключи во Vue.

В любом случае, давайте перейдем к лучшему методу принудительного повторного рендера!

Изменение ключа для принудительного повторного рендеринга компонента

Наконец, вот — самый лучший способ (на мой взгляд) заставить Vue повторно визуализировать компонент.

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

Вот самый простой способ сделать это:

 <шаблон>
  
 
 экспорт по умолчанию {
  данные() {
    возвращение {
      componentKey: 0,
    };
  },
  методы: {
    forceRerender () {
      this.componentKey + = 1;
    }
  }
} 

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

Вы получаете дочерний компонент, который повторно инициализирует себя и «сбрасывает» свое состояние.

Простой и элегантный способ решить нашу проблему!

Подробнее об этой технике смены ключа я пишу здесь.

Просто помните, если вам нужно заставить Vue повторно отрендерить компонент, возможно, вы делаете что-то не лучшим образом.

Если, однако, вам все же нужно что-то повторно отрендерить, выберите метод с изменением ключа , а не что-либо еще.

7 ошибок, которые делают пользователи Blender, пытаясь ускорить рендеринг.

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

1 — Использование слишком малого количества отражений света

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

Визуализировано с 12 отражениями света

Визуализация с 1 отражением света

Проблема с использованием небольшого количества этих отскоков света состоит в том, что они почти сводят на нет цель иметь любые отскоки. Потому что в физическом мире существует неограниченное количество отражений света, идущих во всех возможных направлениях. Единственный способ попытаться имитировать эти отскоки — иметь их довольно большое количество, иначе тени наверняка будут темнее, чем та же сцена в физическом мире.По умолчанию Blender настроен на максимум 12 отражений света, и этого достаточно для большинства визуализаций и, возможно, перебор для большинства сцен без необходимости в эффектах полного GI. Для большинства рендеров обычно можно установить максимум 4-6 отскоков, и все будет в порядке, но будьте осторожны, снижая это значение.

2 — Низкие значения зажима

Использование зажима — распространенный прием для уменьшения шума визуализации и светлячков (пикселей с необычно высокими значениями яркости).Если вы не уверены в том, что такое зажим, это ограничение ограничивает высокие значения яркости изображения. Обычно это значение устанавливается для ограничения слишком ярких образцов вне диапазона / яркости до значения ограничения.

Исходный необработанный рендеринг

Чрезмерно зажатый рендер
(обратите внимание на тусклые блики)

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

Для получения более подробной информации о зажимах я настоятельно рекомендую вам ознакомиться с этой статьей HJ Hornbeck.

3 — Запеченное освещение

Запеченное освещение — один из наиболее распространенных методов оптимизации для игр и графики в реальном времени. Однако совсем недавно, с появлением поддержки запекания в движке рендеринга Cycles, запекание стало использоваться для анимации для ускорения времени рендеринга кадра в Blender. Этот метод может быть полезен, но есть еще несколько вещей, на которые следует обратить внимание.

Обратите внимание на статичность модели и отсутствие зеркальных отражений

Основная проблема с запеканием света состоит в том, что запекается дополнительная информация за пределами освещения. Такие как отражения, зеркальные блики и все другие динамические свойства материалов «жестко закодированы» в сцене. Это означает, что когда объекты или камеры в сцене перемещаются, материалы больше не взаимодействуют с окружающей средой. По сути, любая анимация, использующая запекание всего материала, будет иметь элемент нефотореализма.

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

4 — Использование Material Hacks

Material hacks обычно ищут уловку, чтобы уменьшить время рендеринга, проблема в том, что для материалов Cycles очень мало уловок, потому что Cycles — это беспристрастный движок рендеринга, а те, которые существуют, обычно в конечном итоге влияют на визуальное качество изображений. Так что я бы посоветовал избегать поиска «волшебной кнопки скорости» материалов, так как беспристрастные движки рендеринга редко имеют такие функции по сравнению с смещенными движками (такими как Blender Internal), которые могут предложить «читы» рендеринга в пользу скорости.

Слева, типичный стеклянный материал. Справа «взломанное» стекло из глянцевых и прозрачных шейдеров

5 — Оптимизация модели

Я бы рискнул сказать, что : самый неправильный метод оптимизации — это оптимизация сетки.Это означает, что отсчет многоугольника ведется в обратном порядке, используя либо низкие уровни подразделения, либо инструменты прореживания. Общая идея состоит в том, что менее плотная сетка будет отображаться быстрее; и хотя до некоторой степени это верно, это очень мало связано с рендерингом и больше связано с памятью. Плотная сетка практически не влияет на CPU или GPU с точки зрения рендеринга плитки. Вместо этого процесс сборки BVH ограничен.

Края модели ясно показывают их низкополигональную природу

Процесс сборки BVH сильно зависит от памяти, и если у вас мало памяти, это может занять очень много времени. Но правда в том, что если на вашем ПК есть как минимум 4-8 ГБ памяти, вы сможете отрендерить практически любую сцену, которую вы ему бросите, если у вас нет безумного количества ненужных полигонов. Поэтому вместо того, чтобы тратить много времени на оптимизацию моделей, убедитесь, что у вас нет безумно плотных моделей, и двигайтесь дальше.

6 — Экстремальное снижение шума

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

Оригинальный шумный рендер из Blender

Версия без шума (обратите внимание на размытые артефакты сзади)

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

7 — Локальная визуализация

Во-первых, да, это беспардонный плагин для наших услуг здесь, в Blendergrid, но, во-вторых, это веский момент, который следует учитывать. Рендеринг на домашнем компьютере может быть проще и, возможно, дешевле, но за все это приходится платить. Использование фермы рендеринга имеет несколько основных преимуществ по сравнению с использованием обычного компьютера для рендеринга. Это не только ускоряет рендеринг на ферме, но и продлевает срок службы вашего домашнего компьютера и может даже быть дешевле, в зависимости от того, сколько компонентов ПК и сколько стоит электричество в вашем районе.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *