Часто задаваемые вопросы о DirectX

В этой статье содержится коллекция часто задаваемых вопросов (часто задаваемых вопросов) о Microsoft DirectX.

Общие проблемы разработки DirectX

Должны ли разработчики игр действительно заботиться о поддержке выпусков x64?

Конечно. Технология x64 широко доступна на рынке. Большинство новых ЦП, проданных за последние несколько лет, и почти все линии процессора в разработке от AMD и Intel, являются 64-разрядными. Windows XP Professional x64 Edition представила технологию включения ОС для x64, выпущенной в апреле 2005 года. Так как для выпусков x64 требуется новое поколение 64-разрядных собственных драйверов, этот первый выпуск был ограничен дистрибутивом OEM.

В Windows Vista клиенты могут выбирать 32-разрядные или 64-разрядные выпуски при покупке компьютеров под управлением Windows, а лицензии для Windows Vista действительны как для 32-разрядных, так и для 64-разрядных выпусков ОС. Кроме того, многие 64-разрядные драйверы доступны в коробке, а производство устройств требуется для предоставления 32-разрядных и 64-разрядных драйверов в рамках программы сертификации Windows.

Все эти факторы значительно увеличат развертывание 64-разрядных выпусков Windows. По мере того как новые компьютеры начинают доставку с более чем 2 ГБ физической ОЗУ, стимул использования 32-разрядной операционной системы значительно уменьшается в пользу 64-разрядных выпусков. 64-разрядная технология полностью поддерживает 32-разрядный собственный код, хотя 64-разрядные собственные реализации необходимы для полного использования нового 64-разрядного пространства памяти. Каждое 32-разрядное приложение должно иметь 64-разрядную совместимость в качестве минимального требования к доставке, и это требование является базовым требованием для совместимости Windows Vista. Несовместимость обычно возникает из использования 16-разрядного кода, предназначенного для операционной системы Windows 3.1 или установки драйверов, которые не предоставляются как в 32-разрядных, так и 64-разрядных собственных формах.

Дополнительные сведения о 64-разрядной технологии см . в 64-разрядном программировании для разработчиков игр.

Должны ли разработчики игр публиковать игры для Windows 95, Windows 98 или Windows ME?

Больше не по двум причинам: производительность и набор компонентов.

Если минимальная скорость ЦП, необходимая для вашей игры, составляет 1,2 ГГц или выше (что более распространено для заголовков высокой производительности), то подавляющее большинство подходящих компьютеров будет работать под управлением Windows XP. К тому времени, когда компьютеры с скоростью ЦП выше 1,2 ГГц продаются, Windows XP был установлен в качестве операционной системы по умолчанию почти всеми производителями. Это означает, что в Windows XP существует множество функций, которые современные разработчики игр должны использовать следующие преимущества:

  • Улучшено многозадачность - что приводит к лучшему, более гладкому интерфейсу для видео, аудио и игр.
  • Более стабильная модель видеодрайва — которая позволяет упростить отладку, более плавное воспроизведение игр и повысить производительность.
  • Упрощенная конфигурация для сети — которая позволяет упростить доступ к многопользовательским играм.
  • Поддержка передачи DMA по умолчанию с жестких дисков — что приводит к более плавной, быстрой загрузке приложений.
  • Отчеты об ошибках Windows , что приводит к более стабильной ОС, драйверам и приложениям.
  • Поддержка Юникода, которая значительно упрощает проблемы локализации.
  • Повышение безопасности и стабильности , что приводит к улучшению взаимодействия с потребителем.
  • Улучшенная поддержка современного оборудования — большинство из которых больше не использует драйверы Windows 98.
  • Улучшенное управление памятью — что приводит к повышению стабильности и безопасности.
  • Улучшенная файловая система NTFS , которая более устойчива к сбоям и имеет более высокую производительность с функциями безопасности.

Должны ли разработчики игр по-прежнему публиковать игры для Windows 2000?

Забудьте об этом. Помимо причин, перечисленных в разделе "Если разработчики игр по-прежнему публикуют игры для Windows 95, Windows 98 или Windows ME?", Windows 2000 не имеет этих функций:

  • Windows XP поддерживает расширенные функции процессора, такие как Hyper-Threading, Multi-Core и x64.
  • Windows XP поддерживает параллельные компоненты, что значительно снижает конфликты версий приложений.
  • Windows XP поддерживает защиту памяти без выполнения, которая помогает предотвратить вредоносные программы и помочь в отладке.
  • Windows XP улучшила поддержку расширенных карта видео на основе AGP и PCI Express.
  • Windows XP поддерживает быстрое переключение пользователей, удаленный рабочий стол и удаленную помощь, что может помочь снизить затраты на поддержку продуктов.
  • Средства производительности, такие как PIX (в пакете SDK для разработчиков DirectX), больше не поддерживают Windows 2000.

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

Каковы различия между различными выпусками Windows Vista? Как они влияют на приложение DirectX?

Семейство Windows Vista включает пять выпусков:

  • Windows Vista Home Basic
  • Windows Vista Домашняя расширенная
  • Windows Vista Business
  • Windows Vista Enterprise
  • Windows Vista Ultimate

Home Basic и Home Premium являются версиями, ориентированными на потребителей, с такими функциями, как Family Сейф ty (ранее известный как родительский контроль), и Home Premium включает Media Center. Бизнес и предприятия — это корпоративные выпуски с такими функциями, как присоединение к домену и удаленный рабочий стол или службы терминалов. Выпуск Ultimate объединяет все функции потребительских и корпоративных выпусков в одну версию. Все выпуски доступны как в 32-разрядной версии (x86), так и в 64-разрядных выпусках (x64), и пользователи могут использовать один и тот же идентификатор продукта для обеих платформ.

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

  • Игры Обозреватель существуют во всех выпусках, но ярлык игр на меню находится только в Home Basic, Home Premium и Ultimate. Игры Обозреватель по-прежнему можно найти во всех выпусках (нажав кнопку "Пуск", наведите указатель на все программы и выберите "Игры"), а также функции интерфейса IGame Обозреватель на всех выпусках.
  • Игры, включенные в Состав Windows, недоступны по умолчанию для бизнеса и предприятия, но их можно включить администратором.
  • Семейные Сейф и оценки игр не отображаются или не влияют на поведение бизнеса или предприятия, и они отключены в Ultimate при присоединении домена.

Параметры управления учетными записями пользователей имеют одинаковые значения по умолчанию для всех выпусков, но их можно переопределить параметрами групповой политики для домена в бизнесе, enterprise и Ultimate. Например, параметр политики "Контроль учетных записей пользователей": поведение запроса на повышение прав для стандартных пользователей может быть задано как автоматическое отклонение запросов на повышение прав в многих бизнес-параметрах для повышения безопасности, и многие пользователи в этих средах всегда будут работать как стандартные пользователи без возможности даже выбрать запуск как Администратор istrator. Любая программа (например, установщик), требующая прав администратора, из-за обнаружения устаревших настроек или наличия манифеста, указывающего запрошенный уровень выполнения как "требовать Администратор istrator", всегда не сможет начаться в таких ситуациях. Другие параметры политики, такие как контроль учетных записей пользователей: только повышенные привилегии исполняемых файлов, подписанных и проверенных, также могут предотвратить работу установщика, если вы не подписываете исполняемый файл с помощью Authenticode.

Эти типы изменений политики можно применять к любому выпуску Windows Vista, но скорее всего, на компьютерах, присоединенных к домену.

Каковы различия между различными выпусками Windows 7? Как они влияют на приложение DirectX?

Большинство пользователей Windows 7, скорее всего, будут иметь один из двух выпусков: Windows 7 Домашняя расширенная, для домашних пользователей или Windows 7 Профессиональная для бизнес-пользователей и разработчиков. Для крупных корпораций существует выпуск корпоративной лицензии Windows 7 Корпоративная, который включает все функции Windows 7; Windows 7 Максимальная является розничным эквивалентом этого выпуска.

