DirectX занимает важное место в архитектуре Windows. Этот набор системных компонентов отвечает за все мультимедийные задачи в системе: видео, звук, графику. Мы расскажем об интересных новинках и изменениях в десятой версии Direct3D – компонента, ответственного за трехмерную графику. Тем более что в Microsoft Vista на его плечи легла визуализация графического интерфейса операционной системы – Aero.

На самом деле мы были бы рады познакомить читателей с новыми возможностями всех компонентов DirectX, если бы... таковые имели место. В этот раз впервые значительным, даже кардинальным изменениям подвергся только Direct3D. Прочие крупные компоненты (а из актуальных их теперь лишь два: DirectInput и DirectSound) остались без изменений, еще несколько уже довольно давно считаются устаревшими (DirectDraw, DirectMusic и DirectPlay) либо предназначенными для мультимедийных, а не игровых задач (DirectShow).

Хотя такой компонент, как Direct3D (D3D), адресован разработчикам ПО и игр и обычные пользователи напрямую с ним не работают, знать о нем им не помешает. Ведь каждая новая версия D3D устанавливает некую планку технических возможностей, которые должен поддерживать 3D-акселератор аппаратно (т. е. без эмуляции видеодрайвером), чтобы называться совместимым с ней, – и эта информация поможет в выборе модели видеокарты. К тому же по поддержке той или иной игрой определенной версии Direct3D можно примерно судить о техническом потенциале графического движка игры, по крайней мере на переходном этапе между версиями (т. е. в ближайшие год-полтора), так как в первую очередь новую версию D3D стараются поддержать наиболее технологичные и современные проекты. И наконец, та или иная игра делается в расчете на определенную минимальную версию Direct3D и без поддержки ее системой (ОС и видеокартой) просто не запустится – это может послужить толчком к апгрейду либо уберечь от покупки несовместимой игры для старого компьютера.





Crysis

Direct3D 10 стал первым крупным обновлением данного API за последние четыре года – со времен появления D3D 9.0 в 2002 г. И это первый случай, когда его новая версия поддерживается только самой последней операционной системой Microsoft Vista. Поддержка D3D10 в Windows XP официально не планируется, к тому же она трудно осуществима технически. Причина кроется в значительном изменении архитектуры дисплейного драйвера, т. е. уходе от принципа его совместимости с прошлым семейством Windows NT 5.x (Windows 2000, XP, 2003 Server). Новая архитектура называется WDDM (Windows Display Driver Model), и переход на нее во многом вызван появлением нового графического интерфейса в Vista – Aero, базирующегося на Direct3D и в немалой степени «нагружающего» 3D-акселератор. Aero не использует для рендеринга GUI старый двумерный GDI API, применявшийся в Windows для этих целей еще с первых версий, и при использовании которого перерисовываются только части экрана, изменившиеся или «затертые» другими окнами, например, при их перемещении. Многие эффекты Aero являются динамическими и истинно трехмерными, что GDI не под силу. В Aero пересмотрена сама концепция рендеринга интерфейса программ: вместо непосредственного рисования на экране происходит сборка изображения из отдельных частей с применением эффектов на лету, несколько раз в секунду, как это осуществляется в играх. В свою очередь рендеринг трехмерного изображения параллельно несколькими программами, а также самой ОС без возникновения задержек требует лучшего управления его ресурсами, что и достигается с помощью WDDM-совместимых драйверов.

От общеархитектурных изменений в Vista для поддержки D3D10 перейдем к новым возможностям этого API и акселераторов, аппаратно совместимых с ним. На диаграмме изображена общая схема 3D-конвейера в Direct3D, округлые блоки являются гибко программируемыми с помощью шейдеров, прямоугольные же по-прежнему управляются путем установки набора состояний, задающих режим их работы. Уделим внимание новым этапам конвейера.







Direct3D 9
Direct3D 10
Схемы конвейера рендеринга Direct3D 9 и Direct3D 10

