9. тенденции построения современных графических систем: графическое ядро, приложения, инструментарий для написания приложений
Как было сказано выше, одна из важнейших функций 3D САПР – визуализация проектируемого или анализируемого объекта. Для изображения трехмерных объектов на экране монитора требуется проведение серии процессов (так называемого конвейера) с последующей трансляцией результата в двумерный вид. Первоначально, объект представляется в виде набора точек, или координат, в трехмерном пространстве. Трехмерная система координат определяется тремя осями: горизонтальной, вертикальной и глубины. Объектом может быть дом, человек, машина, самолет или целый 3D мир и координаты определяют положение вершин (узловых точек), из которых состоит объект, в пространстве. Соединив вершины объекта линиями, мы получим каркасную модель, называемую так из-за того, что видимыми являются только края поверхностей трехмерного тела. Каркасная модель определяет области, составляющие поверхности объекта, которые могут быть заполнены цветом, текстурами и освещаться лучами света.

Рис. 9.1- Каркасная модель куба
Даже при таком упрощенном объяснении конвейера 3D графики становится ясно, как много требуется вычислений для прорисовки трехмерного объекта на двумерном экране. Можно представить, насколько увеличивается объем требуемых вычислений над системой координат, если объект движется.

Рис. 9.2 - Модель самолета с закрашенными поверхностями
9.1. Понятие конвейеров ввода и вывода графической информации
Множество графических приложений следуют довольно стандартной схеме построения трехмерных изображений (далее мы будем называть этот процесс конвейером). Причем, некоторые программы реализуют все стадии этого конвейера, некоторые же перекладывают часть работы на плечи аппаратных устройств, специальных библиотек программ (API), другие программы или, даже, пользователя. Итак, конвейер состоит из следующих стадий (Рис. 9.3):
1. Определение состояния объектов (Situation modeling) – эта часть программы не имеет прямого отношения к компьютерной графике, она моделирует тот мир, который будет отображаться в дальнейшем.
2. Определение соответствующих текущему состоянию геометрических моделей (Geometry generation) – эта часть конвейера создает геометрическое представление текущего момента нашего маленького "виртуального мира".
3. Разбиение геометрических моделей на примитивы (Tesselation) – эта первая действительно зависимая от "железа" стадия. На ней создается внешний вид объектов в виде набора определенных примитивов, разумеется, на основе информации из предыдущего шага конвейера. Наиболее распространенным примитивом в наше время является треугольник, и большинство современных программ и ускорителей работают именно с треугольниками. Не буду вдаваться в математические подробности, но на треугольники всегда можно разбить любой плоский многоугольник и именно тремя точками можно однозначно задать плоскость в пространстве.