Windows 7 Начальная Выпуск доступен в мире для изготовителей оборудования и, как ожидается, будет развернут в основном с помощью netbooks, компьютеров с низкой мощностью записной книжки. Windows 7 Домашняя базовая доступна только на развивающихся рынках.

Обратите внимание, что все выпуски Windows 7 (кроме Starter Edition) доступны для 32-разрядных (x86) и 64-разрядных версий (x64), а все розничные пакеты Windows 7 включают носители для обеих версий. Как и в Windows Vista, пользователи могут использовать тот же идентификатор розничного продукта на любой платформе.

Базовая технология в различных выпусках идентична, и все выпуски имеют одну и ту же версию среды выполнения DirectX и других компонентов. Они имеют некоторые различия в отношении игровых функций:

  • Игры Обозреватель существуют во всех выпусках, но ярлык игр на меню по умолчанию скрыт в Windows 7 Профессиональная и Enterprise. Игры Обозреватель по-прежнему можно найти на меню (щелкнув "Все программы", а затем дважды щелкнув "Игры"), а прямой ярлык игр можно включить пользователем.
  • Игры, включенные в Состав Windows, по умолчанию недоступны для Windows 7 Профессиональная и Enterprise, но они могут быть включены администратором.
  • Семейные Сейф и оценки игр доступны во всех выпусках, но они отключены на Windows 7 Профессиональная, Enterprise и Ultimate, когда операционная система присоединяется к домену. Как и в Windows Vista Ultimate, эта функция может быть повторно включена на компьютере, присоединенном к домену.

Параметры управления учетными записями пользователей (UAC) могут влиять на параметры групповой политики в выпусках Windows 7 Профессиональная, Enterprise и Ultimate, например Windows Vista. Дополнительные сведения см. в статье О различиях между различными выпусками Windows Vista? Как они влияют на приложение DirectX?

Будет ли DirectX 10 доступен для Windows XP?

Нет. Windows Vista, которая имеет DirectX 10, включает обновленную среду выполнения DirectX на основе среды выполнения в Windows XP SP2 (DirectX 9.0c) с изменениями для работы с новой моделью драйвера отображения Windows (WDDM) и новым стеком звуковых драйверов и другими обновлениями в операционной системе. Помимо Direct3D 9, Windows Vista поддерживает два новых интерфейса, когда присутствуют правильные видеоустройства и драйверы: Direct3D9Ex и Direct3D10.

Так как эти новые интерфейсы используют технологию WDDM, они никогда не будут доступны в более ранних версиях Windows. Все остальные изменения, внесенные в технологии DirectX для Windows Vista, также относятся к новой версии Windows. Имя DirectX 10 вводит в заблуждение, что многие технологии доставки в пакете SDK DirectX (XACT, XINPUT, D3DX) не охватываются этим номером версии. Таким образом, ссылка на номер версии среды выполнения DirectX в целом потеряла большую часть своего значения, даже для 9.0c. Средство диагностики DirectX (DXdiag.exe) в Windows Vista сообщает DirectX 10, но это действительно относится только к Direct3D 10.

Будет ли DirectX 11 доступен для Windows Vista или Windows XP?

