{"id":479246,"date":"2026-05-10T17:32:04","date_gmt":"2026-05-10T17:32:04","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=479246"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=479246","title":{"rendered":"Direct2D #10. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u042d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u21169.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: Direct2D \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 Direct3D. \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 HWNDRenderTarget, \u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Windows 8 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0451\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u043b HWNDRenderTarget &#8212; \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043e \u0434\u0432\u0443\u0445 \u0431\u0443\u0444\u0435\u0440\u0430\u0445: \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u043a\u0438\u0441\u0442\u044c\u044e, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 &#8212; \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, \u0431\u0438\u0442\u043c\u0430\u043f \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041e\u0431\u0430 \u044d\u0442\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 DeviceContext (\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430). \u0410 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043a\u0438\u0441\u0442\u0435\u0439, \u0431\u0438\u0442\u043c\u0430\u043f\u043e\u0432), \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u0436\u0438\u0437\u043d\u044c\u044e \u0438 \u0432\u0441\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 Device (\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e). \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 &#8212; SwapChain (\u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430). \u0423 \u043d\u0435\u0433\u043e \u0434\u0432\u0430 \u0431\u0443\u0444\u0435\u0440\u0430: \u0437\u0430\u0434\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439. \u041f\u043e\u043a\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u044f\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043c\u0435\u043d, \u0431\u0443\u0444\u0435\u0440\u044b \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438: \u0437\u0430\u0434\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043c \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0430 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430.<\/p>\n<p>\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u043b\u0438\u0448\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u0440\u0451\u0445. \u0421\u0442\u0430\u0440\u044b\u0439 HWNDRenderTarget \u0441\u043a\u0440\u044b\u0432\u0430\u043b \u0438\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u0438 &#8212; \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0430\u0434\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u0445. \u0421\u043f\u0440\u0430\u0439\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 (sprite batch). \u041f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0432\u0437\u044f\u0442\u044c \u0438 \u043a\u0430\u043a \u0435\u0451 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0443\u044e \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">HRESULT InitDirect2D(HWND hWnd){    HRESULT hr;    ComPtr&lt;ID3D11Device&gt; d3dDevice;    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,        D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT,        nullptr, 0, D3D11_SDK_VERSION, d3dDevice.GetAddressOf(), nullptr, nullptr);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIDevice&gt; dxgiDevice;    hr = d3dDevice.As(&amp;dxgiDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIAdapter&gt; adapter;    hr = dxgiDevice-&gt;GetAdapter(adapter.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIFactory2&gt; dxgiFactory;    hr = adapter-&gt;GetParent(IID_PPV_ARGS(dxgiFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    RECT rc;    GetClientRect(hWnd, &amp;rc);    UINT width = rc.right - rc.left;    UINT height = rc.bottom - rc.top;    if (width == 0) width = 800;    if (height == 0) height = 600;    DXGI_SWAP_CHAIN_DESC1 swapDesc = {};    swapDesc.Width = width;    swapDesc.Height = height;    swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;    swapDesc.SampleDesc.Count = 1;    swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    swapDesc.BufferCount = 2;    swapDesc.Scaling = DXGI_SCALING_NONE;    swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;    swapDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;    hr = dxgiFactory-&gt;CreateSwapChainForHwnd(d3dDevice.Get(), hWnd, &amp;swapDesc, nullptr, nullptr, g_swapChain.GetAddressOf());    if (FAILED(hr)) return hr;    D2D1_FACTORY_OPTIONS options = {};#ifdef _DEBUG    options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;#endif    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, options, g_d2dFactory.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1Device&gt; baseDevice;    hr = g_d2dFactory-&gt;CreateDevice(dxgiDevice.Get(), baseDevice.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseDevice.As(&amp;g_d2dDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1DeviceContext&gt; baseContext;    hr = g_d2dDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, baseContext.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseContext.As(&amp;g_d2dContext);    if (FAILED(hr)) return hr;    hr = CreateRenderTarget();    if (FAILED(hr)) return hr;    hr = LoadTextureFromFile(L\"image.png\");    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateSpriteBatch(g_spriteBatch.GetAddressOf());    return hr;}HRESULT CreateRenderTarget(){    ComPtr&lt;IDXGISurface&gt; backBuffer;    HRESULT hr = g_swapChain-&gt;GetBuffer(0, IID_PPV_ARGS(backBuffer.GetAddressOf()));    if (FAILED(hr)) return hr;    D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1(        D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)    );    hr = g_d2dContext-&gt;CreateBitmapFromDxgiSurface(backBuffer.Get(), props, g_targetBitmap.GetAddressOf());    if (SUCCEEDED(hr))        g_d2dContext-&gt;SetTarget(g_targetBitmap.Get());    return hr;}HRESULT LoadTextureFromFile(const std::wstring&amp; filename){    ComPtr&lt;IWICImagingFactory&gt; wicFactory;    HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(wicFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapDecoder&gt; decoder;    hr = wicFactory-&gt;CreateDecoderFromFilename(filename.c_str(), nullptr, GENERIC_READ, WICDecodeMetadataCacheOnLoad, decoder.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapFrameDecode&gt; frame;    hr = decoder-&gt;GetFrame(0, frame.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICFormatConverter&gt; converter;    hr = wicFactory-&gt;CreateFormatConverter(converter.GetAddressOf());    if (FAILED(hr)) return hr;    hr = converter-&gt;Initialize(frame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateBitmapFromWicBitmap(converter.Get(), nullptr, g_spriteTexture.GetAddressOf());    return hr;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u0448\u0430\u0433\u0430\u043c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f Device, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a Direct3D. \u0424\u0443\u043d\u043a\u0446\u0438\u044f D3D11CreateDevice:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;ID3D11Device&gt; d3dDevice;hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,    D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT,    nullptr, 0, D3D11_SDK_VERSION, d3dDevice.GetAddressOf(), nullptr, nullptr);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 D3D11CreateDevice<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<p>\u0422\u0438\u043f: IDXGIAdapter* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pAdapter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041b\u044e\u0431\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0435\u0440(\u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430), \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 EnumAdapters, \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: nullptr \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 GPU).<\/p>\n<p>\u0422\u0438\u043f: D3D_DRIVER_TYPE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: DriverType \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, D3D_DRIVER_TYPE_SOFTWARE \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D_DRIVER_TYPE_HARDWARE \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, D3D_DRIVER_TYPE_REFERENCE &#8212; \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0443\u0441\u044b.<\/p>\n<p>\u0422\u0438\u043f: HMODULE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Software \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 DLL \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 NULL \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u0440\u0438 DriverType = HARDWARE \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Flags \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u0432 D3D11_CREATE_DEVICE_FLAG (\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: SINGLETHREADED \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443; BGRA_SUPPORT \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f Direct2D, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c B8G8R8A8.<\/p>\n<p>\u0422\u0438\u043f: const D3D_FEATURE_LEVEL* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFeatureLevels \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041c\u0430\u0441\u0441\u0438\u0432 D3D_FEATURE_LEVEL \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: nullptr \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Direct 3D 11.<\/p>\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: FeatureLevels \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 pFeatureLevels, \u0438\u043d\u0430\u0447\u0435 0 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 pFeatureLevels = nullptr. \u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: SDKVersion \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 D3D11_SDK_VERSION \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D11_SDK_VERSION \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>\u0422\u0438\u043f: ID3D11Device** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppDevice \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: d3dDevice.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u044e\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Direct3D 11.<\/p>\n<p>\u0422\u0438\u043f: D3D_FEATURE_LEVEL* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFeatureLevel \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c Direct3D 11 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043f\u043e \u0438\u0442\u043e\u0433\u0443.<\/p>\n<p>\u0422\u0438\u043f: ID3D11DeviceContext** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppImmediateContext \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Immediate Context D3D11, \u0432\u0435\u0441\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Direct2D.<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c DXGI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 GPU, \u0447\u0442\u043e \u0438 d3dDevice. IDXGIDevice &#8212; \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 D3D \u0438 DXGI, IDXGIAdapter &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, IDXGIFactory2 &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0441\u0442 SwapChain, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 \u043d\u0430\u0448\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IDXGIDevice&gt; dxgiDevice;hr = d3dDevice.As(&amp;dxgiDevice);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 As<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: REFIID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: riid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (IID) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: IID_IDXGIDevice \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 DXGI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0443 \u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0435.<\/p>\n<p>\u0422\u0438\u043f: void** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppvObject \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: dxgiDevice.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 dxgiDevice \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 IDXGIDevice.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 &#8212; \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b DXGI \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0442\u0435\u043c \u0436\u0435 GPU, \u0447\u0442\u043e \u0438 \u043d\u0430\u0448\u0435 D3D-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IDXGIAdapter&gt; adapter;hr = dxgiDevice-&gt;GetAdapter(adapter.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GetAdapter<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IDXGIAdapter** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pAdapter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: adapter.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0430\u043f\u0442\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 GPU.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0443 DXGI. \u041c\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDXGIFactory2, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 (swap chains) \u0434\u043b\u044f \u043e\u043a\u043e\u043d. \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0442\u043e\u043c\u0443 \u0436\u0435 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0443, \u0447\u0442\u043e \u0438 \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IDXGIFactory2&gt; dxgiFactory;hr = adapter-&gt;GetParent(IID_PPV_ARGS(dxgiFactory.GetAddressOf()));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GetParent<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: REFIID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: riid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): IID \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (\u0444\u0430\u0431\u0440\u0438\u043a\u0438) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: IID_IDXGIFactory2 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0432\u0435\u0440\u0441\u0438\u0438 2, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a CreateSwapChainForHwnd.<\/p>\n<p>\u0422\u0438\u043f: void** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppParent \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: dxgiFactory.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c IDXGIFactory2, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f SwapChain:<\/p>\n<pre><code class=\"cpp\">DXGI_SWAP_CHAIN_DESC1 swapDesc = {};swapDesc.Width = width;swapDesc.Height = height;swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;swapDesc.SampleDesc.Count = 1;swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;swapDesc.BufferCount = 2;swapDesc.Scaling = DXGI_SCALING_NONE;swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;swapDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b DXGI_SWAP_CHAIN_DESC1<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Width \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): 1\u2026\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430 (\u0435\u0441\u043b\u0438 0, \u0442\u043e 800) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0428\u0438\u0440\u0438\u043d\u0430 \u0437\u0430\u0434\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430; \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043d\u0443\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u043c \u043e\u043a\u043d\u0435.<\/p>\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Height \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): 1\u2026\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430 (\u0435\u0441\u043b\u0438 0, \u0442\u043e 600) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0412\u044b\u0441\u043e\u0442\u0430 \u0437\u0430\u0434\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u0430 \u043e\u0442 \u043d\u0443\u043b\u044f.<\/p>\n<p>\u0422\u0438\u043f: DXGI_FORMAT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Format \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0424\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043a\u0430\u043a \u0446\u0435\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: DXGI_FORMAT_B8G8R8A8_UNORM \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0420\u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u044f Direct2D 8-\u0431\u0438\u0442\u043d\u044b\u0439 BGRA-\u0444\u043e\u0440\u043c\u0430\u0442.<\/p>\n<p>\u0422\u0438\u043f: DXGI_SAMPLE_DESC \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: SampleDesc \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): Count 1\u202632, Quality \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: Count = 1, Quality = 0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: MSAA \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d (1 \u0441\u044d\u043c\u043f\u043b \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c).<\/p>\n<p>\u0422\u0438\u043f: DXGI_USAGE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: BufferUsage \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f RENDER_TARGET_OUTPUT, SHADER_INPUT, UNORDERED_ACCESS \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: DXGI_USAGE_RENDER_TARGET_OUTPUT \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0411\u0443\u0444\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430; \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 SHADER_INPUT \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0444\u043b\u0430\u0433\u0430 CANNOT_DRAW \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 D2D-\u0431\u0438\u0442\u043c\u0430\u043f\u0430.<\/p>\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: BufferCount \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): 2\u202616 \u0434\u043b\u044f FLIP_DISCARD \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 2 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0414\u0432\u043e\u0439\u043d\u0430\u044f \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f. \u0422\u0438\u043f: DXGI_SCALING \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Scaling \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): DXGI_SCALING_NONE \u0438\u043b\u0438 DXGI_SCALING_STRETCH \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: DXGI_SCALING_NONE \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e; \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438 WM_SIZE.<\/p>\n<p>\u0422\u0438\u043f: DXGI_SWAP_EFFECT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: SwapEffect \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): DISCARD, SEQUENTIAL, FLIP_DISCARD, FLIP_SEQUENTIAL \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: DXGI_SWAP_EFFECT_FLIP_DISCARD \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f flip-\u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435 Present; \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0422\u0438\u043f: DXGI_ALPHA_MODE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: AlphaMode \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): IGNORE, PREMULTIPLIED, STRAIGHT \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: DXGI_ALPHA_MODE_IGNORE \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0410\u043b\u044c\u0444\u0430-\u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u0438\u043d\u0433\u0435 \u043e\u043a\u043d\u0430 \u2013 \u043e\u043a\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u0431\u043c\u0435\u043d\u0430 (swap chain) \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0434\u0432\u0443\u043c\u044f (\u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435) \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 &#8212; \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043c \u0438 \u0437\u0430\u0434\u043d\u0438\u043c. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c \u0432 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c Present(), \u0431\u0443\u0444\u0435\u0440\u044b \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">hr = dxgiFactory-&gt;CreateSwapChainForHwnd(d3dDevice.Get(), hWnd, &amp;swapDesc, nullptr, nullptr, g_swapChain.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateSwapChainForHwnd<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IUnknown* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pDevice \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Direct3D (\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a IUnknown) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: d3dDevice.Get() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432 \u0431\u0443\u0444\u0435\u0440\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0422\u0438\u043f: HWND \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: hWnd \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 HWND \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u043a\u043d\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0422\u0438\u043f: const DXGI_SWAP_CHAIN_DESC1* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pDesc \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: &amp;swapDesc \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u0434\u0430\u0451\u0442 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u0440\u0430\u0437\u043c\u0435\u0440, \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0442.\u0434.).<\/p>\n<p>\u0422\u0438\u043f: const DXGI_SWAP_CHAIN_FULLSCREEN_DESC* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFullscreenDesc \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u0441\u0442\u0430\u0432\u0430\u0451\u043c\u0441\u044f \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>\u0422\u0438\u043f: IDXGIOutput* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pRestrictToOutput \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0441 \u043e\u043a\u043d\u043e\u043c.<\/p>\n<p>\u0422\u0438\u043f: IDXGISwapChain1** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppSwapChain \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f swap chain \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_swapChain.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u0430\u043c\u0438.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 Direct2D:<\/p>\n<pre><code class=\"cpp\">    D2D1_FACTORY_OPTIONS options = {};#ifdef _DEBUG    options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;#endif    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, options, g_d2dFactory.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 D2D1CreateFactory<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: D2D1_FACTORY_TYPE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: type \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): SINGLE_THREADED \u0438\u043b\u0438 MULTI_THREADED \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D2D1_FACTORY_TYPE_SINGLE_THREADED \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0422\u0438\u043f: const D2D1_FACTORY_OPTIONS* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFactoryOptions \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 debugLevel (NONE, INFORMATION, WARNING, ERROR) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: &amp;options \u0441 debugLevel = D2D1_DEBUG_LEVEL_INFORMATION (\u0432 Debug) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0432 Debug-\u0441\u0431\u043e\u0440\u043a\u0435; \u0432 Release &#8212; NONE.<\/p>\n<p>\u0422\u0438\u043f: ID2D1Factory** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppFactory \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_d2dFactory.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 Direct2D, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043e\u0431\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Direct2D, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 GPU, \u0447\u0442\u043e \u0438 \u043d\u0430\u0448\u0435 DXGI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041e\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 Direct2D (\u0431\u0438\u0442\u043c\u0430\u043f\u0430\u043c\u0438, \u043a\u0438\u0441\u0442\u044f\u043c\u0438) \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\"> ComPtr&lt;ID2D1Device&gt; baseDevice; hr = g_d2dFactory-&gt;CreateDevice(dxgiDevice.Get(), baseDevice.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateDevice<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IDXGIDevice* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dxgiDevice \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 DXGI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 D3D-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: dxgiDevice.Get() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 Direct2D \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c GPU; \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e D2D-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u043d\u0430 \u044d\u0442\u043e\u043c GPU.<\/p>\n<p>\u0422\u0438\u043f: ID2D1Device** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: d2dDevice \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Direct2D \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: baseDevice.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 baseDevice \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 ID2D1Device; \u0434\u0430\u043b\u0435\u0435 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0434\u043e ID2D1Device1 \u0447\u0435\u0440\u0435\u0437 As(), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Direct2D &#8212; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0446\u0435\u043b\u044c, \u043a\u0438\u0441\u0442\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438) \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 GPU:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;ID2D1DeviceContext&gt; baseContext;hr = g_d2dDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, baseContext.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateDeviceContext<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: D2D1_DEVICE_CONTEXT_OPTIONS \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: options \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): NONE (0) \u0438\u043b\u0438 ENABLE_GDI_COMPATIBLE_RENDERING \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D2D1_DEVICE_CONTEXT_OPTIONS_NONE \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 GDI, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439.<\/p>\n<p>\u0422\u0438\u043f: ID2D1DeviceContext** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: deviceContext \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: baseContext.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f; \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u043e ID2D1DeviceContext1.<\/p>\n<\/div>\n<\/details>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f CreateRenderTarget:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 DXGI-\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (IDXGISurface). \u0418\u043d\u0434\u0435\u043a\u0441 0 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440\u0443, \u0433\u043e\u0442\u043e\u0432\u043e\u043c\u0443 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u0430\u0434\u0440\u0435:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IDXGISurface&gt; backBuffer;HRESULT hr = g_swapChain-&gt;GetBuffer(0, IID_PPV_ARGS(backBuffer.GetAddressOf()));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GetBuffer<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Buffer \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0418\u043d\u0434\u0435\u043a\u0441 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0442 0 \u0434\u043e BufferCount-1 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u0440\u0438 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 0 \u0432\u0441\u0435\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u043d\u0438\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0422\u0438\u043f: REFIID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: riid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): IID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: IID_IDXGISurface \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c DXGI-\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u0432 D2D-\u0431\u0438\u0442\u043c\u0430\u043f. \u0422\u0438\u043f: void** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppSurface \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: backBuffer.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c IDXGISurface \u0437\u0430\u0434\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u0438\u0442\u043c\u0430\u043f\u0430 Direct2D: \u0444\u043b\u0430\u0433\u0438 TARGET (\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0446\u0435\u043b\u044c) \u0438 CANNOT_DRAW (\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f). \u0424\u043b\u0430\u0433 CANNOT_DRAW \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c swap chain \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1(    D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,    D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 BitmapProperties1<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: D2D1_BITMAP_OPTIONS \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: bitmapOptions \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f TARGET, CANNOT_DRAW, CPU_READ \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: TARGET \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0446\u0435\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430; CANNOT_DRAW \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u2013 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437 SHADER_INPUT.<\/p>\n<p>\u0422\u0438\u043f: D2D1_PIXEL_FORMAT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pixelFormat \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 DXGI_FORMAT \u0438 D2D1_ALPHA_MODE \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0424\u043e\u0440\u043c\u0430\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441\u043e swap chain; IGNORE \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0430\u043b\u044c\u0444\u044b \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435.<\/p>\n<p>\u0422\u0438\u043f: FLOAT (\u043d\u0435\u044f\u0432\u043d\u043e) \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dpiX, dpiY \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 96.0f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0438\u0442\u043c\u0430\u043f\u0430 \u0432 \u0442\u043e\u0447\u043a\u0430\u0445 \u043d\u0430 \u0434\u044e\u0439\u043c; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0432.<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 DXGI-\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c (\u043d\u0430\u0448 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440) \u0432 \u0431\u0438\u0442\u043c\u0430\u043f Direct2D \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e, \u043a\u0443\u0434\u0430 Direct2D \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">hr = g_d2dContext-&gt;CreateBitmapFromDxgiSurface(backBuffer.Get(), props, g_targetBitmap.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateBitmapFromDxgiSurface <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IDXGISurface* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dxgiSurface \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 DXGI-\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: backBuffer.Get() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e Direct2D \u00ab\u043e\u0431\u0435\u0440\u043d\u0451\u0442\u00bb \u0432 \u0441\u0432\u043e\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0438\u043f: const D2D1_BITMAP_PROPERTIES1* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: bitmapProperties \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0438\u0442\u043c\u0430\u043f\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: &amp;props \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043e\u043f\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u0435\u043d \u0444\u043b\u0430\u0433 CANNOT_DRAW.<\/p>\n<p>\u0422\u0438\u043f: ID2D1Bitmap1** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: bitmap \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0431\u0438\u0442\u043c\u0430\u043f\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_targetBitmap.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0442\u043c\u0430\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0412\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f (\u043e\u0447\u0438\u0441\u0442\u043a\u0430, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432) \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u0431\u0438\u0442\u043c\u0430\u043f, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">g_d2dContext-&gt;SetTarget(g_targetBitmap.Get());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 SetTarget<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: ID2D1Image* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: image \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0435 D2D-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_targetBitmap.Get() (\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a ID2D1Image) \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0446\u0435\u043b\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f; \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<\/div>\n<\/details>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f LoadTextureFromFile:<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 Windows Imaging Component (WIC) &#8212; \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u044b:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IWICImagingFactory&gt; wicFactory;HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(wicFactory.GetAddressOf()));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CoCreateInstance<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: REFCLSID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: rclsid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): CLSID \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e COM-\u043a\u043b\u0430\u0441\u0441\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: CLSID_WICImagingFactory \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041a\u043b\u0430\u0441\u0441 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 Windows Imaging Component \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0422\u0438\u043f: LPUNKNOWN \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pUnkOuter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): nullptr \u0438\u043b\u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0438\u043f: DWORD \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dwClsContext \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): CLSCTX_INPROC_SERVER, LOCAL_SERVER \u0438 \u0434\u0440. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: CLSCTX_INPROC_SERVER \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u0430\u043a DLL \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0422\u0438\u043f: REFIID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: riid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): IID \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: IID_IWICImagingFactory \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 WIC.<\/p>\n<p>\u0422\u0438\u043f: LPVOID* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppv \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: wicFactory.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f wicFactory \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 WIC.<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0435\u043a\u043e\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. \u0414\u0435\u043a\u043e\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430 (PNG, JPEG, BMP \u0438 \u0442.\u0434.):  <\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IWICBitmapDecoder&gt; decoder;hr = wicFactory-&gt;CreateDecoderFromFilename(filename.c_str(), nullptr, GENERIC_READ, WICDecodeMetadataCacheOnLoad, decoder.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateDecoderFromFilename<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: LPCWSTR \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: wzFilename \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 Unicode \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: filename.c_str() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0424\u0430\u0439\u043b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0438\u043f: const GUID* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pguidVendor \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): GUID \u043a\u043e\u0434\u0435\u043a\u0430-\u0432\u0435\u043d\u0434\u043e\u0440\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u0434\u0435\u043a\u0430 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u0422\u0438\u043f: DWORD \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dwDesiredAccess \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): GENERIC_READ \u0438\u043b\u0438 GENERIC_WRITE \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: GENERIC_READ \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0438\u043f: WICDecodeOptions \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: metadataCacheOptions \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): CacheOnLoad, CacheOnDemand, NoCache \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: WICDecodeMetadataCacheOnLoad \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>\u0422\u0438\u043f: IWICBitmapDecoder** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppIDecoder \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: decoder.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u043e\u0432.  <\/p>\n<\/div>\n<\/details>\n<p>\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u0430\u0434\u0440 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u043d \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439; \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GIF) \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0430\u0434\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IWICBitmapFrameDecode&gt; frame;hr = decoder-&gt;GetFrame(0, frame.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GetFrame<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: nFrameIndex \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0418\u043d\u0434\u0435\u043a\u0441 \u043a\u0430\u0434\u0440\u0430 (0 \u2026 \u043a\u043e\u043b-\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 &#8212; 1) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u0435\u0440\u0432\u044b\u0439 (\u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439) \u043a\u0430\u0434\u0440 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0438\u043f: IWICBitmapFrameDecode** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppIFrameDecode \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: frame.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">ComPtr&lt;IWICFormatConverter&gt; converter;hr = wicFactory-&gt;CreateFormatConverter(converter.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>CreateFormatConverter<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IWICFormatConverter** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppConverter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: converter.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440: \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u0430\u0434\u0440, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 &#8212; \u0444\u043e\u0440\u043c\u0430\u0442 32bppPBGRA (8 \u0431\u0438\u0442 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b, premultiplied alpha, \u043f\u043e\u0440\u044f\u0434\u043e\u043a BGRA). \u0422\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Direct2D \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">hr = converter-&gt;Initialize(frame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 Initialize<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IWICBitmapSource* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pISource \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: frame.Get() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041a\u0430\u0434\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442.<\/p>\n<p>\u0422\u0438\u043f: REFWICPixelFormatGUID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dstFormat \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): GUID \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: GUID_WICPixelFormat32bppPBGRA \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: Premultiplied BGRA &#8212; \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f Direct2D, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0422\u0438\u043f: WICBitmapDitherType \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: dither \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): None, Ordered4x4, Ordered8x8 \u0438 \u0434\u0440. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: WICBitmapDitherTypeNone \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0414\u0438\u0437\u0435\u0440\u0438\u043d\u0433 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0422\u0438\u043f: IWICPalette* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pIPalette \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0430\u043b\u0438\u0442\u0440\u0443 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0430\u043b\u0438\u0442\u0440\u044b (true color).<\/p>\n<p>\u0422\u0438\u043f: double \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: alphaThresholdPercent \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): 0.0 \u2013 100.0 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 0.0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u0440\u043e\u0433 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0430\u043b\u0438\u0442\u0440\u043e\u0439; \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0438\u043f: WICBitmapPaletteType \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: paletteTranslate \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): Custom, MedianCut \u0438 \u0442.\u0434. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: WICBitmapPaletteTypeCustom \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0422\u0438\u043f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u044b; \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u0430\u043b\u0438\u0442\u0440\u044b.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0438\u0442\u043c\u0430\u043f Direct2D \u0438\u0437 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e WIC-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">hr = g_d2dContext-&gt;CreateBitmapFromWicBitmap(converter.Get(), nullptr, g_spriteTexture.GetAddressOf());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateBitmapFromWicBitmap<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: IWICBitmapSource* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: wicBitmapSource \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041b\u044e\u0431\u043e\u0439 WIC-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: converter.Get() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PBGRA.<\/p>\n<p>\u0422\u0438\u043f: const D2D1_BITMAP_PROPERTIES* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: bitmapProperties \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: nullptr \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0438 DPI \u0438\u0437 WIC-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.<\/p>\n<p>\u0422\u0438\u043f: ID2D1Bitmap** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: bitmap \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0431\u0438\u0442\u043c\u0430\u043f\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_spriteTexture.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0413\u043e\u0442\u043e\u0432\u044b\u0439 D2D-\u0431\u0438\u0442\u043c\u0430\u043f \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 (ID2D1SpriteBatch), \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CreateSpriteBatch<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f: ID2D1SpriteBatch** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: spriteBatch \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 SpriteBatch \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: g_spriteBatch.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443, \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0439\u0442\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void RenderFrame(){    if (!g_d2dContext || !g_targetBitmap) return;    g_d2dContext-&gt;BeginDraw();    g_d2dContext-&gt;Clear(D2D1::ColorF(0.1f, 0.1f, 0.15f));    if (g_spriteTexture &amp;&amp; g_spriteBatch)    {        g_spriteBatch-&gt;Clear();        const int count = 7;        D2D1_RECT_F   dstRects[7];        D2D1_RECT_U   srcRects[7];        D2D1_COLOR_F  colors[7];        D2D1_MATRIX_3X2_F transforms[7];        \/\/ 1. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442        dstRects[0] = { 100, 100, 300, 300 };        srcRects[0] = { 0, 0, 256, 256 };        colors[0] = D2D1::ColorF(1, 1, 1, 1);        transforms[0] = D2D1::Matrix3x2F::Identity();        \/\/ 2. Tint + \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c        dstRects[1] = { 400, 100, 600, 300 };        srcRects[1] = { 0, 0, 256, 256 };        colors[1] = D2D1::ColorF(1.0f, 0.5f, 0.5f, 0.8f);        transforms[1] = D2D1::Matrix3x2F::Identity();        \/\/ 3. \u041f\u043e\u0432\u043e\u0440\u043e\u0442        dstRects[2] = { 150, 400, 350, 600 };        srcRects[2] = { 0, 0, 256, 256 };        colors[2] = D2D1::ColorF(1, 1, 1, 1);        transforms[2] = D2D1::Matrix3x2F::Rotation(45, D2D1::Point2F(250, 500));        \/\/ 4. \u041c\u0430\u0441\u0448\u0442\u0430\u0431        dstRects[3] = { 450, 400, 650, 600 };        srcRects[3] = { 0, 0, 256, 256 };        colors[3] = D2D1::ColorF(1, 1, 1, 1);        transforms[3] = D2D1::Matrix3x2F::Scale(1.5f, 0.7f, D2D1::Point2F(550, 500));        \/\/ 5. \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (\u0430\u0442\u043b\u0430\u0441)        dstRects[4] = { 750, 100, 950, 300 };        srcRects[4] = { 100, 100, 200, 200 };        colors[4] = D2D1::ColorF(1, 1, 1, 1);        transforms[4] = D2D1::Matrix3x2F::Identity();        \/\/ 6. \u041d\u0430\u043a\u043b\u043e\u043d (shear) \u043f\u043e X \u043d\u0430 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432        dstRects[5] = { 20, 20, 220, 220 };        srcRects[5] = { 0, 0, 256, 256 };        colors[5] = D2D1::ColorF(1, 1, 1, 1);        transforms[5] = D2D1::Matrix3x2F::Skew(0.57735f, 0.0f, D2D1::Point2F(120, 120));        \/\/ 7. \u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438        dstRects[6] = { 400, 400, 600, 600 };        srcRects[6] = { 0, 0, 256, 256 };        colors[6] = D2D1::ColorF(1, 1, 1, 1);        transforms[6] = D2D1::Matrix3x2F::Scale(-1.0f, 1.0f, D2D1::Point2F(500, 500));        g_spriteBatch-&gt;AddSprites(count,            dstRects, srcRects, colors, transforms,            sizeof(D2D1_RECT_F),            sizeof(D2D1_RECT_U),            sizeof(D2D1_COLOR_F),            sizeof(D2D1_MATRIX_3X2_F));        g_d2dContext-&gt;SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);        g_d2dContext-&gt;DrawSpriteBatch(g_spriteBatch.Get(), g_spriteTexture.Get(),            D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, D2D1_SPRITE_OPTIONS_NONE);    }    HRESULT hr = g_d2dContext-&gt;EndDraw();    if (SUCCEEDED(hr))        g_swapChain-&gt;Present(0, 0);    else if (hr == D2DERR_RECREATE_TARGET)    {        g_targetBitmap.Reset();        CreateRenderTarget();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c (\u0432 \u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434):<\/p>\n<pre><code class=\"cpp\">g_d2dContext-&gt;BeginDraw()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u043d\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">g_d2dContext-&gt;Clear(D2D1::ColorF(0.1f, 0.1f, 0.15f));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">g_spriteBatch-&gt;Clear();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"cpp\">dstRects[0] = { 100, 100, 300, 300 };srcRects[0] = { 0, 0, 256, 256 };colors[0] = D2D1::ColorF(1, 1, 1, 1);transforms[0] = D2D1::Matrix3x2F::Identity();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>dstRects &#8212; \u0421\u043f\u0440\u0430\u0439\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 (100, 100) \u0434\u043e \u0442\u043e\u0447\u043a\u0438 (300, 300). \u0428\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e 200 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442\u0430 \u0438\u043b\u0438 \u0441\u0436\u0430\u0442\u0430 \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 200\u00d7200 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>srcRects &#8212; \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u0442 (0,0) \u0434\u043e (256,256) &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>colors &#8212; \u0426\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u043e\u0442\u0442\u0435\u043d\u043e\u043a (tint) \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043a \u0441\u043f\u0440\u0430\u0439\u0442\u0443<\/p>\n<p>transforms &#8212; \u041c\u0430\u0442\u0440\u0438\u0446\u0430 3\u00d72, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u043d\u0430\u043a\u043b\u043e\u043d). \u0415\u0434\u0438\u043d\u0438\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (Identity) \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<pre><code class=\"cpp\">D2D1::Matrix3x2F::Rotation(45, D2D1::Point2F(250, 500));\u0438\u043b\u0438D2D1::Matrix3x2F::Scale(1.5f, 0.7f, D2D1::Point2F(550, 500));\u0438\u043b\u0438D2D1::Matrix3x2F::Skew(0.57735f, 0.0f, D2D1::Point2F(120, 120));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Rotation &#8212; \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 45\u00b0 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e (250, 500).<\/p>\n<p>Scale &#8212; \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430: \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 1.5 \u0440\u0430\u0437\u0430, \u0432\u044b\u0441\u043e\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0432 0.7 \u0440\u0430\u0437\u0430.<\/p>\n<p>Skew &#8212; \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043d\u0430\u043a\u043b\u043e\u043d\u0430 (shear). \u0421\u043f\u0440\u0430\u0439\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u0448\u0435\u043d \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438: \u0432\u0435\u0440\u0445 \u0441\u0434\u0432\u0438\u043d\u0435\u0442\u0441\u044f \u0432\u043f\u0440\u0430\u0432\u043e, \u043d\u0438\u0437 \u0432\u043b\u0435\u0432\u043e (\u043f\u0440\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c skewX), \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044f \u043d\u0430\u043a\u043b\u043e\u043d \u043f\u043e\u0434 30\u00b0. \u0422\u043e\u0447\u043a\u0430 (120, 120) \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0440\u0430\u0439\u0442 \u043d\u0435 \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">g_spriteBatch-&gt;AddSprites(count,    dstRects, srcRects, colors, transforms,    sizeof(D2D1_RECT_F),    sizeof(D2D1_RECT_U),    sizeof(D2D1_COLOR_F),    sizeof(D2D1_MATRIX_3X2_F));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0432 \u043f\u0430\u043a\u0435\u0442. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0442\u0432\u0451\u0440\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u2011\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u0441 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0430\u0444\u0444\u0438\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u0430\u0442\u0447\u0430; \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0437\u0436\u0435, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 DrawSpriteBatch. \u0412\u0441\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e spriteCount \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0448\u0430\u0433\u0438 (strides) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u0430\u043a \u043f\u043b\u043e\u0442\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0445 \u0441 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043c\u0438<\/p>\n<pre><code class=\"cpp\">g_d2dContext-&gt;SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043b\u0438 \u043a\u0440\u0430\u044f \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0420\u0435\u0436\u0438\u043c ALIASED \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0434\u0435\u043b\u0430\u044f \u043a\u0440\u0430\u044f \u0447\u0451\u0442\u043a\u0438\u043c\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043d\u0430 \u0441\u0442\u044b\u043a\u0430\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0442\u043b\u0430\u0441\u0435.<\/p>\n<pre><code class=\"cpp\">g_d2dContext-&gt;DrawSpriteBatch(g_spriteBatch.Get(), g_spriteTexture.Get(),    D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, D2D1_SPRITE_OPTIONS_NONE);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432,  \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212; \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u0442\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. spriteOptions  &#8212; \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e ( \u0438 \u0435\u0449\u0451 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b + \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u043e\u043a\u043e\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e):<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;windows.h&gt;#include &lt;d2d1_3.h&gt;#include &lt;d3d11.h&gt;#include &lt;dxgi1_2.h&gt;#include &lt;wincodec.h&gt;#include &lt;wrl\/client.h&gt;#include &lt;string&gt;#pragma comment(lib, \"d2d1\")#pragma comment(lib, \"d3d11\")#pragma comment(lib, \"dxgi\")#pragma comment(lib, \"windowscodecs\")using Microsoft::WRL::ComPtr;ComPtr&lt;ID2D1Factory3&gt; g_d2dFactory;ComPtr&lt;ID2D1Device3&gt; g_d2dDevice;ComPtr&lt;ID2D1DeviceContext3&gt; g_d2dContext;ComPtr&lt;IDXGISwapChain1&gt; g_swapChain;ComPtr&lt;ID2D1Bitmap1&gt; g_targetBitmap;ComPtr&lt;ID2D1Bitmap1&gt; g_spriteTexture;ComPtr&lt;ID2D1SpriteBatch&gt; g_spriteBatch;HWND g_hwnd = nullptr;HRESULT InitDirect2D(HWND hWnd);void CleanupDirect2D();HRESULT CreateRenderTarget();HRESULT LoadTextureFromFile(const std::wstring&amp; filename);void RenderFrame();LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);\/\/ ------------------------------------------------------------------int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int nCmdShow){    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);    const wchar_t CLASSNAME[] = L\"D2DSpriteWindow\";    WNDCLASSW wc = {};    wc.lpfnWndProc = WndProc;    wc.hInstance = hInstance;    wc.lpszClassName = CLASSNAME;    RegisterClassW(&amp;wc);    g_hwnd = CreateWindowExW(0, CLASSNAME, L\"Direct2D Sprite Demo\",        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,        1920, 1080, nullptr, nullptr, hInstance, nullptr);    ShowWindow(g_hwnd, nCmdShow);    UpdateWindow(g_hwnd);    MSG msg = {};    while (true)    {        if (PeekMessage(&amp;msg, nullptr, 0, 0, PM_REMOVE))        {            if (msg.message == WM_QUIT) break;            TranslateMessage(&amp;msg);            DispatchMessage(&amp;msg);        }        else        {            RenderFrame();        }    }    CoUninitialize();    return 0;}\/\/ ------------------------------------------------------------------LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    switch (msg)    {    case WM_CREATE:        if (FAILED(InitDirect2D(hwnd))) {            PostQuitMessage(1);            return -1;        }        return 0;    case WM_DESTROY:        CleanupDirect2D();        PostQuitMessage(0);        return 0;    case WM_SIZE:        if (g_swapChain &amp;&amp; wParam != SIZE_MINIMIZED)        {            g_d2dContext-&gt;SetTarget(nullptr);            g_targetBitmap.Reset();            g_d2dContext-&gt;Flush();            RECT rc;            GetClientRect(hwnd, &amp;rc);            UINT width = rc.right - rc.left;            UINT height = rc.bottom - rc.top;            if (width == 0 || height == 0) return 0;            HRESULT hr = g_swapChain-&gt;ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, 0);            if (SUCCEEDED(hr))            {                CreateRenderTarget();            }            else            {                OutputDebugString(L\"ResizeBuffers failed, recreating Direct2D\\n\");                CleanupDirect2D();                InitDirect2D(g_hwnd);            }        }        return 0;    }    return DefWindowProc(hwnd, msg, wParam, lParam);}\/\/ ------------------------------------------------------------------HRESULT InitDirect2D(HWND hWnd){    HRESULT hr;    ComPtr&lt;ID3D11Device&gt; d3dDevice;    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,        D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT,        nullptr, 0, D3D11_SDK_VERSION, d3dDevice.GetAddressOf(), nullptr, nullptr);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIDevice&gt; dxgiDevice;    hr = d3dDevice.As(&amp;dxgiDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIAdapter&gt; adapter;    hr = dxgiDevice-&gt;GetAdapter(adapter.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIFactory2&gt; dxgiFactory;    hr = adapter-&gt;GetParent(IID_PPV_ARGS(dxgiFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    RECT rc;    GetClientRect(hWnd, &amp;rc);    UINT width = rc.right - rc.left;    UINT height = rc.bottom - rc.top;    if (width == 0) width = 800;    if (height == 0) height = 600;    DXGI_SWAP_CHAIN_DESC1 swapDesc = {};    swapDesc.Width = width;    swapDesc.Height = height;    swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;    swapDesc.SampleDesc.Count = 1;    swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    swapDesc.BufferCount = 2;    swapDesc.Scaling = DXGI_SCALING_NONE;    swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;    swapDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;    hr = dxgiFactory-&gt;CreateSwapChainForHwnd(d3dDevice.Get(), hWnd, &amp;swapDesc, nullptr, nullptr, g_swapChain.GetAddressOf());    if (FAILED(hr)) return hr;    D2D1_FACTORY_OPTIONS options = {};#ifdef _DEBUG    options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;#endif    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, options, g_d2dFactory.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1Device&gt; baseDevice;    hr = g_d2dFactory-&gt;CreateDevice(dxgiDevice.Get(), baseDevice.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseDevice.As(&amp;g_d2dDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1DeviceContext&gt; baseContext;    hr = g_d2dDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, baseContext.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseContext.As(&amp;g_d2dContext);    if (FAILED(hr)) return hr;    hr = CreateRenderTarget();    if (FAILED(hr)) return hr;    hr = LoadTextureFromFile(L\"image.png\");    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateSpriteBatch(g_spriteBatch.GetAddressOf());    return hr;}HRESULT CreateRenderTarget(){    ComPtr&lt;IDXGISurface&gt; backBuffer;    HRESULT hr = g_swapChain-&gt;GetBuffer(0, IID_PPV_ARGS(backBuffer.GetAddressOf()));    if (FAILED(hr)) return hr;    D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1(        D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)    );    hr = g_d2dContext-&gt;CreateBitmapFromDxgiSurface(backBuffer.Get(), props, g_targetBitmap.GetAddressOf());    if (SUCCEEDED(hr))        g_d2dContext-&gt;SetTarget(g_targetBitmap.Get());    return hr;}HRESULT LoadTextureFromFile(const std::wstring&amp; filename){    ComPtr&lt;IWICImagingFactory&gt; wicFactory;    HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(wicFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapDecoder&gt; decoder;    hr = wicFactory-&gt;CreateDecoderFromFilename(filename.c_str(), nullptr, GENERIC_READ, WICDecodeMetadataCacheOnLoad, decoder.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapFrameDecode&gt; frame;    hr = decoder-&gt;GetFrame(0, frame.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICFormatConverter&gt; converter;    hr = wicFactory-&gt;CreateFormatConverter(converter.GetAddressOf());    if (FAILED(hr)) return hr;    hr = converter-&gt;Initialize(frame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateBitmapFromWicBitmap(converter.Get(), nullptr, g_spriteTexture.GetAddressOf());    return hr;}void RenderFrame(){    if (!g_d2dContext || !g_targetBitmap) return;    g_d2dContext-&gt;BeginDraw();    g_d2dContext-&gt;Clear(D2D1::ColorF(0.1f, 0.1f, 0.15f));    if (g_spriteTexture &amp;&amp; g_spriteBatch)    {        g_spriteBatch-&gt;Clear();        const int count = 7;        D2D1_RECT_F   dstRects[7];        D2D1_RECT_U   srcRects[7];        D2D1_COLOR_F  colors[7];        D2D1_MATRIX_3X2_F transforms[7];        \/\/ 1. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442        dstRects[0] = { 100, 100, 300, 300 };        srcRects[0] = { 0, 0, 256, 256 };        colors[0] = D2D1::ColorF(1, 1, 1, 1);        transforms[0] = D2D1::Matrix3x2F::Identity();        \/\/ 2. Tint + \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c        dstRects[1] = { 400, 100, 600, 300 };        srcRects[1] = { 0, 0, 256, 256 };        colors[1] = D2D1::ColorF(1.0f, 0.5f, 0.5f, 0.8f);        transforms[1] = D2D1::Matrix3x2F::Identity();        \/\/ 3. \u041f\u043e\u0432\u043e\u0440\u043e\u0442        dstRects[2] = { 150, 400, 350, 600 };        srcRects[2] = { 0, 0, 256, 256 };        colors[2] = D2D1::ColorF(1, 1, 1, 1);        transforms[2] = D2D1::Matrix3x2F::Rotation(45, D2D1::Point2F(250, 500));        \/\/ 4. \u041c\u0430\u0441\u0448\u0442\u0430\u0431        dstRects[3] = { 450, 400, 650, 600 };        srcRects[3] = { 0, 0, 256, 256 };        colors[3] = D2D1::ColorF(1, 1, 1, 1);        transforms[3] = D2D1::Matrix3x2F::Scale(1.5f, 0.7f, D2D1::Point2F(550, 500));        \/\/ 5. \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (\u0430\u0442\u043b\u0430\u0441)        dstRects[4] = { 750, 100, 950, 300 };        srcRects[4] = { 100, 100, 200, 200 };        colors[4] = D2D1::ColorF(1, 1, 1, 1);        transforms[4] = D2D1::Matrix3x2F::Identity();        \/\/ 6. \u041d\u0430\u043a\u043b\u043e\u043d (shear) \u043f\u043e X \u043d\u0430 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432        dstRects[5] = { 20, 20, 220, 220 };        srcRects[5] = { 0, 0, 256, 256 };        colors[5] = D2D1::ColorF(1, 1, 1, 1);        transforms[5] = D2D1::Matrix3x2F::Skew(0.57735f, 0.0f, D2D1::Point2F(120, 120));        \/\/ 7. \u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438        dstRects[6] = { 400, 400, 600, 600 };        srcRects[6] = { 0, 0, 256, 256 };        colors[6] = D2D1::ColorF(1, 1, 1, 1);        transforms[6] = D2D1::Matrix3x2F::Scale(-1.0f, 1.0f, D2D1::Point2F(500, 500));        g_spriteBatch-&gt;AddSprites(count,            dstRects, srcRects, colors, transforms,            sizeof(D2D1_RECT_F),            sizeof(D2D1_RECT_U),            sizeof(D2D1_COLOR_F),            sizeof(D2D1_MATRIX_3X2_F));        g_d2dContext-&gt;SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);        g_d2dContext-&gt;DrawSpriteBatch(g_spriteBatch.Get(), g_spriteTexture.Get(),            D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, D2D1_SPRITE_OPTIONS_NONE);    }    HRESULT hr = g_d2dContext-&gt;EndDraw();    if (SUCCEEDED(hr))        g_swapChain-&gt;Present(0, 0);    else if (hr == D2DERR_RECREATE_TARGET)    {        g_targetBitmap.Reset();        CreateRenderTarget();    }}void CleanupDirect2D(){    g_spriteBatch.Reset();    g_spriteTexture.Reset();    g_targetBitmap.Reset();    g_d2dContext.Reset();    g_d2dDevice.Reset();    g_swapChain.Reset();    g_d2dFactory.Reset();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>Image.png 200 \u043d\u0430 200 , \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043a\u0438\u0440\u043f\u0438\u0447\u043d\u0430\u044f \ud83d\ude00<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9fb\/3fc\/998\/9fb3fc998562588557e679880ad92ee3.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0434\u0430\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0434\u0430\" width=\"1919\" height=\"1042\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9fb\/3fc\/998\/9fb3fc998562588557e679880ad92ee3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9fb\/3fc\/998\/9fb3fc998562588557e679880ad92ee3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0441\u043b\u043e\u0438 &#8212; \u0441 \u043d\u0438\u043c\u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c, \u0430 \u043d\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438\u00a0&#8212; \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437\u00a0<a href=\"https:\/\/yoomoney.ru\/fundraise\/1FC5LM5GP86.260118\" rel=\"noopener noreferrer nofollow\">\u0441\u0431\u043e\u0440 \u0432 \u042e\u041c\u0430\u043d\u0438<\/a>.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1033582\/\">https:\/\/habr.com\/ru\/articles\/1033582\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u042d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u21169.\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: Direct2D \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 Direct3D. \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 HWNDRenderTarget, \u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Windows 8 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0451\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u043b HWNDRenderTarget &#8212; \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e.\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043e \u0434\u0432\u0443\u0445 \u0431\u0443\u0444\u0435\u0440\u0430\u0445: \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434.\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u043a\u0438\u0441\u0442\u044c\u044e, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.\u041a\u043e\u043c\u0430\u043d\u0434\u0430 &#8212; \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, \u0431\u0438\u0442\u043c\u0430\u043f \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.\u041e\u0431\u0430 \u044d\u0442\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 DeviceContext (\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430). \u0410 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043a\u0438\u0441\u0442\u0435\u0439, \u0431\u0438\u0442\u043c\u0430\u043f\u043e\u0432), \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u0436\u0438\u0437\u043d\u044c\u044e \u0438 \u0432\u0441\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 Device (\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e). \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 &#8212; SwapChain (\u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430). \u0423 \u043d\u0435\u0433\u043e \u0434\u0432\u0430 \u0431\u0443\u0444\u0435\u0440\u0430: \u0437\u0430\u0434\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439. \u041f\u043e\u043a\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0437\u0430\u0434\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u044f\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043c\u0435\u043d, \u0431\u0443\u0444\u0435\u0440\u044b \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438: \u0437\u0430\u0434\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043c \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0430 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430.\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u043b\u0438\u0448\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u0440\u0451\u0445. \u0421\u0442\u0430\u0440\u044b\u0439 HWNDRenderTarget \u0441\u043a\u0440\u044b\u0432\u0430\u043b \u0438\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u0438 &#8212; \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0430\u0434\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u043c\u0438.\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430\u0445. \u0421\u043f\u0440\u0430\u0439\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 (sprite batch). \u041f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043f\u0440\u0430\u0439\u0442 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0432\u0437\u044f\u0442\u044c \u0438 \u043a\u0430\u043a \u0435\u0451 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0443\u044e \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.\u041a\u043e\u0434HRESULT InitDirect2D(HWND hWnd){    HRESULT hr;    ComPtr&lt;ID3D11Device&gt; d3dDevice;    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,        D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT,        nullptr, 0, D3D11_SDK_VERSION, d3dDevice.GetAddressOf(), nullptr, nullptr);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIDevice&gt; dxgiDevice;    hr = d3dDevice.As(&amp;dxgiDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIAdapter&gt; adapter;    hr = dxgiDevice-&gt;GetAdapter(adapter.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IDXGIFactory2&gt; dxgiFactory;    hr = adapter-&gt;GetParent(IID_PPV_ARGS(dxgiFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    RECT rc;    GetClientRect(hWnd, &amp;rc);    UINT width = rc.right &#8212; rc.left;    UINT height = rc.bottom &#8212; rc.top;    if (width == 0) width = 800;    if (height == 0) height = 600;    DXGI_SWAP_CHAIN_DESC1 swapDesc = {};    swapDesc.Width = width;    swapDesc.Height = height;    swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;    swapDesc.SampleDesc.Count = 1;    swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    swapDesc.BufferCount = 2;    swapDesc.Scaling = DXGI_SCALING_NONE;    swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;    swapDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;    hr = dxgiFactory-&gt;CreateSwapChainForHwnd(d3dDevice.Get(), hWnd, &amp;swapDesc, nullptr, nullptr, g_swapChain.GetAddressOf());    if (FAILED(hr)) return hr;    D2D1_FACTORY_OPTIONS options = {};#ifdef _DEBUG    options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;#endif    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, options, g_d2dFactory.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1Device&gt; baseDevice;    hr = g_d2dFactory-&gt;CreateDevice(dxgiDevice.Get(), baseDevice.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseDevice.As(&amp;g_d2dDevice);    if (FAILED(hr)) return hr;    ComPtr&lt;ID2D1DeviceContext&gt; baseContext;    hr = g_d2dDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, baseContext.GetAddressOf());    if (FAILED(hr)) return hr;    hr = baseContext.As(&amp;g_d2dContext);    if (FAILED(hr)) return hr;    hr = CreateRenderTarget();    if (FAILED(hr)) return hr;    hr = LoadTextureFromFile(L&#187;image.png&#187;);    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateSpriteBatch(g_spriteBatch.GetAddressOf());    return hr;}HRESULT CreateRenderTarget(){    ComPtr&lt;IDXGISurface&gt; backBuffer;    HRESULT hr = g_swapChain-&gt;GetBuffer(0, IID_PPV_ARGS(backBuffer.GetAddressOf()));    if (FAILED(hr)) return hr;    D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1(        D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)    );    hr = g_d2dContext-&gt;CreateBitmapFromDxgiSurface(backBuffer.Get(), props, g_targetBitmap.GetAddressOf());    if (SUCCEEDED(hr))        g_d2dContext-&gt;SetTarget(g_targetBitmap.Get());    return hr;}HRESULT LoadTextureFromFile(const std::wstring&amp; filename){    ComPtr&lt;IWICImagingFactory&gt; wicFactory;    HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(wicFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapDecoder&gt; decoder;    hr = wicFactory-&gt;CreateDecoderFromFilename(filename.c_str(), nullptr, GENERIC_READ, WICDecodeMetadataCacheOnLoad, decoder.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICBitmapFrameDecode&gt; frame;    hr = decoder-&gt;GetFrame(0, frame.GetAddressOf());    if (FAILED(hr)) return hr;    ComPtr&lt;IWICFormatConverter&gt; converter;    hr = wicFactory-&gt;CreateFormatConverter(converter.GetAddressOf());    if (FAILED(hr)) return hr;    hr = converter-&gt;Initialize(frame.Get(), GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);    if (FAILED(hr)) return hr;    hr = g_d2dContext-&gt;CreateBitmapFromWicBitmap(converter.Get(), nullptr, g_spriteTexture.GetAddressOf());    return hr;}\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u0448\u0430\u0433\u0430\u043c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f Device, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a Direct3D. \u0424\u0443\u043d\u043a\u0446\u0438\u044f D3D11CreateDevice:ComPtr&lt;ID3D11Device&gt; d3dDevice;hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,    D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT,    nullptr, 0, D3D11_SDK_VERSION, d3dDevice.GetAddressOf(), nullptr, nullptr);\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 D3D11CreateDevice\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\u0422\u0438\u043f: IDXGIAdapter* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pAdapter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041b\u044e\u0431\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0435\u0440(\u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430), \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 EnumAdapters, \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: nullptr \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 GPU).\u0422\u0438\u043f: D3D_DRIVER_TYPE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: DriverType \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, D3D_DRIVER_TYPE_SOFTWARE \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D_DRIVER_TYPE_HARDWARE \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, D3D_DRIVER_TYPE_REFERENCE &#8212; \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0443\u0441\u044b.\u0422\u0438\u043f: HMODULE \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Software \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 DLL \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 NULL \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u0440\u0438 DriverType = HARDWARE \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Flags \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u0432 D3D11_CREATE_DEVICE_FLAG (\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: SINGLETHREADED \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443; BGRA_SUPPORT \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f Direct2D, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c B8G8R8A8.\u0422\u0438\u043f: const D3D_FEATURE_LEVEL* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFeatureLevels \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041c\u0430\u0441\u0441\u0438\u0432 D3D_FEATURE_LEVEL \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: nullptr \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Direct 3D 11.\u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: FeatureLevels \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 pFeatureLevels, \u0438\u043d\u0430\u0447\u0435 0 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 0 \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 pFeatureLevels = nullptr. \u0422\u0438\u043f: UINT \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: SDKVersion \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 D3D11_SDK_VERSION \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: D3D11_SDK_VERSION \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.\u0422\u0438\u043f: ID3D11Device** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppDevice \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: d3dDevice.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0421\u044e\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Direct3D 11.\u0422\u0438\u043f: D3D_FEATURE_LEVEL* \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pFeatureLevel \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c Direct3D 11 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u043f\u043e \u0438\u0442\u043e\u0433\u0443.\u0422\u0438\u043f: ID3D11DeviceContext** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppImmediateContext \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 nullptr \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: nullptr \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Immediate Context D3D11, \u0432\u0435\u0441\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Direct2D.\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c DXGI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 GPU, \u0447\u0442\u043e \u0438 d3dDevice. IDXGIDevice &#8212; \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 D3D \u0438 DXGI, IDXGIAdapter &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, IDXGIFactory2 &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0441\u0442 SwapChain, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 \u043d\u0430\u0448\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c:ComPtr&lt;IDXGIDevice&gt; dxgiDevice;hr = d3dDevice.As(&amp;dxgiDevice);\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 As\u0422\u0438\u043f: REFIID \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: riid \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (IID) \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: IID_IDXGIDevice \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 DXGI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0443 \u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0435.\u0422\u0438\u043f: void** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: ppvObject \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: dxgiDevice.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 dxgiDevice \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 IDXGIDevice.\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 &#8212; \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b DXGI \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0442\u0435\u043c \u0436\u0435 GPU, \u0447\u0442\u043e \u0438 \u043d\u0430\u0448\u0435 D3D-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e:ComPtr&lt;IDXGIAdapter&gt; adapter;hr = dxgiDevice-&gt;GetAdapter(adapter.GetAddressOf());\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GetAdapter\u0422\u0438\u043f: IDXGIAdapter** \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: pAdapter \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d): \u0410\u0434\u0440\u0435\u0441, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: adapter.GetAddressOf() \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435: \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0430\u043f\u0442\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 GPU.\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-479246","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=479246"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479246\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=479246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=479246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=479246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}