Input Assembler (IA) предназначен для задания набора входных данных, размещенных в видеопамяти, для использования их последующими этапами конвейера и интерпретации нужным образом. Следующий за ним этап вершинного шейдера (vertex shader, VS) не претерпел особых изменений по сравнению с прошлой версией и служит для трансформации информации отдельных вершин-точек 3D-объектов, изменяя такие их параметры, как координаты или освещенность.

Одним из самых интересных и наиболее мощных нововведений D3D10 являются геометрические шейдеры (geometry shader, GS). Вершинные шейдеры ничего не знают о связях отдельных вершин объекта, над которым работают, т. е. геометрической топологии объекта, и не могут вмешиваться в эти связи, добавляя или удаляя вершины. В отличие от них геометрические шейдеры работают уже с целыми примитивами (точка, линия либо треугольник) и их связями с соседними примитивами, но главное – могут более произвольно с ними обращаться, генерируя на выходе новые примитивы на лету в любом количестве либо пропуская ненужные, в зависимости от входных данных и своего алгоритма. Такие богатые возможности в обращении с геометрией позволяют перенести полностью на GPU многие вещи, которые ранее делались частично под управлением CPU, что снижало скорость параллельной работы процессора и видеокарты за счет частых блокировок 3D-ресурсов для произведения операций над ними на CPU. К примеру, стало возможным полностью перенести на GPU системы частиц, расчет теневых объемов для ряда алгоритмов динамических теней, реализовать наконец честный displacement mapping, некоторые прогрессивные техники motion blur, визуальные эффекты (мех, волосы, растительность), однопроходное создание кубических карт отражения (cubemap).

Стадия геометрического шейдера в 3D-конвейере является опциональной и расположена между этапами вершинного шейдера и растеризации. Кроме того, как видно из схемы, выход геометрического шейдера может быть отправлен и просто в буфер памяти, а затем повторно подан на вход конвейера в произвольный момент, даже на другом кадре. Это позволяет, к примеру, однократно вычислить скелетную анимацию или морфинг для очень сложной модели, сохранить результат операции в видеопамяти, после чего многократно подавать ее на рендеринг на том же или последующих кадрах, реализуя таким образом новый метод инстансинга (instansing) объектов.

Все прочие стадии конвейера не являются чем-то новым: растеризатор преобразует трехмерную сцену в двумерное изображение с учетом перспективы и вызывает пиксельный шейдер (pixel shader, PS) для расчета цвета и Z-глубины каждого пиксела. После чего на последнем этапе сборки и вывода производятся окончательные проверки на глубину (Z test) и соответствие буферу шаблонов (stencil test, может применяться для самых разных алгоритмов, чаще для теней и отражений), в случае успеха результат пиксела сохраняется в буфер кадра или текстуру (render target).





Crysis

В Direct3D 10 используется очередное поколение шейдеров – Shader Model 4.0 (SM 4.0). Среди новых возможностей: целочисленные и побитовые команды для лучшего управления логикой шейдера, снятие ограничений на количество инструкций в шейдере, увеличение лимитов на количество используемых шейдером текстур. Разработчики отказались и от поддержки низкоуровневого ассемблерного языка программирования шейдеров, теперь все шейдеры должны быть написаны на высокоуровневом языке HLSL. Сама функциональность HLSL в четвертой версии разбита на некую базовую, которую поддерживают все три типа шейдеров (VS, GS и PS), и специфическую для каждого из них. Легко видно, что такие изменения, как введение третьего типа шейдеров и унификация их базовой функциональности, лишний раз послужили толчком к переходу в новом D3D10-совместимом поколении акселераторов к унификации архитектуры GPU, когда в зависимости от нагрузки на ту или иную часть 3D-конвейера отдельные вычислительные блоки GPU временно берут на себя функции по работе над одним из трех типов шейдеров. И хотя подобная архитектура GPU не является непременным требованием со стороны спецификаций Direct3D, она оказалась вовремя поддержанной как NVIDIA в GeForce 8 series, так и AMD/ATI в еще не вышедшем R600.