DirectX 11 встроен в Windows 7 и доступен в качестве обновления для Windows Vista (см. раздел https://go.microsoft.com/fwlink/p/?linkid=160189). Сюда входят API Direct3D 11, инфраструктура графики DirectX (DXGI) 1.1, 10Level9, расширенные платформы растеризации Windows (WARP) 10 программных средств отрисовки, Direct2D, DirectWrite и обновление API Direct3D 10.1 для поддержки 10Level9 и WARP 10.

По тем же причинам, описанным в предыдущем вопросе (будет ли DirectX 10 доступен для Windows XP?), Direct3D 11 и связанные API недоступны в Windows XP.

Что случилось с DirectShow? Не удается найти его в пакете SDK DirectX.

DirectShow был удален из пакета SDK DirectX по состоянию на апрель 2005 года. Вы можете получить заголовки, библиотеки, инструменты и примеры DirectShow в комплекте средств разработки программного обеспечения Windows (ранее известном как пакет SDK для платформы). DirectSetup в пакете SDK DirectX продолжает поддерживать распространение системных компонентов DirectShow, а последние компоненты уже установлены в следующих операционных системах: Microsoft Windows XP с пакетом обновления 2, Windows XP Professional x64 Edition, Windows Server 2003 с пакетом обновления 1 и Windows Vista.

Какие изменения были внесены в среду выполнения DirectX для Windows Vista?

Основные изменения были внесены для поддержки нового WDDM. Дополнительные сведения о новой модели драйвера, влиянии на Direct3D 9 и на двух новых графических интерфейсах Direct3D 9Ex и Direct3D 10 см . в API графики в Windows. Новые графические API для Windows 7 — Direct3D 11, Direct2D, DirectWrite, DXGI 1.1 и обновленные Direct3D 10.1 — доступны в качестве обновления для Windows Vista (см. ).https://go.microsoft.com/fwlink/p/?linkid=160189

Пакет обновления 1 для Windows Vista включает обновленную версию среды выполнения DirectX. Это обновление расширяет поддержку Windows Vista, чтобы включить Direct3D 10.1, предоставляя новые дополнительные аппаратные функции. (Все оборудование, которое поддерживает Direct3D 10.1, также полностью поддерживает все функции Direct3D 10.)

DirectSound был обновлен, чтобы предоставить возможности нового стека звуковых драйверов Windows Vista, который поддерживает буферы программного обеспечения с несколькими каналами. API режима хранения Direct3D полностью удален из Windows Vista. Функция DirectPlay Voice также была удалена, а также вспомогательный элемент NAT DirectPlay и пользовательский интерфейс сопоставления действий DirectInput. Поддержка интерфейсов DirectX 7 и DirectX 8 для Visual Basic 6.0 недоступна в Windows Vista.

Какие изменения были внесены в среду выполнения DirectX для Windows 7?

Windows 7 включает все компоненты среды выполнения DirectX, найденные в Windows Vista, и добавляет Direct3D 11, DXGI 1.1, 10Level9, программное устройство WARP10, Direct2D, DirectWrite и обновление до Direct3D 10.1 для поддержки 10Level9 и WARP10. Дополнительные сведения см. в разделе API графики в Windows.

Все остальные компоненты идентичны Windows Vista с добавлением 64-разрядной (x64) встроенной поддержки основного API DirectMusic, связанного с меткой времени MIDI. Уровень производительности DirectMusic остается устаревшим, и он доступен только для 32-разрядных приложений в Windows 7 для совместимости приложений. Обратите внимание, что 64-разрядная поддержка DirectMusic недоступна в Windows Vista.

Я думаю, что я нашел ошибку драйвера, что делать?

Сначала убедитесь, что вы проверка результаты с помощью эталонного растризатора. Затем проверка результаты с последней сертифицированной версией WHQL драйвера IHVs. Вы можете программно проверка состояние WHQL с помощью метода GetAdapterIdentifier() в интерфейсе IDirect3D9, передав флаг D3DENUM_WHQL_LEVEL.

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

Возможно, у вас нет правильного набора пути включения. Многие компиляторы, включая Microsoft Visual C++, включают более раннюю версию пакета SDK, поэтому если путь включения выполняет поиск по стандартному компилятору, сначала вы получите неправильные версии файлов заголовков. Чтобы устранить эту проблему, убедитесь, что пути включения и пути библиотеки задаются для поиска в microsoft DirectX, включая и пути библиотеки. См. также файл dxreadme.txt в пакете SDK. Если установить пакет SDK DirectX и вы используете Visual C++, установщик может при необходимости настроить пути включения.

Я получаю ошибки компоновщика о нескольких или отсутствующих символах для глобальных уникальных идентификаторов (GUID), что делать?

Используемые идентификаторы GUID должны быть определены один раз и только один раз. Определение GUID будет вставлено, если вы #define символ INITGUID перед включением файлов заголовков DirectX. Поэтому следует убедиться, что это происходит только для одной единицы компиляции. Альтернативой этому методу является связывание с библиотекой dxguid.lib, которая содержит определения для всех графических идентификаторов DirectX. Если вы используете этот метод (рекомендуется), то никогда не следует #define символа INITGUID.

Можно ли привести указатель на интерфейс DirectX к нижнему номеру версии?

Нет. Интерфейсы DirectX — это com-интерфейсы. Это означает, что для получения более высокого нумерованного интерфейса не требуется производные от соответствующих более низких нумерованных интерфейсов. Таким образом, единственным безопасным способом получения другого интерфейса для объекта DirectX является использование метода QueryInterface интерфейса. Этот метод является частью стандартного интерфейса IUnknown, из которого должны быть производны все интерфейсы COM.

Можно ли смешивать использование компонентов DirectX 9 и DirectX 8 или более ранних компонентов в одном приложении?

Вы можете свободно смешивать различные компоненты разных версий; Например, можно использовать DirectInput 8 с Direct3D 9 в одном приложении. Однако обычно нельзя смешивать разные версии одного компонента в одном приложении; Например, вы не можете смешивать DirectDraw 7 с Direct3D 9 (так как они фактически являются тем же компонентом, что и DirectDraw, был подсумирован в Direct3D с DirectX 8). Однако существуют исключения, такие как использование Direct3D 9 и Direct3D 10 в одном приложении, которое разрешено.

Можно ли смешивать использование Direct3D 9 и Direct3D 10 в одном приложении?

Да, эти версии Direct3D можно использовать вместе в одном приложении.

Что означают возвращаемые значения из методов Release или AddRef?

Возвращаемое значение будет текущим числом ссылок объекта. Однако спецификация COM указывает, что не следует полагаться на это, и значение обычно доступно только для целей отладки. Наблюдаемые значения могут быть непредвиденными, так как другие системные объекты могут содержать ссылки на создаваемые объекты DirectX. По этой причине не следует писать код, который неоднократно вызывает выпуск до нуля, так как объект может быть освобожден, даже если другой компонент по-прежнему может ссылаться на него.

Имеет ли значение, в каком порядке я выпускаю интерфейсы DirectX?

Это не должно иметь значения, так как com-интерфейсы считаются ссылочными. Однако существуют некоторые известные ошибки с порядком выпуска интерфейсов в некоторых версиях DirectX. Чтобы обеспечить безопасность, рекомендуется освободить интерфейсы в обратном порядке создания.

Что такое умный указатель и следует ли использовать его?

Интеллектуальный указатель — это класс шаблона C++, предназначенный для инкапсулировать функции указателя. В частности, существуют стандартные классы смарт-указателей, предназначенные для инкапсулировать указатели интерфейса COM. Эти указатели автоматически выполняют QueryInterface вместо приведения, и они обрабатывают AddRef и release для вас. Следует ли использовать их в значительной степени вопрос вкуса. Если код содержит много копий указателей интерфейса, с несколькими AddRefs и выпусками, интеллектуальные указатели, вероятно, могут сделать код более аккуратным и менее подверженным ошибкам. В противном случае можно обойтись без них. Visual C++ включает стандартный смарт-указатель Microsoft COM, определенный в файле заголовка comdef.h (поиск com_ptr_t в справке).

У меня возникли проблемы с отладкой приложения DirectX, какие-либо советы?

Наиболее распространенная проблема при отладке приложений DirectX заключается в попытке отладки во время блокировки поверхности DirectDraw. Эта ситуация может вызвать блокировку Win16 в системах Microsoft Windows 9x, которая предотвращает рисование окна отладчика. Указание флага D3DLOCK_NOSYSLOCK при блокировке поверхности обычно может устранить это. Windows 2000 не страдает от этой проблемы. При разработке приложения полезно работать с отладчиком версии среды выполнения DirectX (выбранной при установке пакета SDK), которая выполняет некоторые проверки параметров и выводит полезные сообщения в выходные данные отладчика.

Как правильно проверка коды возврата?

Используйте макросы SUCCEEDED и FAILED. Методы DirectX могут возвращать несколько кодов успешного и неудачного выполнения, поэтому просто:

== D3D_OK

или аналогичный тест не всегда достаточно.

Разделы справки отключить ALT+TAB и другое переключение задач?

Ты не можешь! Игры должны иметь возможность эффективно обрабатывать задачи переключения, так как многие вещи вызывают это: ALT+TAB, подключения к удаленному рабочему столу, быстрый переключение пользователей, ограничения на использование родительских элементов управления и многие другие события.

В то же время два распространенных источника случайного переключения задач на игры с помощью схем управления с помощью клавиатуры нажимают клавишу с логотипом Windows и активируют функцию СтикyKeys с помощью клавиши SHIFT. Чтобы устранить эти случаи, отключите функциональные возможности, ознакомьтесь с методами, описанными в разделе "Отключение сочетаний клавиш в играх".

Существует ли рекомендуемая книга, объясняющая COM?

Внутри COM дейл Роджерсон, опубликованный Microsoft Press, является отличным введением в COM. Для более подробного просмотра COM, книга Essential COM от Don Box, опубликованная Longman, также настоятельно рекомендуется.

Что такое "управляемый код"?

Управляемый код — это код, управляемый средой CLR платформа .NET Framework. Он относится к контракту сотрудничества между собственным выполнением кода и средой выполнения. Этот контракт указывает, что в любой момент выполнения среда выполнения может остановить выполнение ЦП и получить сведения, относящиеся к текущему адресу инструкции ЦП. Сведения, которые должны иметь возможность запроса, обычно относятся к состоянию среды выполнения, например содержимому регистра или стека памяти.

Перед выполнением кода IL компилируется в собственный исполняемый код. И, так как эта компиляция выполняется в управляемой среде выполнения (или, более правильно, компилятором с поддержкой среды выполнения, который знает, как ориентироваться на управляемую среду выполнения), управляемая среда выполнения может обеспечить гарантии того, что будет делать код. Он может вставлять ловушки и соответствующие перехватчики сборки мусора, обработку исключений, безопасность типов, границы массива и проверка индексов и т. д. Например, такой компилятор обязательно выкладывает кадры стека и все правильно, чтобы сборщик мусора может работать в фоновом режиме на отдельном потоке, постоянно ходить по активному стеку вызовов, находить все корни, гонять все живые объекты. Кроме того, поскольку IL имеет понятие безопасности типа, подсистема выполнения будет поддерживать гарантию безопасности типа, устраняя целый класс ошибок программирования, которые часто приводят к отверстиям безопасности.

В отличие от этого в неуправляемом мире: неуправляемые исполняемые файлы в основном являются двоичным изображением, кодом x86, загруженным в память. Счетчик программы возвращается туда, и это последний ос знает. Существуют защиты вокруг управления памятью и ввода-вывода портов и т. д., но система на самом деле не знает, что делает приложение. Таким образом, он не может гарантировать, что происходит при запуске приложения.

Какие книги есть о общем программировании Windows?

Много. Тем не менее, два, которые настоятельно рекомендуется, являются следующими:

  • Программирование Windows Чарльзом Петцольдом (Microsoft Press)
  • Программирование приложений для Windows jeffrey Richter (Microsoft Press)

Разделы справки отладку с помощью файлов символов Windows?

Корпорация Майкрософт публикует отрезаные символы для всех системных библиотек DLL (а также для нескольких других). Чтобы получить доступ к ним, добавьте следующий путь к символу в параметрах проекта в Visual Studio:

srv*https://msdl.microsoft.com/download/symbols

Для кэширования символов локально используйте следующий синтаксис:

srv*c:\cache*https://msdl.microsoft.com/download/symbols

Где c:\cache — это локальный каталог для кэширования файлов символов.

Вопросы direct3D

Общие вопросы Direct3D

Где можно найти сведения о трехмерных методах графики?

Стандартная книга по теме компьютерная графика: принципы и практика Фоли, Ван Дам и т. д. Это ценный ресурс для всех, кто хочет понять математические основы геометрии, растризации и освещения. Часто задаваемые вопросы о группе comp.graphics.algorithms Usenet также содержат полезный материал.

Эмулирует ли Direct3D функциональные возможности, не предоставляемые оборудованием?

Это зависит от ряда обстоятельств. Direct3D имеет полнофункциональный конвейер обработки вершин (включая поддержку пользовательских шейдеров вершин). Однако эмуляция не предоставляется для операций на уровне пикселей; приложения должны проверка соответствующие биты крышки и использовать API ValidateDevice для определения поддержки.

Есть ли программный растризатор, включенный в Direct3D?

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

Как выполнять цветовые ключи с помощью графики DirectX?

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

Использует ли код геометрии Direct3D 3DNow! и /или Инструкции SIMD iii III?

Да. Конвейер геометрии Direct3D имеет несколько разных путей кода в зависимости от типа процессора, и он будет использовать специальные операции с плавающей запятой, предоставляемые 3DNow! или инструкции SIMD в Формате Iii, где они доступны. Это включает обработку пользовательских шейдеров вершин.

Разделы справки предотвратить запись прозрачных пикселей в z-буфер?

Вы можете отфильтровать пиксели с альфа-значением выше или ниже заданного порога. Вы управляете этим поведением с помощью отрисовки ALPHATESTENABLE, ALPHAREF и ALPHAFUNC.

Что такое буфер набора элементов?

Буфер наборов — это дополнительный буфер сведений о пикселях, как и z-буфер. На самом деле, он находится в некоторых битах z-буфера. Распространенные форматы наборов элементов/z-буфера: 15-разрядные и 1-разрядные наборы элементов или 24-разрядные z и 8-разрядные наборы элементов. Можно выполнять простые арифметические операции с содержимым буфера наборов элементов на основе пикселя, так как отрисовываются многоугольники. Например, буфер набора элементов может быть добавочным или отложенным, или пиксель может быть отклонен, если значение набора элементов завершается сбоем простого теста сравнения. Это полезно для эффектов, связанных с маркировкой области буфера кадра, а затем выполнение отрисовки только помеченной (или не помеченной) области. Хорошим примером являются объемные эффекты, такие как теневые тома.

Разделы справки использовать буфер набора элементов для отрисовки теневых томов?

Ключом к этому и другим эффектам буфера наборов томов является взаимодействие буфера наборов элементов и z-буфера. Сцена с теневым томом отрисовывается на трех этапах. Во-первых, сцена без тени отображается как обычно, используя z-буфер. Затем тени отмечены в буфере наборов элементов следующим образом. Передние лица теневого тома рисуются с помощью невидимых многоугольников, с включенным z-тестированием, но z-записи отключены и буфер наборов элементов увеличивается на каждом пикселе, передавая z-тест. Обратные лица теневого тома отрисовываются аналогичным образом, но вместо этого уменьшается значение набора элементов.

Теперь рассмотрим один пиксель. Предполагая, что камера не находится в теневом томе, существует четыре возможности для соответствующей точки в сцене. Если луч от камеры к точке не пересекается с теневым томом, то ни один теневой многоугольник не будет нарисован там, и буфер наборов элементов по-прежнему равен нулю. В противном случае, если точка находится перед теневым объемом теневого многоугольника будет z-буферизуется, и набор снова остается неизменным. Если точки находятся за теневым томом, то то такое же количество передних теневых лиц, как и задние лица будут отрисованы, и набор элементов будет нулевым, приращения столько раз, сколько отложено.

Окончательная возможность заключается в том, что точка находится внутри теневого тома. В этом случае заднее лицо теневого тома будет выровнено, но не переднее лицо, поэтому буфер набора элементов будет ненулевым значением. Результатом является часть буфера кадра, линяющаяся в тени, имеет ненулевое значение набора элементов. Наконец, чтобы на самом деле отрисовывать тени, весь сцена смыта с помощью альфа-смешанного многоугольника, чтобы повлиять только на пиксели с ненулевым значением набора элементов. Пример этого метода можно увидеть в примере теневого тома, который поставляется с пакетом SDK DirectX.

Каковы правила выравнивания текселя? Разделы справки получить сопоставление "один к одному"?

Это объясняется полностью в документации по Direct3D 9. Однако сводка руководства заключается в том, что вы должны предвзять координаты экрана на -0,5 пикселя, чтобы правильно выровняться с текселями. Большинство карта теперь соответствуют правилам выравнивания текселя, однако существуют некоторые старые карта или драйверы, которые не соответствуют. Чтобы справиться с этими случаями, рекомендуется обратиться к поставщику оборудования в вопросе и запросить обновленные драйверы или их предлагаемое решение. Обратите внимание, что в Direct3D 10 это правило больше не содержится.

Какова цель флага D3DCREATE\_PUREDEVICE?

Используйте флаг D3DCREATE_PUREDEVICE во время создания устройства для создания чистого устройства. Чистое устройство не сохраняет текущее состояние (во время изменений состояния), что часто повышает производительность; для этого устройства также требуется аппаратная обработка вершин. Чистое устройство обычно используется при завершении разработки и отладки, и вы хотите добиться оптимальной производительности.

Одним из недостатков чистого устройства является то, что он не поддерживает все вызовы API Get*; Это означает, что вы не можете использовать чистое устройство для запроса состояния конвейера. Это затрудняет отладку при запуске приложения. Ниже приведен список всех методов, отключенных чистым устройством.

Второй недостаток чистого устройства заключается в том, что он не фильтрует какие-либо избыточные изменения состояния. При использовании чистого устройства приложение должно уменьшить количество изменений состояния в цикле отрисовки до минимума; Это может включать изменения состояния фильтрации, чтобы убедиться, что состояния не задаются более одного раза. Этот компромисс зависит от приложения; Если для каждого кадра используется более 1000 вызовов set, рекомендуется воспользоваться функцией фильтрации избыточности, которая выполняется автоматически с помощью не чистого устройства.

Как и во всех проблемах с производительностью, единственный способ узнать, будет ли ваше приложение лучше работать с чистым устройством, — сравнить производительность приложения с чистой и не чистой. Чистое устройство может ускорить приложение, уменьшая нагрузку на ЦП API. Но будьте осторожны! В некоторых сценариях чистое устройство замедлит приложение (из-за дополнительных работ ЦП, вызванных избыточными изменениями состояния). Если вы не уверены, какой тип устройства лучше всего подходит для приложения, и вы не фильтруете избыточные изменения в приложении, используйте не чистое устройство.

Разделы справки перечислить устройства отображения в системе с несколькими мониторами?

Перечисление можно выполнить с помощью простой итерации приложением с помощью методов интерфейса IDirect3D9. Вызовите GetAdapterCount, чтобы определить количество адаптеров отображения в системе. Вызовите GetAdapterMonitor, чтобы определить, к какому физическому монитору подключен адаптер (этот метод возвращает HMONITOR, к которому затем можно использовать в API Win32 GetMonitorInfo для определения сведений о физическом мониторе). Определение характеристик определенного адаптера дисплея или создание устройства Direct3D на этом адаптере является таким же простым, как передача соответствующего номера адаптера вместо D3DADAPTER_DEFAULT при вызове GetDeviceCaps, CreateDevice или других методов.

Что произошло с исправленной функцией бампинга в D3D9?

По состоянию на Direct3D 9 мы ужесточили проверку на карта, которые могли поддерживать > только 2 одновременных текстур. Некоторые старые карта имеют только 3 этапа текстуры, доступных при использовании определенной операции альфа-модуляции. Наиболее распространенное использование, которое люди используют 3 этапа для , это emboss баммапинг, и вы по-прежнему можете сделать это с D3D9.

Поле высоты должно храниться в альфа-канале и используется для модуляции вклада света, то есть:

// Stage 0 is the base texture, with the height map in the alpha channel
m_pd3dDevice->SetTexture(0, m_pEmbossTexture );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0 );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
if( m_bShowEmbossMethod )
{
 // Stage 1 passes through the RGB channels (SELECTARG2 = CURRENT), and 
 // does a signed add with the inverted alpha channel. 
 // The texture coords associated with Stage 1 are the shifted ones, so 
 // the result is:
 //    (height - shifted_height) * tex.RGB * diffuse.RGB
   m_pd3dDevice->SetTexture( 1, m_pEmbossTexture );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE|D3DTA_COMPLEMENT );
   m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );

   // Set up the alpha blender to multiply the alpha channel 
   // (monochrome emboss) with the src color (lighted texture)
   m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
   m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
   m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
}

