Главная - Видеосистема - DirectX 8.0: Вопросы и ответы
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.
2. Motion blur
(смазывание движения) -
основанное не на многоразовом
расчете сцены, а на более
продвинутом подходе (работе с
вершинами).
3. Большое
число источников света (более
8) - ограничено только
количеством специальных
регистров ускорителя,
задействованных шейдером!
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 и все что угодно).
2. Реалистичные
тени (когда даже бугорки
рельефа отбрасывают
корректные тени).
3. Плоскости
отсечения произвольной
конфигурации с точностью до
пикселя.
Одним
словом, всевозможные
комбинации попиксельного
освещения и некоторые более
экзотические возможности.
Количество инструкций в
пиксельном шейдере ограничено
8-ю. Каждая инструкция
выполняется приблизительно за
1 такт.
Теперь
хотелось бы упомянуть о микрополигонах.
Микрополигоны в понимании DX8 -
это то, что во всех играх
называется частицы (particles), т.е.
маленькие плоские картинки в 3х
мерном пространстве, лежащие в
плоскости экрана. Реализация
микрополигонов содержит в себе
множество ограничений:
- Максимальный
размер = 64 пикселя
- Текстура
наносится на него только
целиком.
- Невозможны
манипуляции с текстурными
координатами.
- Никакого
мультитекстурирования.
Зачем
столько ограничений? Дело в том,
что скорость растеризации этих
микрополигонов в 2 раза выше, по
сравнению с обычными. А если
учесть, что на частицу обычно
уходит 2 полигона, то в 4 раза
выше.
Но, тем не менее,
строгие ограничения сильно
сужают область применения
подобных частиц. Их можно
прекрасно использовать в эффектах
на основе большого количества
частиц с одинаковой текстурой -
снег, дождь, огонь, облака…
Ранее на подобные эффекты
существенно не хватало
мощностей (когда я увидел
ливень в Metal Gear Solid 2, я понял, что
все виденные мною на PC дожди
просто убогие), приличная тучка
или костер беззастенчиво
требуют 4000-8000 тысяч
микрополигонов. По разным
данным, на Xbox будет
обрабатываться от 150 до 300
миллионов микрополигонов в
секунду (т.е. 3 миллиона капель
дождя в кадре при 100 fps).
В DX8
включена новая надстройка к
Direct3D - D3DX8. Если раньше (в DX7) это
был просто набор утилит и
функций, то теперь это мощная
система, которая включает в
себя:
1. Класс
мультитекстурных эффектов,
загружаемых из текстового
файла.
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) в
играх.