Для многих людей слово "рендеринг" прочно ассоциируется с другим: "ожидание". Для небольшого же количества людей слово "рендеринг" означает комплекс математических операций с широким диапазоном возможных результатов. Эта статья, я надеюсь, поможет людям, далеким от программирования, понять, что же происходит внутри компьютера во время рендеринга. Мы рассмотрим несколько способов рендеринга и примеры их применения на практике.
Большинство 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. Мы рассмотрим основных представителей этих категорий и их различия, чтобы вы смогли самостоятельно выбрать наиболее для вас подходящий.
Потоковый рендеринг основывается на четырех уровнях.
Все объекты 3D сцены четко определены в пространстве, до того, как вы помещаете объект в сцену, у него уже есть собственное геометрическое описание: длина, высота, ширина и глубина, но он пока никак не связан с другими объектами. В этот этап также может входить и процесс tessellation (когда обсчитываемые поверхности трансформируются в полигоны). Тут нужно быть осторожным, т.к. если вы используете NURBS и поверхности Безье – точность выполнения tessellation виляет на окончательные результаты.
Когда вы помещаете объект в сцену, он приобретает дополнительные геометрические описания, теперь у него есть точная позиция и ориентация по отношению к другим объектам сцены. На этом этапе назначаются параметры поверхностей объектов и устанавливается освещение. Также объектам могут быть присвоены анимационные ключи.
Когда в сцене появляется камера, все объекты приобретают новый параметр – ориентация и местоположение по отношению к камере. На этой стадии все полигоны проверяются на предмет видимости, полигоны, не видимые камерой игнорируются. Этот процесс называется отсеиванием невидимых поверхностей (backface cutting). Камере также могут быть присвоены анимационные атрибуты.
Далее, все объекты трансформируются с точки зрения конечного изображения. Сначала, в зависимости от настроек камеры (фокусное расстояния, поле зрения и т.п.) формируется визуальный коридор. Полигоны полностью за пределами визуального коридора игнорируются, лежащие на границе – усекаются. На этом этапе выполняется множество визуальных трюков, чтобы компенсировать искажение перспективы (более удаленные вещи кажутся меньше и т.д.).
Теперь мы входим в ту стадию, которую большинство людей считает собственно процессом рендеринга, хотя технически все вышеперечисленные этапы - это часть потокового рендеринга. Итак, обрезанные и корректно искаженные полигоны проецируются на плоскость (как будто на экран монитора). Каждый полигон преобразовывается в растровый формат, ретушируется, вычисляется глубина цвета. На этом этапе могут применены различные эффекты типа Antialiasing и Motion Blur.
Все эти этапы – это части "технического" рендеринга и большинство пакетов 3D моделирования позволяют выполнять их в реальном времени и приступать к финальной стадии только после нажатия кнопки "RENDER".
В то время, как начальные этапы потока довольно незамысловаты (чистая математика), последняя стадия может быть выполнена огромным количеством способов, приемов и трюков, призванных ускорить процесс, но в тоже время сделать сцену максимально реальной. К сожалению, многие приемы, используемые для ускорения процесса или достижения определенного визуального эффекта ведут к появлению проблем, которые решаются с помощью новых приемов и трюков (со своими проблемами) – и так далее.
Например, рендереры, основанные на принципе Radiosity, берут почти готовую сцену и анализируют количество света, отраженного от других поверхностей, с учетом изменения его спектра, этот свет в свою очередь отражается от поверхности и падает на другую… Эти вычисления повторяются снова и снова. Когда вычисления закончены, каждая поверхность окрашивается и ретушируется в соответствии с результатами вычислений. Главной проблемой такого способа является то, что для ограничения времени выполнения (иначе вычисления длились бы бесконечно), обсчет ведется в соответствии с определенным алгоритмом, но именно в результате этого некоторые поверхности могут быть выключены из общего процесса и окрашены некорректно.
Тем не менее, такой способ рендеринга дает прекрасные результаты. Но Radiosity, который прекрасно подходит для неподвижных сцен, мало пригоден для рендеринга анимаций. В силу особенностей данного принципа, при рендеринге движущихся объектов возможно появление мерцания.
[Вперед]