Этот пример вместе с другими старыми примерами больше не поставляется в текущем выпуске пакета SDK и не будет отправлен в будущих выпусках пакета SDK.

Обработка геометрии (вершин)

Вершинные потоки запутают меня, как они работают?

Direct3D собирает каждую вершину, которая передается в часть обработки конвейера из одного или нескольких потоков вершин. Наличие только одного потока вершин соответствует старой модели directX 8, в которой вершины приходят из одного источника. При использовании DirectX 8 различные компоненты вершин могут поступать из разных источников; Например, один буфер вершин может содержать позиции и нормальные значения, а второй — значения цвета и координаты текстуры.

Что такое шейдер вершин?

Шейдер вершин — это процедура обработки одной вершины. Он определяется с помощью простого языка сборки, который собирается библиотекой служебной программы D3DX в поток токенов, который принимает Direct3D. Шейдер вершин принимает в качестве входных данных одну вершину и набор константных значений; он выводит позицию вершины (в пространстве клипа) и при необходимости набор цветов и координат текстур, которые используются в растеризации. Обратите внимание, что при наличии пользовательского шейдера вершины компоненты вершин больше не применяются к ним семантикой Direct3D и вершинами являются просто произвольными данными, которые интерпретируются созданным шейдером вершин.

Выполняет ли шейдер вершины деление перспективы или вырезку?