В SM 4.0 было уделено особое внимание передаче константных данных в код шейдера. Через них в шейдер передавались самые разные наборы данных, например о костях модели для скелетной анимации, информация об источниках света, позиции, повороте и масштабе модели. Ранее у каждого шейдера имелся один довольно небольшой блок константных данных, его приходилось часто менять, иногда перед каждым вызовом рендеринга, постоянно перекачивая весь блок между системной и видеопамятью. В SM 4.0 константные данные разбиты на наборы, которыми можно управлять независимо и подключать к шейдеру до 16 таких наборов. Подобный подход дает немалый выигрыш в производительности, поскольку разные наборы констант можно обновлять независимо и с разной частотой. Некоторые загружаются в видеопамять единожды, сразу после загрузки уровня (например, список статических источников света), другие будут изменяться лишь один раз за кадр (положение и параметры динамических источников света в сцене), а третьи – с каждым выводимым объектом (позиция, ориентация, анимационные данные).




Alan Wake

Кроме того, в десятой версии наконец ликвидированы пережитки, которые оставались еще с шестой-седьмой версии. Так, произошел окончательный отказ от механизмов Fixed Function Pipeline (FFP) – конвейера с фиксированной функциональностью, методики рендеринга «дошейдерной» эпохи. Это был большой набор состояний, флагов и функций для их установки, который и так уже долгое время в новых акселераторах эмулировался с помощью шейдеров и существенно «раздувал» как код видеодрайвера, так и саму библиотеку Direct3D. Под нож пошла и «развесистая» система опроса драйвера видеокарты через сам D3D о возможностях и ограничениях аппаратуры – capabilities (или кратко – caps). Зачастую данные, полученные подобным образом, были неполны или просто неверны. Разработчикам также приходилось нередко использовать всевозможные «хаки» как для отдельных поколений графически чипов, так и для некоторых особенностей архитектур видеокарт ATI и NVIDIA. Microsoft пытается в очередной раз привести все к единому, поддерживаемому всеми стандарту, и видеокарты, которые хотят называться D3D10-совместимыми, должны попросту поддерживать все возможности, оговоренные в документации на Direct3D от и до, без отклонений в сторону меньшей функциональности. Были исключены медленные вызовы рендеринга объектов из системной памяти (DrawPrimitiveUp), как и весь механизм работы с пулами памяти. На практике даже в играх топ-компаний часто злоупотребляли этими возможностями, что сильно снижало производительность. Теперь все ресурсы должны быть явно размещены в видеопамяти перед использованием. Исчезла давно критикуемая концепция «потери и восстановления устройства» (device lost & restore) – к такому состоянию Direct3D приходил после нажатия Alt+Tab, Win+L (блокировка сессии) или Alt+Enter (переключение между полноэкранным и оконным режимами). При возникновении подобной ситуации игра должна была освободить все занятые ею ресурсы Direct3D, произвести сброс устройства, затем пересоздать эти ресурсы заново. Что происходило, во-первых, медленно, во-вторых, код обработки описанной ситуации (иногда достаточно сложный) был рассредоточен по всему графическому движку, и в случае допущенной где-то ошибки игра просто «падала» после Alt+Tab. С такой проблемой, наверное, сталкивался каждый. Сейчас из Direct3D выделен отдельный модуль под названием DXGI (DirectX Graphics Infrastructure), который отвечает за общие вопросы управления 3D-адаптерами, дисплеями и экранными режимами, гаммой, презентацией финального изображения, а также обработку ситуаций переключения режима пользователем по Alt+Enter. И наконец, за счет избавления от всех устаревших возможностей, а значит, облегчения Direct3D runtime, вместе с переносом многих проверок правильности данных с этапа рендеринга на этап создания ресурсов, были облегчены многие вызовы Direct3D, т. е. теперь можно выводить на экран больше объектов в каждом кадре при прежней производительности.

