Поделиться через


Важные изменения с Direct3D 9 на Direct3D 11

Сводка

В этом разделе объясняется высокий уровень различий между DirectX 9 и DirectX 11.

Direct3D 11 в основном совпадает с типом API Direct3D 9 — низкоуровневым виртуализированным интерфейсом в графическом оборудовании. Он по-прежнему позволяет выполнять операции рисования графики для различных аппаратных реализаций. Макет графического API изменился с момента Direct3D 9; Концепция контекста устройства была расширена, и API был добавлен специально для графической инфраструктуры. Ресурсы, хранящиеся на устройстве Direct3D, имеют новый механизм полиморфизма данных, называемый представлением ресурсов.

Основные функции API

В Direct3D 9 необходимо было создать интерфейс для API Direct3D, прежде чем начать использовать его. В игре Direct3D 11 универсальная платформа Windows (UWP) вы вызываете статическую функцию с именем D3D11CreateDevice, чтобы создать устройство и контекст устройства.

Контекст устройств и устройств

Устройство Direct3D 11 представляет виртуализированный графический адаптер. Он используется для создания ресурсов в памяти видео, например отправки текстур в GPU, создания представлений о ресурсах текстуры и цепочек буферов и создании примеров текстур. Полный список того, что используется интерфейсом устройства Direct3D 11 для просмотра id3D11Device и ID3D11Device1.

Direct3D 11. Контекст устройства используется для задания состояния конвейера и создания команд отрисовки. Например, цепочка отрисовки Direct3D 11 использует контекст устройства для настройки цепочки отрисовки и рисования сцены (см. ниже). Контекст устройства используется для доступа к памяти видео (карты), используемой ресурсами устройств Direct3D; Он также используется для обновления данных подресурса, например константных буферных данных. Полный список контекста устройства Direct3D 11 используется для просмотра id3D11DeviceContext и ID3D11DeviceContext1. Обратите внимание, что большинство наших примеров используют немедленный контекст для отрисовки непосредственно на устройстве, но Direct3D 11 также поддерживает отложенные контексты устройств, которые в основном используются для многопоточности.

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

Инфраструктура устройств, буферы кадров и целевые представления отрисовки

В Direct3D 11 адаптер устройства и конфигурация оборудования устанавливаются с ПОМОЩЬЮ API инфраструктуры графики DirectX (DXGI) с помощью интерфейсов COM IDXGIAdapter и IDXGIDevice1 COM. Буферы и другие ресурсы окна (видимые или внеэкранные) создаются и настраиваются определенными интерфейсами DXGI; Реализация шаблона фабрики IDXGIFactory2 получает ресурсы DXGI, такие как буфер кадров. Так как DXGI владеет цепочкой буферов, интерфейс DXGI используется для представления кадров на экране - см. раздел IDXGISwapChain1.

Используйте IDXGIFactory2 , чтобы создать цепочку буферов, совместимую с игрой. Необходимо создать цепочку буферов для основного окна или композиции (взаимодействия XAML), а не создавать цепочку буферов для HWND.

Ресурсы устройства и представления ресурсов

Direct3D 11 поддерживает дополнительный уровень полиморфизма в ресурсах памяти видео, известных как представления. По сути, в одном объекте Direct3D 9 для текстуры теперь есть два объекта: ресурс текстуры, содержащий данные, и представление ресурсов, указывающее, как представление используется для отрисовки. Представление на основе ресурса позволяет использовать этот ресурс для конкретной цели. Например, ресурс текстуры 2D создается как id3D11Texture2D, а затем создается представление ресурсов шейдера (ID3D11ShaderResourceView), чтобы его можно было использовать в качестве текстуры в шейдере. Целевое представление отрисовки (ID3D11RenderTargetView) также можно создать в том же ресурсе текстуры 2D, чтобы его можно было использовать в качестве поверхности рисования. В другом примере одни и те же данные пикселей представлены в 2 разных форматах пикселей с помощью двух отдельных представлений для одного ресурса текстуры.

Базовый ресурс должен быть создан со свойствами, совместимыми с типом представлений, которые будут созданы из него. Например, если идентификатор ID3D11RenderTargetView применяется к поверхности, то эта поверхность создается с помощью флага D3D11_BIND_RENDER_TARGET. Surface также должен иметь формат поверхности DXGI, совместимый с отрисовкой (см. DXGI_FORMAT).

Большинство ресурсов, используемых для отрисовки, наследуются от интерфейса ID3D11Resource, который наследует от ID3D11DeviceChild. Буферы вершин, буферы индексов, буферы констант и шейдеры являются всеми ресурсами Direct3D 11. Входные макеты и состояния выборки наследуются непосредственно от ID3D11DeviceChild.

Представления ресурсов используют значение перечисления DXGI_FORMAT для указания формата пикселей. Не все D3DFMT поддерживаются как DXGI_FORMAT. Например, в DXGI нет формата RGB 24bpp, эквивалентного D3DFMT_R8G8B8. Существуют также не эквиваленты BGR для каждого формата RGB (DXGI_FORMAT_R10G10B10A2_UNORM эквивалентен D3DFMT_A2B10G10R10, но нет прямого эквивалента D3DFMT_A2R10G10B10). Необходимо спланировать преобразование содержимого в устаревших форматах в поддерживаемые форматы во время сборки. Полный список форматов DXGI см. в перечислении DXGI_FORMAT .

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

Контекст устройства и цепочка отрисовки