Нет. Вершинный шейдер выводит однородную координату в пространстве клипа для преобразованной позиции вершины. Разделение перспективы и вырезка выполняются автоматически после шейдера.

Можно ли создать геометрию с помощью шейдера вершин?

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

Можно ли применить шейдер вершин к результатам конвейера геометрии фиксированной функции (или наоборот)?

Нет. Вы должны выбрать один или другой. При использовании пользовательского шейдера вершин вы несете ответственность за выполнение всего преобразования вершин.

Можно ли использовать шейдер вершин, если оборудование не поддерживает его?

Да. Подсистема программной обработки вершин Direct3D полностью поддерживает пользовательские шейдеры вершин с удивительно высоким уровнем производительности.

Разделы справки определить, поддерживает ли оборудование пользовательский шейдер вершин?

Устройства, способные поддерживать шейдеры вершин в оборудовании, необходимы для заполнения поля D3DCAPS9::VertexShaderVersion, чтобы указать уровень версии шейдера вершин, которые они поддерживают. Любое устройство, требующее поддержки определенного уровня шейдера вершин, должно поддерживать все юридические шейдеры вершин, соответствующие спецификации этого уровня или ниже.

Сколько регистров констант доступны для шейдеров вершин?

Устройства, поддерживающие шейдеры вершин и 1.0, требуются для поддержки не менее 96 регистров констант. Устройства могут поддерживать больше этого минимального числа и сообщать об этом с помощью поля D3DCAPS9::MaxVertexShaderConst.

Можно ли совместно использовать данные о расположении между вершинами с разными координатами текстуры?

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

Когда я отправляю индексированный список примитивов, выполняет ли Direct3D обработку всех вершин в буфере или только тех, которые я индексировал?

При использовании конвейера геометрии программного обеспечения Direct3D сначала преобразует все вершины в отправленном диапазоне, а не преобразовывает их по запросу по мере их индексирования. Для плотно упакованных данных (то есть, где используется большая часть вершин) это более эффективно, особенно если доступны инструкции SIMD. Если данные разрежены (т. е. многие вершины не используются), вы можете рассмотреть возможность переупорядочения данных, чтобы избежать слишком большого количества избыточных преобразований. При использовании аппаратного ускорения геометрии вершины обычно преобразуются по запросу по мере их необходимости.

Что такое буфер индекса?

Буфер индекса точно аналогичен буферу вершин, но вместо этого он содержит индексы для использования в вызовах DrawIndexedPrimitive. Настоятельно рекомендуется использовать буферы индексов, а не необработанные памяти, выделенные приложением, по тем же причинам, что и буферы вершин.

Я замечаю, что 32-разрядные индексы являются поддерживаемым типом; Можно ли использовать их на всех устройствах?

Нет. Чтобы определить максимальное значение индекса, поддерживаемое устройством, необходимо проверка поле D3DCAPS9::MaxVertexIndex. Это значение должно быть больше 2 до 16-й мощности -1 (0xffff), чтобы буферы индексов типа D3DFMT_INDEX32 поддерживаться. Кроме того, обратите внимание, что некоторые устройства могут поддерживать 32-разрядные индексы, но поддерживают максимальное значение индекса менее 2 до 32-й мощности -1 (0xffffffff); В этом случае приложение должно соблюдать ограничение, указанное устройством.

Поддерживает ли обработка вершин S/W 64 бит?

Существует оптимизированный конвейер вершин для x64, но он не существует для IA64.

Настройка производительности

Как повысить производительность приложения Direct3D?

Ниже приведены ключевые области, которые необходимо учитывать при оптимизации производительности.

Размер пакета

Direct3D оптимизирован для больших пакетов примитивов. Чем больше многоугольников, которые можно отправлять в одном вызове, тем лучше. Хорошее правило большого пальца заключается в том, чтобы в среднем 1000 вершин на примитивный вызов. Ниже этого уровня вы, вероятно, не получаете оптимальную производительность, выше этого, и вы впадаете в снижение возврата и потенциальные конфликты с рекомендациями по параллелизму (см. ниже).

Изменения состояния

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

Примечание.

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

 

Параллелизма

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

Отправка текстур

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

Буферы вершин и индексов

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

Блоки макросов состояния

Они были представлены в DirectX 7.0. Они предоставляют механизм записи ряда изменений состояния (включая освещение, материалы и матрицы изменения) в макрос, который затем можно воспроизвести одним вызовом. Это принесет два преимущества:

  • Вы сокращаете затраты на вызов, выполняя один звонок вместо многих.
  • Известный драйвер может предварительно проанализировать и предварительно скомпилировать изменения состояния, что делает его гораздо быстрее для отправки в графическое оборудование.

Изменения состояния по-прежнему могут быть дорогостоящими, но использование макросов состояния может помочь сократить по крайней мере некоторые затраты. Используйте только одно устройство Direct3D. Если необходимо отобразить несколько целевых объектов, используйте SetRenderTarget. Если вы создаете окно с несколькими трехмерными окнами, используйте API CreateAdditionalSwapChain. Среда выполнения оптимизирована для одного устройства и существует значительный штраф за использование нескольких устройств.

Какие примитивные типы (полосы, вентиляторы, списки и т. д.) следует использовать?

Многие сетки, встречающиеся в реальных вершинах функций данных, которые совместно используются несколькими многоугольниками. Чтобы повысить производительность, желательно уменьшить дублирование в вершинах, преобразованных и отправленных через шину на устройство отрисовки. Понятно, что использование простых списков треугольников не обеспечивает общий доступ вершин, что делает его наименее оптимальным методом. Затем выбор состоит в том, чтобы использовать полосы и вентиляторы, что означает определенную связь подключения между многоугольниками и использованием индексированных списков. Где данные, естественно, попадают в полосы и вентиляторы, это наиболее подходящий выбор, так как они свести к минимуму данные, отправленные водителю. Однако разложение сетки на полосы и вентиляторы часто приводит к большому количеству отдельных частей, подразумевая большое количество вызовов DrawPrimitive. По этой причине наиболее эффективным методом обычно является использование одного вызова DrawIndexedPrimitive с списком треугольников. Дополнительное преимущество использования индексированного списка заключается в том, что преимущество можно получить, даже если последовательные треугольники используют только одну вершину. В итоге, если данные естественным образом попадают в большие полосы или вентиляторы, используйте полосы или вентиляторы; в противном случае используйте индексированные списки.

Как определить общую память текстуры карта, за исключением памяти AGP?

IDirect3Device9::GetAvailableTextureMem возвращает общую доступную память, включая AGP. Выделение ресурсов на основе предположения о том, сколько памяти видео у вас нет, не является отличной идеей. Например, что делать, если карта выполняется в архитектуре единой памяти (UMA) или может сжимать текстуры? Может быть больше места, чем вы могли бы думать. Необходимо создать ресурсы и проверка для ошибок "вне памяти", а затем уменьшить масштаб текстуры. Например, можно удалить верхние уровни MIP текстур.

Что такое хороший шаблон использования буферов вершин, если я создаю динамические данные?

  1. Создайте буфер вершин с помощью флагов использования D3DUSAGE_DYNAMIC и D3DUSAGE_WRITEONLY и флага пула D3DPOOL_DEFAULT. (Также укажите D3DUSAGE_SOFTWAREPROCESSING, если используется обработка вершин программного обеспечения.)
  2. I = 0.
  3. Задайте состояние (текстуры, отрисовки и т. д.).
  4. Проверьте, есть ли пространство в буфере, например, I + M <= N? (Где M — число новых вершин).
  5. Если да, заблокируйте VB с помощью D3DLOCK_NOOVERWRITE. Это сообщает Direct3D и драйверу, что вы добавите вершины и не измените те, которые вы ранее пакетировали. Таким образом, если выполняется операция DMA, она не прерывается. Если нет, goto 11.
  6. Заполните вершины M на I.
  7. Разблокировать.
  8. Вызов draw[indexed]Primitive. Для неиндексированных примитивов используется i в качестве параметра StartVertex. Для индексированных примитивов убедитесь, что индексы указывают на правильную часть буфера вершин (для этого может быть проще всего использовать параметр BaseVertexIndex вызова SetIndices).
  9. I += M.
  10. Goto 3.
  11. Ок, так что мы не в пространстве, так что давайте начнем с нового VB. Мы не хотим использовать то же самое, так как может произойти операция DMA. Мы взаимодействуем с этим с Direct3D и драйвером, заблокируя тот же VB с флагом D3DLOCK_DISCARD. Это означает, что "вы можете дать мне новый указатель, потому что я делаю со старым и не очень заботься о старом содержимом больше".
  12. I = 0.
  13. Goto 4 (или 6).

Почему нужно указать дополнительные сведения в структуре D3DVERTEXELEMENT9?

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

Новые объявления вершин можно использовать либо с конвейером фиксированной функции, либо с шейдерами. Для конвейера фиксированной функции не требуется вызывать SetVertexShader. Однако если вы хотите переключиться на конвейер фиксированной функции и ранее использовали шейдер вершин, вызовите SetVertexShader(NULL). После этого необходимо по-прежнему вызвать SetFVF, чтобы объявить код FVF.

При использовании шейдеров вершин вызовите SetVertexShader с объектом шейдера вершин. Кроме того, вызовите SetFVF для настройки объявления вершин. Для этого используется информация, неявная в FVF. SetVertexDeclaration можно вызвать вместо SetFVF, так как он поддерживает объявления вершин, которые нельзя выразить с помощью FVF.

Библиотека служебной программы D3DX

Какие форматы файлов поддерживаются функциями загрузчика файлов D3DX?

Функции загрузчика файлов изображений D3DX поддерживают файлы BMP, TGA, JPG, DIB, система УПП и DDS.

Функции отрисовки текста в D3DX не работают, что я делаю неправильно?

Распространенная ошибка при использовании функций ID3DXFont::D rawText заключается в указании нулевого альфа-компонента для параметра цвета; в результате полностью прозрачный (т. е. невидимый) текст. Для полного непрозрачного текста убедитесь, что альфа-компонент параметра цвета полностью насыщенный (255).

Как сохранить содержимое поверхности или текстуры в файл?

Пакет SDK DirectX 8.1 добавил две функции в библиотеку D3DX специально для этой цели: D3DXSaveSurfaceToFile() и D3DXSaveTextureToFile(). Эти функции поддерживают сохранение изображения в файле в формате BMP или DDS. В предыдущих версиях необходимо заблокировать поверхность и считывать данные изображения, а затем записать его в растровый файл. Сведения о написании функции для хранения растровых изображений см. в разделе "Хранение изображения".

Кроме того, GDI+ можно использовать для сохранения образа в различных форматах, хотя это требует распространения дополнительных файлов поддержки с приложением.

Как использовать язык шейдеров высокого уровня (HLSL) в моей игре?

Существует три способа включения языка шейдеров высокого уровня Майкрософт (HLSL) в игровой механизм:

  • Скомпилируйте источник шейдера в сборку заливки вершин или пикселей (с помощью служебной программы командной строки fxc.exe) и используйте D3DXAssembleShader() во время выполнения. Таким образом, даже игра DirectX 8 может даже воспользоваться преимуществами власти HLSL.
  • Используйте D3DXCompileShader() для компиляции источника шейдера в поток маркеров и форму таблицы констант. Во время выполнения загрузите поток маркеров и таблицу констант и вызовите CreateVertexShader() или CreatePixelShader() на устройстве, чтобы создать шейдеры.
  • Самый простой способ получить и запустить — воспользоваться системой эффектов D3DX, вызвав D3DXCreateEffectFromFile() или D3DXCreateEffectFromResource() с файлом эффекта.

Какова цель нового флага компилятора шейдера?

Начиная с пакета SDK DirectX за декабрь 2006 года, новый компилятор HLSL, разработанный для Direct3D 10, был включен для целевых объектов Direct3D 9. Новый компилятор не поддерживает целевые объекты ps_1_x и теперь является компилятором по умолчанию для всех шейдеров Direct3D HLSL. Флаг обратной совместимости можно использовать для принудительной компиляции целевых объектов ps_1_x в качестве целевых объектов ps_2_0.

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

Какой правильный способ получить шейдеры из эффекта?

Используйте D3DXCreateEffect для создания id3DXEffect и получения D3DXPASS_DESC с помощью GetPassDesc. Эта структура содержит указатели на вершины и шейдеры пикселей.

Не используйте ID3DXEffectCompiler::GetPassDesc. Дескрипторы вершин и шейдера пикселей, возвращаемые из этого метода, имеют значение NULL.

Что такое встроенный шум HLSL?

Внутренняя функция шума создает шум перлин, как определено КенОм Перлином. Функция HLSL в настоящее время может использоваться только для заполнения текстур в шейдерах текстур, так как текущий h/w не поддерживает метод в собственном коде. Шейдеры текстур используются в конжуции с функциями D3DXFill*Texture(), которые полезны вспомогательными функциями для создания процедурно определенных текстур во время загрузки.

Разделы справки определить, следует ли использовать модель шейдера пикселей 2.0 или 2.a?

Вы можете использовать функции D3DXGetPixelShaderProfile() и D3DXGetPixelShaderProfile(), которые возвращают строку, определяющую, какой профиль HLSL лучше всего подходит для запущенного устройства.

Разделы справки доступ к параметрам в предварительно скомпилированных шейдерах эффектов?

Через интерфейс ID3DXConstantTable, используемый для доступа к постоянной таблице. Эта таблица содержит переменные, используемые шейдерами и эффектами высокого уровня.

Существует ли способ добавления пользовательских данных в эффект или другой ресурс?

Да, чтобы задать частные данные, которые вы вызываете SetPrivateData (pReal — это объект текстуры D3D, pSpoof — это объект текстуры в оболочке).

hr = pReal->SetPrivateData(IID_Spoof, &pSpoof, 
            sizeof(IDirect3DResource9*), 0)));