Итак, мы видим, что Microsoft учла многие недостатки и ограничения прошлых поколений своего 3D API и постаралась их исправить, зачастую путем простого отказа от накопленного «балласта». Особое внимание было уделено повышению гибкости программирования 3D-конвейера, перспективе обеспечения еще большего параллелизма между CPU и GPU, снижению объемов передаваемых в видеокарту данных, улучшению менеджмента ее ресурсов. Добавление некоторых возможностей, таких как геометрические шейдеры, открывает путь к реализации многих систем и алгоритмов полностью на GPU (системы частиц, displacement mapping). Хотя ничто не дается даром – Direct3D 10 будет работать только с Vista и только с новым поколением ускорителей. Для всего остального придется использовать девятую версию.

Сейчас на рынке уже имеется одна линейка акселераторов с поддержкой Direct3D 10 – NVIDIA GeForce 8800, финальная версия DirectX SDK вышла в декабре, а вот финальную версию D3D10-совместимых драйверов под этот акселератор можно будет увидеть лишь в январе 2007 г., когда в розничной продаже появится Microsoft Windows Vista. В скором времени стоит ожидать как младшие модели в этой линейке ускорителей от NVIDIA, так и конкурирующий продукт от ATI, имеющий пока кодовое название R600 (поступит в I квартале 2007). По-видимому, первые игры с движками, поддерживающими новый API, начнут выходить к весне-лету 2007 г.; вероятно, ими станут Crysis от Crytek или игры на Unreal Engine 3.0 (Unreal Tournament 2007). Впрочем, оба эти движка также поддерживают и DirectX 9.0c, да и полный переход на новую версию API с отказом от поддержки предыдущей произойдет не раньше чем через полтора-два года, когда текущее поколение акселераторов окончательно устареет.























































































































Друзья! Оставляйте, пожалуйста, свои комментарии!!!
Ваше мнение очень важно для нас!

Рейтинг: 0.0 (голосов: 0)
Даты выхода различных версий DirectX
Версия DirectX Операционная система Дата выпуска
DirectX 1.0 Windows 95a 30 сентября 1995
DirectX 2.0/2.0a Windows 95 OSR2 и NT 4.0 5 июня 1996
DirectX 3.0/3.0a Windows NT 4.0 SP3 (последняя версия с поддержкой DirectX для Windows NT 4.0) 15 сентября 1996
DirectX 4.0
DirectX 5.0 Была доступна в бета-версии под Windows NT 5.0, инсталлировалась под Windows NT 4.0 16 июля 1997
DirectX 5.1 Windows 95/98/NT 4.0 1 декабря 1997
DirectX 5.2 Windows 95 5 мая 1998
DirectX 6.0 Windows 98/NT 4.0 7 августа 1998
DirectX 6.1 Windows 95/98/98SE 3 февраля 1999
DirectX 7.0 Windows 95/98/98SE/2000 22 сентября 1999
DirectX 7.0a Windows 95/98/98SE/2000 1999
DirectX 7.1 Windows 95/98/98SE/Mе/2000 16 сентября 1999
DirectX 8.0 Windows 95/98/98SE/Mе/2000 30 сентября 2000
DirectX 8.0 Xbox 3 ноября 2000
DirectX 8.0a Последний вариант под Windows 95 7 ноября 2000
DirectX 8.1 Windows 98/98SE/Mе/2000/XP 12 ноября 2001
DirectX 9.0 Windows Server 2003 19 декабря 2002
DirectX 9.0a Windows 98/98SE/Mе/2000/XP 26 марта 2003
DirectX 9.0b RC2 13 августа 2003
DirectX 9.0c Windows XP SP2, Windows Server 2003 SP1, Xbox 360 13 декабря 2004
DirectX 9.0c Совместимые с DX9.0c версии Windows, впервые включены D3DX DLL 9 декабря 2005
DirectX 9.0c (Shader Model 3.0) Windows XP
Последнее обновление с поддержкой Windows 98/98SE/Mе/2000 – в августе 2005
Версии декабря 2005 и февраля 2006 – с поддержкой формата XML для некоторых классов
Ежемесячные обновления с августа 2005
DirectX 9.0L DirectX 9 API – только для Windows Vista
DirectX 10.0 Новая версия DirectX – только для Windows Vista
Всего комментариев: 0
Имя *:
Email *:
Код *: