DirectX 8.0: Вопросы и ответы


Избавляет ли DirectX 8.0 (далее DX8) программистов от рутины? Это правда, что кода теперь необходимо писать меньше?

Да, исходного кода теперь надо писать существенно меньше. Гораздо проще выполняется инициализация D3D. Раньше было необходимо вызвать 20-30 различных функций в строго определённом порядке и со строго определёнными параметрами! А теперь необходимо заполнить структуру, состоящую из приблизительно 10-ти параметров, и сделать всего два вызова. Кроме того, упрощен процесс создания текстур и картинок, не надо каждый раз заполнять запутанные структуры заранее определёнными параметрами — только один вызов функции (6 параметров) и всё!

Как Вы оцениваете быстродействие DX8? Есть существенные изменения для старого и нового (написанного под DX8) обеспечения?

Игры, не рассчитанные на DX8, получают 5-10% прироста производительности благодаря более качественным библиотекам DX7, которые, разумеется, входят в состав DX8 для совместимости.

Игры, специально написанные для DX8, могут получить прирост производительности от 5% до 50% в зависимости от используемых ими возможностей DX8. Максимальный прирост может быть обеспечен при повсеместном использовании шейдеров вершин (vertex shader's) и обязательном наличии DX8 совместимого ускорителя.

Нужна ли оптимизация приложения для DX8, чтобы разницу с DX7 стала заметна?

Смотря что подразумевается под разницей. В DX8 появились пиксельные и вершинные шейдеры, которые практически ничем не ограничивают фантазию создателей различных эффектов. Для того, чтобы использовать прочие возможности, которые уже включены в DX8 (например, эффекты с использованием T-буфера), игра должна быть создана с учетом этих возможностей.

Получается, что если установить DX8, драйверы DX8, и запустить приложение, созданное для DX7 ранее, мы не увидим ничего нового в смысле скорости и качества?

В смысле качества — ничего (по крайней мере, я ничего не заметил), в смысле скорости — см. вопрос о производительности.

Как обстоят дела с удобством написания и легкостью прочтения исходного кода?

Просто нет слов — по сравнению с DX7 всё стало настолько прозрачнее и удобнее, что даже трудно подобрать соответствующие эпитеты!!! :-)

Говорят, что DX7 соответствует по возможностям OGL 1.2, а как обстоит дело с DX8?

У OpenGL (далее OGL) есть расширения (extensions) — универсальный механизм добавления новых возможностей. Создал новое расширение — получил доступ к новым возможностям аппаратуры. Здесь есть одна сложность (со слов Tony Cox): в 2001 году выйдут DX8 совместимые карты от различных производителей (как минимум, ATI и NVIDIA). Новые возможности этих карт, как обычно, будут поддержаны соответствующими OGL расширениями, но нет никакой гарантии, что это будут одни и те же расширения для одинаковых возможностей. И вам придется писать код с учетом всех существующих карт, как это уже не раз было…

Пиксельных и вершинных шейдеров в OGL нет, а они, несомненно, ОЧЕНЬ большой шаг вперёд как с точки зрения удобства, так и универсальности API. И хотя шейдеры можно сделать доступными через систему OGL расширений, это будет набор вызовов, а не данные. К тому же, у разных производителей вызовы (т.е. расширения) будут собственными!

Хочется еще немного добавить про концепцию пиксельных и вершинных шейдеров. С появлением аппаратного ускорения сразу же теряется гибкость (как правило, в любой области). Появилась аппаратная растеризация и мы потеряли возможность гибкой обработки 2D картинки и произвольных мультитекстурных эффектов. Остались только те операции, которые нам позволяет железо. Появился аппаратный T&L (трансформация и освещение) и пропала возможность гибкого влияния на процесс преобразования координат и освещения примитивов. Концепция шейдеров словно частичный "возврат долгов" программистам от производителей железа — теперь программисты могут достаточно гибко влиять на трансформацию геометрии (вершинные шейдеры) и на процесс растеризации (пиксельные шейдеры).

Что принципиально нового дают шейдеры, чего нельзя сделать механизмами DX7? Перечислим несколько очевидных отличий (хотя их общее количество очень велико)!

1. Mesh morphing (морфинг модели) — есть две 3D модели, вычисляется промежуточная стадия плавного превращения из одной в другую под управлением плавающего коэффициента от 0 до 1.


Видео-ролик: morphing.avi (1.65 Mb)

Все ролики, на которые есть ссылки в данной статье, записаны в формате DiVX, для их просмотра в стандартном MS Media Player вам необходимо скачать и установить себе кодек: http://www.divx.nm.ru/soft/DivX311alpha.EXE (516 Кб)