Чтобы найти завернутый указатель, выполните следующие действия.

    IDirect3DResource9* pSpoof;
    DWORD dwSize = sizeof(pSpoof);
    hr = pReal->GetPrivateData(IID_Spoof, (void*) &pSpoof, &dwSize);

Почему отрисовка объекта ID3DXMesh значительно снижается после определения подмножеств?

Возможно, вы не оптимизированы для сетки после определения атрибутов лица. Если вы указываете атрибуты, а затем вызываете ID3DXMesh::D rawSubset(), этот метод должен выполнить поиск сетки для всех лиц, содержащих запрошенные атрибуты. Кроме того, отрисованные лица, скорее всего, находятся в шаблоне случайного доступа, поэтому не используют кэш вершин. Определив атрибуты лица для подмножества, вызовите метод ID3DXMesh::Optimize или ID3DXMesh::OptimizeInPlace и укажите метод оптимизации D3DXMESHOPT_ATTRSORT или сильнее. Обратите внимание, что для оптимальной производительности следует оптимизировать с помощью флага D3DXMESHOPT_VERTEXCACHE, который также будет переупорядочение вершин для оптимального использования кэша вершин. Массив зависимостей, созданный для сетки D3DX, содержит три записи на лицо, но некоторые лица могут не иметь смежных лиц на всех трех краях. Как это закодировано? Записи, в которых нет смежных лиц, кодируются как 0xffffffff.

Я слышал много о предварительно вычисляемой передачи сияния (PRT), где можно узнать больше?

PRT — это новая функция D3DX, добавленная в обновление пакета SDK summer 2003. Она обеспечивает отрисовку сложных сценариев освещения, таких как глобальная -llumination, мягкая тень и точечная под поверхность в режиме реального времени. Пакет SDK содержит документацию и примеры интеграции технологии в игру. Примеры демонстрации PRT и LocalDeformablePRT демонстрируют, как использовать симулятор для каждой вершины и для сценариев освещения пикселей соответственно. Дополнительные сведения об этом и других темах также можно найти на веб-странице Питера Пайка Слоана.

Как выполнить отрисовку в текстуру и использовать антииссинг?

Создайте многофакторную целевую отрисовку с помощью Direct3DDevice9::CreateRenderTarget. После отрисовки сцены в целевой объект отрисовки, StretchRect из него в целевую текстуру отрисовки. Если вы внесите изменения в текст внеэкранного экрана (например, размытие или цветение), скопируйте его обратно в задний буфер перед представлением().

Вопросы directSound

Почему при запуске приложения возникает всплеск статического состояния? Я замечаю эту проблему с другими приложениями тоже.

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

Почему я испытываю задержку между изменением параметров эффектов и слушанием результатов?

Изменения параметров эффекта не всегда происходят немедленно в DirectX 8. Для повышения эффективности DirectSound обрабатывает 100 миллисекунд звуковых данных в буфере, начиная с курсора воспроизведения, перед воспроизведением буфера. Эта предварительная обработка выполняется после всех следующих вызовов:

IDirectSoundBuffer8::SetCurrentPosition
IDirectSoundBuffer8::SetFX
IDirectSoundBuffer8::Stop
IDirectSoundBuffer8::Unlock

По состоянию на DirectX 9 новый алгоритм обработки FX, который обрабатывает эффекты JIT-решения этой проблемы и снижает задержку. Алгоритм был добавлен в вызов IDirectSoundBuffer8::P lay() вместе с дополнительным потоком, который обрабатывает эффекты непосредственно перед курсором записи. Таким образом, вы можете задать параметры в любое время, и они будут работать должным образом. Однако обратите внимание, что в буфере воспроизведения будет небольшая задержка (обычно 100 мс), прежде чем вы услышите изменение параметра, так как звук между воспроизведением и записью курсоров (и немного больше заполнений) уже обработан в то время.

Разделы справки определить, установлен ли DSound?

Если вам не нужно использовать DirectSoundEnumerate() для перечисления доступных устройств DSound, не свяжите приложение с dsound.lib и вместо этого используйте его через COMs CoCreateInstance(CLSID_DirectSound...), а затем инициализировать объект DSound с помощью Initialize(NULL). Если вам нужно использовать DirectSoundEnumerate(), вы можете динамически загрузить dsound.dll с помощью LoadLibrary("dsound.dll"); и доступ к его методам с помощью GetProcAddress("DirectSoundEnumerateA/W") и GetProcAddress("DirectSoundCreateA/W") и т. д.

Разделы справки создать многоканальный звук с ПОМОЩЬЮ WAVEFORMATEXTENSIBLE?

Если вы не можете найти ответ на ваш вопрос в файлах справки DirectSound, есть хорошая статья с дополнительными сведениями, доступными на сайте Multiple Channel Audio Data and WAVE Files.

Как использовать DirectSound Voice Manager с наборами свойств, такими как EAX?

В DirectSound 9.0 при дублировании буфера теперь можно получить интерфейс IDirectSoundBuffer8 на повторяющийся буфер, который предоставит вам доступ к методу AcquireResources. Это позволит связать буфер с флагом DSBCAPS_LOCDEFER с аппаратным ресурсом. Затем можно задать параметры EAX в этом буфере перед вызовом Play().

При использовании уведомлений о положении курсора возникают проблемы с ненадежным поведением. Как получить более точные сведения?

Существуют некоторые тонкие ошибки в различных версиях DirectSound, основной стек звука Windows и звуковые драйверы, которые делают уведомления о положениях курсора ненадежными. Если вы не нацелены на известную конфигурацию HW/SW, в которой вы знаете, что уведомления хорошо работают, избегайте уведомлений о положении курсора. Для отслеживания позиций GetCurrentPosition() является более безопасным методом.

Я страдают от снижения производительности при использовании GetCurrentPosition(). Что можно сделать для повышения производительности?

Каждый вызов GetCurrentPosition() для каждого буфера вызывает системный вызов, и системные вызовы следует свести к минимуму, так как они являются большим компонентом ЦП DSound. В NT (Win2K и XP) курсоры в буферах SW (и буферах HW на некоторых устройствах) перемещаются в 10 мс добавок, поэтому вызов GetCurrentPosition() каждые 10 мс идеально подходит. Вызов его чаще, чем каждые 5 мс, приведет к снижению производительности.

Приложение DirectSound занимает слишком много времени ЦП или выполняется медленно. Есть ли что-нибудь, что я могу сделать для оптимизации кода?

Существует несколько действий, которые можно сделать для повышения производительности звукового кода:

  • Не вызывайте GetCurrentPosition слишком часто. Каждый вызов GetCurrentPosition() для каждого буфера вызывает системный вызов, и системные вызовы следует свести к минимуму, так как они являются большим компонентом ЦП DSound. В NT (Win2K и XP) курсоры в буферах SW (и буферах HW на некоторых устройствах) перемещаются в 10 мс добавок, поэтому вызов GetCurrentPosition() каждые 10 мс идеально подходит. Вызов его чаще, чем каждые 5 мс, приведет к некоторому снижению производительности.

  • Используйте отдельную, более низкую частоту кадров для звука. В настоящее время многие игры Windows могут превышать 100 кадров в секунду, и в большинстве случаев не требуется обновлять трехмерные звуковые параметры с той же частотой кадров. Обработка звука каждые секунду или третий графический кадр, или каждые 30 мс или около того, может значительно сократить количество аудиозвонков во всем приложении без снижения качества звука.

  • Используйте DS3D_DEFERRED для трехмерных объектов. Большинство звуковых карта немедленно реагируют на изменения параметров и в одном кадре могут изменяться, особенно если изменить положение или ориентацию прослушивателя. Это приводит к тому, что звук карта / ЦП выполняет множество ненужных вычислений, поэтому другая быстрая и универсальная оптимизация заключается в том, чтобы отложить некоторые изменения параметров и зафиксировать их в конце кадра.

    или по крайней мере используйте метод SetAllParameters, а не отдельные вызовы Set3DParamX в буферах.

    Аналогичным образом следует использовать по крайней мере вызовы SetAllParamenters в трехмерных буферах, а не отдельные вызовы Set3DParamX. По возможности попробуйте свести к минимуму системные вызовы.

  • Не вызывайте избыточные вызовы; храните и сортируйте список вызовов воспроизведения. Часто в одном кадре обновления звука есть 2 запроса на воспроизведение новых звуков. Если запросы обрабатываются по мере их поступления, то первый новый звук можно запустить, а затем немедленно заменить второй запрошенный звук. Это приводит к избыточным вычислениям, ненужным вызовом воспроизведения и ненужным вызовом остановки. Лучше сохранить список запросов на воспроизведение новых звуков, чтобы список можно было сортировать, и только те голоса, которые должны начать играть, на самом деле когда-либо играли.

    Кроме того, следует хранить локальные копии параметров 3D и EAX для каждого источника звука. Если запрос выполняется для задания параметра определенному значению, можно проверка, чтобы узнать, отличается ли значение от последнего набора значений. Если это не так, вызов не требуется делать.

    Хотя звуковой карта драйвер, вероятно, обнаружит этот сценарий и не выполняет (то же самое) вычисление снова, звуковой вызов придется обратиться к звуковому драйверу (через переход на кольцо), и это уже медленная операция.