В Direct3D 9 и Direct3D 10.x существовал один объект устройства Direct3D, который управлял созданием ресурсов, состоянием и рисованием. В Direct3D 11 интерфейс устройства Direct3D по-прежнему управляет созданием ресурсов, но все операции с состоянием и рисованием обрабатываются с помощью контекста устройства Direct3D. Ниже приведен пример использования контекста устройства (интерфейс ID3D11DeviceContext1 ) для настройки цепочки отрисовки:

  • Установка и очистка целевых представлений отрисовки (и представление элементов глубины)
  • Задайте буфер вершин, буфер индекса и макет входных данных для этапа входного сборщика (этап IA)
  • Привязка вершин и шейдеров пикселей к конвейеру
  • Привязка буферов констант к шейдерам
  • Привязка представлений текстур и примеров к шейдеру пикселей
  • Рисование сцены

Когда вызывается один из методов ID3D11DeviceContext::D raw , сцена рисуется в целевом представлении отрисовки. Когда вы закончите, все рисование адаптер DXGI используется для представления завершенного кадра путем вызова IDXGISwapChain1::P resent1.

Управление данными о состоянии

Параметры управляемого состояния Direct3D 9 с большим набором отдельных переключателей с помощью методов SetRenderState, SetSamplerState и SetTextureStageState. Так как Direct3D 11 не поддерживает устаревший конвейер фиксированной функции, метод SetTextureStageState заменяется записью шейдеров пикселей (PS). Нет эквивалента блоку состояния Direct3D 9. Direct3D 11 вместо этого управляет состоянием с помощью 4 типов объектов состояния, которые обеспечивают более упрощенный способ группировки состояния.

Например, вместо использования SetRenderState с D3DRS_ZENABLE создается объект DepthStencilState с этим и другими связанными параметрами состояния и используется для изменения состояния во время отрисовки.

При переносе приложений Direct3D 9 в объекты состояния следует учитывать, что различные сочетания состояний представляются как неизменяемые объекты состояния. Их следует создать один раз и повторно использовать до тех пор, пока они допустимы.

Уровни функций Direct3D

Direct3D имеет новый механизм определения аппаратной поддержки, называемой уровнями компонентов. Уровни компонентов упрощают задачу определения возможностей графического адаптера, позволяя запрашивать четко определенный набор функциональных возможностей GPU. Например, уровень компонентов 9_1 реализует функциональные возможности, предоставляемые графическими адаптерами Direct3D 9, включая модель шейдера 2.x. Так как 9_1 является самым низким уровнем функций, можно ожидать, что все устройства поддерживают шейдер вершин и шейдер пикселей, которые были одинаковыми этапами, поддерживаемыми моделью шейдера Direct3D 9.

Игра будет использовать D3D11CreateDevice для создания контекста устройства и устройства Direct3D. При вызове этой функции вы предоставляете список уровней функций, которые может поддерживать ваша игра. Он вернет самый высокий поддерживаемый уровень компонентов из этого списка. Например, если ваша игра может использовать текстуры BC4/BC5 (функция аппаратного обеспечения DirectX 10), то в список поддерживаемых уровней функций можно включить по крайней мере 9_1 и 10_0. Если игра работает на оборудовании DirectX 9 и текстурах BC4/BC5 нельзя использовать, то D3D11CreateDevice вернет 9_1. Затем ваша игра может вернуться к другому формату текстуры (и меньшие текстуры).

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

Подробные сведения о поддержке уровня функций см . в разделах уровней функций Direct3D. Полный список функций Direct3D 11 и Direct3D 11.1 см. в разделе "Функции Direct3D 11".

Уровни компонентов и программируемый конвейер

Оборудование продолжает развиваться с direct3D 9, и в программируемый графический конвейер добавлены несколько новых дополнительных этапов. Набор параметров для графического конвейера зависит от уровня компонентов Direct3D. Уровень компонентов 10.0 включает этап шейдера геометрии с необязательным потоком для многопассной отрисовки на GPU. Уровень компонентов 11_0 включает шейдер корпуса и шейдер домена для использования с аппаратным тесселяции. Уровень компонентов 11_0 также включает полную поддержку шейдеров DirectCompute, а уровни компонентов 10.x включают только поддержку ограниченной формы DirectCompute.

Все шейдеры записываются в HLSL с помощью профиля шейдера, соответствующего уровню функций Direct3D. Профили шейдера совместимы вверх, поэтому шейдер HLSL, который компилируется с помощью vs_4_0_level_9_1 или ps_4_0_level_9_1 будет работать на всех устройствах. Профили шейдера не совместимы, поэтому шейдер, скомпилированный с помощью vs_4_1 будет работать только на уровне компонентов 10_1, 11_0 или 11_1 устройства.

Управляемые константы Direct3D 9 для шейдеров с помощью общего массива с SetVertexShaderConstant и SetPixelShaderConstant. Direct3D 11 использует буферы констант, которые являются ресурсами, такими как буфер вершин или буфер индекса. Буферы констант предназначены для эффективного обновления. Вместо того, чтобы все константы шейдера были организованы в один глобальный массив, вы упорядочиваете константы в логические группировки и управляете ими с помощью одного или нескольких буферов констант. При переносе игры Direct3D 9 в Direct3D 11 планируется упорядочить буферы констант, чтобы можно было соответствующим образом обновить их. Например, константы группового шейдера, которые не обновляются каждый кадр в отдельный буфер констант, чтобы не нужно постоянно передавать эти данные в графический адаптер вместе с более динамическими константами шейдеров.

Обратите внимание, что большинство приложений Direct3D 9 широко используют шейдеры, но иногда смешанные в использовании устаревшего поведения фиксированной функции. Обратите внимание, что Direct3D 11 использует только программируемую модель заливки. Устаревшие функции фиксированной функции Direct3D 9 устарели.