Рис. 9.3 – Конвейер 3D визуализации.
4. Привязка текстур и освещения (Texture and light definition) – на этой стадии определяется, как будут освещены геометрические примитивы (треугольники), а также какие и как на них в дальнейшем будут наложены текстуры. Под текстурами понимаются изображения, передающие внешний вид материала объекта т.е. негеометрическую визуальную информацию. Хороший пример текстуры – песок на абсолютно ровном пляже. Как правило, на этой стадии информация вычисляется только для вершин примитива.
5. Видовые геометрические преобразования (Projection) – здесь определяются новые координаты для всех вершин примитивов, исходя из положения наблюдателя и направления его взгляда. Сцена как бы проектируется на поверхность монитора, превращаясь в двухмерную, хотя информация о расстоянии от наблюдателя до вершин сохраняется для последующей обработки.
6. Отбрасывание невидимых примитивов (Culling) – на этой стадии из списка примитивов исключаются полностью невидимые (оставшиеся позади или сбоку от зоны видимости).
7. Установка примитивов (Setup) – здесь информация о примитивах (координаты вершин, наложение текстур, освещение и т.д.) преобразуется в вид пригодный для последующей стадии. (Например: координаты точек буфера экрана или текстур в целые числа фиксированного размера, с которыми работает аппаратура).
8. Закраска примитивов (Fill) – на этой стадии собственно и происходит построение в буфере кадра (памяти отведенной под результирующие изображение) картинки, на основе информации о примитивах, сформированной предыдущей стадией конвейера, и прочих данных. Таких, как текстуры, таблицы тумана и прозрачности и пр. Как правило, на этой стадии для каждой точки закрашиваемого примитива определяется ее видимость, например с помощью буфера глубин (Z-буфера) и, если она не заслонена более близкой к наблюдателю точкой (другого примитива), вычисляется ее цвет. Цвет определяется на основе информации об освещении и наложении текстур, определенной ранее для вершин этого примитива. Большинство характеристик ускорителя, которые можно почерпнуть из его описания относятся именно к этой стадии, так как в основном именно эту стадию конвейера ускоряют аппаратно (в случае недорогих и доступных плат).
9. Финальная обработка (Post processing) – обработка всей результирующей картинки, как единого целого, какими-либо двумерными эффектами.
Теперь попробуем разобраться, как все обстоит на самом деле. Во-первых, некоторые стадии этого конвейера могут быть переставлены местами, разбиты на части или совмещены. Во-вторых, они могут отсутствовать вообще (редко) или могут появится новые (часто). И, в-третьих, результат работы каждой из них может быть послан (в обход других стадий) обратно. Например, картинку, полученную на последней стадии, можно использовать как новую текстуру для 8-ой стадии, реализуя таким образом эффект отражающих поверхностей (зеркал), таких как мраморный пол в игре Unreal.
9.2. Cтандарты в области разработки графических систем
Программируемый интерфейс приложений (API, Application Programming Interface) состоит из функций, управляющих 3D конвейером на программном уровне, но при этом может использовать преимущества аппаратной реализации 3D, в случае наличия этой возможности. Если имеется аппаратный ускоритель, API использует его преимущества, если нет, то API работает с оптимальными настройками, рассчитанными на самые обычные системы. Таким образом, благодаря применению API, любое количество программных средств может поддерживаться любым количеством аппаратных 3D ускорителей.
Для 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 будет гораздо проще и удобнее, если будет происходить в трехмерном пространстве.
Для производства готового результата надо определится с двумя вещами – какая программа какие стадии конвейера будет выполнять и как она это будет делать. У нас есть три основных кандидата на работу – сама программа (как правило - начальные стадии конвейера), библиотека прикладного программирования (интерфейс, API) и сам ускоритель. Впрочем, программы, не использующие ускоритель, все стадии конвейера выполняют самостоятельно. В понятие библиотеки в данном контексте можно (без особого зазрения совести) поместить драйвера данного ускорителя т.к. с точки зрения программы они становятся частью библиотеки. Программ и ускорителей существует великое множество, а вот число общепризнанных библиотек весьма ограничено. Наиболее часто игры используют следующие библиотеки (Рис. 9.4):
· OpenGL – созданная первоначально для профессиональных графических станций и программ трехмерного моделирования, библиотека. Постепенно она пришла на платформу PC, в основном благодаря стремительному прогрессу в области аппаратного обеспечения. Наличие поддержки этой библиотеки у ускорителя крайне желательно, из-за большого числа программ, ориентированных на нее. Библиотека является в некотором роде высокоуровневой, так как берет на себя все действия, начиная с середины 4-ой ступени нашего конвейера. С одной стороны - это здорово облегчает работу программистам, с другой - способно несколько осложнить ее же, особенно при реализации нестандартных эффектов или необходимости использовать новые возможности ускорителя выходящие за рамки OpenGL. Хороший пример полезности подобного подхода – возможность выпустить версию OpenGL значительно ускоряющую (конкретно – геометрические преобразования) работу программ на новых процессорах с SIMD наборами команд – AMD 3Dnow! и Intel SSE (Katmai New Instructions, MMX2). Очевидным достоинством, также, является переносимость программ на другие, не Wintel-платформы. Существенным, но быстро исправляемым, недостатком – отсутствие ее полного варианта для некоторых распространенных ускорителей.
· Direct3D – библиотека, являющаяся частью Microsoft DirectX и поддерживаемая, сейчас, практически всеми ускорителями. Фактически, представляет собой две библиотеки – низкоуровневую (начиная с 7 стадии) и высокоуровневую (с 5-ой). Результат – большая гибкость для программиста в реализации его идей и, как следствие, головная боль для него же из-за множества связанных с конкретной реализацией ускорителя параметров. Сейчас идет бурное развитие этого продукта Microsoft, и, судя по всему, версия 6 Direct3D (которая уже официально вышла) будет вполне достойным конкурентом OpenGL по своим возможностям и скорости.
· Glide – собственная низкоуровневая библиотека (стадия 7 конвейера и далее) фирмы 3Dfx, добившаяся популярности благодаря большому распространению первых, действительно успешных ускорителей (на базе набора чипов Voodoo). Но, скорее всего, эта библиотека уйдет со сцены в ближайшие несколько лет. Она не поддерживается другими ускорителями и не будет ими поддерживаться (без разрешения 3Dfx это является незаконным)

Рис. 9.4 – Основные 3D библиотеки.
Существует около 10 библиотек низкого уровня, созданных разработчиками различных ускорителей, такие как R-Redline фирмы Rendition, S3D Toolkit фирмы S3 и т.д. Как и следовало ожидать, программы, написанные специально для них, постепенно исчезают.
Хотя большинство современных ускорителей берут на себя лишь две-три последние стадии конвейера, существует важное и быстро прогрессирующие исключение из этого правила: появились первые доступные чипы с поддержкой геометрических преобразований, способные здорово увеличить скорость построения изображения на компьютерах с недостаточной вычислительной мощностью (а она, мощность, недостаточна по определению - иначе не было бы потребности в ускорителях вообще).