(c) Александр Корень, http://itc.ua В данной Теме недели мы решили затронуть и такую серьезную проблему, как новый API, разработанный компанией Microsoft. Почему лишь затронуть? Дело в том, что DirectX 10 – это не надстройка предшествующей версии, а практически заново созданная «среда существования» графической подсистемы в новой ОС Windows Vista, и даже для поверхностного описания принципов ее работы потребуется объем, намного превосходящий наш журнал. Но, как говорится, и большой путь начинается с маленького шага. Разумеется основные моменты, касающиеся функционирования DirectХ 10 (для простоты под DirectХ 10 мы подразумеваем самую важную его составляющую Direct3D 10) и отличий от девятой версии, в большей части интересны программистам, так как для обычного пользователя вся взаимосвязь с данным API, как правило, заканчивается настройкой вкладки с одноименным названием в меню драйвера. Тем не менее есть несколько моментов, которыми нам хотелось бы поделиться с читателями. DirectХ 10 только в Windows Vista Возможно, эта новость кому-то покажется порядком устаревшей, но начинать описание данного API, думаем, стоит именно с нее. Действительно, Microsoft не будет обеспечивать совместимость нового API с предыдущими версиями своей ОС. Причем в официальном заявлении компании отказ от поддержки DirectХ 10 в Windows XP звучит как невозможность обеспечения полноценной функциональности из-за устаревшего подхода к использованию драйверов и управлению аппаратными ресурсами графической подсистемы. Может возникнуть резонный вопрос: «Каково соотношение технических и маркетинговых предпосылок к такому заявлению?» Однако это не тема нашего сегодняшнего материала. Как бы там ни было, в новой ОС управление всеми аппаратными ресурсами действительно более виртуализировано, в том числе драйверная часть расслоена на две составляющие – низкий (поддержка аппаратных ресурсов на уровне ядра ОС) и пользовательский уровень (по сути, интерфейс для конфигурации). Необходимые нововведения – графический чип с поддержкой нового API в обязательном порядке должен быть мультизадачным, а графическая память соответственно виртуализированной. Так, обращение любого приложения к аппаратным ресурсам графической карты теперь выполняется в четыре стадии – в отличие от трех в предыдущей версии ОС. Теперь любое обращение формируется через интерфейс Direct3D, затем на более низком уровне ядра проходит через виртуальный планировщик работы GPU и менеджер видеопамяти, а далее через низкоуровневый Kernel-Mode Driver (KMD) происходит общение уже с аппаратной частью. Разделения на Direct3D 9 и Direct3D 10 Опять-таки в отличие от Windows XP в Vista будут применяться три графических конвейера. Старый DirectХ-конвейер, оставленный для сохранения совместимости с ПО, разработанным для предыдущей версии ОС, будет выполнять следующий набор действий: аппаратное ускорение видеоконтента вплоть до HDTV (разумеется, с поддержкой HDCP), обработку графики Direct3D 9 (через старую часть драйвера, написанную для XP) и трансформацию вызовов более старых версий Direct3D (5, 6, 7, 8) в код Direct3D 9 с соответствующей заменой стандартных (фиксированных) функций формирования и обработки 3D-объектов шейдером из набора SM 3.0. Второй конвейер также стандартный – это ICD для обеспечения работоспособности OpenGL-приложений. И наконец, третий – тот самый Direct3D 10, который сможет работать только под Windows Vista и не имеет обратной совместимости с предыдущими API DirectX. На нем остановимся подробнее. Новый конвейер Direct3D 10 Пожалуй, главное новшество, положенное в основу Direct3D 10, – максимальное недопущение «вольностей» со стороны производителей GPU из-за специфики структуры нового набора шейдеров SM 4.0. В результате многочисленные надстройки, придуманные производителями, теперь уйдут в прошлое. Вспомните чехарду с Direct3D 9, когда для соответствия спецификациям требовалась лишь поддержка SM 2.0, а уже сами разработчики за три года «додумали» столько, что версии 9.0с и 9.0а отличались такими «мелочами», как SM 3.0, HDR, новые типы фильтрации, использование геометрических шаблонов и т. д. И все это кардинальным образом смогло изменить реализм трехмерной графики. Однако отсутствие жесткой стандартизации на уровне API привело к тому, что многие возможности пришлось снова поддерживать на уровне приложений (читай – игр), а это вылилось в проблемы с совместимостью, потери производительности и др. Теперь только 100%-ное соответствие требованиям нового API позволит карте называться DirectX 10-совместимой, а выход за эти рамки станет бессмысленным. В результате получается, что по 3D-возможностям все новые видеокарты от ATI/AMD и NVIDIA, рассчитанные на Direct3D 10, будут архитектурно идентичными, разница лишь в быстродействии. Полное избавление от фиксированных 3D-функций Все принципы работы, заложенные в DirectX с версии 6 до 8,1, а именно: использование определенных (заранее обозначенных) функций формирования 3D-объектов, теперь уходят в прошлое. Так, начиная с DirectX 10 всем будут заведовать шейдеры. Унификация типов шейдеров Предусматривается использование полностью программируемых универсальных шейдеров при отсутствии разделения на вершинные и пиксельные, как это было раньше. Также добавлен новый тип шейдеров – геометрический, промежуточный между вершинным и пиксельным. Он дает возможность производить манипуляции над уже определившимся массивом треугольников после окончания работы вершинного шейдера и, самое главное, допускает произвольное изменение их геометрии. Потоковый вывод Следом за геометрическим шейдером идет новая процедура конвейера Direct3D10, названная потоковым выводом. Пожалуй, именно это нововведение позволит сделать еще один существенный шаг в сторону полноценной виртуальной реальности. Теперь данные, прошедшие обработку в вершинных и геометрических шейдерах, записываются в выделенные буфера видеопамяти без обязательной отрисовки в пиксельной части конвейера. В результате несколькими возвратами к вершинной части конвейера и определенными алгоритмами в геометрической части можно, к примеру, создавать неоднотипные детализированные ландшафты без потери производительности. Унификация типов ресурсов Подобно шейдреам четкое разграничение по типам ресурсов, используемых для подготовки объектов к визуализации, – также уже пережиток прошлого. Так, текстуры в DirectX 10 перестали быть объектом, доступным исключительно на стадии пиксельного шейдера, т. е. данными, необходимыми только для визуализации. Теперь равнозначный доступ к текстурам можно осуществлять на любой стадии конвейера – от вершинного до пиксельного. Плюс ко всему как текстуры могут быть трактованы массивы вершин или другие типы данных, хранящихся в буферах. Таким образом, подобная неразбериха привела к появлению нового типа данных – текстурному массиву с динамической индексацией в шейдере. Соответственно одни и те же данные, определенные шейдером как текстуры, нормали или набор вершин, дадут на выходе абсолютно разную картину. HLSL 10 (high level shader language) Бурное развитие языка программирования шейдеров высокого уровня за последние два с половиной года для Direct3D и OpenGL 2.0 привело к практически полному отказу от использования ассемблера в описании шейдера. Рассказывать о преимуществах языка высокого уровня мы не станем. Самое главное, что HLSL не требует серьезных знаний в области машинного программирования, в то же время ПО, написанное на этом языке, гораздо легче поддается модернизации. FX 10 Новая система создания 3D-эффектов, использующая синтаксис Direct3D 10. Основная задача, которую должен выполнять данный sub-API, – просчет сложных эффектов в реальном времени в 3D-сценах, для создания которых ранее применялась исключительно предварительная визуализация. SM 4.0 (Shader Model) Обратите внимание на таблицу: с использованием унифицированной модели шейдеров вдвое возрастает эффективность имеющихся в распоряжении ресурсов, так как больше нет разделения на вершинные и пиксельные типы данных. Но не стоит сбрасывать со счетов и количественные показатели, рост которых не может не впечатлять. Вряд ли будет преувеличением сказать, что возможности, доступные четвертому поколению шейдеров, на порядок превосходят заявленные в SM 3.0. Подведение итогов Пример реализации геометрических шейдеров и процедурной геометрии В новых играх, начиная со II квартала 2007 г., нас ожидают очередные стандарты трехмерной графики. На основе таких современных технологий, как процедурная геометрия (Procedural Geometry), к примеру, можно создавать ландшафты с постепенно растущей растительностью, а с помощью систем объемных частиц (Volume Particles) – демонстрировать реалистичные дымовые эффекты (комбинированием систем частиц и расчета освещения с помощью трассировки лучей). В свою очередь, морфинг распределенных объектов (Sparse Morph Targets) – это предельно естественная мимика персонажей. А суть попиксельного замещающего текстурирования (Displacement Mapping) заключается в вытягивании призм из треугольников на поверхности объектов с последующим применением геометрического шейдера для генерации новой текстуры произвольной либо заданной формы с учетом угла обзора камеры. Все это позволит создавать такие игровые движки, реалистичность которых сможет поразить даже видавших виды скептиков. Однако бесплатно ничего не бывает – за подобные красоты пользователю придется платить, и причем весьма немало. Как нам кажется, выход во II квартале 2007 г. более дешевых версий видеокарт для DirectX 10 не исправит ситуацию (вспомните, как было с появлением первых бюджетных для DirectX 9). Современная графика для отрисовки в реальном времени требует все больше аппаратных ресурсов, и гибкость подходов в Direct3D 10 поможет скорее программистам в написании игр, чем пользователям в увеличении производительности. Так что посоветовать можем только одно: чтобы увидеть все вышеописанное у себя на мониторе, но не в режиме пошаговой стратегии, экономьте средства для покупки GeForce 8800 GTX, а еще лучше – сразу двух. Сравнительные характеристики спецификаций различных версий DirectX Параметры | DirectX 8.1 | DirectX 9.0a | DirectX 9.0c | DirectX 10 | Шейдерная модель | SM 1.4 | SM 2.0 | SM 3.0 | SM 4.0 | Вершинные инструкции | 128 | 256 | 512 | 64000 | Пиксельные инструкции | 4+8 | 32+64 | 512 | Вершинные константы | 96 | 256 | 256 | 16×4096 | Пиксельные константы | 8 | 32 | 224 | Вершинные переменные | 16 | 16 | 16 | 4096 | Пиксельные переменные | 2 | 12 | 32 | Вершинные потоки | 16 | 16 | 16 | 16 | Пиксельные потоки | 4+2 | 8+2 | 10 | 32 | Вершинные текстуры | - | - | 4 | 128 | Пиксельные текстуры | 8 | 16 | 16 | Размер 2D-текстур | 2000×2000 | 2000×2000 | 2000×2000 | 8000×8000 |
|