Сопоставление компонентов 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:

Следующие статьи помогут вам добавить сетевые возможности и объявить поддержку сети в манифесте пакета приложения.

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

Сопоставление функций

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

Direct3D9 Эквивалент в Direct3D 11

IDirect3DDevice9

ID3D11Device2

ID3D11DeviceContext2

Этапы графического конвейера описаны в статье Графический конвейер.

IDirect3D9

IDXGIFactory2

IDXGIAdapter2

IDXGIDevice3

IDirect3DDevice9::Present

IDXGISwapChain1::Present1

IDirect3DDevice9::TestCooperativeLevel

Вызовите IDXGISwapChain1::Present1 с установленным флагом DXGI_PRESENT_TEST.

IDirect3DBaseTexture9

IDirect3DTexture9

IDirect3DCubeTexture9

IDirect3DVolumeTexture9

IDirect3DIndexBuffer9

IDirect3DVertexBuffer9

ID3D11Buffer

ID3D11Texture1D

ID3D11Texture2D

ID3D11Texture3D

ID3D11ShaderResourceView

ID3D11RenderTargetView

ID3D11DepthStencilView

IDirect3DVertexShader9

IDirect3DPixelShader9

ID3D11VertexShader

ID3D11PixelShader

IDirect3DVertexDeclaration9

ID3D11InputLayout

IDirect3DDevice9::SetRenderState

IDirect3DDevice9::SetSamplerState

ID3D11BlendState1

ID3D11DepthStencilState

ID3D11RasterizerState1

ID3D11SamplerState

IDirect3DDevice9::DrawIndexedPrimitive

IDirect3DDevice9::DrawPrimitive

ID3D11DeviceContext::Draw

ID3D11DeviceContext::DrawIndexed

ID3D11DeviceContext::DrawIndexedInstanced

ID3D11DeviceContext::DrawInstanced

ID3D11DeviceContext::IASetPrimitiveTopology

ID3D11DeviceContext::DrawAuto

IDirect3DDevice9::BeginScene

IDirect3DDevice9::EndScene

IDirect3DDevice9::DrawPrimitiveUP

IDirect3DDevice9::DrawIndexedPrimitiveUP

Нет прямого эквивалента

IDirect3DDevice9::ShowCursor

IDirect3DDevice9::SetCursorPosition

IDirect3DDevice9::SetCursorProperties

Используйте стандартные API курсора.

IDirect3DDevice9::Reset

LOST (состояние устройства) и POOL_MANAGED более не существуют. IDXGISwapChain1::Present1 может завершиться сбоем и возвратить значение DXGI_ERROR_DEVICE_REMOVED.

IDirect3DDevice9:DrawRectPatch

IDirect3DDevice9:DrawTriPatch

IDirect3DDevice9:LightEnable

IDirect3DDevice9:MultiplyTransform

IDirect3DDevice9:SetLight

IDirect3DDevice9:SetMaterial

IDirect3DDevice9:SetNPatchMode

IDirect3DDevice9:SetTransform

IDirect3DDevice9:SetFVF

IDirect3DDevice9:SetTextureStageState

Конвейер фиксированной функции устарел.

IDirect3DDevice9:CheckDepthStencilMatch

IDirect3DDevice9:CheckDeviceFormat

IDirect3DDevice9:GetDeviceCaps

IDirect3DDevice9:ValidateDevice

Биты возможностей заменяются уровнями функций. Только некоторые сценарии использования форматов и компонентов являются необязательными для любого отдельно взятого уровня компонентов. Это можно проверить с помощью 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 или более поздней версии
 

Дополнительные сведения о сопоставлении

Управление аппаратной гамма-рампой карта видео через 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 и вверх.