
Основы рендеринга. |
Автор - Guy Wright Перевод и адаптация - Paggard paggard@yahoo.com Страница 1: Потоковый рендеринг Страница 2: Scanline рендеринг | Raytrace рендеринг | Ретуширование | Real-Time против Non-Real-Time Страница 3: Посмотрим... | Maya | LightWave | RenderMan | Electric Image | MAX | Softimage | Будущее | Заключение
Для многих людей слово "рендеринг" прочно ассоциируется с другим: "ожидание". Для небольшого же количества людей слово "рендеринг" означает комплекс математических операций с широким диапазоном возможных результатов. Эта статья, я надеюсь, поможет людям, далеким от программирования, понять, что же происходит внутри компьютера во время рендеринга. Мы рассмотрим несколько способов рендеринга и примеры их применения на практике. Большинство 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, который прекрасно подходит для неподвижных сцен, мало пригоден для рендеринга анимаций. В силу особенностей данного принципа, при рендеринге движущихся объектов возможно появление мерцания. |
Страница 2: Scanline рендеринг | Raytrace рендеринг | Ретуширование | Real-Time против Non-Real-Time Страница 3: Посмотрим... | Maya | LightWave | RenderMan | Electric Image | MAX | Softimage | Будущее | Заключение
Scanline рендеринг
Как я уже сказал ранее, существует два основных подхода к процессу рендеринга: scanline и raytracing. Что же представляет из себя Scanline рендеринг? Предположим, что нам необходимо получить изображение разрешением 300Х200. Программа проводит воображаемую линию через каждый пиксель, вычисляя, какие полигоны лежат на пути этой линии и вычисляет необходимый цвет пикселя, в зависимости от того, какие текстуры и цвета были назначены полигонам, встретившимся на пути этой воображаемой линии. Затем берется следующий пиксель, затем следующий – и так до конца.
Основной проблемой этого способа является отделение видимых полигонов от невидимых. В первых поколениях такого рода рендереров процесс вычисления полигонов начинался с самой дальней точки от зрителя и каждый новый полигон закрашивал предыдущий. Такой подход далек от идеала из-за множества ненужных операций. Чтобы решить эту проблему используется Z-буфер. Программа вычисляет все полигоны, лежащие на пути воображаемой линии и назначает каждому полигону Z-значение в зависимости от его удаленности от экрана. Когда настает время рендеринга, обсчитываются только полигоны с наименьшим Z-значением – остальные просто отбрасываются. Такой способ позволяет существенно ускорить процесс рендеринга, но имеет и существенные недостатки, которые будут рассмотрены ниже.
Raytrace рендеринг
Подобно Scanline рендереру, Raytrace рендерер начинает с вычисления воображаемой линии от одного пикселя (кроме того, существует инверсный рендеринг, когда вычисления начинаются от источника света и рендеринг использованием обоих принципов). Когда воображаемая линия встречает на своем пути полигон, случаются три вещи. Сначала вычисляется цвет и яркость на основе прямого освещения источниками света, затем вычисляются углы отражения и преломления (reflection/refraction). На основе параметров отражения/преломления данного полигона луч раздваивается и двигается по двум новым направлениям. Если любой из этих лучей встретит полигон, он раздваивается снова – и так до определенного момента, когда луч либо уйдет за пределы сцены, либо встретит источник света, либо количество отражений/преломлений достигнет определенного установленного числа (recursion level). Когда все лучи закончат свое движение, вычисляется окончательное значение пикселя.
Инверсные трассировщики лучей начинают вычисления от источника света, с огромного количества лучей света, отражающихся от объектов сцены, которые возможно пройдут через нужный пиксель и достигнут зрителя.
Я думаю вы представляете себе, с какой легкостью такие способы вычислений могут поглотить миллиарды вычислений и занять огромное количество времени. Создатели таких рендереров обычно дают пользователю возможность точно указать, сколько отражений луча обсчитывать. Иногда пользователь может пользоваться только уже заранее установленными настройками типа good; better; best.
Выгодой такого способа является точность обсчета отражений и преломлений – свет отражается от зеркала либо проходит через воду именно так, как это происходит в реальной жизни. Такой способ рендеринга позволяет точно вычислять тени. Когда луч встречает полигон, программа пытается провести от этого полигона прямой луч к источнику света, если это невозможно – полигон затеняется.
Основные недостатки – огромное число вычислений и исключение из обсчета определенных свойств света (отраженное освещение). В природе нет абсолютно черных теней, т.к. весь мир наполнен отраженным освещением. Многие рендереры пытаются избавиться от этих недостатков двумя путями: они либо добавляют общее освещение (global illumination), которое освещает всю сцену, либо представляют все объекты сцены как отдельные источники света, способные излучать слабый свет.