Сопоставление функций DirectX 9 с API DirectX 11
Узнайте, как функции игры Direct3D 9 будут переведены на Direct3D 11 и универсальная платформа Windows (UWP).
Также см. раздел "Планирование порта DirectX" и важные изменения с Direct3D 9 на Direct3D 11.
Сопоставление API Direct3D 9 с DirectX 11
Direct3D по-прежнему является основой графики DirectX, но API изменился с DirectX 9:
- Инфраструктура графики Microsoft DirectX (DXGI) используется для настройки графических адаптеров. Используйте DXGI для выбора форматов буферов, создания цепочек буферов, представления кадров и создания общих ресурсов. Обзор DXGI.
- Контекст устройства Direct3D используется для задания состояния конвейера и создания команд отрисовки. Большинство наших примеров используют немедленный контекст для отрисовки непосредственно на устройстве; Direct3D 11 также поддерживает многопотточную отрисовку, в этом случае используются отложенные контексты. Общие сведения об устройстве в Direct3D 11.
- Некоторые функции устарели, в частности, конвейер фиксированной функции. См . нерекомендуемые функции.
Полный список функций Direct3D 11 см. в разделе "Функции Direct3D 11 " и "Функции Direct3D 11".
Переход с Direct2D 9 на Direct2D 11
Direct2D (Windows) по-прежнему является важной частью графики DirectX и Windows. Вы по-прежнему можете использовать Direct2D для рисования 2D-игр и рисования наложений (HUD) на основе Direct3D.
Direct2D выполняется поверх Direct3D; 2D-игры можно реализовать с помощью любого API. Например, 2D-игра, реализованная с помощью Direct3D, может использовать ортографическую проекцию, задать значения Z для управления порядком рисования примитивов и использовать шейдеры пикселей для добавления специальных эффектов.
Так как Direct2D основан на Direct3D, он также использует контексты DXGI и устройства. Ознакомьтесь с обзором API Direct2D.
API DirectWrite добавляет поддержку форматированного текста с помощью Direct2D. Ознакомьтесь с введением DirectWrite.
Замена устаревших вспомогательных библиотек
D3DX и DXUT устарели и не могут использоваться играми UWP. Эти вспомогательные библиотеки предоставили ресурсы для таких задач, как загрузка текстур и загрузка сетки.
- Простой порт из Direct3D 9 в пошаговое руководство по UWP демонстрирует настройку окна, инициализацию Direct3D и выполнение базовой трехмерной отрисовки.
- В пошаговом руководстве DirectX простые игры UWP демонстрируются распространенные задачи программирования игр, включая графику, загрузку файлов, пользовательский интерфейс, элементы управления и звук.
- Проект сообщества средств DirectX предлагает вспомогательные классы для использования с приложениями Direct3D 11 и UWP.
Перемещение программ шейдера из FX в HLSL
Библиотека служебной программы D3DX (D3DX 9, D3DX 10 и D3DX 11), включая эффекты, устарела для UWP. Все игры DirectX для UWP управляют графическим конвейером с помощью HLSL без эффектов.
Visual Studio по-прежнему использует FXC под капотом для компиляции объектов шейдера. Шейдеры игр UWP компилируются заранее. Байт-код загружается во время выполнения, а каждый ресурс шейдера привязан к графическому конвейеру во время соответствующего прохождения отрисовки. Шейдеры должны быть перемещены в собственный отдельный. HLSL-файлы и методы отрисовки должны быть реализованы в коде C++.
Краткий обзор загрузки ресурсов шейдера см. в статье "Простой порт" из Direct3D 9 в UWP.
В Direct3D 11 появилась модель шейдера 5, для которой требуется уровень компонентов Direct3D 11_0 (или более поздней версии). См . шейдер HLSL 5 функций для Direct3D 11.
Замена XNAMath и D3DXMath
Код с помощью XNAMath (или D3DXMath) должен быть перенесен на DirectXMath. DirectXMath включает типы, переносимые между x86, x64 и Arm. См . раздел "Миграция кода" из библиотеки математики XNA.
Обратите внимание, что типы с плавающей запятой 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 (сеть) (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::P resent1 с набором флагов DXGI_PRESENT_TEST. |
|
ID3D11DeviceContext::D rawIndexed ID3D11DeviceContext::D rawIndexedInstanced ID3D11DeviceContext::D rawInstanced |
|
Нет прямого эквивалента |
|
Используйте стандартные API курсоров. |
|
УСТРОЙСТВО LOST и POOL_MANAGED больше не существуют. IDXGISwapChain1::P resent1 может завершиться ошибкой с DXGI_ERROR_DEVICE_REMOVED возвращаемым значением. |
|
Конвейер фиксированной функции устарел. |
|
IDirect3Device9:CheckDepthStencilMatch |
Биты возможностей заменяются уровнями компонентов. Для любого заданного уровня компонентов необязательно использовать только несколько вариантов использования функций. Их можно проверить с идентификатором ID3D11Device::CheckFeatureSupport и ID3D11Device::CheckFormatSupport. |
Сопоставление формата Surface
Используйте следующую таблицу для преобразования форматов 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
Примечание . Используйте swizzle r в шейдере, чтобы дублировать красный цвет в другие компоненты, чтобы получить поведение 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
Примечание . Используйте swizzle r в шейдере, чтобы дублировать красный цвет для других компонентов, чтобы получить поведение 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 или более поздней версии
|
Дополнительные сведения о сопоставлении
- IDirect3Device9::SetCursorPosition заменяется SetCursorPos.
- IDirect3Device9::SetCursorProperties заменяется SetCursor.
- IDirect3Device9::SetIndices заменяется идентификатором ID3D11DeviceContext::IASetIndexBuffer.
- IDirect3Device9::SetRenderTarget заменяется идентификатором ID3D11DeviceContext::OMSetRenderTargets.
- IDirect3Device9::SetScissorRect заменен идентификатором ID3D11DeviceContext::RSSetScisorRects.
- IDirect3Device9::SetStreamSource заменяется идентификатором ID3D11DeviceContext::IASetVertexBuffers.
- IDirect3Device9::SetVertexDeclaration заменяется идентификатором ID3D11DeviceContext::IASetInputLayout.
- IDirect3Device9::SetViewport заменяется идентификатором ID3D11DeviceContext::RSSetViewports.
- IDirect3Device9::ShowCursor заменяется ShowCursor.
Управление аппаратным гамма-пандусом видеокарты через IDirect3Device9::SetGammaRamp заменено IDXGIOutput::SetGammaControl. См. раздел "Использование гамма-коррекции".
IDirect3Device9::P rocessVertices заменяется функцией Stream-Output геометрических шейдеров. См. статью "Начало работы с этапом потоковых выходных данных".
Метод IDirect3Device9::SetClipPlane для задания плоскостей клипов пользователей был заменен либо семантикой вывода HLSL SV_ClipDistance вершинного шейдера (см. семантику), доступной в VS_4_0 и вверх, либо новым атрибутом функции клиппланов HLSL (см. плоскости клипов пользователей на аппаратном уровне 9).
IDirect3Device9::SetPaletteEntries и IDirect3DDevice9::SetCurrentTexturePalette устарели. Замените их шейдером пикселей, который ищет цвета в текстуре 256x1 R8G8B8A8 .
Функции тесселяции фиксированной функции, такие как DrawRectPatch, DrawTriPatch, SetNPatchMode и DeletePatch, устарели. Замените их программируемыми шейдерами SM5.0 Tessellation (если оборудование поддерживает шейдеры тесселяции).
Коды IDirect3Device9::SetFVF и FVF больше не поддерживаются. Перед переносом в макеты входных данных D3D11 следует переносить коды FVF D3D9/D3D9 FVF в объявления вершин D3D11.
Все D3DDECLTYPE типы, которые не поддерживаются напрямую, можно эмулировать довольно эффективно с небольшим количеством побитовых операций в начале вершинного шейдера в VS_4_0 и вверх.