Перейти к основному содержимому

DirectX — графика и мультимедиа на Windows

Разработчику Архитектору

Что такое DirectX

DirectX — семейство API Microsoft для графики, вычислений, аудио и ввода на Windows и Xbox. Для нативного C++ на PC DirectX — естественный путь к GPU: драйверы AMD/NVIDIA/Intel оптимизированы под Direct3D, индустрия исторически строится на DirectX, Visual Studio и Windows SDK дают заголовки, библиотеки и PIX.

DirectX — не один API, а набор компонентов:

КомпонентНазначение
Direct3D 11 (D3D11)Зрелый 3D; проще вход, чем D3D12
Direct3D 12 (D3D12)Низкий CPU overhead; явная синхронизация
DXGIАдаптеры, swap chain, fullscreen, форматы
HLSLЯзык шейдеров; компиляция в DXBC/DXIL
Direct2D / DirectWrite2D-векторная графика и текст
XAudio2Игровой звук
XInput / GameInputГеймпады

Обзор desktop — Desktop-приложения. Toolchain — Компиляторы и toolchain C++. Кросс-платформа — OpenGL или Vulkan.


Ключевые понятия

ТерминОпределение
AdapterВидеокарта или встроенный GPU в системе
Swap chainЦепочка back buffer'ов; Present показывает кадр
Render Target View (RTV)"Вид" на текстуру как на цветовой буфер
Depth Stencil View (DSV)Буфер глубины для 3D
HLSLHigh Level Shading Language — шейдеры DirectX
COMComponent Object Model; объекты D3D — IUnknown, нужен Release()
PSOPipeline State Object в D3D12 — тяжёлый immutable state

Как GPU работает в целом — как работает компьютер.


DirectX, OpenGL и Vulkan

КритерийD3D11D3D12OpenGLVulkan
ОСWindows, XboxWindows, XboxКросс-платформаКросс-платформа
Порог входаСреднийВысокийСреднийВысокий
Управление GPUЧастично неявноеЯвноеСмешанноеЯвное
ШейдерыHLSLHLSLGLSLSPIR-V
ОтладкаPIXPIXRenderDocRenderDoc

Правило выбора: Windows-only + старые GPU — D3D11. Свой движок — D3D12 или Vulkan. Учебный 2D — Raylib, SFML.


Инициализация Direct3D 11

Шаги:

  1. Окно Win32 (HWND) — DirectX не создаёт UI (SFML и Qt создают).
  2. CreateDXGIFactory → выбор адаптера.
  3. D3D11CreateDevice, feature level 11_0 или выше.
  4. CreateSwapChainForHwnd, формат DXGI_FORMAT_R8G8B8A8_UNORM.
  5. Back buffer → CreateRenderTargetView; depth → CreateDepthStencilView.
  6. Каждый кадр: bind RTV → clear → draw → Present.

Clear и present:

const float clearColor[4] = {0.12f, 0.12f, 0.16f, 1.f};
context->ClearRenderTargetView(rtv.Get(), clearColor);
context->ClearDepthStencilView(dsv.Get(), D3D11_CLEAR_DEPTH, 1.f, 0);
swapChain->Present(1, 0); // sync interval 1 ≈ VSync

Разбор фрагмента

  • ClearRenderTargetView — заливка color buffer; без clear — мусор прошлого кадра.
  • ClearDepthStencilView — depth = 1.0 (дальняя плоскость); нужен для 3D.
  • Present(1, 0) — первый аргумент 1 — ждать vertical blank (VSync); 0 — без ожидания.

Используйте ComPtr (WRL) — COM-объекты требуют Release(); RAII — Идиомы, Память.


Шейдеры HLSL

Vertex shader (упрощённо):

struct VSIn { float3 pos : POSITION; };
struct VSOut { float4 pos : SV_Position; };
VSOut main(VSIn i) {
VSOut o;
o.pos = float4(i.pos, 1.0);
return o;
}

Компиляция из C++:

ComPtr<ID3DBlob> vsBlob;
D3DCompileFromFile(L"triangle.vs.hlsl", nullptr, nullptr, "main",
"vs_5_0", 0, 0, &vsBlob, nullptr);
device->CreateVertexShader(vsBlob->GetBufferPointer(),
vsBlob->GetBufferSize(), nullptr, &vertexShader);
  • SV_Position — обязательный выход vertex shader (экранные координаты).
  • Input layout связывает POSITION с vertex buffer.
  • Константы (MVP) — constant buffer register(b0).

Сравнение с GLSL — OpenGL и шейдеры.


Direct3D 12 — отличия от D3D11

D3D12 переносит работу на приложение:

  • Descriptor heaps и root signature вместо простых slots;
  • Command lists на CPU → submit в command queue;
  • Fence — синхронизация CPU/GPU;
  • PSO — дорогой объект; кэшируют и переиспользуют.

Модель близка к Vulkan: "сложнее код — меньше driver overhead". Unreal Engine 5 на Windows использует D3D12.


Direct2D и UI

Для 2D поверх 3D или без него:

  • Direct2D — примитивы, градиенты, path;
  • DirectWrite — ClearType-текст;
  • D2D + DXGI — рисование в surface swap chain.

Полноценный desktop UI — Qt или WinUI (116). WPF/WinUI тоже используют DirectX под капотом.


Среда разработки

ИнструментНазначение
Visual Studio 2022Workload "Разработка классических приложений на C++"
Windows SDKd3d11.h, dxgi.h, d3dcompiler.h
PIXЗахват кадра, GPU timeline
RenderDocОтладка D3D11/12

MSVC — типичный компилятор; MinGW + DirectX возможен, но хуже поддерживается.


DirectX и игровые движки

Unreal, Unity на Windows скрывают DirectX за RHI. "Голый" D3D изучают, если:

  • пишете свой рендер;
  • делаете мод/плагин с низкоуровневым доступом;
  • отлаживаете performance на PC/Xbox.

Учебный 2D без Win32 — Raylib или SFML. Контекст индустрии — разработка игр.


Когда DirectX подходит

СценарийDirectX
Windows/Xbox игра или симуляторДа
Linux/macOSOpenGL/Vulkan
Быстрый учебный 2DSFML / Raylib
Корпоративный GUIQt / WinUI

Частые ошибки

СимптомПричинаРешение
DXGI_ERROR_DEVICE_REMOVEDTDR / падение shaderPIX, упростить shader
Чёрный экранRTV не boundOMSetRenderTargets
HLSL errorневерный profilevs_5_0 vs feature level
УтечкиCOM без ReleaseComPtr, RAII

Что читать дальше