C 3d графика: Работа с 3-ёх мерными объектами в С# с использованием OpenGL
Популярно о компьютерной 3D графике, часть 1 / Хабр
Все мы слышали о 3D графике (далее просто 3D, не путать со способом отображения — голограммами, 3D-мониторами и т.п.), многие прекрасно знают, что такое 3D и с чем его едят. Но, все же, есть и те, кто смутно себе представляет, что кроется под этой короткой аббревиатурой. Статья рассчитана на тех, кто не имеет представления о компьютерной графике. Также будет немного экскурса в историю компьютерной графики (в следующих планируемых частях).
Почему именно 3D? Как нетрудно догадаться, речь идет о 3 Dimension, или о трех измерениях. И не обязательно при этом, чтобы и отображение было в 3D. Речь идет о способе построения картинки.
Часть 1. Собственно, моделирование
Традиционно рисуют в 2D (по осям X и Y) — на бумаге, холсте, дереве и т.п. При этом отображают какую-то одну из сторон предмета. Картинка сама по себе плоская. Но если мы хотим получить представление обо всех сторонах предмета, то необходимо нарисовать несколько рисунков. Так поступают в традиционной рисованной анимации. Но, вместе с тем, существует, (кстати, в СССР была довольно хорошо развита) т.н. кукольная анимация. Один раз изготовленную куклу снимают в необходимых позах и ракурсах, получая серию «плоских картинок». 3D (к X и Y добавляется координата глубины Z) визуализация — это те же «куклы», только существующие в цифровом виде. Другими словами, в специальных программах (Blender, 3ds Max, Maya, Cinema 4D и т.п.) создается объемное изображение, например авто.
Преимущество данного метода в том, что в распоряжении, скажем, аниматора есть объемная модель, необходимо лишь поместить ее должным образом в кадр, анимировать (задать траекторию передвижения или рассчитать с помощью симулятора) при необходимости, а уж отображение авто в финальной картинке ложится на специальную программу называемую визуализатором (render). Еще одно преимущество в том, что модель достаточно нарисовать один раз, а потом использовать в других проектах (скопировав), изменять, деформировать и т.п. по своему усмотрению. Для обычного 2D рисунка, в общем случае, такое невозможно. Третье преимущество — можно создавать практически бесконечно детализированные модели, например смоделировать даже винтики на часах и т.п. На общем плане этот винтик может быть и неразличим, но стоит нам приблизить камеру, программа-визуализатор сама рассчитает, что видно в кадре, а что — нет.
Существует несколько способов моделирования, но самым популярным является полигональное моделирование. Нередко можно увидеть в роликах о 3D или фантастических фильмах как тот или иной объект представляется в виде т.н. сетки. (см. рисунок выше) Это и есть пример полигонального моделирования. Суть его в том, что поверхности представляются в виде простых геометрических двумерных примитивов. В компьютерных играх это треугольники, для других целей обычно используют четырехугольники и фигуры с большим кол-вом углов. Эти примитивы, из которых состоит модель, называют полигонами. Но при создании 3D объекта стараются обойтись, как правило, четырехугольниками. При необходимости четырехугольники (полигоны) без проблем превращаются в треугольники при экспорте в игровой движок, а при необходимости сглаживания или тесселяции модель из четырехугольников получается, как правило, без артефактов.
Что такое тесселяция? Если какой-то объект представляется в виде полигонов (особенно органические объекты, например человек), то понятно, что чем меньше размер полигонов, чем их больше, тем более близкой может быть модель к оригиналу. На этом основан метод тесселяции: сначала изготавливают грубую болванку из небольшого кол-ва полигонов, затем применяют операцию тесселяции, при этом каждый полигон делится на 4 части. Так вот, если полигон четырехугольный (а еще лучше, близок к квадрату) то алгоритмы тесселяции дают более качественный и предсказуемый результат. Также операция сглаживания, а это та же тесселяция, только с изменением углов на более тупые, при близких к квадрату полигонах, позволяет получить хороший результат.
Как было сказано выше, чем больше полигонов, тем более модель может (может, потому, что модель должна быть еще похожа на оригинал, а это вопрос мастерства моделера, а не полигонов) походить на оригинал. Но у большого кол-ва полигонов есть обратная сторона: понижение производительности. Чем больше полигонов, тем больше точек по которым они строятся, тем больше данных приходится обрабатывать процессору. Поэтому 3D графика — это всегда компромисс между детализацией модели и производительностью. В связи с этим даже возникли термины: hight poly и low poly, соответственно высоко полигональная модель и низко полигональная модель. В играх применяются низко полигональные модели, так как в них выполняется визуализация в реальном времени. Кстати, модели в играх представлены треугольниками для повышения производительности: графические процессоры умеют на аппаратном уровне быстро обрабатывать сотни миллионов треугольников за секунду.
Как правило, полигональное моделирование относится к пустотелому моделированию, где объект имеет только объем, но внутри пустой. Это означает, что если мы смоделируем куб, а потом удалим одну из стенок, то увидим внутри пустоту. Также имеются программы для твердотельного моделирования, где тот же самый куб представлен в виде монолитного объекта. В таких программах (к примеру, Autodesk Inventor) применяются математические модели отличные от тех, что в полигональном моделировании. Алгоритмы твердотельного моделирования лучше подходят для моделирования механизмов при разработке техники. Программы вроде Autodesk Inventor имеют средства для моделирования с учетом особенностей технологического процесса, как то фаски, сверление отверстий, проставление размеров, допусков и т.п. Получаемые модели можно сразу отправить на подходящий станок для получения изделия в металле или другом материале.
Также существуют так называемые программы 3D лепки (ZBrush, Autodesk Mudbox) в которых моделирование сводится (грубо говоря) к созданию углублений или выпуклостей. Такая техника похожа на то, как скульпторы лепят из глины — убирая ненужное и добавляя необходимое. С помощью таких программ можно добиться реалистичного рельефа поверхности, например морщин на коже или складок ткани. В настоящее время высокополигональные (а для лепки модель должна обладать солидным кол-вом полигонов) реалистичные модели людей и вообще животного мира выполняются, в большинстве своем, с применение программы лепки. Распространена практика когда заготовка модели создается с помощью полигонального моделирования, а затем в программе лепки тесселируется и добавляются мелкие детали.
Но вот у нас есть готовая модель, скажем, танка. Но на танк, собственно, она не совсем похожа. В чем же тут дело? На данном этапе у нас всего лишь математическая модель содержащая данные только о геометрической форме. Но у реального объекта кроме формы есть еще и цвет, плотность, отражающая способность, и, возможно, запах. Последнее пока в 3D графике не применяется, а вот все остальное можно смоделировать. Придание модели нужного цвета и блеска называют текстурированием, от слова текстура.
В общем случае текстура — это двумерный рисунок который накладывается на 3D модель. Текстура может быть как процедурной — сгенерированной при помощи алгоритма, так и нарисованная в графическом редакторе, или фотографией реального объекта. С помощью текстуры задается рисунок и цвет модели, но реальная поверхность обладает и другими параметрами: отражающей способностью, преломлением, рельефом, позрачностью и т.п. Все эти параметры задаются в свойствах материала. Т.е. материал с точки зрения 3D графики — это некая математическая модель описывающая параметры поверхности. Например, для воды обязательно необходимо указать прозрачность и преломляющую, отражающую способности.
Перед «нанесением» материала на 3D модель необходимо создать ее развертку, т.е. представить все (несколько, одну) поверхности в виде проекции на плоскость. Это необходимо для того, чтобы затем двумерная текстура правильно «лягла» на модель.
Таким образом изготовление 3D модели в общем случае состоит из следующих стадий:
1. Получение изображений референса (т.е. того, с чего будет моделироваться) или самого референса. Или отрисовка экскиза.
2. Моделирование геометрии на основе референса.
3. Создание развертки.
4. Отрисовка текстур или получение их другим способом в виде файлов.
5. Настройка параметров материала (текстуры, преломление, отражение, прозрачность).
Теперь 3D модель готова для визуализации — получении картинки.
Первый и четвертый пункт могут быть быть опущены если модель простая, но, как правило, хороших результатов без всех 5 шагов не добиться.
Подытожим.
Между обычным рисунком, скажем, на бумаге, и построением 3D изображения есть существенные различия в самом процессе. Двумерный рисунок, как правило, создается в два этапа: эскиз и раскрашивание. В 3D графике после изготовления модели ее необходимо поместить в сцену к другим объектам (или в так называемую студию), добавить освещение, камеру и лишь затем можно надеяться получить финальную картинку. Изображение в 3Dграфике просчитывается на основе физической модели, как правило, это модель распространения луча света с учетом отражения, преломления, рассеивания и т.п. Рисуя красками мы сами отрисовываем тени, блики и т.д., а в трехмерной графике мы подготавливаем сцену с учетом освещения, материалов, геометрии, свойств камеры, программа рассчитывает итоговую картинку сама.
Вот, на сегодня пока и все. Комментарии, а особенно вопросы и замечания по существу приветствуются.
P.S. В следующих частях (если Хабрабществу будет интересно) мы более подробно поговорим о трехмерном моделировании для игр, будет затронута визуализация, моделирование динамических сред, таких как вода, разрушение объекта и затронем динамическое взаимодействие между 3D объектами, историю 3D графики.
Трёхмерная графика с нуля. Часть 2: растеризация / Хабр
Первая часть статьи может быть доказательством того, что трассировщики лучей — это изящный пример программного обеспечения, позволяющий создавать потрясающе красивые изображения исключительно с помощью простых и интуитивно понятных алгоритмов.
К сожалению, эта простота имеет свою цену: низкую производительность. Несмотря на то, что существует множество способов оптимизации и параллелизации трассировщиков лучей, они всё равно остаются слишком затратными с точки зрения вычислений для выполнения в реальном времени; и хотя оборудование продолжает развиваться и становится быстрее с каждым годом, в некоторых областях применения необходимы красивые, но в сотни раз быстрее создаваемые изображения уже сегодня. Из всех этих областей применения самыми требовательными являются игры: мы ожидаем рендеринга отличной картинки с частотой не менее 60 кадров в секунду. Трассировщики лучей просто с этим не справятся.
Тогда как это удаётся играм?
Ответ заключается в использовании совершенно иного семейства алгоритмов, которое мы исследуем во второй части статьи. В отличие от трассировки лучей, которая получалась из простых геометрических моделей формирования изображений в человеческом глазе или в камере, сейчас мы будем начинать с другого конца — зададимся вопросом, что мы можем отрисовать на экране, и как отрисовать это как можно быстрее. В результате мы получим совершенно другие алгоритмы, которые создают примерно похожие результаты.
Снова начнём с нуля: у нас есть холст с размерами и , и мы можем расположить на нём пиксель ().
Допустим, у нас есть две точки, и с координатами и . Отрисовка этих двух точек по отдельности тривиальна; но как можно отрисовать отрезок прямой линии из в ?
Давайте начнём с представления прямой с параметрическими координатами, как мы делали это ранее с лучами (эти «лучи» — не что иное, как прямые в 3D). Любую точку на прямой можно получить, начав с и переместившись на какое-то расстояние в направлении от к :
Мы можем разложить это уравнение на два, по одному для каждой из координат:
Давайте возьмём первое уравнение и вычислим :
Теперь мы можем подставить это выражение во второе уравнение вместо :
Немного преобразуем его:
Заметьте, что — это постоянная, зависящая только от конечных точек отрезка; давайте обозначим её :
Что же такое ? Судя по тому, как она определена, она является показателем изменения координаты на изменение единицы длины координаты ; другими словами, это показатель наклона прямой.
Давайте вернёмся к уравнению. Раскроем скобки:
Группируем константы:
Выражение снова зависит только от конечных точек отрезка; давайте обозначим его , и наконец получим
Это классическая линейная функция, которой можно представить почти все прямые. Ею нельзя описать вертикальные прямые, потому что они имеют бесконечное количество значений при одном значении , и ни одного при всех остальных. Иногда в процессе получения такого представления из исходного параметрического уравнения такие семейства прямых можно упустить; это происходит при вычислении , потому что мы проигнорировали то, что может давать деление на ноль. Пока давайте просто проигнорируем вертикальные прямые; позже мы избавимся от этого ограничения.
Итак, теперь у нас есть способ вычисления значения для любого интересующего нас значения . При этом мы получим пару , удовлетворяющую уравнению прямой. Если мы будем двигаться от к
Что такое 3D-графика и как она устроена
Персонажи, оружие, машины, пончики, пейзажи… всё, что вы видите в играх и фильмах с использованием 3D-графики, состоит из точек, граней и плоскостей. Вот, например, изображение трёхмерной сферы:
Кажется, что это просто гладкий шар, но на самом деле он состоит из множества точек — вершин (англ. vertices — вершины):
Чем больше вершин, тем более детализированной выглядит модель и тем больше ресурсов требуется компьютеру, чтобы отрисовать такой объект на экране.
Вершины соединяются друг с другом и образуют рёбра (англ. edge) и грани (англ. face):
Всё это образует полигональную сетку (англ. polygon mesh или просто меш, геометрия) —- совокупность вершин, рёбер и граней (плоскостей), которая определяет форму объекта.
У каждой вершины есть свои координаты по осям X, Y и Z. А то, как грань отображается на мониторе, зависит от её положения относительно камеры и источников света:
Изменяя меш, добавляя вершины и меняя их положение, мы можем создавать любые сложные объекты:
3D-моделирование в Blender
Для создания твёрдых объектов (англ. hard surface) 3D-художники обычно меняют положение граней вручную, как это показано выше.
При работе с персонажами чаще используется скульптинг (англ. sculpting) — напоминает лепку из пластилина:
Скульптинг в Blender
Но геометрия — не последний этап создания 3D-модели. Например, у моделей, созданных скульптингом, плохая топология (то, как именно устроен меш) — слишком много задействовано вершин:
Чтобы исправить это, используют специальные инструменты для ретопологии — это когда удаляют лишние грани, чтобы оптимизировать модель.
Также нужно подготовить материал — это то, как окрашены разные грани или вся модель. Возможен как и простой цвет, так и изображение или паттерн.
Есть множество других важных моментов: анимирование, запекание текстур, составление карт нормалей и так далее. Всё это стоит вплотную изучить тем, кто собирается моделировать 3D. Сейчас же мы поговорим о более техническом вопросе.
Что такое 3D графика?
Вступление
Вопрос о том, что же является двигателем всей компьютерной индустрии, давно заботит многих пользователей. То ли это фирма Intel, которая, не переставая, выпускает и выпускает новые процессоры. Но кто тогда заставляет их покупать? Может, во всем виноват Microsoft, который непрерывно делает свои окна больше и краше? Да нет, можно ведь довольствоваться старыми версиями программ — тем более спектр их возможностей практически не изменяется. Вывод напрашивается сам собой — во всем виноваты игры. Да, именно игры стремятся все более и более уподобиться реальному миру, создавая его виртуальную копию, хотят все более мощных ресурсов.
Вся история компьютерной графики на PC является тому подтверждением. Вспомните, в начале были тетрисы, диггеры, арканоиды. Вся графика заключалась в перерисовке небольших участков экрана, спрайтов, и нормально работала даже на XT. Но прошли те времена. Взошла звезда симуляторов.
С выходом таких игр, как F19, Formula 1 и т.п., в которых приходилось уже перерисовывать весь экран, предварительно заготавливая его в памяти, всем нам пришлось обзавестись, по крайней мере, 286 процессором. Но прогресс на этом не остановился. Желание уподобить виртуальный мир в игре реальному миру усилилось, и появился Wolf 3D.
Это, можно сказать, первая 3D-игра, в которой был смоделирован какой-никакой, но все же реалистичный мир. Для его реализации пришлось использовать верхнюю (более 640 Кб) память и загнать программу в защищенный режим. Для полноценной игры пришлось установить процессор 80386. Но и мир Wolf 3D страдал недостатками. Хотя стены и были не просто одноцветными прямоугольниками, но для их закраски использовались текстуры с небольшим разрешением, поэтому поверхности смотрелись прилично лишь на расстоянии. Конечно, можно было пойти по пути наращивания разрешения текстур, вспомним, например, DOOM. Тогда нам пришлось снова перейти на более новый процессор и увеличить количество памяти. Правда, все равно, хотя изображение и улучшилось, но ему были присущи все те же недостатки. Да и плоские объекты и монстры — кому это интересно. Тут то и взошла звезда Quake. В этой игре был применен революционный подход — z-буфер, позволивший придать объемность всем объектам. Однако вся игра все равно работала в невысоком разрешении и не отличалась высокой реалистичностью.
Назревало новое аппаратное решение. И решение это оказалось, в общем-то, лежащим на поверхности. Раз пользователи хотят играть в трехмерном виртуальном мире, то процесс его создания (вспомним минуты ожидания, проведенные за 3D Studio перед появлением очередной картинки) надо кардинально ускорить. А раз центральный процессор с этой задачей справляется из рук вон плохо, было принято революционное решение — сделать специализированный.
Тут то и вылез производитель игровых автоматов 3Dfx, сделавший эту сказку былью с помощью своего графического процессора Voodoo. Человечество сделало еще один шаг в виртуальный мир.
А поскольку операционной системы на PC с текстурными окнами, уплывающими назад, в туман, пока нет, и не предвидится, весь аппарат трехмерной графики можно пока применить только к играм, что успешно делает все цивилизованное человечество.
Модель
Для изображения трехмерных объектов на экране монитора требуется проведение серии процессов (обычно называемых конвейером) с последующей трансляцией результата в двумерный вид. Первоначально, объект представляется в виде набора точек, или координат, в трехмерном пространстве. Трехмерная система координат определяется тремя осями: горизонтальной, вертикальной и глубины, обычно называемых, соответственно осями x, y и z. Объектом может быть дом, человек, машина, самолет или целый 3D мир и координаты определяют положение вершин (узловых точек), из которых состоит объект, в пространстве. Соединив вершины объекта линиями, мы получим каркасную модель, называемую так из-за того, что видимыми являются только края поверхностей трехмерного тела. Каркасная модель определяет области, составляющие поверхности объекта, которые могут быть заполнены цветом, текстурами и освещаться лучами света.
Рис. 1: Каркасная модель куба
Даже при таком упрощенном объяснении конвейера 3D графики становится ясно, как много требуется вычислений для прорисовки трехмерного объекта на двумерном экране. Можно представить, насколько увеличивается объем требуемых вычислений над системой координат, если объект движется.
Рис. 2: Модель самолета с закрашенными поверхностями
Роль API
Программируемый интерфейс приложений (API) состоит из функций, управляющих 3D конвейером на программном уровне, но при этом может использовать преимущества аппаратной реализации 3D, в случае наличия этой возможности. Если имеется аппаратный ускоритель, API использует его преимущества, если нет, то API работает с оптимальными настройками, рассчитанными на самые обычные системы. Таким образом, благодаря применению API, любое количество программных средств может поддерживаться любым количеством аппаратных 3D ускорителей.
Для приложений общего и развлекательного направления, существуют следующие API:
- Microsoft Direct3D
- Criterion Renderware
- Argonaut BRender
- Intel 3DR
Компания Apple продвигает свой собственный интерфейс Rave, созданный на основе их собственного API Quickdraw 3D.
Для профессиональных приложений, работающих под управлением WindowsNT доминирует интерфейс OpenGL. Компания Autodesk, крупнейший производитель инженерных приложений, разработала свой собственный API, называемый Heidi.
Свои API разработали и такие компании, как Intergraph — RenderGL, и 3DFX — GLide.
Существование и доступность 3D интерфейсов, поддерживающих множество графических подсистем и приложений, увеличивает потребность в аппаратных ускорителях трехмерной графике, работающих в режиме реального времени. Развлекательные приложения, главный потребитель и заказчик таких ускорителей, но не стоит забывать и о прфессиональных приложениях для обработки 3D графики, работающих под управлением Windows NT, многие из которых переносятся с высокопроизводительных рабочих станций, типа Silicon Graphics, на PC платформу. Интернет приложения сильно выиграют от невероятной маневренности, интуитивности и гибкости, которые обеспечивает применение трехмерного графического интерфейса. Взаимодействие в World Wide Web будет гораздо проще и удобнее, если будет происходить в трехмерном пространстве.
Графический ускоритель
Рынок графических подсистем до появления понятия малтимедиа был относительно прост в развитии. Важной вехой в развитии был стандарт VGA (Video graphics Array), разработанный компанией IBM в 1987 году, благодаря чему производители видеоадаптеров получили возможность использовать более высокое разрешение (640х480) и большую глубину представления цвета на мониторе компьютера. С ростом популярности ОС Windows, появилась острая потребность в аппаратных ускорителях двумерной графики, чтобы разгрузить центральный процессор системы, вынужденный обрабатывать дополнительные события. Отвлечение CPU на обработку графики существенно влияет на общую производительность GUI (Graphical User Interface) — графического интерфеса пользователя, а так как ОС Windows и приложениям для нее требуется как можно больше ресурсов центрального процессора, обработка графики осуществлялась с более низким приоритетом, т.е. делалась очень медленно. Производители добавили в свои продукты функции обработки двумерной графики, такие, как прорисовка окон при открытии и свертовании, аппаратный курсор, постоянно видимый при перемещении указателя, закраска областей на экране при высокой частоте регенерации изображения. Итак, появился процессор, обеспечивающий ускорение VGA (Accelerated VGA — AVGA), также известный, как Windows или GUI ускоритель, который стал обязательным элементом в современных компьютерах.
Внедрение малтимедиа создало новые проблемы, вызванные добавлением таких компонентов, как звук и цифровое видео к набору двумерных графических функций. Сегодня легко заметить, что многие продукты AVGA поддерживают на аппаратном уровне обработку цифрового видео. Следовательно, если на Вашем мониторе видео проигрывается в окне, размером с почтовую марку — пора установить в Вашей машине малтимедиа ускоритель. Малтимедиа ускоритель (multimedia accelerator) обычно имеет встроенные аппаратные функции, позволяющие масштабировать видеоизображение по осям x и y, а также аппаратно преобразовывать цифровой сигнал в аналоговый, для вывода его на монитор в формате RGB. Некоторые малтимедиа акселлераторы могут также иметь встроенные возможности декомпресси цифрового видео.
Разработчики графических подсистем должны исходить из требований, частично диктуемых размерами компьютерного монитора, частично под влиянием GUI, и частично под влиянием графического процессора. Первичный стандарт VGA с разрешением 640х480 пикселов был адекватен 14″ мониторам, наиболее распространенных в то время. Сегодня наиболее предпочтительны мониторы с размером диагонали трубки 17″, благодаря возможности выводить изображения с разрешением 1024х768 и более.
Основной тенденцией при переходе от VGA к малтимедиа ускорителям была возможность размещения как можно больше визуальной информации на мониторе компьютера. Использование 3D графики является логичным развитием этой тенденции. Огроммные объемы визуальной информации могут быть втиснуты в ограниченное пространство экрана монитора, если она представляется в трехмерном виде. Обработка трехмерной графики в режиме реального времени дает возможность пользователю легко оперировать представляемыми данными.
Игровые двигатели (Games engines)
Первое правило компьютерных игр — нет никаких правил. Традиционно, разработчики игр больше заинтересованы в крутой графике своих программ, чем следованию рекомендаций технарей. Не взирая на то, что в распоряжении разработчиков имеется множество трехмерных API, например — Direct3D, некоторые программисты идут по пути создания собственного 3D игрового интерфейса или двигателя. Собственные игровые двигатели — один из путей для разработчиков добиться невероятной реалистичности изображения, фактически на пределе возможностей графического программирования.
Нет ничего более желанного для разработчика, чем иметь прямой доступ к аппаратным функциям компонентов системы. Несколько известных разработчиков создали свои собственные игровые двигатели, работающие с оптимальным использованием аппаратных ускорителей графики, которые принесли им известность и деньги. Например, двигатели Interplay для Descent II и id Software для Quake, обеспечивают истинную трехмерность действия, используя наполную аппаратные функции 3D, если они доступны.
Графика без компромисов
Разговоры, ведущиеся уже довольно долгое время, о перспективах применения трехмерной графики в таких областях, как развлечения и бизнес, допредела подогрели интерес потенциальных пользователей, на рынке уже появился новый тип продуктов. Эти новые технологические решения, совмещают в себе великолепную поддержку 2D графики, соответствующую сегодняшним требованиям к Windows акселлераторам, аппаратную поддержку функций 3D графики и проигрывают цифровое видео с требуемой частотой смены кадров.
В принципе, эти продукты можно смело отнести к новому поколению графических подсистем, обеспечивающих графику без компромиссов, занимающих достойное место стандартного оборудования в настольных вычислительных системах.
Среди представителей нового поколения можно назвать, в качестве примера, следующие продукты:
- процессор Ticket-To-Ride компании Number Nine Visual Technologies
- серия процессоров ViRGE компании S3 Inc.
- процессор RIVA128, разработанный совместно компаниями SGS Thomson и nVidia
Технология 3D-графики
Пусть нам все-таки удалось убедить Вас попробовать трехмерную графику в действии (если Вы до сих пор не сделали это), и Вы решили сыграть в одну из трехмерных игр, предназначенных для применения 3D-видеокарты.
Допустим, такой игрой оказался симулятор автомобильных гонок, и Ваша машина уже стоит на старте, готовая устремиться к покорению новых рекордов. Идет предстартовый обратный отсчет, и Вы замечаете, что вид из кабины, отображаемый на экране монитора, немного отличается от привычного.
Вы и прежде участвовали в подобных гонках, но впервые изображение поражает Вас исключительным реализмом, заставляя поверить в действительность происходящего. Горизонт, вместе с удаленными объектами, тонет в утренней дымке. Дорога выглядит необычайно ровно, асфальт представляет собой не набор грязно-серых квадратов, а однотонное покрытие с нанесенной дорожной разметкой. Деревья вдоль дороги действительно имеют лиственные кроны, в которых, кажется, можно различить отдельные листья. От всего экрана в целом складывается впечатление как от качественной фотографии с реальной перспективой, а не как от жалкой попытки смоделировать реальность.
Попробуем разобраться, какие же технические решения позволяют 3D-видеокартам передавать виртуальную действительность с такой реалистичностью. Каким образом изобразительным средствам PC удалось достигнуть уровня профессиональных студий, занимающихся трехмерной графикой.
Часть вычислительных операций, связанных с отображением и моделированием трехмерного мира переложено теперь на 3D-акселератор, который является сердцем 3D-видеокарты. Центральный процессор теперь практически не занят вопросами отображения, образ экрана формирует видеокарта. В основе этого процесса лежит реализация на аппаратном уровне ряда эффектов, а также применение несложного математического аппарата. Попробуем разобраться, что же конкретно умеет графический 3D-процессор.
Возвращаясь к нашему примеру с симулятором гонок, задумаемся, каким образом достигается реалистичность отображения поверхностей дороги или зданий, стоящих на обочине. Для этого применяется распространенный метод, называемый текстурирование (texture mapping).
Это самый распространенный эффект для моделирования поверхностей. Например, фасад здания потребовал бы отображения множества граней для моделирования множества кирпичей, окон и дверей. Однако текстура (изображение, накладываемое на всю поверхность сразу) дает больше реализма, но требует меньше вычислительных ресурсов, так как позволяет оперировать со всем фасадом как с единой поверхностью. Перед тем, как поверхности попадают на экран, они текстурируются и затеняются. Все текстуры хранятся в памяти, обычно установленной на видеокарте. Кстати, здесь нельзя не заметить, что применение AGP делает возможным хранение текстур в системной памяти, а ее объем гораздо больше.
Очевидно, что когда поверхности текстурируются, необходим учет перспективы, например, при отображении дороги с разделительной полосой, уходящей за горизонт. Перспективная коррекция необходима для того, чтобы текстурированные объекты выглядели правильно. Она гарантирует, что битмэп правильно наложится на разные части объекта — и те, которые ближе к наблюдателю, и на более далекие.
Коррекция с учетом перспективы очень трудоемкая операция, поэтому нередко можно встретить не совсем верную ее реализацию.
При наложении текстур, в принципе, также можно увидеть швы между двумя ближайшими битмэпами. Или, что бывает чаще, в некоторых играх при изображении дороги или длинных коридоров заметно мерцание во время движения. Для подавления этих трудностей применяется фильтрация (обычно Bi- или tri-линейная).
Билинейная фильтрация — метод устранения искажений изображения. При медленном вращении или движении объекта могут быть заметны перескакивания пикселов с одного места на другое, что и вызывает мерцание. Для снижения этого эффекта при билинейной фильтрации для отображения точки поверхности берется взвешенное среднее четырех смежных текстурных пикселов.
Трилинейная фильтрация несколько сложнее. Для получения каждого пиксела изображения берется взвешенное среднее значение результатов двух уровней билинейной фильтрации. Полученное изображение будет еще более четкое и менее мерцающее.
Текстуры, с помощью которых формируется поверхность объекта, изменяют свой вид в зависимости от изменения расстояния от объекта до положения глаз зрителя. При движущемся изображении, например, по мере того, как объект удаляется от зрителя, текстурный битмэп должен уменьшаться в размерах вместе с уменьшением размера отображаемого объекта. Для того чтобы выполнить это преобразование, графический процессор преобразует битмэпы текстур вплоть до соответствующего размера для покрытия поверхности объекта, но при этом изображение должно оставаться естественным, т.е. объект не должен деформироваться непредвиденным образом.
Для того, чтобы избежать непредвиденных изменений, большинство управляющих графикой процессов создают серии предфильтрованных битмэпов текстур с уменьшенным разрешением, этот процесс называется mip mapping. Затем, графическая программа автоматически определяет, какую текстуру использовать, основываясь на деталях изображения, которое уже выведено на экран. Соответственно, если объект уменьшается в размерах, размер его текстурного битмэпа тоже уменьшается.
Но вернемся в наш гоночный автомобиль. Сама дорога уже выглядит реалистично, но проблемы наблюдаются с ее краями! Вспомните, как выглядит линия, проведенная на экране не параллельно его краю. Вот и у нашей дороги появляются «рваные края». И для борьбы с этим недостатком изображения применяется anti-aliasing.
Рваные края | Ровные края |
---|
Это способ обработки (интерполяции) пикселов для получения более четких краев (границ) изображения (объекта). Наиболее часто используемая техника — создание плавного перехода от цвета линии или края к цвету фона. Цвет точки, лежащей на границе объектов определяется как среднее цветов двух граничных точек. Однако в некоторых случаях, побочным эффектом anti-aliasing является смазывание (blurring) краев.
Мы подходим к ключевому моменту функционирования всех 3D-алгоритмов. Предположим, что трек, по которому ездит наша гоночная машина, окружен большим количеством разнообразных объектов — строений, деревьев, людей.
Тут перед 3D-процессором встает главная проблема, как определить, какие из объектов находятся в области видимости, и как они освещены. Причем, знать, что видимо в данный момент, недостаточно. Необходимо иметь информацию и о взаимном расположении объектов. Для решения этой задачи применяется метод, называемый z-буферизация. Это самый надежный метод удаления скрытых поверхностей. В так называемом z-буфере хранятся значения глубины всех пикселей (z-координаты). Когда рассчитывается (рендерится) новый пиксел, его глубина сравнивается со значениями, хранимыми в z-буфере, а конкретнее с глубинами уже срендеренных пикселов с теми же координатами x и y. Если новый пиксел имеет значение глубины больше какого-либо значения в z-буфере, новый пиксел не записывается в буфер для отображения, если меньше — то записывается.
Z-буферизация при аппаратной реализации сильно увеличивает производительность. Тем не менее, z-буфер занимает большие объемы памяти: например даже при разрешении 640×480 24-разрядный z-буфер будет занимать около 900 Кб. Эта память должна быть также установлена на 3D-видеокарте.
Разрешающая способность z-буфера — самый главный его атрибут. Она критична для высококачественного отображения сцен с большой глубиной. Чем выше разрешающая способность, тем выше дискретность z-координат и точнее выполняется рендеринг удаленных объектов. Если при рендеринге разрешающей способности не хватает, то может случиться, что два перекрывающихся объекта получат одну и ту же координату z, в результате аппаратура не будет знать какой объект ближе к наблюдателю, что может вызвать искажение изображения.
Для избежания этих эффектов профессиональные платы имеют 32-разрядный z-буфер и оборудуются большими объемами памяти.
Кроме вышеперечисленных основ, трехмерные графические платы обычно имеют возможность воспроизведения некоторого количества дополнительных функций. Например, если бы Вы на своем гоночном автомобиле въехали бы в песок, то обзор бы затруднился поднявшейся пылью. Для реализации таких и подобных эффектов применяется fogging (затуманивание). Этот эффект образуется за счет комбинирования смешанных компьютерных цветовых пикселов с цветом тумана (fog) под управлением функции, определяющей глубину затуманивания. С помощью этого же алгоритма далеко отстоящие объекты погружаются в дымку, создавая иллюзию расстояния.
Реальный мир состоит из прозрачных, полупрозрачных и непрозрачных объектов. Для учета этого обстоятельства, применяется alpha blending — способ передачи информации о прозрачности полупрозрачных объектов. Эффект полупрозрачности создается путем объединения цвета исходного пиксела с пикселом, уже находящимся в буфере.
В результате цвет точки является комбинацией цветов переднего и заднего плана. Обычно, коэффициент alpha имеет нормализованное значение от 0 до 1 для каждого цветного пиксела. Новый пиксел = (alpha)(цвет пиксела А) + (1 — alpha)(цвет пиксела В).
Очевидно, что для создания реалистичной картины происходящего на экране необходимо частое обновление его содержимого. При формировании каждого следующего кадра, 3D-акселератор проходит весь путь подсчета заново, поэтому он должен обладать немалым быстродействием. Но в 3D-графике применяются и другие методы придания плавности движению. Ключевой — Double Buffering.
Представьте себе старый трюк аниматоров, рисовавших на уголках стопки бумаги персонаж мультика, со слегка изменяемым положением на каждом следующем листе. Пролистав всю стопку, отгибая уголок, мы увидим плавное движение нашего героя. Практически такой же принцип работы имеет и Double Buffering в 3D анимации, т.е. следующее положение персонажа уже нарисовано, до того, как текущая страница будет пролистана. Без применения двойной буферизации изображение не будет иметь требуемой плавности, т.е. будет прерывистым. Для двойной буферизации требуется наличие двух областей, зарезервированных в буфере кадров трехмерной графической платы; обе области должны соответствовать размеру изображения, выводимого на экран. Метод использует два буфера для получения изображения: один для отображения картинки, другой для рендеринга. В то время как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буфера переключаются (меняются местами). Таким образом, играющий все время видит отличную картинку.
В заключение обсуждения алгоритмов, применяемых в 3D-графических акселераторах, попробуем разобраться, каким же образом применение всех эффектов по отдельности позволяет получить целостную картину. 3D-графика реализуется с помощью многоступенчатого механизма, называемого конвейером рендеринга.
Применение конвейерной обработки позволяет еще ускорить выполнение расчетов за счет того, что вычисления для следующего объекта могут быть начаты до окончания вычислений предыдущего.
Конвейер рендеринга может быть разделен на 2 стадии: геометрическая обработка и растеризация.
На первой стадии геометрической обработки выполняется преобразование координат (вращение, перенос и масштабирование всех объектов), отсечение невидимых частей объектов, расчет освещения, определение цвета каждой вершины с учетом всех световых источников и процесс деления изображения на более мелкие формы. Для описания характера поверхности объекта она делится на всевозможные многоугольники.
Наиболее часто при отображении графических объектов используется деление на треугольники и четырехугольники, так как они легче всего обсчитываются и ими легко манипулировать. При этом координаты объектов переводятся из вещественного в целочисленное представление для ускорения вычислений.
На второй стадии к изображению применяются все описанные эффекты в следующей последовательности: удаление скрытых поверхностей, наложение с учетом перспективы текстур (используя z-буфер), применение эффектов тумана и полупрозрачности, anti-aliasing. После этого очередная точка считается готовой к помещению в буфер со следующего кадра.
Из всего вышеуказанного можно понять, для каких целей используется память, установленная на плате 3D-акселератора. В ней хранятся текстуры, z-буфер и буфера следующего кадра. При использовании шины PCI, использовать для этих целей обычную оперативную память нельзя, так как быстродействие видеокарты существенно будет ограничено пропускной способностью шины. Именно по этому для развития 3D-графики особенно перспективно продвижение шины AGP, позволяющее соединить 3D-чип с процессором напрямую и тем самым организовать быстрый обмен данными с оперативной памятью. Это решение, к тому же, должно удешевить трехмерные акселераторы за счет того, что на борту платы останется лишь немного памяти собственно для кадрового буфера.
Заключение
Повсеместное внедрение 3D-графики вызвало увеличение мощности компьютеров без какого-либо существенного увеличения их цены. Пользователи ошеломлены открывающимися возможностями и стремятся попробовать их у себя на компьютерах. Множество новых 3D-карт позволяют пользователям видеть трехмерную графику в реальном времени на своих домашних компьютерах. Эти новые акселераторы позволяют добавлять реализм к изображениям и ускорять вывод графики в обход центрального процессора, опираясь на собственные аппаратные возможности.
Хотя в настоящее время трехмерные возможности используются только в играх, думается, деловые приложения также смогут впоследствии извлечь из них выгоду. Например, средства автоматизированного проектирования уже нуждаются в выводе трехмерных объектов. Теперь создание и проектирование будет возможно и на персональном компьютере благодаря открывающимся возможностям. Трехмерная графика, возможно, сможет также изменить способ взаимодействия человека с компьютером. Использование трехмерных интерфейсов программ должно сделать процесс общения с компьютером еще более простым, чем в настоящее время.
При подготовке материала использовалась информация из Diamond White Papers
3D графика. Теория
Мы все играли в Quake (если вы не играли в Quake, поиграйте, пожалуйста, при первой же возможности). Многие из нас играли в него на каком-либо ускорителе трехмерной графики. Некоторые, поиграв или понаблюдав за играющими, решили купить этот самый «ускоритель», подвергая себя мучительному интеллектуальному труду, который хорошо знаком современному жителю крупного города: поиску товара по устраивающей его цене, и обладающего при этом оптимальными для него характеристиками. В большинстве случаев именно этот процесс способен неожиданно расширить познания человека в области, рассматриваемой им ранее лишь с потребительской точки зрения. Избежать такие проблемы я сейчас и попытаюсь помочь.
3D-конвейер
Большинство игр, а также множество более серьезных приложений следуют довольно стандартной схеме построения трехмерных изображений (далее мы будем называть этот процесс конвейером). Причем некоторые программы реализуют все стадии этого конвейера, некоторые же перекладывают часть работы на плечи аппаратных устройств, специальных библиотек программ (API), другие программы или даже на пользователя. Итак, конвейер состоит из следующих стадий:
- Определение состояния объектов (Situation modeling) — эта часть программы не имеет прямого отношения к компьютерной графике, она моделирует тот мир, который будет отображаться в дальнейшем. Например в случае Quake это — правила игры и физические законы перемещения игрока, искусственный интеллект монстров и т.д.
- Определение соответствующих текущему состоянию геометрических моделей (Geometry generation) — эта часть конвейера создает геометрическое представление текущего момента нашего маленького «виртуального мира».
- Разбиение геометрических моделей на примитивы (Tesselation) — эта первая действительно зависимая от «железа» стадия. На ней создается внешний вид объектов в виде набора определенных примитивов, разумеется, на основе информации из предыдущего шага конвейера. Наиболее распространенным примитивом в наше время является треугольник, и большинство современных программ и ускорителей работают именно с треугольниками. Не вдаваясь в математические подробности скажу, что на треугольники всегда можно разбить любой плоский многоугольник, и именно тремя точками можно однозначно задать плоскость в пространстве. К тому же, все мы знаем, что у Царя было три сына, а у Горыныча — три головы.
- Привязка текстур и освещения (Texture and light definition) — на этой стадии определяется, как будут освещены геометрические примитивы (треугольники), а также какие и как на них в дальнейшем будут наложены текстуры (Textures: изображения, передающие внешний вид материала объекта, т.е. негеометрическую визуальную информацию. Хороший пример текстуры — песок на абсолютно ровном пляже). Как правило, на этой стадии информация вычисляется только для вершин примитива.
- Видовые геометрические преобразования (Projection) — здесь определяются новые координаты для всех вершин примитивов исходя из положения наблюдателя и направления его взгляда. Сцена как бы проецируется на поверхность монитора, превращаясь в двухмерную, хотя информация о расстоянии от наблюдателя до вершин сохраняется для последующей обработки.
- Отбрасывание невидимых примитивов (Culling) — на этой стадии из списка примитивов исключаются полностью невидимые (оставшиеся позади или сбоку от зоны видимости).
- Установка примитивов (Setup) — здесь информация о примитивах (координаты вершин, наложение текстур, освещение и т.д.) преобразуется в вид, пригодный для последующей стадии. (Например: координаты точек буфера экрана или текстур — в целые числа фиксированного размера, с которыми работает аппаратура).
- Закраска примитивов (Fill) — на этой стадии, собственно, и происходит построение в буфере кадра (памяти, отведенной под результирующее изображение) картинки на основе информации о примитивах, сформированной предыдущей стадией конвейера, и прочих данных. Таких, как текстуры, таблицы тумана и прозрачности и пр. Как правило, на этой стадии для каждой точки закрашиваемого примитива определяется ее видимость, например, с помощью буфера глубин (Z-буфера) и, если она не заслонена более близкой к наблюдателю точкой (другого примитива), вычисляется ее цвет. Цвет определяется на основе информации об освещении и наложении текстур, определенной ранее для вершин этого примитива. Большинство характеристик ускорителя, которые можно почерпнуть из его описания, относятся именно к этой стадии, так как в основном именно эту стадию конвейера ускоряют аппаратно (в случае недорогих и доступных плат).
- Финальная обработка (Post processing) — обработка всей результирующей картинки как единого целого какими-либо двумерными эффектами.
Теоретически мы подковались, теперь попробуем разобраться, как все обстоит на самом деле. Во-первых, некоторые стадии этого конвейера могут быть переставлены местами, разбиты на части или совмещены. Во-вторых, они могут отсутствовать вообще (редко) или могут появится новые (часто). И, в-третьих, результат работы каждой из них может быть послан (в обход других стадий) обратно. Например, картинку, полученную на последней стадии, можно использовать как новую текстуру для 8-ой, реализуя таким образом эффект отражающих поверхностей (зеркал). Таких, как мраморный пол в игре Unreal.
3D API
Хорошо, теперь у нас есть последовательность действий. Но для получения результата надо определится с двумя вещами — кто какие стадии будет выполнять и как он это будет делать. У нас есть три основных кандидата на работу — сама программа (как правило, начальные стадии конвейера), библиотека прикладного программирования (интерфейс, API) и сам ускоритель. Впрочем, программы, не использующие ускоритель (Doom, Quake в программном режиме и т.д.), все стадии конвейера выполняют самостоятельно. В понятие библиотеки в данном контексте можно (без особого зазрения совести) поместить драйвера данного ускорителя, т.к., с точки зрения программы, они становятся частью библиотеки. Программ и ускорителей существует великое множество, а вот число общепризнанных библиотек весьма ограничено. Наиболее часто игры используют следующие библиотеки
- OpenGL — созданная первоначально для профессиональных графических станций и программ трехмерного моделирования библиотека. Постепенно она пришла на платформу PC, в основном благодаря стремительному прогрессу в области «железа» и игре Quake, использовавшей урезанный вариант этой библиотеки. Наличие поддержки этой библиотеки у ускорителя крайне желательно из-за большого числа новых игр, ориентированных на нее. Библиотека является в некотором роде высокоуровневой, так как берет на себя все действия, начиная с середины 4-ой ступени нашего конвейера. С одной стороны, это здорово облегчает работу программистам, с другой — способно несколько осложнить ее же, особенно при реализации нестандартных эффектов или необходимости использовать новые возможности ускорителя, выходящие за рамки OpenGL. Хороший пример полезности подобного подхода — возможность выпустить версию OpenGL, значительно ускоряющую (конкретно — геометрические преобразования) работу игр на новых процессорах с SIMD наборами команд — AMD 3Dnow! и Intel Katmai New Instructions (MMX2). Очевидным достоинством также является переносимость программ на другие, не Wintel-платформы. Существенным, но быстро исправляемым недостатком — отсутствие ее полного варианта для некоторых распространенных ускорителей.
- Direct3D — библиотека, являющаяся частью Microsoft DirectX и поддерживаемая сейчас практически всеми ускорителями. Фактически представляет собой две библиотеки — низкоуровневую (начиная с 7 стадии) и высокоуровневую (с 5-ой). Результат — большая гибкость для программиста в реализации его идей и, как следствие, головная боль для него же из-за множества связанных с конкретной реализацией ускорителя параметров. Сейчас идет бурное развитие этого продукта Microsoft, и, судя по всему, версия 6 Direct3D (которая уже официально вышла) будет вполне достойным конкурентом OpenGL по своим возможностям и скорости.
- Glide — собственная низкоуровневая библиотека (стадия 7 конвейера и далее) фирмы 3Dfx, добившаяся популярности благодаря большому распространению первых, действительно успешных ускорителей (на базе набора чипов Voodoo). Но, скорее всего, эта библиотека уйдет со сцены в ближайшие несколько лет. Она не поддерживается другими ускорителями и не будет ими поддерживаться (без разрешения 3Dfx это является незаконным), к тому же все новые игры, рассчитанные на нее, работают, как минимум, еще с одной из ранее описанных библиотек. Создатели неприятного исключения из этого правила (а именно, игры Unreal) уже анонсировали дополнение к игре с поддержкой Direct3D и OpenGL.
Еще существует около 10 библиотек низкого уровня, созданных разработчиками различных ускорителей; таких как: R-Redline фирмы Rendition, S3D Toolkit фирмы S3 и т.д. Как и следовало ожидать, программы, написанные специально для них, постепенно исчезают.
Хотя большинство современных ускорителей берут на себя лишь две-три последние стадии конвейера, существует важное и быстро прогрессирующие исключение из этого правила: появились первые доступные чипы с поддержкой геометрических преобразований, способные значительно увеличить скорость построения изображения на компьютерах с недостаточной вычислительной мощностью (а она, мощность, недостаточна по определению — иначе не было бы потребности в ускорителях вообще).
3D акселерация
Итак, самый общий ускоритель состоит из геометрического процессора (Geometry Processor, пока практически всегда отсутствует), механизма установки (Setup engine, стадия 7 конвейера) и механизма отрисовки примитивов — закраски (Fill engine, стадии 8 и 9), который при детальном рассмотрении оказывается комбинацией двух блоков — обработки текстур (Texel engine) и обработки буфера кадра (Pixel engine). Производительность ускорителя зависит от процессора, производительности памяти, шины и самих обрабатывающих блоков. Как правило, приводятся два числа — максимальная пропускная способность (треугольников в секунду, triangle throughput) и максимальная производительность закраски (точек в секунду, fill rate). Такой подход возможен, но не очень корректен. Да и все мы знаем, что лучшим тестом является скорость игры, в которую мы любим играть (fps, кадров в секунду на каком-то стандартном наборе действий) и качество изображения (в цифрах не измерить). Именно эти параметры и необходимо узнать в первую очередь в Internet или, может быть, у соседа в подъезде, но не стоит при этом забывать о сильной зависимости числа кадров от объема памяти и мощности процессора компьютера этого самого соседа.
Если не вдаваться в глубокие технические подробности, закраска происходит следующим образом: блок обработки буфера кадра определяет, видна ли закрашиваемая точка, например, с помощью буфера глубин (Z Buffer). Если она видна, блок обработки текстур вычисляет цвет текстуры, соответствующий этой точке примитива. Здесь есть несколько важных моментов — интерполяция (filtering, сглаживание) и выбор уровня текстуры (mip-mapping). Первый обеспечивает изображение без резких прямоугольных пикселей, даже когда вы находитесь вблизи предмета и разрешение текстуры явно недостаточное. Второй устраняет искажения (странные узоры), возникающие при чрезмерном удалении от текстуры, выбирая аналог текстуры с меньшим разрешением. Фактически, существует несколько режимов комбинирования этих двух методов. Сейчас наиболее распространены билинейная фильтрация (bilinear filtering — вначале определяется необходимая для этого расстояния текстура, а затем значение цвета линейно интерполируется между четырьмя соседними точками текстуры, по каждой из координат на поверхности выбранной текстуры) и трилинейная (trilinear — две билинейных для двух текстур, с меньшим и большим разрешениями, затем результат интерполируется между ними). Последняя выглядит более приятно, но и требует больших затрат, так как не реализуется за один такт на современных ускорителях с одним блоком обработки текстур и, в результате, вдвое понижает скорость закраски. Сейчас появились первые ускорители с анизотропной (anisotropic — внутри куба, из двух наборов по 4 соседних точки текстур, итого по 8 точкам) фильтрацией, которая выглядит совсем хорошо, но и занимает еще вдвое больше времени. Затем вычисленный с помощью одного из вышеописанных методов цвет текстуры помещается в буфер кадра, заменяя находившееся там ранее значение, либо комбинируется с ним по какому-либо правилу (combination, blending, alpha-blending). Как минимум, ускоритель должен поддерживать режимы Источник*Приемник (Src*Dest) и Источник+Приемник (Src+Dest). Подобные возможности позволяют реализовать цветное освещение, эффекты типа металла или отражения, реализовывать трилинейную фильтрацию там, где она не поддерживается аппаратно и т.д. (так называемое многопроходное построение изображения, multipass rendering).
Как правило, для каждой точки текстуры, кроме RGB цвета, можно задать степень ее прозрачности (alpha, RGBA формат текстуры), которая будет использоваться ускорителем для регулирования воздействия источника на приемник. Подобным образом закрашиваются, например, полупрозрачные по краям взрывы и ореолы вокруг источников света в Unreal.
Не является жизненно необходимой, но очень ускоряет работу программ, использующих многопроходное построение изображения (например, Quake2 или Unreal), возможность мультитекстурирования (multitexturing). Фактически, это наличие двух (или даже более) блоков обработки текстур, способных одновременно вычислять два цвета по двум текстурам для одной точки примитива, а затем комбинировать их между собою. Подобной возможностью обладает Vоodoo2, RivaTNT и еще несколько пока «недоделанных» чипов.
Важны также точность представления цветов (16 бит — Hi-Color или 32 бита — True-Color, последний гораздо лучше) и точность буфера глубин (Z-Buffer, 16 бит хуже, 24 и 32 лучше), используемого для определения видимости отдельных точек примитива. Ошибки в определении глубины способны приводить к странным эффектам, например, к проглядывающим сквозь постамент ногам статуи в игре Unreal.
И последнее действие блока обработки буфера кадра — наложениие глобальных эффектов на готовую картинку. Например, туман, дымка или темнота (с точки зрения ускорителя это одно и то же), т.е. эффект, известный как fogging. Или используемый в RivaZX метод полноэкранного сглаживания (full screen antialiasing), когда изображение рассчитывается с большим разрешением, чем показывается пользователю, причем соседние точки изображения суммируются, и именно суммарное значение демонстрируется пользователю как одна точка. Подобным образом устраняются резкие границы между полигонами, изображению придается приятный «монолитный» вид. Существует также краевое сглаживание примитивов, приводящее к практически идентичному (чуть хуже) результату (edge antialiasing), но требующее гораздо меньше затрат на построение изображения.
Резюме
Займемся подведением итогов. Хороший ускоритель на ближайшее будущее это:
- Поддержка OpenGL и Direct3D 5.X и 6.0
- Достаточно большой fill rate (около 100 миллионов точек в секунду)
- Достаточно большой triangle throughput (около 1 миллиона треугольников в секунду)
- Аппаратная трилинейная фильтрация (tri-linear filtering)
- Режимы alpha-blending, Src*Dest, Src+Dest
- Хорошая глубина цвета — True-Color 32 бита
- Хорошая точность Z-Buffer — 32 бита
- Желателен multitexturing
- Желательно сглаживание — antialiasing, full screen или edge
- Достаточное количество памяти — не менее 8 Мб для карты на шине PCI или не менее 4 Мб на шине AGP
И самое главное: приятное для вас изображение и скорость в распространенных играх.
Популярно о 3D графике. Часть 2. Игры и 3D / Хабр
Прошу прощение за столь большой перерыв между первой и второй частью, но на то были как объективные, так и субъективные причины. Итак, часть вторая, про компьютерные игры и 3D.
И, да, статья рассчитана на тех, кто не имеет вообще представления о данном вопросе.3D графика в компьютерных играх
Когда я на заработанные летом деньги в старших классах купил себе свой первый компьютер — ZX Spectrum и научился загружать с кассеты игры, меня сразу начал интересовать вопрос: как это все программируется? Ответ на этот вопрос я получил из книги по программированию игр для ZX Spectrum. Когда у меня появился РС-совместимый компьютер я уже представлял как делаются игры. Но прошло совсем немного времени и появились игры которые были непохожи на другие — игры с 3D персонажами. Одной из ярких представителей таких игр была Tomb Raider. И с каждым годом количество таких игр росло. Мне всегда было интересно: а как же они создаются? Но вразумительного ответа (Интернет тогда был экзотикой) я не нашел. Если бы мне в то время попалась подобная статья, то я бы получил ответы на некоторые вопросы. Надеюсь, что нижеприведенный текст поможет дать представление о том как в 3D играх появляются окружение и персонажи.
Но сначала немного о полигонах. В прошлой статье Популярно о 3D графике, часть 1 были упомянуты полигоны. Но, судя по комментариям, цель статьи была не совсем достигнута. Поэтому хочу немного остановиться на тесселяции и сглаживании. Представьте, что у вас есть лист бумаги. Это и будет полигон. Разделите его пополам по горизонтали и вертикали. Получим 4 части. Это и есть тесселяция. Зачем нам это нужно в 3D графике? Все дело в том, что полигон является базовой единицей поверхности (в полигональном моделировании) и им можно смоделировать разве что плоскость. Вспомните, что для того, чтобы изготовить бумажный самолетик необходимо лист бумаги несколько раз согнуть. Так и с полигонами — разбивая исходные полигоны на части, располагая их под нужными углами друг к другу и сглаживая можно получать те или иные формы. Сглаживание, как уже упоминалось в прошлой части, это разбиение полигонов с изменением углов между полигонами. Это означает, что если у нас есть квадрат, у которого, как известно, прямые углы 90 градусов, то после сглаживания эти углы будут уже примерно 135 градусов. Как операция сглаживания преображает заготовку модели можно увидеть на видео ниже.
В данном случае применено две итерации сглаживания. Видно, как увеличивается количество полигонов и модель приобретает плавные формы.
Но вернемся к играм.
На заре персональных компьютеров графические (были и текстовые, да, да, текстовые! игры) игры были двумерными во всех смыслах: персонажи были рисованными в проекции и двигаться могли только по осям X и Y. Для имитации, к примеру, ходьбы отрисовывались положения ног в разный период времени и эти кадры просто пускались по кругу. Классический пример двумерной игры — Тетрис. На приведенном ниже видео кадры из двумерной игры Nebulus для необыкновенно популярной в 80-х годах (а в СНГ и в 90-х) прошлого века платформы ZX Spectrum.
Но компьютеры росли и в последнее время большинство игр являются трехмерными. Что же нам дает трехмерность? (кстати, итоговая картинка для обычных мониторов все равно псевдохтрехмерная, но за счет размещения объектов в перспективе и возможности двигаться в трех измерениях, появляется иллюзия трехмерности). Трехмерность нам дает больше свободы и реалистичности. Взгляните на эти шахматы, одни из которых двумерные, а вторые — трехмерные. Какие из них смотрятся реалистичнее?
Каким же образом в игре появляется трехмерный персонаж? Для начала моделер изготавливает высокополигональную модель необходимого объекта или персонажа в одной из программ трехмерного моделирования (например, 3ds Max или Maya, возможна доработка в ZBrush или Mudbox). Затем строится развертка — представление рисунка трехмерного объекте на плоскости. По развертке художник рисует текстуры, т.е., грубо говоря, раскрашивает модель, затем настраиваются материалы, включающие нарисованные текстуры. Материалы позволяют придать текстурам реалистичности. Модель готова. Но для игры необходима низкополигональная модель. Ее получают из высокополигональной или копируют на определенном этапе моделирования высокополигональной. Зачем нужна высокополигональная модель? Она дает возможность получить более реалистичную картинку, смоделировать мелкие детали, тени, которые затем будут присутствовать в игре в виде текстуры. Многое, что мы в играх воспринимаем как мелкие объекты (углубления, коррозия, трещины, шпингалеты и многое-многое другое) на самом деле нарисовано с учетом теней, что при не очень детальном рассмотрении воспринимается как трехмерный объект. Из высокополигональной модели получают вспомогательные текстуры. Как правило, кроме текстуры цвета и рисунка применяют текстуры рельефа (bump) и отражений (specular), карту нормали. Накладываясь на текстуру рисунка (diffuse) они делаю модель более реалистичной. Все это позволяет снизить требования к аппаратному обеспечению до доступного для современного железа уровеня.
Затем низкополигональная модель и текстуры экспортируется в так называемый игровой движок который позволяет, как правило, симулировать некоторый мир. Игровой движок ответственен за сам игровой процесс: взаимодействие героя с окружающим миром, визуализацию изображения в реальном времени, за искусственный интеллект компьютерных персонажей. Игровые 3D движки бывают разные: как платные, так и бесплатные, бесплатные при некоммерческом использовании, сложные и трудные в освоении, для различных платформ и т.п. Если вы решите поэкспериментировать с экспортом собственных моделей в игровой движок главное, чтобы была возможность конвертировать модель в формате вашего 3D редактора в формат игрового движка и последний работал на вашей платформе.
Чтобы не быть голословным я в представленном ниже видео кратко покажу как модель вставляется в игровой движок. Для примера я взял CryEngine 3. Почему именно его? Потому, что на нем «бегает» широко известный шутер Crysis 3, к тому же сам движок доступен для свободного скачивания и бесплатен для не коммерческого использования. Для CryEngine 3 доступна документация как на английском, так и на русском, присутствует расширение для 3ds Max.
На этом пока все.
Предыдущие статьи данного цикла:
Популярно о компьютерной графике. Часть 1 Введение и полигоны.
Многомерные графики в Python — от трёхмерных и до шестимерных / Хабр
Примеры многомерных графиков
Введение
Визуализация — важная часть анализа данных, а способность посмотреть на несколько измерений одновременно эту задачу облегчает. В туториале мы будем рисовать графики вплоть до 6 измерений.
Plotly — это питоновская библиотека с открытым исходным кодом для разнообразной визуализации, которая предлагает гораздо больше настроек, чем известные matplotlib и seaborn. Модуль устанавливается как обычно — pip install plotly. Его мы и будем использовать для рисования графиков.
Давайте подготовим данные
Для визуализации мы используем простые данные об автомобилях от UCI (Калифорнийский университет в Ирвине — прим. перев.), которые представляют собой 26 характеристик для 205 машин (26 столбцов на 205 строк). Для визуализации шести измерений мы возьмём такие шесть параметров.
Здесь показаны только 4 строки из 205
Загрузим данные из CSV с помощью pandas.
import pandas as pd
data = pd.read_csv("cars.csv")
Теперь, подготовившись, начнем с двух измерений.
Двухмерная диаграмма рассеяния
Диаграмма рассеяния — весьма простой и распространенный график. Из 6 параметров, price и curb-weight используются ниже как Y и X соответственно.
# Импорт необходимых модулей
import plotly
import plotly.graph_objs as go
# Создаём figure
fig1 = go.Scatter(x=data['curb-weight'],
y=data['price'],
mode='markers')
# Создаём layout
mylayout = go.Layout(xaxis=dict(title="curb-weight"),
yaxis=dict( title="price"))
# Строим диаграмму и сохраняем HTML
plotly.offline.plot({"data": [fig1],
"layout": mylayout},
auto_open=True)
В plotly процесс немного отличен от аналогичного в Matplotlib. Мы должны создать layout и figure, передав их в функцию offline.plot, после чего результат будет сохранён в HTML файл в текущей рабочей директории. Вот скриншот того, что получится. В конце статьи будет ссылка на GitHub репозиторий с готовыми интерактивными HTML-графиками.
Двухмерная диаграмма рассеяния
Диаграмма рассеяния в 3D
Мы можем добавить третий параметр horsepower (количество лошадиных сил) на ось Z. Plotly предоставляет функцию Scatter3D для построения интерактивных трёхмерных графиков.
3D график
Вместо того чтобы вставлять код сюда каждый раз, я добавлял его в репозиторий.
(Удобнее всего смотреть релевантный код в соседней вкладке параллельно со чтением — прим. перев.)
Добавление четвёртого измерения
Мы знаем, что использовать больше трёх измерений напрямую нельзя, но есть обходной путь: мы можем эмулировать глубину для визуализации более высоких измерений с помощью цвета, размера или формы.
Здесь, наряду с тремя предыдущими характеристиками, мы будем использовать пробег в городских условиях — city-mpg как четвертое измерение, за которое будет отвечать параметр markercolor функции Scatter3D. Более светлый оттенок маркера будет означать меньший пробег.
Сразу же бросается в глаза, что чем выше цена, количество лошадей и масса, тем меньше будет пробег.
4D график с оттенками в качестве 4-го измерения
Добавление пятого измерения
Размер маркера можно использовать для визуализации 5-го измерения. Мы используем характеристику engine-size (размер двигателя) для параметра markersize функции Scatter3D.
Наблюдения: размер двигателя связан с некоторыми из предыдущих параметров. Чем выше цена, тем больше двигатель. Ра́вно как и: ниже пробег — больше двигатель.
5D график с величиной маркера в качестве пятого измерения (размер двигателя)
Добавление шестого измерения
Форма маркера отлично подходит для визуализации категорий. Plotly даёт на выбор 10 различных фигур для 3D графика (звёздочка, круг, квадрат и т.д.). Таким образом, в качестве формы можно показать до 10 различных значений.
У нас есть характеристика num-of-doors, которая содержит целые числа — количество дверей (2 или 4). Преобразуем эти значения в фигуры: квадрат для 4 дверей, круг для 2 дверей. Используется параметр markersymbol функции Scatter3D.
Наблюдения: такое чувство, что у всех самых дешёвых машин по 4 двери (круги). Продолжая изучать график, можно будет сделать больше предположений и выводов.
6D график с формой маркера в качестве шестого измерения (количество дверей)
Можем ли мы добавить больше измерений?
Конечно можем! У маркеров есть больше свойств, таких как непрозрачность и градиенты, которые можно задействовать. Но чем больше измерений мы добавляем, тем труднее удержать их все в голове.
Исходный код
Код на Python и интерактивные графики для всех фигур доступны на GitHub здесь.
Популярно о компьютерной 3D графике, часть 1 / Хабр
Все мы слышали о 3D-графике (также просто 3D, не путать со способами отображения — голограммами, 3D-мониторами и т.п.), многие знают, что такое 3D и с его едят. Но, все же, есть и те, кто смутно себе представляет, что кроется под этой короткой аббревиатурой. Статья рассчитана на тех, кто не имеет представление о компьютерной графике. Также будет немного экскурса в историю компьютерной графики (в следующих частях).
Почему именно 3D? Как нетрудно догадаться, речь идет о 3 Dimension, или о трех измерениях. И не обязательно при этом, чтобы и отображалось в 3D. Речь идет о способе построения картинки.
Часть 1. Собственно, моделирование
Традиционно рисуют в 2D (по осям X и Y) — на бумаге, холсте, дереве и т.п. При этом отображают какую-то одну из сторон предмета. Картинка сама по себе плоская. Мы хотим получить представление обо всех сторонах предмета, то необходимо нарисовать несколько рисунков.Так поступают в традиционной рисованной анимации. Но, вместе с тем, существует, (кстати, в СССР была довольно хорошо развита) т.н. кукольная анимация. Один раз изготовленную куклу снимают в необходимых позах и ракурсах, получая серию «плоских картинок». 3D (к X и Y добавляются координаты глубины Z) визуализация — это те же «куклы», только усилием в цифровом виде. Другими словами, в специальных программах (Blender, 3ds Max, Maya, Cinema 4D и т.п.) создается объемное изображение, например авто.
Большим образом заданного метода в том, что в пространстве, скажем, аниматора есть объемная модель, необходимо лишь поместить ее должным образом в кадр, анимировать (задать траекторию передвижения или рассчитать с помощью симулятора) при необходимости, а уж отображение авто в финальной картинке ложится на специальную программу называемую визуализатором (render). Еще одно преимущество в том, что модель достаточно нарисовать один раз, а потом использовать в других проектах (скопировав), исследовать, деформировать и т.п. по своему усмотрению. Для обычного 2D рисунка, в общем случае, такое невозможно. Третье преимущество — можно создать практически бесконечно детализированные модели, например смоделировать даже винтики на часах и т.п. На общем плане этот винтик может быть и неразличим, но стоит нам приблизить камеру, программа-визуализатор сама рассчитывает, что — нет.
Существует несколько способов моделирования, но самым популярным является полигональное моделирование.Нередко можно увидеть в роликах о 3D или фантастических фильмах как тот или иной объект представляется в виде т.н. сетки. (см. рисунок выше) Это и есть пример полигонального моделирования. Суть его в том, что поверхности представляются в виде простых геометрических двумерных примитивов. В компьютерных играх это треугольники, для других целей использовать четырехугольники и фигуры с большим кол-вом углов. Эти примитивы, из которых состоит модель, называют полигонами . Но при создании 3D объекта стараются обойтись, как правило, четырехугольниками.При необходимости четырехугольники (полигоны) без проблем превращаются в треугольники при экспорте в игровой движок, при необходимости сглаживания или тесселяции модель из четырехугольников получается, как правило, без артефактов.
Что такое тесселяция? Если какой-то объект представляется в виде полигонов (особенно органические объекты, например человек), то понятно, что чем меньше размер полигонов, чем их больше, тем более близкой может быть модель к оригиналу. На этом основан метод тесселяции: сначала изготавливают грубую болванку из небольшого кол-ва полигонов, применяют операцию тесселяции, при этом каждый полигон делится на 4 части.Так вот, если полигон четырехугольный (а еще лучше, близок к квадрату) то алгоритмы тесселяции дают более качественный и предсказуемый результат. Также операция сглаживания, а это та же тесселяция, только с изменением углов на более тупые, при близких к квадрату полигонах, позволяет получить хороший результат.
Как было сказано выше, чем больше полигонов, тем более модель может (может, потому что модель должна быть еще похожа на оригинал, а это вопрос мастерства моделера, а не полигонов) походить на оригинал.Но у большого кол-ва полигонов есть обратная сторона: понижение производительности. Чем больше полигонов, тем больше точек по которым они строятся, тем больше данных приходится обрабатывать процессору. Поэтому — это всегда компромисс между деталями модели и производственной графики. В связи с этим даже возникли термины: hight poly и low poly, соответственно высоко полигональная модель и низко полигональная модель. В играх применяются полигональные модели, так как в них выполняется визуализация в реальном времени.Кстати, модели в играх представленных треугольников для производительности производительности: графические процессоры умеют на аппаратном уровне быстро обрабатывать миллионы треугольников за секунду.
Как правило, полигональное моделирование относится к пустотелому моделированию, где объект имеет только объем, но внутри пустой. Это означает, что если мы смоделируем куб, а потом удалим одну из стенок, то увидим внутри пустоту. Также имеются программы для твердотельного моделирования, где тот же самый куб представлен в виде монолитного объекта.В таких программах (к примеру, Autodesk Inventor) применяются математические модели отличные от тех, что в полигональном моделировании. Алгоритмы твердотельного моделирования лучше подходят для моделирования механизмов при разработке техники. Программа вроде Autodesk Inventor средства для моделирования с учетом особенностей технологического процесса, как то фаски, сверление отверстий, проставление размеров, допусков и т.п. Получаемые модели можно сразу отправить на подходящий станок для получения изделия в металле или другом материале.
Также существуют так называемые программы 3D лепки (ZBrush, Autodesk Mudbox) в которых моделирование сводится (грубо говоря) к созданию создания или выпуклостей. Такая техника похожа на то, как скульпторы лепят из глины — убирая ненужное и добавляя необходимое. С помощью таких программ можно добиться реалистичного рельефа поверхности, например морщин на коже или складок ткани. В настоящее время высокополигональные (а для лепки модель должна обладать солидным кол-вом полигонов) реалистичные модели людей и вообще животного мира выполняются, в своем большинстве, с применением программы лепки.Распространена практика когда заготовка модели создается с помощью полигонального моделирования, а затем в программе лепки тесселируются и добавляются мелкие детали.
Но вот у нас есть готовая модель, скажем, танка. Но на танк, собственно, она не совсем похожа. В чем же тут дело? На данном этапе у нас всего лишь математическая модель содержит данные только о геометрической форме. Но у реального объекта кроме формы есть еще и цвет, плотность, отражающая способность, и, возможно, запах.Последнее пока в 3D графике не применяется, а вот все остальное можно смоделировать. Придание модели нужного цвета и блеска называют текстурированием, от слова текстура.
В общем случае текстура — это двумерный рисунок который накладывается на 3D модель. Текстура может быть как процедурной — сгенерированной при помощи алгоритма, так и нарисованная в графическом редакторе, или фотографией реального объекта. С помощью текстуры и цвет модели, но реальная поверхность обладает свойствами: отражающей способностью, преломлением, рельефом, позрачностью и т.п. Все эти параметры задаются в свойствах материала. Т.е. материал с точки 3D графики — это некая математическая модель описывающая параметры поверхности. Например, для воды обязательно указать прозрачность и преломляющую, отражающую способность.
Перед «нанесением» материала на 3D модель необходимо создать еетку, т.е. представить все (несколько, одну) поверхности в виде проекции на плоскость. Это необходимо для того, чтобы затем двумерная текстура правильно «лягла» на модель.
Таким образом изготовление моделей в общем случае из следующего стадий:
1. Получение изображений референса (т.е. того, с чего будет моделироваться) или самого референса. Или отрисовка экскиза.
2. Моделирование геометрии на основе референса.
3. Создание развертки.
4. Отрисовка текстур или получение их другим способом в виде файлов.
5. Настройка параметров материала (текстуры, преломление, отражение, прозрачность).
Теперь 3D модель готова для визуализации — получения картинки.
Первый и четвертый пункт могут быть опущены, если модель простая, но, как правило, хороших результатов без всех 5 шагов не добиться.
Подытожим.
Между обычным рисунком, скажем, на бумаге, и построением 3D есть различия в самом процессе. Двумерный рисунок, как правило, создается в два этапа: эскиз и раскрашивание. В 3D графике после изготовления модели ее необходимо поместить в сцену к другим объектам (или в так называемую студию), добавить освещение, камеру и лишь затем можно надеяться получить финальную картинку.Изображение в 3Dграфике просчитывается на основе физических моделей, как правило, это модель распространения луча света с учетом отражения, преломления, рассеивания и т.п. Рисуя красками мы сами отрисовываем тени, блики и т.д., в трехмерном графике мы подготавливаем сцену с учетом освещения, материалов, геометрии, свойств камеры, программа рассчитывает итоговую картинку сама.
Вот, на сегодня пока и все. Комментарии, а особенно вопросы и замечания по существу приветствуются.
с.S. В следующих частях (если Хабрабществу будет интересно) мы более подробно поговорим о трехмерном моделировании для игр, будет включать визуализация, моделирование динамических сред, таких как вода, разрушение объекта и включить динамическое взаимодействие между 3D объектами, 3D графики.
.
Трёхмерная графика с нуля. Часть 1: трассировка лучей / Хабр
Эта статья разделена на две основные части, Трассировка лучей и Растеризация , в которых рассматриваются два основных способа получения красивых изображений из данных. В главе Общие концепции представлены некоторые базовые понятия, необходимые для понимания этих двух частей.
В этой работе мы сосредоточимся не на скорости, а на чётком объяснении концепций. Код примеров наиболее используемым понятным , который не обязательно является самым эффективным для реализации алгоритмов.Есть множество способов реализации, я выбрал тот, который проще всего понять.
«Конечным результатом» работы будут два завершенных, полностью рабочих рендереров: этой трассировщик лучей и растеризатор. Хотя в них используются очень отличающиеся подходы, при рендеринге они показывают разные результаты:
Хотя их возможности во многом пересекаются, они не аналогичны, поэтому в статье рассматриваются их сильные стороны:
. , которые можно запустить в браузере.
Зачем читать эту статью?
Эта работа даст вам всю информацию, специальную информацию для написания программных рендереров. Хотя в нашу эру видеопроцессоров немногие найденные убедительные причины для написания чисто программного рендерера, его написания будет ценным по следующим причинам:
- Шейдеры . В первых видеопроцессорах алгоритмы были жёстко заданы в «железе», но в современных программистах должны писать собственные шейдеры. Другими словами, вам всё равно нужно реализовывать большие фрагменты ПО рендеринга, только теперь оно выполняется в видеопроцессоре.
- Понимание . Вне зависимости от того, что происходит, когда вы используете готовый конвейер или пишете свои шейдеры, понимание того, что происходит за кулисами, позволяет вам оптимальнее использовать готовый конвейер и писать шейдеры лучше.
- Интересность . Немногие области информатики могут похвастаться мгновенного получения видимых результатов, которые даёт нам компьютерная графика. Чувство гордости после запуска выполнения первого запроса SQL несравнимо с тем, что вы чувствуете в первый раз, когда удастся правильно оттрассировать отражения.Я преподавал компьютерную графику в университете в течение пяти лет. Меня часто удивляло, как мне удавалось семестр за семестром получать удовольствие: в конце концов мои усилия оправдывали себя радостью студентов от того, что они могли использовать свои первые рендеры в качестве обоев рабочего стола.
Холст (Холст)
В процессе работы мы будем рисовать объекты на холсте (холст) . Холст — это прямоугольный массив пикселей, которые можно индивидуально раскрашивать.Будет ли он на экране, печататься на литературе или как текстура при последующем рендеринге? Для нашей работы это не важно: мы сосредоточены на рендеринге изображений на этом абстрактном прямоугольном массиве пикселей.
Всё в этой статье мы будем строить из простого примитива: отрисовывать пиксель на холсте с заданным цветом:
canvas.PutPixel (x, y, color)
Теперь мы изучим параметры этого метода — координаты и цвета.
Системы координат
Холст имеет установленную ширину и высоту в пикселях, которые мы назовём и.Для работы с его пикселями можно использовать любую систему координат.
Это очень естественная система координат с учётом организации видеопамяти, но для людей она не очень привычна. Вместо этого мы будем использовать систему координат, обычно применяемую для отрисовки графика на бумаге: начало координат в центре увеличивается, а — вверх:
При использовании этой системы координат координата находится в интервале, а координата — в интервале (Примечание: строго в интервале Мы проигнорируем это за пределами интервала.). Для упрощения попытки работы с пикселями вне возможного интервала, просто ничего не будет происходить.
В примерахст будет рисоваться на экране, поэтому необходимо выполнить преобразование из одной системы координат в другую. Если предположить, что экран имеет тот же размер, что и холст, то уравнения преобразования будут простыми:
Цветовые модели
Сама теория работы цвета цветающа, но, к сожалению, находится за пределами нашей тематики.Ниже представлена упрощенная версия тех услуг, которые нам важны.
Цветом называется способ интерпретации мозгом фотонов, попадающих в наш глаз. Эти фотоны переносят разные частоты, наши глаза связывают эти частоты с цветами. Наименьшая примерно воспринимаемая нами энергия имеет частоту 450 ТГц, мы воспринимаем ее как красный цвет. На другом конце находится 750 ТГц, которые мы видим как «фиолетовый». Между этими двумя частотами мы видим непрерывный спектр цветов, (например, зелёный — это примерно 575 ТГц).
В обычном состоянии мы не можем видеть частоты за пределами этого диапазона. Более высокие частоты несут большую энергию, поэтому инфракрасное излучение (частоты ниже 450 ТГц) безвредно, но ультрафиолет (частоты выше 750 ТГц) может обжечь кожу.
Любой цвет можно описать как различные сочетания этих цветов (в частности, «белый» — это сумма всех цветов, а «чёрный» — отсутствие всех цветов). Описывать цвета указанием точной частоты неудобно. К счастью, можно создать почти все цвета как линейную комбинацию всего трёх цветов, которые мы называем «наносим цветами».
Субтрактивная цветовая модель
Объекты имеют разный цвет, потому что они поглощают и отражают свет по-разному. Давайте начнём с белого света, например, солнечного (Примечание: солнечный свет не совсем белый, но для наших целей достаточно близок к нему.). Белый свет содержит частоты всех цветов. Когда свет падает на объект, то в зависимости от материала его поверхности поглощает часть частот и отражает. Часть отражённого света попадает в наш глаз и мозг преобразует его в цвет.Какой цвет? Сумма всех отраженных частот (Примечание: из-за современных термодинамики остальная часть энергии не теряется, она в основном превращается в тепло.).
Подведём итог: мы начинаем со всех частот, и вычитаем какое-то основное цветов для создания другого цвета. Мы вычитаем частоты, такая модель называется субтрактивной цветовой моделью .
Однако эта модель не совсем верна. На самом деле используются цветы в субтрактивной модели — это не синий, красный и жёлтый, как учат детей и студентов, а голубой (голубой), пурпурный (пурпурный) и жёлтый (желтый).Более того, смешение трёх основных цветов даёт какой-то темноватый цвет, который не совсем похож на чёрный, поэтому в качестве четвёртого «основного» цвета добавляется чёрный. Чёрный обозначается буквой K — и так получается цветовая модель CMYK, используемая для принтеров.
Аддитивная цветовая модель
Но это только половина истории. Экраны мониторов противоположны бумаге. Бумага не излучает свет, а просто отражает часть падающего на нее света. С другой стороны, экраны чёрные, но они сами излучают свет.На бумаге мы начинали с белого света и вычитали ненужные частоты; на экране мы начинаем с отсутствия света и добавляем нужные частоты.
Получается, что для этого нужны другие основные цвета. Большинство цветов можно создать добавлением к чёрной поверхности различных величин красного, зелёного и синего; это цветовая модель RGB, аддитивная цветовая модель :
Забудем о подробностях
Теперь, когда вы всё это знаете, то избирательно забыть ненужные подробности и сосредоточиться на том, что для работы.
Большинство цветов можно представить в RGB или CMYK (или во множестве других цветовых моделей) и можно преобразовать их из одного цветового пространства в другое. Наша основная задача — рендеринг изображений на экран, мы будем использовать цветовую модель RGB.
Как сказано выше, объекты поглощают часть падающего на них света, и отражают остальной. Поглощаемые и отражаемые частоты мы воспринимаем как «цвет» поверхности. Начиная с этого момента мы будем воспринимать цвет просто как свойство поверхности и забудем о частотах поглощаемого света.
Глубина и представление цвета
Как объяснено цвета в разделе, мониторы могут создавать из различных сочетаний красного, зелёного и синего.
Насколько разной может быть их яркость? Хотя напряжение — это непрерывная переменная, мы будем обрабатывать цвета с помощью компьютера, используя дискретные значения. Чем больше различных оттенков красного, зелёного и синего мы можем установить, тем больше цветов мы сможем создать.
В самом популярном сегодня формате используется по 8 бит на основной цвет (также называемый цветовым каналом ).8 бит на канал дают нам 24 бита на пискель, есть всего различных цветов (приблизительно 16,7 миллионов). Этот формат, известный как 888, мы и будем использовать в нашей работе. Можно сказать, что этот формат имеет глубину цвета 24 бит.
Однако он ни в коем случае не является возможным возможным форматом. Не так давно для экономии памяти были популярны 15-битные и 16-битные форматы, назначенные по 5 бит на канал или 5 бит для красного, 6 для зелёного и 5 для синего (этот формат был известен как 565).Почему зелёный цвет получил лишний бит? Потому что наши глаза более чувствительны к изменениям зелёного, чем красного или синего.
16 бит дают нам цветов (примерно 65 тысяч). Это значит, что мы получаем один цвет для каждых 256 цветов 24-битного режима. Хотя 65 тысяч — это много, на изображениях с довольно небольшими цветами можно заметить очень небольшие «ступеньки», которые незаметны в 16,7 миллионах цветов. 16,7 миллионов цветов — это ещё и больше, чем может распознать человеческий глаз, поэтому в обозримом будущем мы скорее всего продолжим использовать 24-битные цвета.(Примечание: это относится только к отображению изображений, хранение изображений с более широким диапазоном — это совершенно другой вопрос, который мы рассмотрим в главе «Освещение».)
Для представления цвета мы будем использовать три байта, в каждом из каждого из них. которых будет содержаться значение 8-битного цветового канала. В тексте мы обозначим цвета как — например, — это чистый красный цвет; — белый, а — красновато-фиолетовый.
Управление цветом
Для управления цветами мы используем несколько операций (Примечание: если вы используете линейную алгебру, то воспринимайте цвета как в трёхмерном цветовом пространстве.В статье я познакомлю вас с операциями, которые мы будем использовать для читателей, незнакомых с линейной алгеброй.).
Мы можем увеличить яркость цвета, увеличив каждый цветовой канал на константу:
Мы можемить два цвета, сложив отдельно цветовые каналы:
Например, если у нас есть красновато-фиолетовый
и мы хотим получить такой же оттенок, но в три раза менее яркий, то мы умножаем каждый канал на и получаем. Если мы хотим объединить красный и зелёный, то складываем каналы и получаем, то есть жёлтый.
Внимательный читатель может сказать, что при таких операциях мы можем получить неверные значения: например, удвоив яркость, мы получим значение R вне цветового диапазона. Мы будем считать любое значение больше 255 равным 255, а любое значение меньше 0 равным 0. Это более-менее аналогично, когда вы делаете снимок со слишком большим или малой выдержкой — на нём появляются совершенно белые или совершенно белые области.
Сцена
Холст (холст) — это абстракция, на которой мы всё рендерим.Что же мы рендерим? Ещё одну абстракцию — сцену .
Сцена — это набор объектов, которые вам нужно отрендерить. Это может быть что угодно, от единственной сферы, висящей в пустом пространстве (мы начнём с этого), до невероятно детализированной модели внутренностей носа огра.
Для того, чтобы говорить об объекте в сцене, нам нужна система координат. Выбрать можно любую, но мы подберём что-нибудь полезное для наших целей. Ось Y будет направлена вверх. Оси X и Z горизонтальны.То есть плоскость XZ будет «полом», а XY и YZ — вертикальными «стенами».
9000
Мы говорим здесь о «физических» объектах, то нужно выбрать единицы их измерения. Они тоже могут быть любыми, но сильно зависят от того, что представлена в сцене. «1» может быть одним миллиметром при моделировании кружки, или одной астрономической единицей при моделировании Солнечной системы. К счастью, ничто из описанного ниже не зависит от состояния, поэтому мы просто проигнорируем их. Пока мы сохраняем единообразие (т.е. «1» всегда означает для всей сцены одно и то же), то всё будет работать нормально.
Представляю, что вы находитесь в каком-то экзотическом месте, и наслаждаетесь потрясающим видом, настолько потрясающим, что вы просто обязаны запечатлеть его на картине.
Швейцарский ландшафт
У вас есть бумага и маркеры, но совершенно нет художественного таланта. Неужели всё потеряно?
Не обязательно. Может у вас и нет таланта, но есть методичность.
Можно сделать наиболее очевидную вещь: взять сетку от насекомых и поместить ее в прямоугольную раму, присоединившуюся раму к палке. Затем посмотреть такую ландшафт сквозь эту сетку, выбрать наилучший ракурс и поставить ещё одну палку точно там, где должна быть голова, чтобы получить точно же точку обзора:
Вы ещё не начали рисовать, но по крайней мере, у есть фиксированная точка обзор и фиксированная рама, сквозь которую вы видите ландшафт. Более того, эта фиксированная рама разделена на мелкие квадраты.И теперь мы приступаем к методичной части. Нарисуем на бумаге сетку с тем же самым квадратов, что и в сетке от насекомых. Теперь посмотрим на левый верхний квадрат сетки. Какой цвет является в нём доминирующим? Небесно-синий. Поэтому мы рисуем в левом верхнем квадрате бумаги небесно-синим цветом. Грубая аппроксимация ландшафта
Грубая аппроксимация ландшафта
Идеально представлена, то есть компьютер, в сущности, очень методичной машиной, совершенно методичной машиной. отсутствуют художественные таланты.Если мы заменили квадраты на бумаге пикселями на экране, чтобы описать процесс рендеринга следующим образом:
Для каждого пикселя холста Закрасить его нужным цветом
Очень просто!
Однако такой код слишком абстрактен для реализации непосредственно в компьютере. Поэтому мы можем немного углубиться в детали:
Разместить глаз и рамку в нужных местах Для каждого пикселя холста Определить квадрат сетки, соответствующий этому пикселю Определить цвет, видимый сквозь этот квадрат Закрасить пиксель этим цветом
Это по-прежнему слишком абстрактно, но уже начинает походить на алгоритм.Удивительно, но это и есть высокоуровневое описание всего алгоритма трассировки лучей. Да, всё настолько просто.
Разумеется, дьявол скрывается в деталях. В главе следующихх мы подробнее рассмотрим все эти этапы.
Одна из самых интересных вещей в компьютерной графике (а возможно, и самая интересная) — отрисовка графики на экране. Чтобы как можно скорее приступить к ней, мы для начала внесём небольшие упрощения, чтобы уже сейчас вывести что-нибудь на экран. Разумеется, такие упрощения предполагают некоторые ограничения наших действий, но в главех мы шаг за шагом избавимся от этих ограничений.
Во-первых, точка обзора фиксирована. Точка — это место, в котором просматривается глаз в нашей аналогии, и оно обычно называется положением камеры ; давайте назовём его. Мы будем считать, что камера в начале системы координат, то есть.
Во-вторых, мы будем считать, что ориентация камеры тоже фиксирована, то есть камера всегда направлена в одно и то же место. Будем считать, что она смотрит вниз по положительной оси Z, положительная ось Y направлена вверх, положительная ось X — вправо:
Положение и ориентация камеры теперь фиксированы.Но у нас всё ещё нет «рамки» из предложенной нами аналогии, через которую мы смотрим на сцену. Будем считать, что рамка имеет размеры и, она фронтальна относительно положения камеры (то есть перпендикулярна) и находится на расстоянии, её стороны параллельны осям X и Y, и она центрирована относительно. Описание выглядит сложно, но на самом деле всё довольно просто:
Этот прямоугольник, который будет нашим окном в мире, называется окном просмотра (область просмотра) .В сущности, мы будем рисовать на холсте всё то, что видим через окно просмотра. Важно, что размер окна просмотра и до краткости определяет угол видимости из камеры, называемый областью видимости (поле зрения) или для краткости FOV. У людей FOV по горизонтали составляет почти, однако большая часть его составляет смутное периферическое зрение без ощущения глубины. В общем случае достоверные изображения получаются при использовании FOV в вертикальном и горизонтальном направлении; этого можно достичь, задав.
Давайте вернёмся к «алгоритму», представленному в разделе обозначим его шаги цифрами:
Разместить глаз и рамку в нужных местах (1) Для каждого пикселя холста Определить квадратную сетку, соответствующий этому пикселю (2) Определить цвет, видимый сквозь этот квадрат (3) Закрасить пиксель этим цветом (4)
Мы уже выполнили шаг 1 (или, если точнее, избавились от него на время). Шаг 4 тривиален ( canvas. PutPixel (x, y, color)
). Давайте вкратце рассмотрим шаг 2, а затем сосредоточимся на более сложном способах реализации шага 3.
Из холста в окно вид
На шаге 2 нам нужно « Определить квадрат сетки, соответствующий этому пикселю «. Мы знаем координаты пикселя на холсте (мы рисуем их все) — давайте назовём их и.
Что такое 3D-графика и как она устроена
Персонажи, оружие, машины, пончики, пейзажи… всё, что вы видите в играх и фильмах с использованием 3D-графики, состоит из точек, граней и плоскостей. Вот, например, изображение трёхмерной сферы:
Кажется, что это просто гладкий шар, но на самом деле он состоит из множества точек — вершин (англ. вершин — вершины):
Чем больше вершин, тем более детализированной выглядит модель и тем больше ресурсов требуется компьютер, чтобы отрисовать такой объект на экране.
Вершины соединяются друг с другом и образуют рёбра (англ. край ) и грани (англ. грань ):
Всё это образует полигональную сетку (англ. или просто полигональную сетку или просто полигональную сетку или просто полигональную сетку ). , геометрия) —- совокупность вершин, рёбер и граней (плоскостей), которая определяет форму объекта.
У каждой вершины есть свои координаты по осям X , Y и Z . А то, как грань отображается на мониторе, зависит от ее положения относительно камеры и источников света:
Изменяя мешает, добавляя вершины и меняя их положение, мы можем создавать любые сложные объекты:
3D-моделирование в Blender
Для создания твёрдых объектов (англ. твердая поверхность ) 3D-художники обычно меняют положение граней вручную, как это показано выше.
При работе с персонажами чаще используется скульптинг (англ. sculpting ) — напоминает лепку из пластилина:
Скульптинг в Blender
Но геометрия — не последний этап создания 3D-модели. Например, у моделей, созданных скульптинг, плохая топология (то, как именно устроен меш) — слишком много задействовано вершин:
Чтобы исправить это, использовать специальные инструменты для ретопологии — это когда удаляют лишние грани, чтобы оптимизировать модель.
Также нужно подготовить материал — это то, как окрашены разные грани или вся модель. Возможен как и простой цвет, так и изображение или паттерн.
Есть множество других важных моментов: анимирование, запекание текстур, составление карт нормалей и так далее. Всё это стоит изучить тем, кто моделирует 3D. Сейчас же мы поговорим о более техническом вопросе.
.
Что такое 3D графика?
Вступление
Вопрос о том, что же является двигателем всей компьютерной индустрии, давно заботит многих пользователей. То ли это фирма Intel, которая, не переставая, выпускает и выпускает новые процессоры. Но кто тогда заставляет их покупать? Может, во всем виноват Microsoft, который непрерывно делает свои окна больше и краше? Да нет, можно ведь довольствоваться старыми версиями программ — тем более спектр их возможности практически не изменяется.Вывод напрашивается сам собой — во всем виноваты игры. Да, именно игры стремятся все более и более уподобиться реальному миру, создавая его виртуальную копию, хотят все более мощных ресурсов.
Вся история компьютерной графики на PC является подтверждением. Вспомните, в начале были тетрисы, диггеры, арканоиды. Вся графика заключалась в перерисовке небольших участков экрана, спрайтов, и нормально работала даже на XT. Но прошли те времена. Взошла звезда симуляторов.
С выходом таких игр, как F19, Formula 1 и т.п., в приходилось уже перерисовывать весь экран, заготавливая его в памяти, всем нам пришлось обзавестись, по крайней мере, 286 процессором. Но прогресс на этом не остановился. Желание уподобить виртуальный мир в игре реальному миру усилилось, и появился Wolf 3D.
Это, можно сказать, первая 3D-игра, в которой был смоделирован какой-никакой, но все же реалистичный мир. Для его пришлось использовать верхнюю (более 640 Кб) память и загнать программу в защищенный режим.Для полноценной игры пришлось установить процессор 80386. Но и мир Wolf 3D страдал недостатками. Хотя стены и были не просто одноцветными прямоугольниками, но для их закраски использовались текстуры с небольшим разрешением, поэтому поверхности смотрелись прилично лишь на расстоянии. Конечно, можно было пойти по пути наращивания разрешения текстур, вспомним, например, DOOM. Тогда нам пришлось снова перейти на новый процессор и увеличить количество памяти. Правда, все равно, хотя изображение и улучшилось, но ему были присущи все те же недостатки.Да и плоские объекты и монстры — кому это интересно. Тут то и взошла звезда Quake. В этой игре был применен революционный подход — z-буфер, позволивший придать объемность всем объектам. Однако вся игра все равно работала в невысоком разрешении и не отличалась высокой реалистичностью.
Назревало новое аппаратное решение. И решение это оказалось, в общем-то, лежащим на поверхности. Разместите в 3D Studio перед созданием очередной картинки, чтобы ускорить процесс.А раз центральный процессор с этой справляется из рук вон плохо, было принято революционное решение — сделать специализированный.
Тут то и вылез производитель игровых автоматов 3Dfx, сделавший эту сказку былью с помощью своего графического процессора Voodoo. Человечество сделало еще один шаг в виртуальный мир.
А поскольку системы на ПК с текстурными окнами, уплывающими назад, в туман, пока нет, и не предвидится, можно пока применить только к играм, что успешно делает все цивилизованное человечество.
Модель
. Первоначально, объект представляется в виде точек набора или координат, в трехмерном пространстве. Трехмерная система координат определяется тремя осями: горизонтальной, вертикальной и глубины, обычно называемых, соответственно осями x, y и z. Объектом может быть дом, человек, машина, самолет или целый 3D мир и координаты определяют положение вершин (узловых точек), из которых состоит объект, в пространстве.Соединивины объекта линиями, мы получим каркасную модель, называемую так из-за того, что видимыми являются только края трехмерного тела. Каркасная модель определяет области, которые могут быть заполнены цветом, текстурами и освещаться лучами света.
Рис. 1: Каркасная модель куба
Даже при таком упрощенном объяснении конвейера 3D становится ясно, как много требуется вычислений для прорисовки трехмерного объекта на двумерном экране.Можно представить, увеличивается объем требуемых вычислений над системой координат, если объект движется.
Рис. 2: Модель самолета с закрашенными поверхностями
Роль API
Программируемый интерфейс приложений (API) состоит из функций, управляющих 3D конвейером на программном уровне, но при этом может использовать преимущества аппаратной реализации 3D, в случае наличия этой возможности. Если имеется аппаратный ускоритель, API использует его преимущества, если нет, то API работает с оптимальными настройками, рассчитанными на самые обычные системы.Таким образом, благодаря применению API, любое количество программных средств может поддерживаться любым механизмом 3D ускорителей.
Для приложений общего и развлекательного направления существуют следующие API:
- Microsoft Direct3D
- Criterion Renderware
- Argonaut BRender
- Intel 3DR
Компания Apple продвигает свой интерфейс Rave, созданный на основе собственного API Quickdraw 3D.
Для профессиональных приложений, работающих под управлением WindowsNT доминирует интерфейс OpenGL.Компания Autodesk, крупнейший производитель инженерных приложений, разработала свой собственный API, называемый Heidi.
Свои API разработали и такие компании, как Intergraph — RenderGL, и 3DFX — GLide.
Существующий и доступный 3D-интерфейс, поддерживающий множество графических подсистем и приложений, увеличивает потребность в аппаратных ускорителях трехмерной графики, работающих в режиме реального времени. Развлекательные приложения, главный потребитель и заказчик ускорителей, но не стоит забывать и о прфессиональных приложениях для обработки 3D графики, работающих под управлением Windows NT, многие из которых переносятся с высокопроизводительных рабочих станций, типа Silicon Graphics, на платформу ПК.Простые графические интерфейсы, интуитивности и гибкости. Взаимодействие в World Wide Web будет намного проще и удобнее, если будет происходить в трехмерном пространстве.
Графический ускоритель
Рынок графических подсистем до появления понятия малтимеди был относительно прост в развитии. Важная вехой в развитии был стандарт VGA (массив видеографики), компания IBM в 1987 году, благодаря чему производители видеоадаптеров получили возможность использовать более высокое разрешение (640х480) и большую глубину представления цвета на мониторе компьютера.С помощью системы управления ОС Windows появилась острая потребность в аппаратных ускорителях, чтобы разгрузить центральный процессор системы, вынужденный обрабатывать дополнительные события. Отвлечение ЦП на обработку графического интерфейса пользователя — графического интерфеса пользователя, а так как ОС Windows и приложения для нее требуется как можно больше центрального процессора, обработка выполняется с более низким приоритетом, т.е. делалась очень медленно. Производители добавили в свои продукты функции обработки двумерной графики, такие, как прорисовка окон при открытии и свертовании, аппаратный указатель, постоянно видимый при перемещении, закраска области на экране при высокой частоте регенерации изображения. Итак, появился процессор, обеспечивающий ускорение VGA (Accelerated VGA — AVGA), также известный, как Windows или GUI ускоритель, который стал обязательным элементом в современном компьютерех.
Внедрение создало новые проблемы, вызванные добавлением таких компонентов, как звук и цифровое видео к набору двумерных графических функций.Сегодня заметить, что многие продукты AVGA легко на аппаратном уровне обработки цифрового видео. Следовательно, если на вашем мониторе видео проигрывается в окне, размером с почтовую марку — пора установить в Вашей машине малтимедиа ускоритель . Малтимеди ускоритель (мультимедийный ускоритель) обычно имеет встроенные аппаратные функции, позволяющие масштабировать видеоизображение по осям x и y, а также аппаратно преобразовывать цифровой сигнал в аналоговый, для вывода его на монитор в формате RGB.Некоторые малтимедиа акселлераторы могут также иметь встроенные возможности декомпресси цифрового видео.
Разработчики графических подсистем должны исходить из требований, частично диктуемых размерами компьютерного монитора, частично под графическим интерфейсом пользователя, и частично под требования графического процессора. Первичный стандарт VGA с разрешением 640х480 пикселей был адекватен 14 «мониторам, наиболее распространенным в то время. Сегодня наиболее предпочтительны мониторы с разрешением 1024х768 и более.
Основная тенденция при переходе от VGA к малтимеди ускорителям была возможность размещения как можно больше визуальной информации на мониторе компьютера. Использование 3D графики представляет собой логическую интерпретацию этой тенденции. Огроммные объемы визуальной информации могут быть втиснуты в ограниченное пространство экрана монитора, если она присутствует в трехмерном виде. Обработка трехмерной графики в режиме реального времени дает возможность легко оперировать представляемые данные.
Игровые двигатели (игровые движки)
Первое правило компьютерных игр — нет никаких правил. Традиционно, разработчики игр больше трутой графике своих программ, чем следованию рекомендаций технарей. Не взирая на то, что в разработчиках имеется набор трехмерных API, например — Direct3D, некоторые программисты идут по пути создания собственного трехмерного игрового интерфейса или двигателя. Собственные игровые двигатели — один из путей для разработчиков достижения невероятной реалистичности, фактически на пределе возможностей графического программирования.
Нет ничего более желанного для разработчика, чем иметь прямой доступ к функциям компонентов системы. Разработаны несколько моделей разработки собственных игровых двигателей. Например, двигатели Interplay для Descent II и id Software для Quake, обеспечивают истинную трехмерность действия, используя наполную аппаратные функции 3D, если они доступны.
Графика без компромисов
Разговоры, ведущиеся уже довольно долгое время, перспективы применения трехмерной графики в таких областях, как развлечения и бизнес, допредела подогрева интерес пользователей, на рынке уже появился новый тип продуктов. Эти новые технологические решения, совмещают в себе превосходную поддержку 2D графики, соответствующие современные требования к акселлерам Windows, аппаратные функции 3D графики и проигрывают цифровое видео с требуемой смены кадров.
В принципе, эти продукты можно смело отнести к новому поколению графических подсистем, сопровождающих графику без компромиссов, занимающих достойное место стандартного оборудования в настольных вычислительных системах.
Среди представителей нового поколения можно назвать продукты, в качестве примера, следующие:
- процессор Ticket-To-Ride компании Number Nine Visual Technologies
- серия процессоров ViRGE компании S3 Inc.
- процессор RIVA128 , предлагаем компании SGS Thomson и nVidia
Технология 3D-графики
Пусть нам все-таки удалось убедить Вас попробовать трехмерную графику в действии (если Вы до сих пор не сделали это) ), и решили сыграть в одну из трехмерных игр, предназначенных для применения 3D-видеокарты.
Допустим, такой игрой оказался симулятор автомобильных гонок, и Ваша машина уже стоит на старте, готовая устремиться к покорению новых рекордов.Идет предстартовый обратный отсчет, и Вы замечаете, что вид из кабины, отображаемый на экране монитора, немного отличается от привычного.
Вы и прежде участвовали в подобных гонках. Горизонт, вместе с удаленными объектами, тонет в утренней дымке. Дорога выглядит необычайно ровно, асфальт представляет собой набор грязно-серых квадратов, однотонное покрытие с нанесенной дорожной разметкой.Деревья вдоль дороги действительно имеют лиственные кроны, которые, кажется, можно различить отдельные листья. От всего экрана в целом складывается впечатление как от качественной фотографии с реальной перспективой, а не как от жалкой попыток смоделировать реальность.
Попробуем разобраться, какие же технические решения позволяют 3D-видеокартам виртуальную действительность с такой реалистичностью. Каким образом изобразительным средствам ПК удалось достичь уровня профессиональных студий, занимающихся трехмерной графикой.
Часть вычислительных операций, связанным с отображением и моделированием трехмерного мира переложено теперь на 3D-акселератор, который является сердцем 3D-видеокарты. Центральный процессор теперь практически не занимаюсь отображением, образ экрана формирует видеокарта. В основе этого процесса лежит реализация на аппаратном уровне ряда эффектов, а также применение несложного математического аппарата. Попробуем разобраться, что же конкретно умеет графический 3D-процессор.
Возвращаясь к нашему примеру с симулятором гонок, задумаемся, каким образом достигается реалистичность поверхностей дорог или зданий, стоящих на обочине.Для этого применяемый метод, называемый распространенное (отображение текстуры).
Это самый распространенный эффект для моделей поверхностей. Например, фасад здания потребовал бы изображение граней для множества кирпичей, окон и дверей. Изображение накладывается на всю поверхность сразу дает больше реализма, но требует меньше вычислительных ресурсов, так как позволяет оперировать со всем фасадом как с единой поверхностью. Перед тем, как поверхности попадают на экран, они текстурируются и затеняются.Все текстуры хранятся в памяти, обычно установленной на видеокарте. Кстати, здесь нельзя не заметить, что применение AGP делает возможным хранение текста в системной памяти, а ее объем намного больше.
Очевидно, когда на поверхности текстурируются, необходимы учетные перспективы, например, при отображении дороги с разделительной полосой, уходящей за горизонт. Перспективная коррекция необходима для того, чтобы текстурированные объекты выглядели правильно. Она гарантирует, что битмэп правильно наложится на разные части объекта — и те, которые ближе к наблюдателю, и на более далекие.
Коррекция с учетом перспективы очень трудоемкая операция, поэтому нередко можно встретить не совсем верную ее выполнение.
При наложении текста, в принципе, также можно увидеть швы между двумя ближайшими битмэпами. В некоторых играх при изображении дороги или длинных коридоров заметно бывает мерцание во время движения. Для подавления этих трудностей применяется фильтрация (обычно Bi- или три-линейная).
Билинейная фильтрация — метод устранения искажений.При медленном вращении или движении объекта могут быть заметны перескакивания пикселов с одного места на другое, что и вызывает мерцание. Для снижения этого эффекта при билинейной фильтрации для отображения точки поверхности берется взвешенное среднее четырех таких текстурных пикселов.
Трилинейная фильтрация несколько сложнее. Для получения каждого пиксела изображения берется взвешенное среднее значение результатов двух уровней билинейной фильтрации. Полученное изображение будет еще более четкое и менее мерцающее.
Текстуры, с помощью которых формируется поверхность объекта, изменяют свой вид в зависимости от изменения расстояния от объекта до положения глаз зрителя. При движемся изображении, например, по мере того, как объект удаляется от зрителя, текстурный битмэп должен уменьшаться в размерах вместе с уменьшением размера отображаемого объекта. Чтобы выполнить это преобразование, графический процессор преобразует битмэпы текстур до надлежащего размера для покрытия поверхности объекта, но при этом изображение должно оставаться естественным, т.е. объект не должен деформироваться непредвиденным образом.
Этот процесс называется mip mapping для того, чтобы избежать непредвиденных изменений серии управляющих процессов процесса предфильтрованных битмэпов текстур с уменьшенным разрешением. Затем, графическая программа автоматически определяет, какую текстуру использовать, используя детали изображения, которое уже выведено на экран. Соответственно, если объект уменьшается в размерах, размер его текстурного битмэпа тоже уменьшается.
Но вернемся в наш гоночный автомобиль. Сама дорога уже выглядит реалистично, но проблемы наблюдаются с ее краями! Вспомните, как выглядит линия, проведенная на экране не параллельно его краю. Вот и у нашей дороги появляются «рваные края». И для борьбы с этим недостатком изображения сглаживания.
Рваные края | Ровные края |
---|
Это способ обработки (интерполяции) пикселов для получения более четких краев (границ) изображения (объекта).Наиболее часто используемая техника — создание плавного перехода от цвета линии или края к цвету фона. Цвет точки, лежащей на границе определяется как среднее цветов двух граничных точек. Однако в некоторых случаях побочным эффектом сглаживание является смазывание (размытие) краев.
Мы подходим к ключевому моменту функционирования всех 3D-алгоритмов. Предположим, что трек, по которому ездит наша гоночная машина, окружен большим разнообразными объектами — строений, деревьев, людей.
Тут перед 3D-процессом встает главная проблема, как определить, какие из объектов находятся в области видимости, и как они освещены. Причем, знать, что видимо в данный момент, недостаточно. Необходимо иметь информацию и о взаимном расположении объектов. Для решения этой задачи применяемый метод, называемый z-буферизация. Это самый надежный метод удаления скрытых поверхностей. В так называемом z-буфере хранятся значения глубины всех пикселей (z-координаты). Когда рассчитывается (рендерится) новый пиксел, его глубина сравнивается со значениями, хранимыми в z-буфере, а конкретнее с глубинами уже срендеренных пикселов с теми же координатами x и y.Если новый пиксел имеет значение больше какого-либо значения в z-буфере, новый пиксел не записывается в буфер для отображения, если меньше — то записывается.
Z-буферизация при аппаратной реализации сильно увеличенной производительности. Тем не менее, z-буфер занимает большие объемы памяти: например, даже при разрешении 640×480 24-разрядный z-буфер будет занимать около 900 Кб. Эта память должна быть также установлена на 3D-видеокарте.
Разрешающая способность z-буфера — самый главный его атрибут.Она критична для качества изображения сцен с большой глубиной. Чем выше разрешающая способность, тем выше дискретность z-координат и точнее разрешающий рендеринг удаленных объектов. Если при рендеринге разрешающей способности не хватает, то может случиться, что два перекрывающихся объекта получат одну и ту же координату z, в результате аппаратура не будет какой объект ближе к наблюдателю, что может вызвать искажение изображения.
Для предотвращения этих эффектов профессиональные платы 32-разрядный z-буфер и оборудуются большими объемами памяти.
Кроме вышеперечисленных основ, трехмерных графических плат обычно имеют возможность воспроизведения некоторого количества дополнительных функций. Например, если бы на своем гоночном автомобиле въехали бы в песок, то обзор бы затруднился поднявшейся пылью. Для реализации таких и эффективных эффектов применяемого туманообразования (затуманивание). Этот эффект образует за счет комбинирования смешанных компьютерных цветовых пикселей с цветом тумана (туман) под управлением функции, определяющей глубину затуманивания.С помощью этого же алгоритма погружаются далеко отстоящие объекты в дымку, создавая иллюзию расстояния.
Реальный мир состоит из прозрачных, полупрозрачных и непрозрачных объектов. Для учета этого обстоятельства применяется альфа-смешение — способ передачи информации о прозрачности полупрозрачных объектов. Эффект полупрозрачности создается путем установки цвета исходного пиксела с помощью уже находящимся в буфере.
В результате цвет точки является комбинацией цветов переднего и заднего плана.Обычно коэффициент альфа имеет нормализованное значение от 0 до 1 для каждого цветного пиксела. Новый пиксел = (альфа) (цвет пиксела А) + (1 — альфа) (цвет пиксела В).
Очевидно, что для создания реалистичной картины происходящего на экране необходимо частое обновление его содержимого. При формировании каждого следующего кадра, 3D-акселератор проходит весь процесс заново, поэтому он должен получить немалым быстродействием. Но в 3D-графике применяются и другие методы придания плавности движению.Ключевой — Двойная буферизация.
Представьте себе старый трюк аниматоров, рисовавших на уголках стопки бумаги персонаж мультика, со слегка изменяемым положением на каждом следующем листе. Пролистав всю стопку, отгибая уголок, мы увидим плавное движение нашего героя. Практически такой же принцип работы имеет и Double Buffering в 3D анимации, т.е. следующее положение персонажа уже нарисовано, до того, как текущая страница будет пролистана. Без применения двойной буферизации изображение не будет иметь требуемой плавности, т.е. будет прерывистым. Для двойной буферизации требуется двух областей, зарезервированных в буфере трехмерной графической платы; обе области соответствуют размеру изображения, выводимого на экран. Метод использует два буфера для получения изображения: один для отображения картинки, другой для рендеринга. В то время как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буфера переключаются (меняются местами). Таким образом, играющий все время видит отличную картинку.
В заключение обсуждения алгоритмов, применяемых в 3D-графических акселераторах, попробуем разобраться, каким же образом применить все эффекты по отдельности, что позволяет получить целостную картину. 3D-графика реализуется с помощью многоступенчатого механизма, называемого конвейером рендеринга.
Применение конвейерной обработки позволяет еще ускорить выполнение расчетов за счет того, что вычисления для следующего объекта могут быть начаты до начала вычислений предыдущего.
Конвейер рендеринга может быть разделен на 2 стадии: геометрическая обработка и растеризация.
На первой стадии геометрической обработки выполняется преобразование координат (вращение, перенос и масштабирование всех объектов), отсечение невидимых частей, расчет освещения, определение цвета каждой вершины с учетом всех световых источников и процесс деления изображения на более мелкие формы. Для описания характера поверхности объекта она делится на всевозможные многоугольники.
Наиболее часто при отображении графических объектов используется деление на треугольники и четырехугольники, так как они легче всего обсчитываются и ими легко манипулировать.При этом координаты объектов переводятся из вещественного в целочисленное представление для ускорения вычислений.
На второй стадии к изображению применяются все описанные в следующей последовательности: удаление скрытых функций, наложение с учетом перспективы текстур (используя z-буфер), применение эффектов тумана и полупрозрачности, сглаживание. После этого очередная точка считается готовой к помещению в буфер со следующего кадра.
Из всего вышеуказанного можно понять, для каких целей используется память, установленная на плате 3D-акселератора.В ней хранятся текстуры, z-буфер и буфера следующего кадра. При использовании шины PCI, используемой для этих целей, обычная оперативная память не может быть ограничена. Именно по этому для развития 3D-графики особенно перспективно продвижение шины AGP, позволяющее соединить 3D-чип с процессором напрямую и тем самым самым быстрым обменом данными с оперативной памятью. Это решение, к же, должно быть удешевить трехмерные акселераторы за счет того, что на борту остается немного памяти собственно для кадрового буфера.
Повсеместное внедрение 3D-графики вызвало увеличение мощности компьютеров без какого-либо существенного увеличения их цены. Пользователи ошеломлены открывающиеся возможности и стремятся попробовать их у себя на компьютерех. Можество новых 3D-карт позволяет пользователю видеть трехмерную графику в реальном времени на своих домашних компьютерах. Эти новые акселераторы позволяют реализм к изображениям и ускорять вывод схемы обхода центрального процессора, опираясь на собственные аппаратные возможности.
Хотя в настоящее время трехмерные возможности используются только в играх, думается, деловые приложения также могут использовать преимущества из них. Например, средства автоматизированного проектирования уже нуждаются в выводе трехмерных объектов. Теперь создание и проектирование будет возможно и на персональном компьютере благодаря открывающимся возможностям. Трехмерная графика, возможно, сможет также изменить способ взаимодействия человека с компьютером. Использование трехмерных интерфейсов программ должно сделать процесс общения с компьютером еще более простым, чем в настоящее время.
При подготовке материала использовалась информация из Diamond White Papers
.