Когда я выполняю потоковую передачу буфера, он, как правило, сбой и плохо работает. Какой лучший способ потоковой передачи буфера?

При потоковой передаче звука в буфер существует два основных алгоритма: After-Write-Cursor (AWC) и Before-Play-Cursor (BPC). AWC сводит к минимуму задержку за счет сбоя, в то время как BPC является противоположной. Поскольку обычно интерактивные изменения потокового звука такого рода задержки редко возникают для игр и аналогичных приложений, поэтому BPC является более подходящим алгоритмом. В AWC каждый раз, когда поток потоковой передачи запускает данные в буферах циклов до N мс за пределами курсоров записи (обычно N=40 или около того, чтобы обеспечить jitter для Windows). В BPC всегда записывается максимальное количество данных в буферы, заполняя их вплоть до курсоров воспроизведения (или, возможно, 32 байта, прежде чем разрешить драйверам, которые неправильно сообщают о ходе выполнения курсора воспроизведения).

Используйте BPC для mimimize сбой и использовать буферы 100 мс или больше, даже если ваши игры не сбои на тестовом оборудовании, он будет сбой на некотором компьютере там.

Я играю те же звуки над и над очень часто и очень быстро, и иногда они не играют правильно, или вызов Play() занимает много времени. Что следует делать?

Задержка запуска (которая отличается от задержки потоковой передачи упоминание выше) может быть проблемой в случае некоторых аппаратных вызовов (вызов Play() занимает много времени иногда в определенных звуковых карта). Если вы действительно хотите уменьшить эту задержку, для twitch звуков (выстрелы пистолета, шаги и т. д.) удобный трюк заключается в том, чтобы сохранить некоторые буферы всегда цикличным и играть молчание. Если вам нужно воспроизвести звук twitch, выберите свободный буфер, посмотрите, где находится курсор записи, и поместите звук в буфер непосредственно за пределами курсора записи. Некоторые звуки карта завершается ошибкой QuerySupport для отложенных свойств, которые я знаю, что они поддерживают. Существует ли обходное решение? Вы можете просто querySupport для не отложенных версий свойств и использовать отложенные параметры в любом случае. Самые последние звуки карта драйверы также могут устранить эту проблему.

Разделы справки кодировать WAV-файлы в WMA?

Ознакомьтесь с документацией по кодировщику Windows Media в: Серия Кодировщика Windows Media 9.

Разделы справки декодировать MP3-файлы с помощью DirectSound?

DirectSound не поддерживает декодирование MP3 в собственном коде. Вы можете заранее декодировать файлы (используя кодек ACM фильтра DirectShow) или просто использовать DirectShow самостоятельно, что может сделать декодирование для вас; Затем можно скопировать полученные звуковые данные PCM в буферы DirectSound.

Расширения DirectX для Псевдонима Майя

Почему мои NURBS не отображаются?

NURBS не поддерживается. Их можно преобразовать в многоугольники.

Почему не отображаются вложенные диски?

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

Почему анимация в X-файле отличается от анимации в окне предварительного просмотра?

Окно предварительного просмотра не является анимацией в самом строгом смысле вопроса. Это не воспроизведение анимации, а синхронизация с самым текущим состоянием сцены Майи. При экспорте анимации матрицы при каждом преобразовании распаковываются в масштаб, поворот (кватернион) и компоненты перевода (часто называемые SRTs). СРТ являются более желательными, чем матрицы, так как они интерполируются хорошо, обеспечивают более компактный вид данных и могут быть сжаты независимо. Не все матрицы могут разбиться на SRTs. Если они не могут декомпилироваться, результирующая функция SRT будет неизвестна, поэтому могут быть обнаружены небольшие ошибки в анимации. Две функции в Майе, которые чаще всего вызывают проблемы во время декомпозиции, являются отрезами и поворотами вне центра или масштабами. Если вы столкнулись с этой проблемой, так как вы используете повороты вне центра или масштабирование, рассмотрите возможность добавления дополнительных преобразований, повышающих уровень иерархии.

Где анимация D3DX поддерживает SRT, выглядит следующим образом:

[S]x[R]x[T]

Матрицы Майи гораздо сложнее и требуют значительного объема дополнительного процесса, который выглядит следующим образом:

[SpInv]x[S]x[Sh]x[Sp]x[St]x[RpInv]x[Ro]x[R]x[Rp]x[Rt]x[T]

Я кожи моей сетки с Жестким Скином, но сетка (или часть) не двигается. Почему?

Жесткая кожа Майи в настоящее время не поддерживается. Пожалуйста, используйте гладкую кожу.

Где все мои IK пошли в X-файле?

X-файлы не поддерживают IK. Вместо этого решения IK запекаются в кадры, хранящиеся в X-файле.

Почему ни один из моих материалов не отображается, кроме DirectXShaders?

Расширения DirectX для Майи в настоящее время поддерживают только материалы DirectXShader для предварительной версии и экспорта. В будущей версии могут поддерживаться другие материалы.

Вопросы XInput

Можно ли использовать DirectInput для чтения триггеров?

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

Дополнительные сведения о том, почему DirectInput интерпретирует триггеры как одну ось, см. в разделе "Использование контроллера с DirectInput".

Сколько контроллеров поддерживает XInput?

XInput поддерживает 4 контроллера, подключенных за раз.

Поддерживает ли XInput не общие контроллеры?

Нет, это не так.

Доступны ли общие контроллеры через DirectInput?

Да, вы можете получить доступ к общим контроллерам через DirectInput.

Разделы справки получить обратную связь о общих контроллерах?

Используйте функцию XInputSetState .

Почему изменение звукового устройства по умолчанию?

При подключении гарнитуры гарнитура контроллера выступает в качестве стандартного USB-звукового устройства, поэтому при подключении Windows автоматически изменяет использование этого USB-звукового устройства в качестве значения по умолчанию. Так как пользователь, скорее всего, не хочет, чтобы все звуки проходили через гарнитуру, им потребуется вручную настроить его обратно в исходный параметр.

Разделы справки управлять светом на контроллере?

Индикаторы контроллера предопределены операционной системой и не могут быть изменены.

Разделы справки получить доступ к кнопке Xbox 360 в моих приложениях?

К сожалению, эта кнопка зарезервирована для дальнейшего использования.

Где я получаю драйверы?

Драйверы будут доступны через Обновл. Windows.

Как определяется идентификатор контроллера?

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

Разделы справки получить звуковые устройства для контроллера?

Используйте функцию XInputGetDSoundAudioDeviceGuids . Дополнительные сведения см. в примере AudioController.

Что делать при отключении контроллера?

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