Сопоставление компонентов DirectX 9 и API DirectX 11
Прочитав этот раздел, вы поймете, как компоненты, которые использует ваша игра с Direct3D 9, будут перенесены в Direct3D 11 и на универсальную платформу Windows (UWP).
См. также статью Планирование порта DirectX и Важные изменения с Direct3D 9 на Direct3D 11.
Сопоставление Direct3D 9 и API DirectX 11
Direct3D по-прежнему является основой графики DirectX, но после DirectX 9 изменились API.
- Для установки графических адаптеров используется Microsoft DirectX Graphics Infrastructure (DXGI). Используйте DXGI для выбора форматов буферов, создания цепочек буферов, представления кадров и создания общих ресурсов. См. общие сведения о DXGI.
- Контекст устройства Direct3D используется для установки состояния конвейера и генерирования команд отрисовки. Во многих наших примерах используется немедленный контекст для прямой отрисовки на устройстве. Direct3D 11 также поддерживает многопотоковую отрисовку, в этом случае используются отложенные контексты. См. раздел Введение в устройство в Direct3D 11.
- Некоторые компоненты устарели, наиболее заметно усовершенствован функциональный конвейер. См. раздел Устаревшие компоненты.
Полный список компонентов Direct3D 11: Компоненты Direct3D 11 и Компоненты Direct3D 11.
Переход с Direct2D 9 на Direct2D 11
Direct2D (Windows) по-прежнему является важной частью графики DirectX и Windows. Вы все еще можете использовать Direct2D для отрисовки двухмерных игр и наложений (HUD) на Direct3D.
Direct2D работает на базе Direct3D; двухмерные игры можно реализовать с помощью любого API. Например, при реализации двухмерной игры с помощью Direct3D можно использовать ортогональную проекцию, установить значения Z для управления порядком отрисовки примитивов и использовать построитель текстуры для добавления специальных эффектов.
Так как Direct2D основан на Direct3D, он также использует DXGI и контексты устройств. См. раздел Обзор API Direct2D.
API DirectWrite добавляет поддержку отформатированного текста с помощью Direct2D. См. раздел Введение в DirectWrite.
Замена устаревших вспомогательных библиотек
D3DX и DXUT являются нерекомендуемыми и не могут использоваться играми UWP. Эти вспомогательные библиотеки предоставляли ресурсы для таких задач, как загрузка текстуры и сетки.
- В пошаговом руководстве Простой перенос из Direct3D 9 на UWP показано, как настроить окно, инициализировать Direct3D и выполнить базовую трехмерную отрисовку.
- В пошаговом руководстве Простая игра UWP с использованием DirectX демонстрируются стандартные задачи, возникающие при программировании игры, включая графику, загрузку файлов, пользовательский интерфейс, элементы управления и звук.
- Сообщество DirectX Tool Kit (Набор инструментов DirectX) предлагает вспомогательные классы для использования с Direct3D 11 и приложениями UWP.
Перенос программ-шейдеров с FX на HLSL
Мы не рекомендуем использовать библиотеку подпрограмм D3DX (D3DX 9, D3DX 10 и D3DX 11), включая эффекты, для UWP. Все игры UWP с DirectX реализует графический конвейер с помощью HLSL без эффектов.
Visual Studio по-прежнему использует FXC для компиляции объектов шейдера. Шейдеры игр UWP компилируются заранее. Байт-код загружается во время выполнения, затем каждый ресурс шейдера привязывается к графическому конвейеру во время соответствующего этапа отрисовки. Шейдеры необходимо переместить в их собственные HLSL-файлы, а методы отрисовки следует реализовать в коде C++.
Чтобы взглянуть на загрузку ресурсов шейдера, см. раздел Простое портирование с Direct3D 9 на UWP.
В Direct3D 11 появилась модель шейдера 5, для которой требуется уровень функций Direct3D 11_0 (или выше). См. раздел Компоненты модели 5 шейдера HLSL для Direct3D 11.
Замена XNAMath и D3DXMath
Код, использующий XNAMath (или D3DXMath), необходимо перенести на DirectXMath. DirectXMath включает типы, которые переносятся в x86, x64 и Arm. См. раздел Перенос кода из библиотеки XNA Math.
Обратите внимание, что типы чисел с плавающей точкой DirectXMath удобно использовать с шейдерами. Например, XMFLOAT4 и XMFLOAT4X4 обеспечивают удобное выравнивание данных для буферов констант.
Замена DirectSound на XAudio2 (и фоновый звук)
DirectSound не поддерживается для UWP:
- Используйте XAudio2, чтобы добавить в игру звуковые эффекты.
Замените DirectInput API XInput и среда выполнения Windows
DirectInput не поддерживается для UWP:
- Используйте обратные вызовы событий ввода CoreWindow для мыши, клавиатуры и сенсорного ввода.
- Используйте XInput 1.4 для поддержки игрового устройства управления (и его гарнитуры). Если вы используете общую базу кода для рабочего стола и UWP, вы найдете сведения об обратной совместимости в разделе о версиях XInput.
- Подпишитесь на события EdgeGesture, если вашей игре нужно использовать панель приложения.
Использование Microsoft Media Foundation вместо DirectShow
DirectShow больше не является частью API DirectX (или API Windows). Microsoft Media Foundation предоставляет видеосодержимое интерфейсу Direct3D посредством общих поверхностей. См. раздел API видео Direct3D 11.
Замена DirectPlay на сетевой код
Microsoft DirectPlay устарел. Если ваша игра использует сетевые службы, вам нужно предоставить сетевой код, соответствующий требованиям сертификации UWP. Используйте следующие API:
- Win32 и COM для приложений UWP apps (сеть) (Windows)
- Пространство имен Windows.Networking (Windows)
- Пространство имен Windows.Networking.Sockets (Windows)
- Пространство имен Windows.Networking.Connectivity (Windows)
- Пространство имен Windows.ApplicationModel.Background (Windows)
Следующие статьи помогут вам добавить сетевые возможности и объявить поддержку сети в манифесте пакета приложения.
- Подключение с помощью сокетов (приложения UWP на C#, VB, C++ и XAML) (Windows)
- Подключение с помощью WebSockets (приложения UWP на C#, VB, C++ и XAML) (Windows)
- Подключение к веб-службам (приложения UWP на C#, VB, C++ и XAML) (Windows)
- Основы работы с сетями
Обратите внимание, что все приложения UWP (включая игры) используют специфические типы фоновых задач для поддержки подключения, когда приложение приостановлено. Если вашей игре необходимо поддерживать подключенное состояние во время приостановки, см. раздел Основы работы в сети.
Сопоставление функций
Используйте следующую таблицу, чтобы преобразовать код из Direct3D 9 в Direct3D 11. Это также поможет понять разницу между устройством и контекстом устройства.
Direct3D9 | Эквивалент в Direct3D 11 |
---|---|
Этапы графического конвейера описаны в статье Графический конвейер. |
|
Вызовите IDXGISwapChain1::Present1 с установленным флагом DXGI_PRESENT_TEST. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
Нет прямого эквивалента |
|
Используйте стандартные API курсора. |
|
LOST (состояние устройства) и POOL_MANAGED более не существуют. IDXGISwapChain1::Present1 может завершиться сбоем и возвратить значение DXGI_ERROR_DEVICE_REMOVED. |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
Конвейер фиксированной функции устарел. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
Биты возможностей заменяются уровнями функций. Только некоторые сценарии использования форматов и компонентов являются необязательными для любого отдельно взятого уровня компонентов. Это можно проверить с помощью ID3D11Device::CheckFeatureSupport и ID3D11Device::CheckFormatSupport. |
Сопоставление форматов поверхностей
Используйте следующую таблицу, чтобы преобразовать форматы Direct3D 9 в форматы DXGI.
Формат Direct3D 9 | Формат Direct3D 11 |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
Недоступно |
D3DFMT_A8R8G8B8 |
DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
D3DFMT_X8R8G8B8 |
DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
D3DFMT_R5G6B5 |
DXGI_FORMAT_B5G6R5_UNORM |
D3DFMT_X1R5G5B5 |
Недоступно |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
Недоступно |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
Недоступно |
D3DFMT_X4R4G4B4 |
Недоступно |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
Недоступно |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
Недоступно |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
Недоступно |
D3DFMT_P8 |
Недоступно |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
Примечание Используйте .r swizzle в шейдере, чтобы дублировать красный цвет в другие компоненты, чтобы получить поведение Direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Примечание Используйте swizzle .rrrg в шейдере для дублирования красного цвета и переместите зеленый цвет в альфа-компоненты, чтобы получить поведение Direct3D 9.
|
D3DFMT_A4L4 |
Недоступно |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
Недоступно |
D3DFMT_X8L8V8U8 |
Недоступно |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
Недоступно |
D3DFMT_A2W10V10U10 |
Недоступно |
D3DFMT_UYVY |
Недоступно |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
Примечание В Direct3D 9 данные были масштабированы на 255,0f, но это можно обрабатывать в шейдере.
|
D3DFMT_YUY2 |
Недоступно |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Примечание В Direct3D 9 данные были масштабированы на 255,0f, но это можно обрабатывать в шейдере.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
Примечание DXT1 и DXT2 одинаковы с точки зрения API и оборудования. Единственная разница заключается в том, использовалось ли предварительно умноженное альфа-значение, которое может отследить приложение и которому не требуется отдельный формат.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
Примечание DXT3 и DXT4 одинаковы с точки зрения API и оборудования. Единственная разница заключается в том, использовалось ли предварительно умноженное альфа-значение, которое может отследить приложение и которому не требуется отдельный формат.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
Недоступно |
D3DFMT_D15S1 |
Недоступно |
D3DFMT_D24S8 |
Недоступно |
D3DFMT_D24X8 |
Недоступно |
D3DFMT_D24X4S4 |
Недоступно |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
Недоступно |
D3DFMT_S1D15 |
Недоступно |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
Недоступно |
D3DFMT_X4S4D24 |
Недоступно |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
Примечание Используйте .r swizzle в шейдере, чтобы дублировать красный цвет для других компонентов, чтобы получить поведение D3D9.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
Недоступно |
D3DFMT_R16F |
DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F |
DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F |
DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F |
DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F |
DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 |
Недоступно |
D3DDECLTYPE_FLOAT1 |
DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 |
DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 |
DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR |
Недоступно |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
Примечание Шейдер получает значения UINT, но если требуются целочисленные числа с плавающей точкой в стиле Direct3D 9 (0,0f, 1,0f... 255.f), UINT можно просто преобразовать в float32 в шейдере.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
Примечание Шейдер получает значения SINT, но если требуются целочисленные значения с плавающей точкой в стиле Direct3D 9, SINT можно просто преобразовать в float32 в шейдере.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Примечание Шейдер получает значения SINT, но если требуются целочисленные значения с плавающей точкой в стиле Direct3D 9, SINT можно просто преобразовать в float32 в шейдере.
|
D3DDECLTYPE_UBYTE4N |
DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N |
DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N |
DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 |
Недоступно |
D3DDECLTYPE_DEC3N |
Недоступно |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
Примечание Требуется уровень компонентов 10.0 или более поздней версии
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Примечание Требуется уровень компонентов 10.0 или более поздней версии
|
Дополнительные сведения о сопоставлении
- IDirect3DDevice9::SetCursorPosition заменяется на SetCursorPos.
- IDirect3DDevice9::SetCursorProperties заменяется на SetCursor.
- IDirect3DDevice9::SetIndices заменяется на ID3D11DeviceContext::IASetIndexBuffer.
- IDirect3DDevice9::SetRenderTarget заменяется id3D11DeviceContext::OMSetRenderTargets.
- IDirect3DDevice9::SetScissorRect заменяется id3D11DeviceContext::RSSetScissorRects.
- IDirect3DDevice9::SetStreamSource заменяется id3D11DeviceContext::IASetVertexBuffers.
- IDirect3DDevice9::SetVertexDeclaration заменяется id3D11DeviceContext::IASetInputLayout.
- IDirect3DDevice9::SetViewport заменяется id3D11DeviceContext::RSSetViewports.
- IDirect3DDevice9::ShowCursor заменяется на ShowCursor.
Управление аппаратной гамма-рампой карта видео через IDirect3Device9::SetGammaRamp заменяется idXGIOutput::SetGammaControl. См . раздел Использование гамма-коррекции.
IDirect3DDevice9::P rocessVertices заменяется функциями Stream-Output геометрических шейдеров. См. статью Начало работы с этапом Stream-Output.
Метод IDirect3DDevice9::SetClipPlane для задания пользовательских плоскостей клипов был заменен либо семантикой вывода вершинного шейдера SV_ClipDistance HLSL (см. семантику), доступной в VS_4_0 и выше, либо новым атрибутом функции HLSL clipplanes (см . раздел Пользовательские плоскости клипов на оборудовании уровня компонентов 9).
IDirect3DDevice9::SetPaletteEntries и IDirect3DDevice9::SetCurrentTexturePalette являются устаревшими. Замените их пиксельным шейдером, который ищет цвета в текстуре R8G8B8A8 256x1.
Функции тесселяции с фиксированными функциями, такие как DrawRectPatch, DrawTriPatch, SetNPatchMode и DeletePatch , являются устаревшими. Замените их программными шейдерами sm5.0 tessellation (если оборудование поддерживает тесселяции).
Коды IDirect3DDevice9::SetFVF и FVF больше не поддерживаются. Перед переносом во входные макеты D3D11 следует перенести коды FVF D3D8/D3D9 в объявления вершин D3D9.
Все типы D3DDECLTYPE , которые не поддерживаются напрямую, можно эмулировать довольно эффективно с помощью небольшого количества побитовых операций в начале вершинного шейдера в VS_4_0 и вверх.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по