Механика виртуальности: RayTracing
АрхивТехнологииКогда объемы вычислений станут измеряться терабайтами и терафлопcами, можно будет подумать о достижении максимальной реалистичности трехмерных сцен за счет точного моделирования освещения.
Как только компьютеры обрели достаточную вычислительную мощность, их тут же стали использовать для рисования трехмерных изображений - в научных и производственных целях (программы автоматического проектирования и визуализации) или в развлекательных (компьютерные игры, мультфильмы, мультимедия).
Всю компьютерную 3D-графику можно поделить на две части - графика реального времени и трехмерные сцены, расчет которых в реальном времени по тем или иным причинам невозможен или неприемлем. В играх, например, как правило, присутствует графика обоих типов: в самой игре графика, естественно, реального времени, поскольку программа должна постоянно перерисовывать игровой мир в зависимости от действий игрока и происходящих событий, а вот мультик, использующийся в качестве заставки, создается заранее и записывается в видеофайл, который затем проигрывается. Так как время, то есть вычислительные ресурсы для рендеринга (программной отрисовки) мультфильма, практически не ограничено (каждый кадр мультфильма может рисоваться минутами), то в данном случае качество изображения выше, чем в игре, графический движок которой располагает относительно небольшими вычислительными ресурсами. Поэтому для выполнения различных задач используются различные алгоритмы компьютерной визуализации. Для мультфильмов применяются методы, позволяющие получить реалистичное качественное отображение, пусть и ценой времени, а в игровой графике, наоборот, используются "быстрые" методы, но принципиально ограниченные в возможностях. В статье речь пойдет о том, как создаются правдоподобные эффекты освещения объектов - ведь именно игра света и тени во многом определяет то, насколько живо и натурально выглядит трехмерная виртуальная реальность.
Недостатки традиционной технологии
Одним из недостатков традиционного подхода при формировании трехмерных изображений в современных компьютерных играх и даже в ряде профессиональных программ трехмерного моделирования и визуализации является весьма приближенная модель освещения.
Как известно (подробности см., например, в статье "Механика виртуальности"), для создания изображения в трехмерных играх объекты сцены задаются совокупностью треугольников. Для каждого из них определяется набор цветовых текстур, а их комбинация отображает материал, из которого сделан данный объект. Этот набор "заталкивается" в видеоускоритель, умеющий быстро растеризовать, то есть рисовать из пикселей текстурированные треугольники, предварительно поворачивая их в зависимости от текущего положения наблюдателя и используя так называемый буфер глубины (Z-буфер) для отсечения невидимых участков (пикселей) (А именно, при отрисовке новых точек треугольника их "глубина" на картинке сравнивается с близостью к плоскости экрана уже нарисованных пикселей, которая и хранится в Z-буфере. И если новый треугольник ближе к наблюдателю, то он рисуется, и значения Z-буфера обновляются).
Современные визуальные процессоры (VPU) при отрисовке каждого пикселя умеют также исполнять шейдеры - небольшие программки, оперирующие информацией, специфичной для данной точки растеризуемого треугольника. Шейдеры (подробнее в статье "Механика виртуальности"), хотя это название и образовано от английского shade - "затенять", предназначены, в частности, для лучшего отображения материала поверхности путем комбинирования текстур цвета и рельефа. А при расчете освещения заданной точки рисуемого треугольника шейдеры просто исходят из расстояния до источника света и угла падения световых лучей. И то лишь, если динамическое освещение вообще предусмотрено в игре.
Как правило, большинство источников света являются статическими и освещение от них рассчитывается заранее и записывается в еще одну специальную текстуру. Но как быть с тенями? Ведь при изменении положения моделей какие-то объекты оказываются затененными?
Если затенением не пренебрегают вовсе (например, считая, что сцена освещена достаточно ярким светом, проникающим во все уголки), то тени от динамических объектов рисуются особым образом. Затененная область представляется как некий геометрический объект, который отображается на основе той же технологии растеризации текстурированных треугольников. Примерно так, как в рисованных мультфильмах художники-мультипликаторы рисовали тени от персонажей. Только вместо кисти аниматора используется видеоускоритель, а именно, тень представляется или как специальная текстура с черным силуэтом объекта, которая накладывается на затеняемые треугольники (отбрасывающая тень модель сначала рисуется в эту теневую текстуру), или как теневой объем, некая область пространства, затеняемая данной моделью. Контур и поверхность этой области как бы рисуются на экране, и попавшие в нее треугольники закрашиваются темным цветом.
Такая упрощенная модель принципиально не позволяет получить многих эффектов, необходимых для реалистичного с точки зрения освещения изображения сцены. И в первую очередь, так называемого вторичного освещения, когда некоторые затененные части сцены слегка освещены отраженным светом. Преломления и отражения лучей света, распространение света в среде и другие световые эффекты тоже не рассчитываются.
Да что говорить, до сих пор в большинстве трехмерных игр используется почти статичная модель освещения на основе lightmap - текстур освещенности. Только недавно вышла игра Doom 3 с ограниченным использованием динамических источников света и с динамическими же тенями от всех объектов. Из-за неприспособленности ускорителей и традиционного полигонального метода для рисования теней действие в игре происходит в очень ограниченном и полутемном пространстве. И в обозримом будущем получить нечто заметно лучшее с помощью традиционных видеоускорителей вряд ли удастся, так как полигональный метод не предполагает моделирования освещения. Он предназначен, в первую очередь, для быстрого построения геометрии сцены.
К счастью, существуют методы, позволяющие реалистично моделировать освещение сцены, и далее мы рассмотрим их перспективы с точки зрения использования в трехмерной графике.
Метод трассировки лучей
Трассировка лучей (ray tracing, рэйтрейсинг) - это способ расчета освещения сцены с фотореалистичным качеством, который год от года становится все популярнее. Рассмотрим сначала прямую трассировку лучей или, иначе говоря, трассировку фотонов. В данном случае представляется, что источник света испускает фотоны во все стороны и распространение каждого кванта света рассчитывается отдельно: например, какого объекта сцены он достиг в первую очередь, в какую сторону отразился, какое количество световой энергии унес с собой (рис. 1).
Как правило, применяется вероятностная модификация метода: при моделировании отдельные кванты испускаются в случайном направлении от источника света, и чем больше квантов будет рассчитано, тем полнее будет картина освещения. Использование физически достоверной модели распространения света позволяет получить реалистичную картину освещения с учетом вторичного освещения и других эффектов, но такой подход требует большого объема вычислений. Для каждого кванта необходимо произвести уйму сложных операций, хотя бы для нахождения точки столкновения с первым объектом. Особенно если объектов на сцене много и каждый представлен большой совокупностью треугольников.
Этот метод занял свое место среди "non-realtime" технологий визуализации. Его любят использовать для предварительного расчета статического освещения и игровых уровней. Таким образом, заранее рассчитанное освещение записывается в вышеупомянутые текстуры - карты освещенности. Например, уровни для компьютерной игры Quake III считаются несколько часов! Даже для небольшой видимой части уровня расчет занимает десятки минут, что в тысячи раз медленнее, чем необходимо для рисования в реальном времени.
Метод прямой трассировки фотонов полностью универсален благодаря приближенной к реальности модели освещения. Правда, он не учитывает некоторые волновые свойства света. Помните, из школьного курса физики? Если источник света расположить за сферой, то на определенном расстоянии, прямо посередине круглой тени от шара, появится светлая точка. Но чтобы это рассчитать, нужно моделировать всю реальность, и никакой мощности не хватит. Поэтому чаще используется модификация метода, называемая обратной трассировкой лучей.
Метод обратной трассировки лучей
Суть его в том, что лучи света рассчитываются и трассируются в обратном направлении - как бы из глаза наблюдателя. Представьте экран, через каждый пиксель которого в направлении от наблюдателя проводится луч и трассируется до пересечения с объектом сцены (рис. 2). Далее рассчитывается отраженный луч (в направлении на источник света), чтобы учесть световую энергию, которая может быть перенесена в направлении наблюдателя. Отраженный луч, то есть, на самом деле, луч, который отразился и попал в глаз наблюдателя, анализируется аналогично. И далее рекурсивным образом. Так можно рассчитывать вторичное освещение, отражение и преломление света. Это будет, конечно, хорошее, но все же приближение вторичного освещения.
Глубина рекурсии характеризует качество аппроксимации освещения: чем больше отраженных лучей проанализировано, тем выше качество, и дольше процесс вычислений. Если рассчитывать только первый луч и луч из точки пересечения в направлении источника света, то можно получить только непосредственные тени объектов - без вторичного освещения и отражений.
Метод можно расширить для поддержки объемных источников света. Но тогда в направлении источника света необходимо выпускать несколько лучей. Возможны и другие модификации, однако все они предполагают значительное увеличение количества лучей для формирования более реалистичной картинки. Тем не менее, и без сильных усовершенствований обратную трассировку лучей можно использовать для реалистичной компьютерной визуализации. Она нашла широкое применение в пакетах трехмерного компьютерного моделирования, таких как Discreet 3ds max, Lightwave и т.п. Причем в этом случае расчет производится силами только центрального процессора компьютера (или нескольких процессоров в многопроцессорных системах), без привлечения трехмерных OpenGL-возможностей графических ускорителей.
Безусловно, разнообразное текстурирование предусматривается и при рэйтрейсинге. Когда луч пересекается с объектом, смотрятся текстурные координаты данной точки пересечения и происходит наложение текстуры обычным образом. Правда, по сравнению с традиционной технологией, метод трассировки лучей хуже приспособлен для изображения простых сцен без расчета освещения, поскольку для каждого пикселя экрана нужно провести луч и проверить его пересечение со всеми объектами сцены, чтобы найти ближайшее (На самом деле не со всеми, ведь существуют различные технологии оптимизации. Например, объекты сцены объединяются в группы, которые содержатся в простых геометрических формах вроде сферы. Сначала проверяется, пересекает ли данный луч объемлющую сферу, и только если пересекает, рассматриваются внутренние объекты).
Тем не менее, это все очень сложные математические вычисления, для которых так просто не сделаешь ускоритель, в отличие от полигонального метода, основанного на очень простом и коротком цикле рисования треугольника. Поэтому когда мощность персональных компьютеров была небольшой, альтернативы полигональному методу практически не было. Однако с ростом производительности процессоров и развитием микроэлектроники в целом постепенно стала возможной реализация метода трассировки лучей в реальном времени, пусть с ограничениями и в небольших разрешениях (количество лучей пропорционально разрешению экрана, и чем оно меньше, тем выше скорость), а также построение специализированных "изощренных" ускорителей рэйтрейсинга.
Аппаратное ускорение рэйтрейсинга
Современная игровая компьютерная графика уже немыслима без специализированных ускорителей, которые в глазах геймеров даже важнее процессоров. А потребительский ускоритель с поддержкой метода трассировки лучей так пока и не создан. Почему? Чтобы это понять, рассмотрим предпринимавшиеся попытки.
Компания Advanced Rendering Technology производит "ускоритель трассировки лучей" для профессионального применения, а именно, для ускорения рендеринга в пакетах трехмерного моделирования. Называется он Pure и представляет собой плату для шины PCI, на которой установлено восемь (!) специализированных процессоров для рэйтрейсинга - AR350 (разумеется, собственного производства). Процессор, изготовленный по 0,13-микронному технологическому процессу, умеет за один такт определять пересечение луча и треугольника и работает на частоте в 350 МГц.
Следует отметить, что метод как прямой, так и обратной трассировки лучей прекрасно масштабируется по количеству процессоров (см. также послесловие в конце этой статьи), поскольку лучи и фотоны могут трассироваться практически независимо друг от друга, и каждому процессору можно выделить свою часть лучей для обработки, например, разделив экран на N одинаковых частей и поручив каждому процессору рендерить свою часть. То есть на большом количестве процессоров можно получить вычислительную систему, полностью эквивалентную, с точки зрения рэйтрейсинга, одному высокочастотному процессору (а может и более эффективную - за счет параллельности вычислений).
Но почему же Pure использует столь низкочастотные процессоры? (На самом деле, не такие уж они низкочастотные, вполне "на уровне" новейших видеоускорителей ATI и nVidia. Например, графические процессоры последнего поколения от ATI, производимые даже по более "тонкой" 0,11-микронной технологии - X300 и X700 - работают на частотах от 325 до 475 МГц, а самые мощные на данный момент GPU от nVidia - GeForce 6800 - имеют частоту ядра от 325 до 400 МГц при 0,13-микронной технологии производства). Это не случайно. Просто современные графические процессоры исповедуют иной подход к вычислениям, нежели высокочастотные микропроцессоры вроде Pentium 4 или Athlon 64: вместо параллельного конвейерного исполнения команд, при котором одновременно выполняются, находясь на различных стадиях, десятки процессорных инструкций, в графических процессорах используются короткие вычислительные конвейеры, но их количество, как правило, может легко масштабироваться в пределах одного ядра (вспомним, например, о шестнадцати пиксельных и, как максимум, восьми вершинных конвейерах в последних ускорителях ATI и nVidia). То есть сравнимая производительность фактически достигается не повышением частоты единственного универсального вычислителя как в настольных процессорах, а наращиванием числа самих вычислителей, ориентированных на узкоспециализированные задачи.
Получается, что специализированный процессор для трассировки лучей примерно эквивалентен "обычному", который будет искать пересечение луча несколько десятков тактов, но и работает на более высокой (на порядок) частоте. Правда, в данном случае низкочастотный процессор AR350 не требует интенсивного охлаждения, что и позволило объединить восемь таких чипов на одной плате. Вот только стоит такой ускоритель порядка тысячи долларов, и все равно "реал-тайма" не обеспечивает. Действительно, он может обеспечить максимальное ускорение раз в двадцать по сравнению с современными процессорами, но сложные сцены, для оптимизации работы с которыми и предназначен ускоритель, обсчитываются в 3ds max минутами. А сцены попроще, без сложных световых эффектов, экономически выгоднее изображать с помощью обычных потребительских ускорителей игровой графики.
Игровой ускоритель с поддержкой рэйтрейсинга
Рассмотрим еще одну интересную попытку сделать (на этот раз уже специально для игровой графики) ускоритель с поддержкой трассировки лучей. Немецкие ученые из Саарского университета сконструировали прототип такого ускорителя. Он внешне похож на обычный VPU, поскольку также обладает одним чипом, в отличие от Pure.
Прототип, до сих пор не запущенный в массовое производство, работает на частоте всего в 90 МГц. Ускорение достигается за счет еще большей параллельности вычислений, но на сей раз модули трассировки лучей интегрированы в один кристалл. Ускоритель умеет рендерить уровни Quake III с реализацией эффектов, присущих трассировке лучей, включая полностью динамические тени, отражения и преломления (рис. 4) (Подробная информация, множество скриншотов и отрендеренные мультики доступны на этой странице. Техническое описание ускорителя (в формате PDF) см. здесь). Но с приемлемой скоростью - только в разрешении 512 x 384, и то производительность иногда "проседает" до десяти кадров в секунду. По-видимому, это обстоятельство, а также высокая стоимость метода и помешали пока его широкому распространению. К тому же, ускоритель не обеспечивает ряда возможностей повышения качества изображения, предоставляемых обычными VPU: трилинейная и анизотропная фильтрация текстур и продвинутые технологии антиалиасинга (сглаживания) проще реализуются на давно развивающихся традиционных ускорителях.
Математическая производительность этого ускорителя примерно эквивалента скорости Pentium 4 с частотой в 10 гигагерц. Впрочем, напрямую такое сравнение вряд ли когда-либо удастся провести, поскольку наметившийся в последнее время кризис архитектуры NetBurst позволяет надеяться лишь на многоядерные процессоры и архитектуру параллельных вычислений гораздо больше, чем на безудержный рост частот. Таким образом, первый потребительский ускоритель трассировки лучей (если когда-нибудь поступит в продажу), скорее, будет давать картинку не столько лучшего качества, сколько с другим подходом и акцентированием на новых эффектах. Кому-то важно качественное текстурирование и высокое разрешение, а кто-то предпочтет более низкое разрешение, но динамическое освещение.
Движок AntiPlanet и программная трассировка лучей в реальном времени
Рэйтрейсинг предоставляет обширные возможности по реализации эффектов освещения, но при этом крайне требователен к вычислительным ресурсам, и рендеринг сложных сцен из десятков тысяч треугольников еще не скоро будет возможен в высоких разрешениях в реальном времени - что на обычных процессорах, что на специализированных ускорителях. Однако у метода трассировки лучей есть преимущество: он не ограничен одним только треугольником в качестве базового примитива для представления сцены, как обычный растеризующий метод. Таким образом, появилась мысль отказаться от моделирования "земноподобной" реальности, требующей треугольников для представления объектов, и использовать в качестве базовых примитивов для построения сцены более удобные для трассировки лучей сферы. То есть отображается некоторая инопланетная сюрреальность, зато со световыми эффектами, возможными благодаря применению метода обратной трассировки лучей. В первую очередь, полностью динамическим освещением и затенением всей сцены в реальном времени, которое нельзя увидеть в современных компьютерных играх.
Первым из авторов этой статьи была написана подобная программа - компьютерная игра AntiPlanet (рис. 5), использующая для визуализации сконструированных из сфер внеземных миров полностью софтверный графический движок на основе метода трассировки лучей. Ее можно скачать отсюда. Использование сфер позволило добиться на современных процессорах "играбельной" частоты кадров при разрешении 1024 x 768/32bit. Причем на геометрически достаточно сложных сценах, но не полигональных. Правда, не все возможности трассировки были реализованы.
Программа AntiPlanet использует для расчета сцен ресурсы только центрального процессора (и системной памяти), совсем не привлекая для этого графический ускоритель. Ее даже можно использовать в качестве сравнительного теста быстродействия (бенчмарка) процессоров и материнских плат, как, например, поступал второй из авторов статьи (рис. 6).
Заключение
Итак, мы сравнили метод трассировки лучей и традиционную технологию, рассмотрели возможности программной и аппаратной реализации рэйтрейсинга в реальном времени. Алгоритмы метода трассировки лучей позволяют естественным образом отображать реалистичное освещение, но уступают традиционной технологии в других компонентах. В частности, современные видеоускорители, в каком-то смысле подменяющие кисть мультипликатора, более приспособлены для качественного изображения материалов. Их также легко использовать для приближенного рисования объектов и эффектов, которые "честным путем" смоделировать в реальном времени не представляется возможным. Например, какой-нибудь туман с рассеянным светом, или мех. Их не рассчитать, поскольку там идет многократное отражение-рассеяние света, зато можно легко нарисовать примерно похожую текстурку или написать шейдер. В то время как метод трассировки лучей больше ориентирован на честное физическое моделирование, которое еще очень долго будет крайне сложной вычислительной задачей, но благодаря высокой реалистичности "картинки" будет непременно использоваться в профессиональных задачах - спецэффектах в кино, телевизионных роликах, мультфильмах, при моделировании проектируемых объектов, наконец (автомобили, интерьеры, здания и пр.).
Вместо послесловия: рэйтрейсинг - технология будущего
Количество данных в трехмерных сценах непрерывно растет, причем не только в профессиональных задачах, где требуются все более высокая детализация и точность воспроизведения объектов, но и в играх, где разработчики хотят создать виртуальную реальность, все больше похожую на правду (в плане визуального восприятия, а не сценариев существования, конечно). Уже сейчас многие трехмерные модели и сцены насчитывают миллионы полигонов. А к этому еще нужно добавить сложные эффекты освещения - ведь именно они придают изрядную долю реализма картинке. Потребность "максимально достоверно" работать с действительностью путем создания и распознавания трехмерных образов в реальном времени выливается в то, что уже сейчас речь идет о наступлении "эры Тера", то есть эры, когда объемы вычислений будут измеряться терабайтами и терафлопсами (в отличие, например, от предыдущих эр кило, Мега и текущей Гига, когда было достаточно мегабайт данных и мегагерц частоты при вычислениях для выполнении типичных задач примерно десятилетней давности или гигабайт данных и гигафлопс - для обработки современного мультимедийного контента).
Один из примеров "эры Тера" - достижение максимальной реалистичности трехмерных сцен за счет точного моделирования освещения и множественных отражений. Как мы видели, сегодняшняя графика в целях упрощения часто пренебрегает подобными эффектами или делает их приближенными. Это порождает неправильные отражения и тени на генерируемых картинках, что становится особенно заметно при приближении к моделируемым объектам. Более достоверные методы рэйтрейсинга отнимают на современных компьютерах минуты и даже часы для расчета только одного кадра. Совершенствование программных алгоритмов рэйтрейсинга в некоторых современных лабораториях, конечно, позволяет частично скомпенсировать это, однако все равно необходимы мощные системы для проведения расчетов в приемлемый отрезок времени. Например, "графический" (с применением рэйтрейсинга) движок немецкой компании inTrace, работающей по контрактам с Audi, Airbus и другими промышленными концернами, состоит из 23 двухпроцессорных систем на Intel Xeon (на фото) суммарной производительностью в 400 гигафлопс (скоро его "нарастят" до терафлопса). Сцена с полем подсолнухов и деревьями, состоящая из одного миллиарда полигонов и теней (см. фото), рассчитывается такой системой со скоростью в четыре кадра в секунду при разрешении 640 x 480. А ведь в будущем такие насыщенные деталями сцены станут повседневной реальностью, отражающей, например, нашу природу…
Но у метода трассировки лучей есть и преимущества. Это более простое создание контента (простые модели), реалистичные световые эффекты и отражения, отличная масштабируемость. И это непременно должно оказать влияние на развитие графики уже в ближайшем будущем. Как пояснил на одном из недавних Форумов Intel для разработчиков Филипп Слюсаллек, профессор компьютерной графики в Саарском университете в Германии и соучредитель компании inTrace, оказывается, масштабируемость разных методов расчета трехмерных сцен при возрастании их сложности совершенно различна! Так, эффективность традиционного метода Hardware Rasterization (описанного в в статье "Механика виртуальности") экспоненциально падает при возрастании сложности сцены (см. график). В то же время, метод трассировки лучей превосходно масштабируется как по количеству процессоров в системе (1, 2, 4 и т. д.), так и по сложности задачи (количеству полигонов), и его эффективность почти не падает при возрастании сложности сцены с миллиона до миллиарда полигонов (см. тот же график)! Это приводит к тому, что в будущем, с ростом производительности компьютеров и появлением многоядерных процессоров, все больше и больше приложений будут использовать рэйтрейсинг вместо традиционной (и упрощенной) растеризации, и со временем последняя полностью уступит место трассировке лучей - даже в трехмерных action-играх, где растеризация пока господствует безраздельно. Хотя интересные игры с применением рэйтрейсинга (Oasen, Ray City и другие) уже создаются. Примеры здесь.