Основы рендеринга
Для многих людей слово "рендеринг" прочно ассоциируется с другим: "ожидание". Для небольшого же количества людей слово "рендеринг" означает комплекс математических операций с широким диапазоном возможных результатов. Эта статья поможет людям, далеким от программирования, понять, что же происходит внутри компьютера во время рендеринга. Мы рассмотрим несколько способов рендеринга и примеры их применения на практике.
Большинство 3D моделлеров, художников и аниматоров плохо представляют как проходит рендеринг, и чем занимается программа рендерер в процессе работы. Программа рендерер рассматривает 3D сцену с математической точки зрения, вычисляет, как должна выглядеть сцена и затем создает итоговое изображение. Мы все знаем, что разные программы используют разные технологии рендеринга – трассировка лучей (raytrasing), ретуширование (shading) и сглаживание контурных неровностей (antialiasing), для достижения максимальной похожести искусственного изображения на реальную жизнь. Мы также прекрасно знаем, что чем сложнее сцена и выше качество выходного изображения, тем дольше длится процесс рендеринга. Возможно, вы также слышали такой термин, как "потоковый рендеринг" (rendering pipeline). Но, в сущности, мало кто задумывался, каким образом происходит процесс рендеринга и от чего зависит конечный результат. Мы думаем, вам интересно будет узнать об особенностях различных рендереров, их возможностях и различиях.
Начнем с цифр – вы наверное не догадывались, но существует более 500 (пятьсот) различных программ для рендеринга. Одни из них встроены в пакеты 3D моделирования, другие поставляются как отдельные продукты, одни могут выполнять огромное число задач, другие созданы для специфических целей. Существуют рендереры, созданные специально для определенных индустрий (например, для военных целей), для определенного оборудования (Амига), для определенных операционных систем (Линукс), и других, иногда самых неожиданных целей (3D аудио). Кроме того, существует некоторое количество бесплатных рендереров, созданных энтузиастами.
Вы спросите зачем столько различных программ одинаковой направленности? Одна из причин - это то, что люди и компании создают подобные программы уже на протяжении 15 лет, кроме того, существует более дюжины платформ, способных поддерживать процесс рендеринга. Посчитаем: если каждая платформа имеет 2-3 real-time рендерера (в основном для игр), 2-3 non-real-time рендерера (коммерческие 3D пакеты), 2-3 специализированных рендерера (созданных для военной, либо другой индустрии), добавим сюда неопределенное количество свободно распространяемых рендереров (чаще всего написанных студентами, хакерами и начинающими программистами) – вот мы и приблизились к реальному числу.
Совершенно необязательно знать про все эти системы рендеринга. Но в зависимости от работы, которую вам необходимо выполнить, вам, возможно, понадобятся некоторые знания, касающиеся различных программ рендеринга. Например, если вы разрабатываете сцены для игровой индустрии, вам необходимо знать возможности real-time рендерера, на основе которого будет работать игра.
Большинство рендереров делятся на две категории: real-time и non-real-time. Кроме того, все рендереры можно разделить по принципу используемых технологий – scan-line и raytrace. Мы рассмотрим основных представителей этих категорий и их различия, чтобы вы смогли самостоятельно выбрать наиболее для вас подходящий.
Потоковый рендеринг (Rendering Pipeline)
Потоковый рендеринг основывается на четырех уровнях.
Все объекты 3D сцены четко определены в пространстве, до того, как вы помещаете объект в сцену, у него уже есть собственное геометрическое описание: длина, высота, ширина и глубина, но он пока никак не связан с другими объектами. В этот этап также может входить и процесс tessellation (когда обсчитываемые поверхности трансформируются в полигоны). Тут нужно быть осторожным, т.к. если вы используете NURBS и поверхности Безье – точность выполнения tessellation виляет на окончательные результаты.
Когда вы помещаете объект в сцену, он приобретает дополнительные геометрические описания, теперь у него есть точная позиция и ориентация по отношению к другим объектам сцены. На этом этапе назначаются параметры поверхностей объектов и устанавливается освещение. Также объектам могут быть присвоены анимационные ключи.
Когда в сцене появляется камера, все объекты приобретают новый параметр – ориентация и местоположение по отношению к камере. На этой стадии все полигоны проверяются на предмет видимости, полигоны, не видимые камерой игнорируются. Этот процесс называется отсеиванием невидимых поверхностей (backface cutting). Камере также могут быть присвоены анимационные атрибуты.
Далее, все объекты трансформируются с точки зрения конечного изображения. Сначала, в зависимости от настроек камеры (фокусное расстояния, поле зрения и т.п.) формируется визуальный коридор. Полигоны полностью за пределами визуального коридора игнорируются, лежащие на границе – усекаются. На этом этапе выполняется множество визуальных трюков, чтобы компенсировать искажение перспективы (более удаленные вещи кажутся меньше и т.д.).
Теперь мы входим в ту стадию, которую большинство людей считает собственно процессом рендеринга, хотя технически все вышеперечисленные этапы - это часть потокового рендеринга. Итак, обрезанные и корректно искаженные полигоны проецируются на плоскость (как будто на экран монитора). Каждый полигон преобразовывается в растровый формат, ретушируется, вычисляется глубина цвета. На этом этапе могут применены различные эффекты типа Antialiasing и Motion Blur.
Все эти этапы – это части "технического" рендеринга и большинство пакетов 3D-моделирования позволяют выполнять их в реальном времени и приступать к финальной стадии только после нажатия кнопки "RENDER".
В то время как начальные этапы потока довольно незамысловаты (чистая математика), последняя стадия может быть выполнена огромным количеством способов, приемов и трюков, призванных ускорить процесс, но в тоже время сделать сцену максимально реальной. К сожалению, многие приемы, используемые для ускорения процесса или достижения определенного визуального эффекта ведут к появлению проблем, которые решаются с помощью новых приемов и трюков (со своими проблемами) – и так далее.
Например, рендереры, основанные на принципе Radiosity, берут почти готовую сцену и анализируют количество света, отраженного от других поверхностей, с учетом изменения его спектра, этот свет в свою очередь отражается от поверхности и падает на другую…Эти вычисления повторяются снова и снова. Когда вычисления закончены, каждая поверхность окрашивается и ретушируется в соответствии с результатами вычислений. Главной проблемой такого способа является то, что для ограничения времени выполнения (иначе вычисления длились бы бесконечно), обсчет ведется в соответствии с определенным алгоритмом, но именно в результате этого некоторые поверхности могут быть выключены из общего процесса и окрашены некорректно.
Тем не менее, такой способ рендеринга дает прекрасные результаты. Но Radiosity, который прекрасно подходит для неподвижных сцен, мало пригоден для рендеринга анимаций. В силу особенностей данного принципа, при рендеринге движущихся объектов возможно появление мерцания.
Scanline рендеринг
Как я уже сказал ранее, существует два основных подхода к процессу рендеринга: scanline и raytracing. Что же представляет из себя Scanline рендеринг? Предположим, что нам необходимо получить изображение разрешением 300Х200. Программа проводит воображаемую линию через каждый пиксель, вычисляя, какие полигоны лежат на пути этой линии и вычисляет необходимый цвет пикселя, в зависимости от того, какие текстуры и цвета были назначены полигонам, встретившимся на пути этой воображаемой линии. Затем берется следующий пиксель, затем следующий – и так до конца.
Основной проблемой этого способа является отделение видимых полигонов от невидимых. В первых поколениях такого рода рендереров процесс вычисления полигонов начинался с самой дальней точки от зрителя и каждый новый полигон закрашивал предыдущий. Такой подход далек от идеала из-за множества ненужных операций. Чтобы решить эту проблему используется Z-буфер. Программа вычисляет все полигоны, лежащие на пути воображаемой линии и назначает каждому полигону Z-значение в зависимости от его удаленности от экрана. Когда настает время рендеринга, обсчитываются только полигоны с наименьшим Z-значением – остальные просто отбрасываются. Такой способ позволяет существенно ускорить процесс рендеринга, но имеет и существенные недостатки, которые будут рассмотрены ниже.
Raytrace рендеринг
Подобно Scanline рендереру, Raytrace рендерер начинает с вычисления воображаемой линии от одного пикселя (кроме того, существует инверсный рендеринг, когда вычисления начинаются от источника света и рендеринг использованием обоих принципов). Когда воображаемая линия встречает на своем пути полигон, случаются три вещи. Сначала вычисляется цвет и яркость на основе прямого освещения источниками света, затем вычисляются углы отражения и преломления (reflection/refraction). На основе параметров отражения/преломления данного полигона луч раздваивается и двигается по двум новым направлениям. Если любой из этих лучей встретит полигон, он раздваивается снова – и так до определенного момента, когда луч либо уйдет за пределы сцены, либо встретит источник света, либо количество отражений/преломлений достигнет определенного установленного числа (recursion level). Когда все лучи закончат свое движение, вычисляется окончательное значение пикселя.
Инверсные трассировщики лучей начинают вычисления от источника света, с огромного количества лучей света, отражающихся от объектов сцены, которые возможно пройдут через нужный пиксель и достигнут зрителя.
Мы думаем, вы представляете себе, с какой легкостью такие способы вычислений могут поглотить миллиарды вычислений и занять огромное количество времени. Создатели таких рендереров обычно дают пользователю возможность точно указать, сколько отражений луча обсчитывать. Иногда пользователь может пользоваться только уже заранее установленными настройками типа good; better; best.
Выгодой такого способа является точность обсчета отражений и преломлений – свет отражается от зеркала либо проходит через воду именно так, как это происходит в реальной жизни. Такой способ рендеринга позволяет точно вычислять тени. Когда луч встречает полигон, программа пытается провести от этого полигона прямой луч к источнику света, если это невозможно – полигон затеняется.
Основные недостатки – огромное число вычислений и исключение из обсчета определенных свойств света (отраженное освещение). В природе нет абсолютно черных теней, т.к. весь мир наполнен отраженным освещением. Многие рендереры пытаются избавиться от этих недостатков двумя путями: они либо добавляют общее освещение (global illumination), которое освещает всю сцену, либо представляют все объекты сцены как отдельные источники света, способные излучать слабый свет.
Ретуширование
Один из наиболее сложных аспектов рендеринга - это алгоритм ретуширования. Разные методы ретуши могут применяться, чтобы увеличить либо качество, либо скорость рендеринга. Мы все знакомы с такими методами как Flat, Phong, Gouraud, но это далеко не все способы имитации вида поверхности. Каждая техника использует разные принципы и выдает разные результаты, каждая техника использует алгоритмы различной сложности.
Все алгоритмы ретуширования пытаются эмулировать то бесконечное число способов, какими луч света реагирует на поверхность в реальном мире. Отражения (reflections), отражение/поглощение света (transmission/absorbtion), рассеивание света (diffraction), преломление света (refraction), смешивание света различных источников (interference). Проще говоря, алгоритм ретуширования используется для вычисления вида поверхности при разном освещении. Самым простым алгоритмом является Flat shading – одноцветный полигон. Небольшим шагом в сторону улучшения качества работы этого алгоритма является его способность изменять оттенок цвета в зависимости от угла, под которым свет падает на поверхность. Таким образом, мы можем произвести простейшую трассировку лучей – проводится воображаемая линия сквозь пиксель экрана пока она не натолкнется на полигон. Затем проводим следующую линию от этого полигона к источнику света и вычисляем получившийся угол. Когда угол вычислен, программа рендерер просто применяет нужную формулу и вычисляет цвет пикселя. Но подобная техника не рассчитана на вычисление теней, т.к. она работает только с одним источником света и не может учитывать освещение данного полигона другими источниками света. К счастью, большинство рендереров решают эту проблему тем или иным способом и нам не придется напрямую сталкиваться с этой проблемой.
Real-Time против Non-Real-Time
Реал-тайм рендереры (основанные чаще всего на принципе scanline) созданы в первую очередь для скорости, а не для качества. Чаще всего их можно встретить в играх, различных симуляторах реального времени или в пакетах 3D моделирования. Основной выгодой использования принципа Scanline – это скорость, но для того, чтобы эмулировать различные визуальные эффекты она мало подходит. Для их реализации используются различные трюки. Чтобы эмулировать поведение света, сцена просчитывается в несколько проходов.
Например, если необходимо создать эффект объемного дыма, создается текстура дыма и накладывается на анимированную плоскую поверхность, но если нужно посмотреть на этот дым, скажем, сквозь оконное стекло, сцену необходимо просчитать дважды – первый раз для создания дыма, и второй – чтобы наложить на нее текстуру окна. Разумеется, если слишком увлечься созданием эффектов, то это приведет к существенной потере скорости.
Реал-тайм рендереры используют множество трюков для достижения высокого качества изображения при сохранении высокой скорости. Z-буфер уже не используется. Для определения невидимых объектов используется другая техника, основанная на иерархическом положении объектов в сцене. Эти принципы применяются в таких играх, как Doom, Quake и др. Текстуры, в основном те, которые используются для стен, обсчитываются заранее с разных точек зрения и сохраняются в отдельных файлах. Затем в реальном времени просчитывается позиция игрока и накладываются наиболее подходящие текстуры. Другие рендереры (как в Quake 3 Arena) используют другую технику Color by Vertex. Все эти техники призваны ускорить процесс рендеринга, но в тоже время существенно ограничивают художников и моделлеров в осуществлении их фантазии.
Если вы создаете 3D сцену для игры, либо для другой программы где будет использован реал-тайм рендерер, вы должны принимать во внимание все ограничения такого типа рендерера и знать способы обхода этих ограничений – но это уже тема для отдельной беседы.
Не все Scanline рендереры работают в реальном времени. Рендереры основанные на этом принципе также доминируют в индустрии кино и телевидения. Всем известные Pixar's RenderMan и Electric Image's Camera основаны на принципе Scanline. Есть две причины, по которым эта система используется в этих индустриях, первая – высокий уровень фотореализма не так важен, т.к. кадр появляется на экране на доли секунды, и вторая это скорость. Когда мы имеем дело с теми разрешениями, которые используются в кино-теле индустрии, даже оснащенные супермощной техникой студии рендеринга работают на пределе, и использование технологии трассировки лучей может добавить многие месяцы работы.
Нон-реал-тайм рендереры, такие, какие используются в Softimage, NewTek LightWave или Discreet 3D Studio MAX, направлены на создания высоко фотореалистичных изображений (естественно теряя при этом в скорости). Все они в основном базируются на технологии трассировки лучей. Такие рендереры могут также выпускаться отдельно от пакетов моделирования. Рендереры, основанные на технологии трассировки лучей, это идеальный инструмент для достижения высококачественных изображений, особенно для неподвижных изображений, когда зрители могут тщательно рассмотреть работу и выявить возможные недостатки. Такие рендереры могут с легкостью обрабатывать сложные сцены с большим количеством источников света и использованием отражающих/преломляющих поверхностей.
Следует отметить, что большинство систем рендеринга на сегодняшний день используют обе технологии параллельно и занимаются трассировкой лучей только в том случае, если это необходимо (обусловлено присутствующими в сцене материалами)
Посмотрим на вещи беспристрастно
Мы уже выяснили, что работа всех программ рендеринга состоит из стандартных этапов. Чем же отличаются друг от друга разные программы? Было проведено исследование, чтобы выяснить, чем же отличаются программы рендеринга разных компаний. Большинство компаний, разумеется, не желает делиться секретами своих технологий, но кое-что все же удалось узнать.
Разумеется, каждая компания утверждает, что ее продукт уникален, и что недостатки качества изображения зависят от пользователя, не удосужившегося настроить программу и воспользовавшегося предустановленными настройками (default).
По заявлению одного из специалистов компании NewTek, люди просто привыкли, что разным продуктам присуще разное качество конечных изображений. Например продукты Alias и LightWave выдают более органичные изображения, тогда как Max лучше работает с такими материалами как пластик и металл. Все это результат лени, и нежелания тратить время на получение нужного результата. При определенных усилиях можно получить совершенно одинаковые результаты в разных программах.
Кроме того, каждая компания заявляет, что именно ее рендерер является самым быстрым. Но такие заявления очень трудно доказать (впрочем как и опровергнуть), так как для этого необходимо создать равные условия работы – а это довольно сложно, учитывая, что программы работают с разными пакетами 3D моделирования. Что можно сказать наверняка, так это то, что Pixar RenderMan и Electric Image Camera работают более быстро, чем их аналоги, основанные на трассировке лучей.
В методе трассировки лучей довольно мало способов ускорить процесс. Первый и главный способ – мультипроцессорная обработка сцены, такая функция встроена практически во все популярные пакеты 3D- моделирования и рендереры. Большинство из них также поддерживают сетевой рендеринг. Все зависит от того, сколько вы готовы платить – LightWave распространяет эти функции бесплатно, в других пакетах необходимо покупать отдельную лицензию на каждую машину, участвующую в рендеринге.
Maya
По мнению многих профессионалов Maya обладает самыми лучшими инструментами для анимации мягких тел. Эти инструменты позволяют данной программе создавать очень реалистичную анимацию ткани и воды. Еще одна уникальная черта данной программы – интерактивный рендерер, позволяющий практически мгновенно видеть результаты работы, включая освещение, текстуры, линзы и другие эффекты.
Еще одни трюк этой программы, это то, что перед финальным рендерингом она разбивает сцену на блоки. Для каждого блока оценивается время рендеринга и если оно совпадает с желанием пользователя – блок отправляется на финальный рендеринг, если ориентировочное время рендеринга выходит за установленные рамки, блок разбивается на новые блоки - и так далее. Также Maya проводит оценку видимости объектов перед рендерингом и в процессе рендеринга эти объекты просто пропускаются.
NewTek LightWave
Считается, что LightWave обладает одним из лучших рендереров. По заявлениям NewTek, их продукт является самым быстрым и точным (впрочем, так говорят все компании о своих продуктах). LightWave использует 96-битную глубину цвета. Новая версия пакета будет обладать способностью обсчитывать анимацию методом Radiosity (впервые на рынке подобных продуктов). Эта программа также поддерживает мультипроцессорный и сетевой рендеринг и выборочную трассировку лучей.
Pixar RenderMan
RenderMan является основным рендерером кино-теле индустрии. Его основным преимуществом является скорость и способность обсчитывать сцены высокой сложности (с многими тысячами полигонов). Разработчики данной программы также гордятся качеством выполнения antialiasing и motion blur, точностью настроек камеры.
RenderMan – это scanline рендерер, поэтому для работы ему требуется набор шейдеров (shader) для создания реалистичных световых эффектов. Разработчики программы создали целый язык, на котором можно программировать шейдеры, но это довольно сложно и многие компании нанимают специалистов для программирования шейдеров. Разумеется Pixar обладает стандартной библиотекой шейдеров которую вы можете использовать, кроме того, существует много отдельных студий, занимающихся их созданием.
RenderMan – это только программа рендеринга без возможности моделирования. Вам придется создавать и анимировать сцены в других программах, а затем передавать их в RenderMan для финального рендеринга. Для этой цели существуют дополнительные программы.
Electric Image Camera
Данная программа является аналогом RenderMan и также ориентирована на кино-теле индустрию. Ее показатели и принцип работы практически совпадает с RenderMan. Единственное различие – программирование шейдеров не является таким сложным процессом и требует лишь знаний C и C++.
Discreet 3D Studio MAX
Max – это рабочая лошадка 3D индустрии во всех областях: рендеринг, моделирование, анимация. Это, возможно, самая гибкая программа т.к. вся ее работа основана на плагинах. Таким образом вы можете добавить в нее те функции, которые вам необходимы и настроить программу под ваши нужды. В этом Max далеко обогнал всех своих конкурентов. Таким образом, если вам не нравится работа встроенного рендерера, вы можете с легкостью поменять его на дюжину других, которых он поддерживает.
Softimage Mental Ray
Данная программа использует комбинацию scanline и raytracing. Также есть возможность программировать свои собственные шейдеры (если вы знаете C или C++). Если такая задача вас пугает – существует множество уже готовых.
Что нас ждет в будущем
Какие же улучшения в области рендеринга нас ждут в будущем? Phil Miller, исполнительный менеджер Max говорит: "Скорость – это необязательно следующий шаг. Мы уже знаем как повторить большинство тех образов, которые мы видим в реальной жизни. Мы можем повторить 95% эффектов реальной жизни, но каждый новый уровень реализма требует удвоения количества расчетов и при этом только слегка приближает нас к реальности. Возможно теперь, когда производительность процессоров так выросла, мы сможем осуществить это".
Brad Peeble, сотрудник NewTek соглашается: "В настоящее время процесс развития рендеринга идет в двух направлениях. Первое - реал-тайм рендеринг, но с большим уровнем физического реализма и световых эффектов – это нас ждет в скором будущем, с ростом производительности процессоров нам уже не нужно будет имитировать поведение света – мы сможем точно рассчитать его. Второе – обогнать фотореализм. Мы хотим иметь возможность создавать сцены, которые будут выглядеть лучше реальности".
Автор - Guy Wright