2. Motion blur (смазывание движения) — основанное не на многоразовом расчете сцены, а на более продвинутом подходе (работе с вершинами).

    
Видео-ролики: blur-off.avi (116 Kb) и blur-on.avi (181 Kb)

3. Большое число источников света (более 8) — ограничено только количеством специальных регистров ускорителя, задействованных шейдером!


Видео-ролик: many-lights.avi (705 Kb)

4. Скининг с использованием большого числа матриц (ограничено только количеством специальных регистров и составляет приблизительно 20 матриц на одну скелетную прямую!

5. Layered fog (слоистый туман) — многоуровневый туман (в оврагах, над водой слоем и т.д.)

И это только некоторые примеры вершинных шейдеров!

Шейдер представляет собою программу на специальном коде, которую любой DX8 совместимый ускоритель исполняет аппаратно. Количество инструкций (размер кода) вершинного шейдера ограничено 127. Каждая инструкция выполняется приблизительно за 1 такт ускорителя. Среди инструкций — различные арифметические операции и условия, выполняющиеся над специальным набором регистров. По сути дела, в ускорителе присутствуют два специализированных программируемых процессора, один из которых используется для обработки координат вершин (трансформации) и задания начальных параметров (установки) треугольников, а второй для вычисления результирующего цвета каждой точки при их закраске (растеризации).

Кстати, графические процессоры GeForce/GeForce2 (а значит, и карты на их основе) не поддерживают vertex shader'ы. Таким образом, на этих GPU возможна работа через DX8 только в режиме Software T&L, в результате теряется весь выигрыш от HW T&L (его просто нет).

Что касается карт на базе GPU Radeon, то тут ситуация аналогична GeForce/Georce2, т.е. карты на этих чипах не поддерживают vertex shader. При этом драйвер позволяет реализовать эту поддержку в режиме SW T&L (+ все бонусы под оптимизированный вертекс буферов). Но при этом HW T&L остаётся полностью незадействованым!

С пиксельными шейдерами всё обстоит несколько сложнее. Основные эффекты:

1. Собственные модели освещения (Phong, Blinn, BDRF и все что угодно).

    
Видео-ролики: dp3-point-light.avi (581 Kb) и dp3-direct-light.avi (1.45 Mb)

2. Реалистичные тени (когда даже бугорки рельефа отбрасывают корректные тени).

3. Плоскости отсечения произвольной конфигурации с точностью до пикселя.

Одним словом, всевозможные комбинации попиксельного освещения и некоторые более экзотические возможности. Количество инструкций в пиксельном шейдере ограничено 8-ю. Каждая инструкция выполняется приблизительно за 1 такт.

Теперь хотелось бы упомянуть о микрополигонах. Микрополигоны в понимании DX8 — это то, что во всех играх называется частицы (particles), т.е. маленькие плоские картинки в 3х мерном пространстве, лежащие в плоскости экрана. Реализация микрополигонов содержит в себе множество ограничений:

  1. Максимальный размер = 64 пикселя
  2. Текстура наносится на него только целиком.
  3. Невозможны манипуляции с текстурными координатами.
  4. Никакого мультитекстурирования.

Зачем столько ограничений? Дело в том, что скорость растеризации этих микрополигонов в 2 раза выше, по сравнению с обычными. А если учесть, что на частицу обычно уходит 2 полигона, то в 4 раза выше. (Кстати, скринсэйвер iXBT как раз и использует подобные частицы, если бы он был написан под DX8 с использованием микрополигонов, он получил бы 2-х кратный прирост скорости)!

Но, тем не менее, строгие ограничения сильно сужают область применения подобных частиц. Их можно прекрасно использовать в эффектах на основе большого количества частиц с одинаковой текстурой — снег, дождь, огонь, облака… Ранее на подобные эффекты существенно не хватало мощностей (когда я увидел ливень в Metal Gear Solid 2, я понял, что все виденные мною на PC дожди просто убогие), приличная тучка или костер беззастенчиво требуют 4000-8000 тысяч микрополигонов. По разным данным, на Xbox будет обрабатываться от 150 до 300 миллионов микрополигонов в секунду (т.е. 3 миллиона капель дождя в кадре при 100 fps).

В DX8 включена новая надстройка к Direct3D — D3DX8. Если раньше (в DX7) это был просто набор утилит и функций, то теперь это мощная система, которая включает в себя:

1. Класс мультитекстурных эффектов, загружаемых из текстового файла.


Видео-ролик: cem.avi (1.02 Mb)

2. LOD технологию на основе т.н. "прогрессивных" моделей.

       

       

3. Кэш-оптимизация моделей.

И много других, мелких, но не менее функциональных вещей…

Есть и еще два новшества в DX8, о которых стоит рассказать отдельно:

Volume texture — объёмные текстуры. Вещь интересная, но противоречивая — с одной стороны, при помощи этих текстур можно создавать всевозможные объёмные эфемерные эффекты, а с другой стороны, расход текстурной памяти будет таким, что ничего не оправдается!!! Для Volume texture обязательно требуется аппаратная поддержка.

High order primitive rendering — поддержка динамической тасселяции поверхностей высшего порядка (сплайнов). Вещь удивительная — на модельке исчезают углы — она становится гладенькой и кругленькой! Всё бы хорошо, но, к сожалению, осуществляется именно поддержка сплайнов, а не subdivision surfaces, т.е. отсюда сразу вытекает патчевая структура модельки и проблемы гладкого стыка патчей — а это усложнение процесса моделирования на порядок! Так что, как мне кажется, далеко не все разработчики приложений бросятся использовать эту интересную функцию DX8. High order primitive rendering требует обязательной аппаратной поддержки.

Какие кардинально новые концепции присутствуют в DX8?

Кардинально нового много:

  • Direct3D: пиксельные и вершинный шейдеры.
  • DirectPlayVoice: живое голосовое общение по сети во время игры. Этого ждали многие и уже достаточно давно. Причём эту возможность можно комбинировать с DirectSound для создания различных звуковых эффектов и с DirectPlay для передачи по интернету.
  • DirectInput также претерпел существенные улучшения. Появилась карта команд (command map) и теперь можно загрузить список СВОИХ команд и соответствующие им константы DirectInput (т.е. коды клавиш, мышь, прочие манипуляторы), и когда эти события происходят, в программу будут приходить уже ваши собственные команды! В реестре сохраняются наборы карт команд "по умолчанию" для различных типов игр, которые можно использовать сразу с этим устройством. И ещё появилось много нового, до чего я пока не добрался.

Есть ли у DX перспектива перебраться на другие платформы?

Здесь будут только Windows и XBox. Остальное не нужно. Причём, как мне кажется, очень скоро основной платформой будет XBox. Зачем DX другие платформы? Никто не будет играть в игры на корпоративном Linux сервере, все будут играть дома на XBox. Это моё мнение.

DX8 ориентирован строго на игры?

Да, фирма Microsoft заявляла, что OpenGL предназначен для серьёзных приложений, где устойчивость важнее скорости, а DX для игр, где нужна максимальная скорость.

В продаже еще нет ускорителей на аппаратном уровне поддерживающих все шэйдеры. Как обстоят дела с эмуляцией, насколько сильно она снижает производительность обычных (класса TNT) ускорителей и последней волны ускорителей, частично поддерживающих шэйдеры?

С пиксельными шейдерами всё очень плохо — если нет поддержки на аппаратном уровне, то ее не будет вообще. Это и понятно, ведь пиксельные шейдеры оперируют с каждым пикселем, для их эмуляции необходимо все изображение растеризовать программно.

У вершинных шейдеров положение гораздо лучше. При использовании с обычными карточками без аппаратного T&L они не должны давать падения производительности. Мы получим выигрыш за счёт того, что используем оптимизированные буфера вершин, а интерпретатор вершинных шейдеров наоборот спровоцирует падение производительности. Они успешно компенсируют друг друга.

По поводу "частичного" поддержания шейдеров — Microsoft против такого понятия. По сути дела, это скатиться в прошедший день несовместимых OGL расширений. Либо ты поддерживаешь весь набор команд шейдера версии N, либо ты его не поддерживаешь. С этой точки зрения карточки GF и GF2 являются переходными от DX7 к DX8 и не имеют поддержки шейдеров DX8.

Есть ли существенные изменения в системе менеджмента текстур?

В DX8 обобщён менеджмент ресурсов. Теперь ресурс — это не только текстура, но и буфера вершин и индексов. Внешне менеджмент не изменился — у каждого ресурса есть приоритет, и драйвер (или D3D) перемещает этот ресурс в соответствии с приоритетом и потребностями в той или иной памяти. Microsoft заявляет о существенном улучшении алгоритмов менеджера ресурсов DX8.

Появились ли удобные средства сохранения контекста (как в OGL), когда последовательность действий можно сохранить и поименовать для последующего обращения (списки)?

Подобная возможность была ещё в DX7 (state block). По функциональности это немного меньше, чем дисплейные списки OGL — здесь можно только записывать состояние (render state/texture stage state/transform/viewport/clip plane/texture/light/material), но нельзя записывать данные типа вершин или индексов.

Шейдеры также являются обобщением концепции state блоков — здесь мы сами строим последовательность необходимых нам действий и запоминаем ее уникальный идентификатор.

Есть ли какие либо новшества в Scene Graph API направлении?

Microsoft обещала соответствующий API, но ничего не сделала в DX8. Есть подозрение, что это направление будет закрыто. В DX8 на него нет никаких намёков.



Приложение: Информация о новых возможностях DX8

DirectGraphics

Полная интеграция DirectDraw и Direct3D

Упрощена инициализация приложения и улучшены аллокация и менеджмент данных. Т.о., интеграция API позволила задавать несколько параллельных входных потоков вертексов для более гибкого рендеринга.

Язык программирования для обработки вершин

Позволяет программистам писать собственные шейдеры для анимации и преобразования моделей, скининга, пользовательских моделей освещения, различных техник, связанных с картами среды, процедурной геометрией и любые другие алгоритмы обработки геометрии.

Язык программирования для обработки пикселей

Позволяет программистам писать собственные шейдеры для комбинирования текстур, попиксельного освещения, наложения рельефа, поточечного наложения среды для фотореалистичного эффекта бликов и любые другие алгоритмы.

Multisampling rendering

Позволяет использовать различные эффекты, связанные с полноэкранным сглаживанием и другими кинематографическими эффектами (сглаживание движения, глубина резкости)

Точечные спрайты

Высокопроизводительная отрисовка систем частиц для искр, взрывов, дождя, снега и т.д.

Объёмные текстуры

Эффект ослабления с расстоянием для попиксельного освещения, объёмные атмосферные эффекты и прочее…

Поддержка примитивов высшего порядка

Улучшает внешний вид моделей и облегчает их перенос из основных систем 3D моделирования.

Высокоуровневые технологии

Включают plug-in'ы экспорта в Direct3D моделей и скинов, адаптивно детализированной геометрии (LOD) и поверхностей высокого порядка (сплайны).

Расширения библиотеки утилит (Direct3DX)

В библиотеку утилит, предназначенную для упрощения создания и отладки Direct3D программ, добавлен новый "слой", реализующий общепринятые задачи, такие как создание пиксельных и вершинных шейдеров, привязка текстур и другая работа с моделями.

DirectAudio

Компоненты, предназначенные для работы со звуком, претерпели значительные изменения. DirectMusic и DirectSound стали более унифицированными API для проигрывания всех форматов, было добавлено множество новых возможностей по его обработке, в том числе динамической. Перечислим новые возможности:

Обработка звуковых данных на основе сообщений (MIDI) и цифрового представления звука (WAV) на основе единого механизма воспроизведения и обработки.

Теперь WAV файлы и ресурсы могут быть загружены и проиграны стандартными средствами DirectMusic. Хотя DirectSound API по прежнему поддерживается, в большинстве случаев гораздо проще переложить воспроизведение, подкачку и синхронизацию заранее созданных аудио потоков на DirectMusic. Для более сложных приложений, оцифровки звука и полнодуплексной обработки по-прежнему выгоднее использовать DirectSound.

Более гибкая модель внутренней передачи и обработки данных (audiopath model).

Если ранее каналы назначались портам, каждый из которых в итоге выводился в DirectSound буфер, то теперь каналы назначаются "audiopaths", которые управляют передачей и обработкой данных. Т.е. данные с синтезатора могут быть посланы на обработку и вывод разными путями одновременно, для различных каналов можно использовать различные фильтры, причём путь прохождения сигналов может динамически меняться по ходу проигрывания.

DLS2 синтез

Теперь полностью поддерживается DLS2 формат банков и синтез, включая огибающие с 6 стадиями, слои, дополнительные низкочастотные осцилляторы и прочие возможности, подсмотренные у таких профессиональных форматов, как SoundFont 2.0 (до 2.1 DSL2 еще крайне далеко). Есть подозрение, что теперь большинство средних sf2 банков можно будет конвертировать в DLS2 (и воспроизводить) практически без потерь.

Специальные эффекты

Прежде чем быть направленными в буферы воспроизведения, итоговые потоки могут быть обработаны в буферах эффектов. Стандартные эффекты, такие как реверберация, дисторшен и эхо предоставляются DirectX Audio, а собственные эффекты могут быть запрограммированы по желанию.

3-D звук

DirectX Audio поддерживает обработку потоков с помощью стандартных пресетов (для reverberation, obstruction, occlusion) в соответствии с I3DL2 (Interactive 3-D Audio Level 2) спецификацией, а также позволяет настроить параметры этих эффектов по своему желанию.

Аудио скрипты

Композиторы и дизайнеры звука могут упростить свою работу, используя возможность написания скриптов. В итоге программа не вдается в детали воспроизведения музыки, а просто вызывает воспроизведение соответствующего скрипта. К примеру, событие в игре может вызвать скрипт, который изменит (отредактирует) текущий саундтрек.

Расширена поддержка контроллеров MIDI

Огибающие могут управлять как RPN, так и NRPN контроллерами.

Значительно расширено управление воспроизведением

Появились новые возможности в проигрывании, зацикливании, синхронизации. Возможна быстрая установка параметров воспроизведения одним вызовом. Треки могут генерироваться в динамике и изменятся перед каждым проигрыванием

Например, для того, чтобы сменить базовые аккорды.

Контейнер

Объект позволяющий сохранить все компоненты, созданные DirectMusic Producer в одном файле, и потом загрузить их одним вызовом.

Lyrics треки

Поддержка текстового сопровождения, синхронизированного с музыкой. Появился объект, представляющий песню (Song)

Он хранит в себе сегменты, автоматизируя их воспроизведение, и автоматически генерируя переходы между ними.

Улучшено кэширование данных

Как и в прочих службах.

DirectPlay

Претерпел значительные изменения. Введен новый набор интерфейсов, "более близкий" доступ к железу, возросла производительность.

Полностью переписаны интерфейсы

Сложность создания сетевого приложения значительно уменьшена благодаря отделению интерфейсов для peer-to-peer и client/server сессий. Интерфейсы для создания сессии DirectPlay следующие:

  • IDirectPlay8Peer Предоставляет методы для создания peer-to-peer сессий.
  • IDirectPlay8Client Предоставляет методы для создания клиентской части приложения типа client/server.
  • IDirectPlay8Server Предоставляет методы для создания серверной части приложения типа client/server.

Добавлена передача звука

  • DirectPlay Voice предоставляет набор интерфейсов для создания голосовых коммуникаций реального времени в приложениях. Определены следующие интерфейсы:
  • IDirectPlayVoiceClient Предоставляет методы для создания и управления клиентом в сессии DirectPlay Voice.
  • IDirectPlayVoiceServer Предоставляет методы для создания и управления сессией DirectPlay Voice.
  • IDirectPlayVoiceSetup Используется для тестирования и настройки DirectPlay Voice audio.

Информация об адресах базируется теперь не на GUID, а на URL

Предыдущие версии DirectPlay адресовали бинарные данные, используя GUID, что было сложно в реализации и нечитабельно для человека. В DirectX 8.0 DirectPlay вводит представление адресов в URL формате. Для создания и манипуляций с новым форматом адресации существуют следующие интерфейсы:

  • IDirectPlay8Address Предоставляет общие адресные методы для создания и управления DirectPlay addresses.
  • IDirectPlay8AddressIP Предоставляет сервис, ориентированный на провайдера по выделению IP.

Добавлена бОльшая масштабируемость и улучшенная система управления памятью

Увеличение пропускной способности сетевых каналов у конечного потребителя существенно сказалось на дизайне и реализации сетевых игр. DirectPlay добавил улучшенное управление потоками, упростив разработку и дизайн масштабируемых, более устойчивых приложений и приложений, поддерживающих massive multiplayer.

Улучшена поддержка Firewalls и Network Address Translators

Написание сетевых игр, которые проходят через Network Address Translators (NATs), Firewalls, и другие методы разделения интернет-соединений, может быть сложным, особенно для протоколов с негарантированной доставкой (UDP). DirectPlay 8.0 поддерживает NAT-решения (где это возможно) для облегчения жизни разработчикам. DirectPlay 8 TCP/IP service provider использует одиночный UDP порт, определяемый разработчиком, для игровых данных, позволяя настраивать firewalls и NATs соответственно.

DirectInput

Microsoft DirectInput for Microsoft DirectX® 8.0 вводит новую возможность: переопределение действий (action mapping). Переопределение действий позволяет установить соответствие между actions и devices, которые не зависят от наличия каких-то специфических частей (например, дополнительные оси или кнопки). Переопределение действий упрощает цикл ввода и упраздняет необходимость в отдельных профилях (custom game drivers, custom device profilers, и custom configuration user interfaces) в играх.




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.