{"id":491650,"date":"2026-08-20T19:52:23","date_gmt":"2026-08-20T19:52:23","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=491650"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=491650","title":{"rendered":"Direct 2D #15.1 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440. \u044f\u0437\u044b\u043a HLSL. \u041f\u0440\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0448\u0435\u0439\u0434\u0435\u0440, \u0442\u043e\u0447\u043d\u0435\u0435 \u2014 \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0435\u043d\u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u0434\u0430 \u0438 \u044f \u0441\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0443\u043c\u0430\u043b, \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0443 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0435\u0449\u0451 \u0438 \u043d\u0430 GitHub. \u041f\u043e\u0437\u0436\u0435 \u2014 \u0438 \u043a\u043e\u0434 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0438\u0445 \u0432\u0441\u0435 \u0438, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0443\u043c\u0431\u0443\u0440\u043d\u0430\u044f, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0431\u0435\u0437 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u043d\u0443 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u043d\u0430 C++, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>\u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 CONSOLE: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0430\u043a\u043e\u0433\u043e .exe-\u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u0422\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f main.<\/p>\n<p>\u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 WINDOWS: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c (GUI). \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f. \u0422\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f WinMain \u0438\u043b\u0438 wWinMain.<\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u2014 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043d\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0447\u0451\u0442 \u0444\u0438\u0437\u0438\u043a\u0438 \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044f\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b).<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">  m_d2dContext-&gt;BeginDraw();  m_d2dContext-&gt;Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));  m_d2dContext-&gt;EndDraw();<\/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<p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0440\u0451\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u0445:<\/p>\n<p>\u042d\u0442\u0430\u043f UMD (User-Mode Driver)<\/p>\n<p>\u042d\u0442\u0430\u043f KMD (Kernel-Mode Driver)<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU \u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f &#8212; \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>BeginDraw() \u2013 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 GPU. \u041e\u043d \u043b\u0438\u0448\u044c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 Direct2D, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434. \u0412\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 UMD \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 (Command Buffer). \u042d\u0442\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u0443\u0434\u0430 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0447\u0435\u0440\u0435\u0437 UMD) \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0424\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u0435\u043d \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>m_d2dContext-&gt;Clear(\u2026) \u2013 UMD \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f GPU \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>m_d2dContext-&gt;EndDraw() \u2013 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434 \u0433\u043e\u0442\u043e\u0432. UMD \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u044f\u0434\u0440\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f &#8212; \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u043b\u044f GPU.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u044f\u0434\u0440\u0430. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0430\u043c KMD.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430: DirectX Graphics Kernel Subsystem (Dxgkrnl) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0442 UMD.<\/p>\n<p>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f: KMD (kernel-mode display miniport driver) \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c. \u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u2013 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430. KMD \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u2013 DMA-\u0431\u0443\u0444\u0435\u0440 (Direct Memory Access buffer).<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f (Allocation List): \u043f\u043e\u043f\u0443\u0442\u043d\u043e KMD \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u0435\u043a\u0441\u0442\u0443\u0440), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445. \u0412 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c (render target), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e: \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e DMA-\u0431\u0443\u0444\u0435\u0440 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d (not patched). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043f\u043e\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043d\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432: \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e KMD DxgkDdiBuildPagingBuffer \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 DMA-\u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u2013 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (paging buffers). \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0430\u043c\u0443 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c) \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e GPU (\u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c), \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0442\u0430\u043c \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u0442\u0430\u043f &#8212; \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU \u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU. \u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u044d\u0442\u0430\u043f\u044b:<\/p>\n<p>Input Assembler (IA) \u2013 GPU \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b (\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043b\u0438\u043d\u0438\u0438).<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440: Vertex Shader \u2013 \u044d\u0442\u043e \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0433\u043e \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.<\/p>\n<p>Hull Shader, Tessellator, Domain Shader (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0442\u0435\u0441\u0441\u0435\u043b\u044f\u0446\u0438\u044f) \u2013 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b Direct2D \u0442\u0435\u0441\u0441\u0435\u043b\u044f\u0446\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0432 Direct3D, \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>Geometry Shader (\u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0435\u0439\u0434\u0435\u0440) \u2013 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b.<\/p>\n<p>\u0420\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440 (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438) \u2013 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 (\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439) \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.<\/p>\n<p>Pixel Shader (\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440) \u2013 \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439.<\/p>\n<p>Output Merger (OM) \u2013 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 (\u0431\u043b\u0435\u043d\u0434\u0438\u043d\u0433) \u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438). \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u0430 (back buffer).<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0442\u0435\u043d\u044c\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435\u043c\u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c\u0438, \u043d\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b. \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0449\u044c GPU \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2013 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0447\u0438\u0441\u0435\u043b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u2013 \u0438 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0432\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.<\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 HLSL. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c:<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f HLSL, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438\u0437 Microsoft \u0438 NVIDIA \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0441 \u043d\u0443\u043b\u044f. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u044f\u0437\u044b\u043a C, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0431\u044b\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 NVIDIA \u043e\u043d\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u044f\u0437\u044b\u043a Cg (C for Graphics), \u0447\u0435\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0431\u044b\u043b\u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u044b HLSL.<\/p>\n<p>\u041b\u044e\u0431\u0430\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e - \u0444\u0443\u043d\u043a\u0446\u0438\u044f main[numthreads(8, 8, 1)]void main(uint3 id : SV_DispatchThreadID){    \/\/ ... \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 ...}<\/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>\u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u044b, uint3 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 uint.<\/p>\n<p>\u0430 \u043a\u0430\u043a \u0436\u0435 \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 [numthreads(8, 8, 1)] \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 (attribute) \u0432 \u044f\u0437\u044b\u043a\u0435 HLSL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430. \u041e\u043d \u0437\u0430\u0434\u0430\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8 \u00d7 8 \u00d7 1 = 64 \u043f\u043e\u0442\u043e\u043a\u0430. \u041e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 (CU\/SM) GPU.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a(\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0447\u0451\u0442 \u0441 \u043d\u0443\u043b\u044f), \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0418 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 SV_DispatchThreadID  ,  \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a (0,0,0), \u0442\u043e \u0438 \u0438\u0434 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 uint3.<\/p>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 (8,8,1) &#8212;  \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a GPU \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u0438. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Warp (\u0443 NVIDIA, \u043f\u043e 32 \u043f\u043e\u0442\u043e\u043a\u0430) \u0438\u043b\u0438 Wavefront (\u0443 AMD\/Intel, \u043f\u043e 64 \u043f\u043e\u0442\u043e\u043a\u0430).<\/p>\n<p>\u0410 8*8<em>*<\/em>1=64, \u0442\u043e \u0435\u0441\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c, \u043d\u0443 \u0438\u043d\u0430\u0447\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u043d\u0430 \u0431\u043b\u043e\u043a \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 , \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439  \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0442\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 32 \u0431\u0438\u0442\u0430, 1 \u0440\u0435\u0433\u0438\u0441\u0442\u0440. \u0415\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u0442\u0430\u043a \u0436\u0435 1, \u0438\u043b\u0438 2 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 \u0432 \u043e\u0434\u0438\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0437\u043d\u0430\u0451\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0439\u043c\u0443\u0442. \u041d\u043e \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430, \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0432 \u043a \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435, \u043f\u043e\u0439\u043c\u0451\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c. \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 5.0 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u04351024 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<ol>\n<li>\n<p>uint3 SV_GroupID &#8212; <em>\u043d\u043e\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b<\/em><\/p>\n<\/li>\n<li>\n<p>uint3 SV_GroupThreadID &#8212; \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b<\/p>\n<\/li>\n<li>\n<p>uint3 SV_DispatchThreadID &#8212; ID \u043f\u043e\u0442\u043e\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>uint SV_GroupIndex &#8212; \u043f\u043b\u043e\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ID \u043f\u043e\u0442\u043e\u043a\u0430 (7,7,0) \u0431\u0443\u0434\u0435\u0442 63, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0451\u0442 \u043f\u043e\u0442\u043e\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u0438 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446. \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:<\/p>\n<p>t# (\u0432 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445, # \u044d\u0442\u043e id, \u0441\u0447\u0451\u0442 \u0441 \u043d\u0443\u043b\u044f) &#8212; \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0431\u0443\u0444\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 5.0 \u043b\u0438\u043c\u0438\u0442 128 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>s# &#8212; \u0441\u044d\u043c\u043f\u043b\u0435\u0440 &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b , \u043b\u0438\u043c\u0438\u0442 16 \u0448\u0442\u0443\u043a \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 5.0<\/p>\n<p>u# &#8212; \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435\/\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b (UAV), \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 8 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<p>b# &#8212; \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b(\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0434\u043a\u043e \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f), \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u044d\u0442\u043e 4096 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 float4. \u0412\u0441\u0435\u0433\u043e \u0442\u0430\u043a\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c 15 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 r# &#8212; \u043d\u043e \u043d\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0448\u0435\u0439\u0434\u0435\u0440\u0430(\u0434\u0430 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0438 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f), \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0445 \u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0430\u043c \u0432\u0430\u043c <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/direct3dhlsl\/dx-graphics-hlsl-data-types\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0443<\/a> , \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"cpp\">Texture2D&lt;float4&gt; InputTexture : register(t0);RWTexture2D&lt;float4&gt; OutputTexture : register(u0);cbuffer constantBuffer : register(b0){    float magnitudeScale;}[numthreads(16,16,1)]void main(uint3 id : SV_DispatchThreadID){  uint width, height;  InputTexture.GetDimensions(width, height);  if (id.x &gt;= width || id.y &gt;= height) return; \/\/ \u041b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f    float4 colorRGBA = InputTexture[id.xy];colorRGBA *= magnitudeScale;    OutputTexture[id.xy] = colorRGBA;}<\/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>\u0412\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 RGBA 50 \u043d\u0430 50 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0412\u044b\u0431\u0440\u0430\u043b \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443 \u043d\u0430\u0441 256. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0442\u043e:<\/p>\n<p>Texture2D \u2013 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u2013 4-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 float4. : register(t0) \u2013 \u044d\u0442\u043e, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.<\/p>\n<p>RWTexture2D \u2013 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c. \u0422\u0443\u0442 \u043c\u044b \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043a \u0441\u043b\u043e\u0442\u0443 0 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0442\u0438\u043f\u0430 u#.<\/p>\n<p>cbuffer constantBuffer \u2013 \u0431\u043b\u043e\u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 CPU. : register(b0) \u2013 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u0441\u043b\u043e\u0442\u0443 0 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (b#). float magnitudeScale \u2013 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>\u041d\u0443 \u0430 \u0434\u0430\u043b\u044c\u0448\u0435, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. GetDimensions \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u0435\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e Direct3D, \u0442\u043e \u0442\u0430\u043c \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u044b \u0435\u0449\u0451 \u0441\u0430\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0442\u044c, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f Direct2D, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u043b\u0451\u0433\u043a\u043e\u0435 \u2013 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440 \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043e\u043f\u0438\u0448\u0443 \u043b\u043e\u0433\u0438\u043a\u0443:<\/p>\n<p>\u0412 Direct2D \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0437\u0435\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b \u2013 \u043e\u0434\u0438\u043d \u0448\u0435\u0439\u0434\u0435\u0440) \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0443\u0437\u043b\u043e\u0432. \u0412 \u0443\u0437\u043b\u0430\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0448\u0435\u0439\u0434\u0435\u0440 \u0438 \u0442.\u043f. \u0410 \u0432\u043e\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a \u043d\u0430\u0448\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u044f\u0441\u043d\u0430: \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0443\u0437\u043b\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u044d\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432: \u0434\u043b\u044f \u0443\u0437\u043b\u0430 \u2013 \u044d\u0442\u043e ID2D1ComputeTransform, \u0434\u043b\u044f \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0443\u0437\u043b\u043e\u0432 \u2013 ID2D1EffectImpl. \u041d\u0443, \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0443\u0437\u043b\u0430. \u0412\u043e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 (HabrNodeHandler.h):<\/p>\n<pre><code class=\"cpp\">#pragma once#include &lt;d2d1_1.h&gt;#include &lt;d2d1effectauthor.h&gt;#include &lt;d3d11.h&gt;#include &lt;d3dcommon.h&gt;DEFINE_GUID(GUID_HABR_COMPUTE_SHADER, 0x895136D1, 0x1511, 0x3850, 0xAF, 0x3B, 0x7A, 0xA3, 0xB0, 0x6C, 0x5D, 0xE1);class HabrNodeHandler : public ID2D1ComputeTransform{public:    HabrNodeHandler(_In_ ID2D1EffectContext* context, UINT32 width, UINT32 height);    IFACEMETHODIMP_(UINT32) GetInputCount() const override { return 1; }    IFACEMETHODIMP SetComputeInfo(_In_ ID2D1ComputeInfo* pComputeInfo) override;    IFACEMETHODIMP CalculateThreadgroups(        _In_ const D2D1_RECT_L* pOutputRect,        _Out_ UINT32* pDimensionX,        _Out_ UINT32* pDimensionY,        _Out_ UINT32* pDimensionZ    ) override;       IFACEMETHODIMP MapOutputRectToInputRects(        _In_ const D2D1_RECT_L* pOutputRect,        _Out_writes_(inputRectCount) D2D1_RECT_L* pInputRects,        UINT32 inputRectCount    ) const override;    IFACEMETHODIMP MapInputRectsToOutputRect(        _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects,        _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects,        UINT32 inputRectCount,        _Out_ D2D1_RECT_L* pOutputRect,        _Out_ D2D1_RECT_L* pOutputOpaqueSubRect    ) override;    IFACEMETHODIMP MapInvalidRect(        UINT32 inputIndex,        D2D1_RECT_L invalidInputRect,        _Out_ D2D1_RECT_L* pInvalidOutputRect    ) const override;    IFACEMETHODIMP_(ULONG) AddRef() override;    IFACEMETHODIMP_(ULONG) Release() override;    IFACEMETHODIMP QueryInterface(REFIID riid, _Outptr_ void** ppOutput) override;private:    ~HabrNodeHandler() = default;    LONG m_cRef;    ID2D1ResourceTexture* m_outputResource;    struct ConstantBuffer    {        float magnitudeScale;    } m_constantBuffer;};<\/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>\u041d\u0430\u0447\u043d\u0451\u043c:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0449\u0451 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u043a \u0432\u044b\u0445\u043e\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u043b \u0448\u0435\u0439\u0434\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>GetInputCount &#8212; \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c 1 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>SetComputeInfo &#8212; \u043c\u0435\u0442\u043e\u0434, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0437\u043b\u0430, \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>CalculateThreadgroups &#8212; Direct2D \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>MapOutputRectToInputRects &#8212; Direct2D \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0443. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0444\u0444\u0435\u043a\u0442 &#8212; \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0434\u0438\u043d-\u043a-\u043e\u0434\u043d\u043e\u043c\u0443<\/p>\n<\/li>\n<li>\n<p>MapInputRectsToOutputRect &#8212; \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0435, \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 (\u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0432\u0435\u043d \u0435\u043c\u0443).<\/p>\n<\/li>\n<li>\n<p>MapInvalidRect &#8212;  \u041a\u043e\u0433\u0434\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a \u201c\u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439\u201d (\u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f), Direct2D \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439, \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443<\/p>\n<\/li>\n<li>\n<p>AddRef, Release, QueryInterface (COM-\u043c\u0435\u0442\u043e\u0434\u044b) &#8212; \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f COM-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. AddRef \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a, Release \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 0. QueryInterface \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, IUnknown, ID2D1ComputeTransform).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440(\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440) &#8212; \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0434\u0430\u043b\u044f\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 Release<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0435 LONG m_cRef; &#8212; \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM.<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0435 ID2D1ResourceTexture* m_outputResource; &#8212; \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0434\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p>struct ConstantBuffer { float magnitudeScale; } m_constantBuffer; &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 GPU \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 , \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">#include \"pch.h\"#include \"HabrNodeHandler.h\"HabrNodeHandler::HabrNodeHandler(_In_ ID2D1EffectContext* context, UINT32 width, UINT32 height) :    m_cRef(0){    \/\/ 1. \u041c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0434\u043b\u044f 2D-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b (\u0448\u0438\u0440\u0438\u043d\u0430, \u0432\u044b\u0441\u043e\u0442\u0430)    UINT32 extents[2] = { width, height };    D2D1_EXTEND_MODE extendModes[2] = { D2D1_EXTEND_MODE_CLAMP, D2D1_EXTEND_MODE_CLAMP };    \/\/ 2. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432    D2D1_RESOURCE_TEXTURE_PROPERTIES props = {};    props.extents = extents;                          \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432    props.dimensions = 2;                             \/\/ 2D-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430    props.bufferPrecision = D2D1_BUFFER_PRECISION_32BPC_FLOAT; \/\/ float4    props.channelDepth = D2D1_CHANNEL_DEPTH_4;        \/\/ 4 \u043a\u0430\u043d\u0430\u043b\u0430 (RGBA)    props.filter = D2D1_FILTER_MIN_MAG_MIP_LINEAR;    \/\/ \u0424\u0438\u043b\u044c\u0442\u0440 (\u043c\u043e\u0436\u043d\u043e D2D1_FILTER_MIN_MAG_MIP_POINT)    props.extendModes = extendModes;   \/\/\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0445 \u044d\u043a\u0441\u0442\u0435\u043d\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0438. (\u0412\u044b\u0445\u043e\u0434 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438).    \/\/ GUID \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c NULL, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c)    \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c nullptr, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441.    context-&gt;CreateResourceTexture(        nullptr,              \/\/ GUID (nullptr = \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439)        &amp;props,        nullptr,              \/\/ initialData (\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430)        nullptr,              \/\/ strides        0,                    \/\/ initialDataSize        &amp;m_outputResource    );    HANDLE hFile = CreateFileW(        L\"HABR_SHADER.cso\",        GENERIC_READ,        FILE_SHARE_READ,        nullptr,        OPEN_EXISTING,        FILE_ATTRIBUTE_NORMAL,        nullptr    );    DWORD fileSize = GetFileSize(hFile, nullptr);    std::vector&lt;BYTE&gt; shaderData(fileSize);        DWORD bytesRead = 0;    ReadFile(hFile, shaderData.data(), fileSize, &amp;bytesRead, nullptr);      CloseHandle(hFile);    context-&gt;LoadComputeShader(        GUID_HABR_COMPUTE_SHADER,        shaderData.data(),        static_cast&lt;UINT32&gt;(shaderData.size())    );}IFACEMETHODIMP HabrNodeHandler::MapInvalidRect(    UINT32 inputIndex,    D2D1_RECT_L invalidInputRect,    _Out_ D2D1_RECT_L* pInvalidOutputRect) const{    *pInvalidOutputRect = invalidInputRect;    return S_OK;}IFACEMETHODIMP HabrNodeHandler::MapOutputRectToInputRects(    _In_ const D2D1_RECT_L* pOutputRect,    _Out_writes_(inputRectCount) D2D1_RECT_L* pInputRects,    UINT32 inputRectCount) const{    if (inputRectCount != 1)        return E_INVALIDARG;    pInputRects[0] = *pOutputRect;    return S_OK;}IFACEMETHODIMP HabrNodeHandler::MapInputRectsToOutputRect(    _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects,    _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects,    UINT32 inputRectCount,    _Out_ D2D1_RECT_L* pOutputRect,    _Out_ D2D1_RECT_L* pOutputOpaqueSubRect){    if (inputRectCount &lt; 1 || pInputRects == nullptr || pOutputRect == nullptr)    {        return E_INVALIDARG;    }    *pOutputRect = pInputRects[0];    if (pInputOpaqueSubRects != nullptr &amp;&amp; pOutputOpaqueSubRect != nullptr)    {        *pOutputOpaqueSubRect = pInputOpaqueSubRects[0];    }    else    {        *pOutputOpaqueSubRect = pInputRects[0];    }    return S_OK;}IFACEMETHODIMP HabrNodeHandler::CalculateThreadgroups(    _In_ const D2D1_RECT_L* pOutputRect,    _Out_ UINT32* pDimensionX,    _Out_ UINT32* pDimensionY,    _Out_ UINT32* pDimensionZ){    \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445    UINT32 width = pOutputRect-&gt;right - pOutputRect-&gt;left;    UINT32 height = pOutputRect-&gt;bottom - pOutputRect-&gt;top;    \/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 (16, 16, 1)    const UINT32 groupSizeX = 16;    const UINT32 groupSizeY = 16;    \/\/ \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445: (\u0440\u0430\u0437\u043c\u0435\u0440 + \u0433\u0440\u0443\u043f\u043f\u0430 - 1) \/ \u0433\u0440\u0443\u043f\u043f\u0430    *pDimensionX = (width + groupSizeX - 1) \/ groupSizeX;    *pDimensionY = (height + groupSizeY - 1) \/ groupSizeY;    *pDimensionZ = 1;    return S_OK;}IFACEMETHODIMP HabrNodeHandler::SetComputeInfo(_In_ ID2D1ComputeInfo* pComputeInfo){        pComputeInfo-&gt;SetOutputBuffer(D2D1_BUFFER_PRECISION_32BPC_FLOAT, D2D1_CHANNEL_DEPTH_4);                pComputeInfo-&gt;SetComputeShader(GUID_HABR_COMPUTE_SHADER);               m_constantBuffer.magnitudeScale = 2.0f;         pComputeInfo-&gt;SetComputeShaderConstantBuffer(            reinterpret_cast&lt;const BYTE*&gt;(&amp;m_constantBuffer),            sizeof(m_constantBuffer)        );         pComputeInfo-&gt;SetResourceTexture(0, m_outputResource);    return S_OK;}IFACEMETHODIMP_(ULONG) HabrNodeHandler::AddRef(){    return ++m_cRef;}IFACEMETHODIMP_(ULONG) HabrNodeHandler::Release(){    ULONG cRef = --m_cRef;    if (cRef == 0)        delete this;    return cRef;}IFACEMETHODIMP HabrNodeHandler::QueryInterface(REFIID riid, _Outptr_ void** ppOutput){    *ppOutput = nullptr;    HRESULT hr = S_OK;    if (riid == __uuidof(ID2D1ComputeTransform))        *ppOutput = static_cast&lt;ID2D1ComputeTransform*&gt;(this);    else if (riid == __uuidof(ID2D1Transform))        *ppOutput = static_cast&lt;ID2D1Transform*&gt;(this);    else if (riid == __uuidof(ID2D1TransformNode))        *ppOutput = static_cast&lt;ID2D1TransformNode*&gt;(this);    else if (riid == __uuidof(IUnknown))        *ppOutput = this;    else        hr = E_NOINTERFACE;    if (*ppOutput != nullptr)        AddRef();    return hr;}<\/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>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043f\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u044f \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b, \u043b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM (m_cRef = 0).<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 extents \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 2 (width \u0438 height) \u0434\u043b\u044f 2D-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 D2D1_RESOURCE_TEXTURE_PROPERTIES:<\/p>\n<ol>\n<li>\n<p>extents \u2013 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>dimensions = 2 \u2013 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>bufferPrecision = D2D1_BUFFER_PRECISION_32BPC_FLOAT \u2013 32 \u0431\u0438\u0442\u0430 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 float4).<\/p>\n<\/li>\n<li>\n<p>channelDepth = D2D1_CHANNEL_DEPTH_4 \u2013 4 \u043a\u0430\u043d\u0430\u043b\u0430 (RGBA).<\/p>\n<\/li>\n<li>\n<p>filter = D2D1_FILTER_MIN_MAG_MIP_LINEAR \u2013 \u0440\u0435\u0436\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 (\u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f).<\/p>\n<\/li>\n<li>\n<p>extendModes &#8212; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u043c\u043e\u043a(\u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0418 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; CreateResourceTexture<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 GUID \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c nullptr , \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443. \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u043a\u0430\u043a \u0432 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435), \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c nullptr.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u0430\u0434\u0434\u0438\u043d\u0433\u043e\u043c). \u0415\u0441\u043b\u0438 \u0448\u0430\u0433 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 nullptr.<\/p>\n<\/li>\n<li>\n<p>\u041f\u044f\u0442\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. <\/p>\n<\/li>\n<li>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Win32 , \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0430\u0439\u043b, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440, \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 LoadComputeShader:<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e GUID \u0448\u0435\u0439\u0434\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f MapInvalidRect, \u043f\u043e \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u0430.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 inputIndex \u2013 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0445\u043e\u0434\u0430 (\u0432\u0441\u0435\u0433\u0434\u0430 0, \u0442.\u043a. \u0432\u0445\u043e\u0434 \u043e\u0434\u0438\u043d).<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212; invalidInputRect \u2013 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 pInvalidOutputRect \u2013 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430: \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439, \u0442.\u043a. \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0435 \u0431\u0435\u0437 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f MapOutputRectToInputRects. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>pOutputRect \u2013 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<\/li>\n<li>\n<p>pInputRects \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 (\u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0430\u0432\u0435\u043d inputRectCount).<\/p>\n<\/li>\n<li>\n<p>inputRectCount \u2013 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043e\u0432 (\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 1).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430: E_INVALIDARG \u0435\u0441\u043b\u0438 inputRectCount != 1, \u0438\u043d\u0430\u0447\u0435 S_OK. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 pOutputRect \u0432 pInputRects[0] (\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 1:1).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f MapInputRectsToOutputRect. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438 \u0435\u0433\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>pInputRects \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435.<\/p>\n<\/li>\n<li>\n<p>pInputOpaqueSubRects \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 (\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441 \u0430\u043b\u044c\u0444\u0430=1).<\/p>\n<\/li>\n<li>\n<p>inputRectCount \u2013 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043e\u0432 (\u22651).<\/p>\n<\/li>\n<li>\n<p>pOutputRect \u2013 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a.<\/p>\n<\/li>\n<li>\n<p>pOutputOpaqueSubRect \u2013 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 E_INVALIDARG \u043f\u0440\u0438 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445, \u0438\u043d\u0430\u0447\u0435 S_OK. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 inputRectCount &gt;= 1, pInputRects != nullptr, pOutputRect != nullptr. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 pInputRects[0] \u0432 pOutputRect. \u0415\u0441\u043b\u0438 pInputOpaqueSubRects \u0438 pOutputOpaqueSubRect \u0432\u0430\u043b\u0438\u0434\u043d\u044b, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439; \u0438\u043d\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0435\u0441\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043a\u0430\u043a \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f CalculateThreadgroups. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (Dispatch), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>pOutputRect \u2013 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d.<\/p>\n<\/li>\n<li>\n<p>pDimensionX, pDimensionY, pDimensionZ \u2013 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b Dispatch (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0441\u0438).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:  \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. \u0417\u0430\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437 HLSL (groupSizeX = 16, groupSizeY = 16). \u041e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u0442 \u0432\u0432\u0435\u0440\u0445: pDimensionX = (width + 15) \/ 16, pDimensionY = (height + 15) \/ 16, pDimensionZ = 1. \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044b, \u0430 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043e\u0442\u0441\u0435\u043a\u0443\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f SetComputeInfo. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440: \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0448\u0435\u0439\u0434\u0435\u0440, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 (UAV). \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Direct2D \u043f\u0435\u0440\u0435\u0434 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>pComputeInfo \u2013 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>pComputeInfo-&gt;SetOutputBuffer(D2D1_BUFFER_PRECISION_32BPC_FLOAT, D2D1_CHANNEL_DEPTH_4); \u2013 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 Direct2D \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 (32-\u0431\u0438\u0442\u043d\u044b\u0439 float RGBA). \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>pComputeInfo-&gt;SetComputeShader(GUID_HABR_COMPUTE_SHADER); \u2013 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u043e GUID.<\/p>\n<\/li>\n<li>\n<p>pComputeInfo-&gt;SetComputeShaderConstantBuffer(reinterpret_cast&lt;const BYTE*&gt;(&amp;m_constantBuffer), sizeof(m_constantBuffer)); \u2013 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432 GPU. \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2013 0 (\u0440\u0435\u0433\u0438\u0441\u0442\u0440 b0), \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044e register(b0) \u0432 HLSL.<\/p>\n<\/li>\n<li>\n<p>pComputeInfo-&gt;SetResourceTexture(0, m_outputResource); \u2013 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 u0 (\u0438\u043d\u0434\u0435\u043a\u0441 0), \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 RWTexture2D OutputTexture : register(u0) \u0432 HLSL.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 S_OK.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f AddRef() &#8212;  \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM \u043d\u0430 1.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Release(). \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 1. \u0415\u0441\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 0, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 delete this.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f QueryInterface. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0443\u0437\u043b\u043e\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0433\u043e\u0432\u043e\u0440\u044e, \u043e\u043d \u043f\u0440\u043e\u0449\u0435:<\/p>\n<pre><code class=\"cpp\">#pragma once#include &lt;d2d1_1.h&gt;#include &lt;d2d1effectauthor.h&gt;DEFINE_GUID(HabrEffect, 0x88F0F871, 0x18A3, 0x4C55, 0xB5, 0x28, 0xE7, 0x38, 0xA7, 0x81, 0x35, 0x1F);class HabrEffect : public ID2D1EffectImpl{public:        static HRESULT Register(_In_ ID2D1Factory1* pFactory);    static HRESULT __stdcall Create(_Outptr_ IUnknown** ppEffectImpl);    \/\/ ID2D1EffectImpl    IFACEMETHODIMP Initialize(        _In_ ID2D1EffectContext* pEffectContext,        _In_ ID2D1TransformGraph* pTransformGraph    ) override;    IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType) override;    IFACEMETHODIMP SetGraph(_In_ ID2D1TransformGraph* pTransformGraph) override;    \/\/ IUnknown    IFACEMETHODIMP_(ULONG) AddRef() override;    IFACEMETHODIMP_(ULONG) Release() override;    IFACEMETHODIMP QueryInterface(REFIID riid, _Outptr_ void** ppOutput) override;private:    HabrEffect();    ~HabrEffect() = default;    LONG m_cRef;};<\/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>\u041d\u0430\u0447\u043d\u0451\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Register. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 Direct2D (ID2D1Factory1), \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Create. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d Direct2D \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Initialize. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Direct2D \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f PrepareForRender. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f SetGraph. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 Direct2D \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439(\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0439\u043c\u0451\u0442\u0435 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442). \u041e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 Initialize \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0433\u0440\u0430\u0444 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f AddRef. \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM \u043d\u0430 1.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Release. \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM \u043d\u0430 1. \u0415\u0441\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 0, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f QueryInterface. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0438 \u0441\u043a\u0430\u0437\u0430\u043b &#8212; \u043f\u043e \u043f\u0440\u043e\u0449\u0435. \u041d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">#include \"pch.h\"#include &lt;initguid.h&gt;#include \"HabrEffect.h\"#include \"HabrNodeHandler.h\"#define XML(X) TEXT(#X)HabrEffect::HabrEffect() :    m_cRef(0){}HRESULT HabrEffect::Register(_In_ ID2D1Factory1* pFactory){    PCWSTR pszXml =        XML(            &lt;?xml version='1.0'?&gt;            &lt;Effect&gt;            &lt;Property name='DisplayName' type='string' value='Sample Discrete Fourier Transform (DFT) Compute Effect'\/&gt;            &lt;Property name='Author' type='string' value='Microsoft Corporation'\/&gt;            &lt;Property name='Category' type='string' value='Transform'\/&gt;            &lt;Property name='Description' type='string' value='A sample compute shader effect that computes the Discrete Fourier Transform of a given input.'\/&gt;            &lt;Inputs&gt;            &lt;Input name='Source'\/&gt;            &lt;\/Inputs&gt;            &lt;\/Effect&gt;        );    return pFactory-&gt;RegisterEffectFromString(HABR_EFFECT, pszXml, nullptr, 0, Create);}HRESULT __stdcall HabrEffect::Create(_Outptr_ IUnknown** ppEffectImpl){    *ppEffectImpl = static_cast&lt;ID2D1EffectImpl*&gt;(new (std::nothrow) HabrEffect());    if (*ppEffectImpl == nullptr)        return E_OUTOFMEMORY;    (*ppEffectImpl)-&gt;AddRef();    return S_OK;}IFACEMETHODIMP HabrEffect::Initialize(    _In_ ID2D1EffectContext* pEffectContext,    _In_ ID2D1TransformGraph* pTransformGraph){    Microsoft::WRL::ComPtr&lt;HabrNodeHandler&gt; dftHorizontalTransform = new (std::nothrow) HabrNodeHandler(pEffectContext,50,50);    pTransformGraph-&gt;AddNode(dftHorizontalTransform.Get());      pTransformGraph-&gt;ConnectToEffectInput(0, dftHorizontalTransform.Get(), 0);    pTransformGraph-&gt;SetOutputNode(dftHorizontalTransform.Get());    return S_OK;}IFACEMETHODIMP HabrEffect::SetGraph(_In_ ID2D1TransformGraph* pTransformGraph){    return E_NOTIMPL;}IFACEMETHODIMP HabrEffect::PrepareForRender(D2D1_CHANGE_TYPE changeType){    return S_OK;}IFACEMETHODIMP_(ULONG) HabrEffect::AddRef(){    return ++m_cRef;}IFACEMETHODIMP_(ULONG) HabrEffect::Release(){    ULONG cRef = --m_cRef;    if (cRef == 0)        delete this;    return cRef;}IFACEMETHODIMP HabrEffect::QueryInterface(REFIID riid, _Outptr_ void** ppOutput){    *ppOutput = nullptr;    HRESULT hr = S_OK;    if (riid == __uuidof(ID2D1EffectImpl))        *ppOutput = static_cast&lt;ID2D1EffectImpl*&gt;(this);    else if (riid == __uuidof(IUnknown))        *ppOutput = this;    else        hr = E_NOINTERFACE;    if (*ppOutput != nullptr)        AddRef();    return hr;}<\/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\u043f\u0438\u0441\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a COM (m_cRef) \u043d\u0443\u043b\u0451\u043c. \u0414\u0440\u0443\u0433\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0451 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 COM-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Register. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Direct2D.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0443<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 XML-\u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>DisplayName \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>Author \u2014 \u0430\u0432\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p>Category \u2014 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f (\u0437\u0434\u0435\u0441\u044c \u201cTransform\u201d).<\/p>\n<\/li>\n<li>\n<p>Description \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p> \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0432\u0445\u043e\u0434 (\u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u201cSource\u201d).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 pFactory-&gt;RegisterEffectFromString \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212; GUID \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 XML-\u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (nullptr) \u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (0) \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u044f\u0442\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e Create, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Create. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 HabrEffect. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Direct2D, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>ppEffectImpl \u2014 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 IUnknown, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 HabrEffect \u0447\u0435\u0440\u0435\u0437 new (std::nothrow), \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u043a ID2D1EffectImpl* (\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043a IUnknown*, \u0442\u0430\u043a \u043a\u0430\u043a ID2D1EffectImpl \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 IUnknown).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043b\u0438 nullptr \u2014 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 E_OUTOFMEMORY.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 (AddRef()) \u2014 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c COM, \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0443\u0436\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0435 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 S_OK.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Initialize. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0433\u0440\u0430\u0444 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Direct2D \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>pEffectContext \u2014 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p>pTransformGraph \u2014 \u0433\u0440\u0430\u0444 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u0437\u043b\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0443\u0437\u043b\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 HabrNodeHandler \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e new (std::nothrow) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b &#8212; \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0435 50\u00d750. \u0421\u0434\u0435\u043b\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0432\u044b \u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 , \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 Microsoft::WRL::ComPtr \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0437\u0435\u043b \u0432 \u0433\u0440\u0430\u0444: pTransformGraph-&gt;AddNode(dftHorizontalTransform.Get()).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 (\u0438\u043d\u0434\u0435\u043a\u0441 0) \u0441 \u0432\u0445\u043e\u0434\u043e\u043c \u0443\u0437\u043b\u0430 (\u0438\u043d\u0434\u0435\u043a\u0441 0) \u0447\u0435\u0440\u0435\u0437 pTransformGraph-&gt;ConnectToEffectInput(0, dftHorizontalTransform.Get(), 0). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 \u0443\u0437\u0435\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 (pTransformGraph-&gt;SetOutputNode(dftHorizontalTransform.Get())), \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0437\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0432\u0441\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 S_OK.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f SetGraph.  \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0433\u0440\u0430\u0444 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0430). (\u0422\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438), \u043e\u0434\u043d\u0430\u043a\u043e \u0443 \u043d\u0430\u0441 \u043e\u043d \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 E_NOTIMPL (\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e). \u042d\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u0435\u0441\u043b\u0438 \u0433\u0440\u0430\u0444 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f PrepareForRender.  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440). \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 S_OK. \u0415\u0441\u043b\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, magnitudeScale), \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0443\u0437\u0435\u043b. \u041d\u0443 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043c\u0435\u0441\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438: AddRef, Release, QueryInterface. \u0421 \u043d\u0438\u043c\u0438 \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0443\u043f\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a(\u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u043e \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439):<\/p>\n<pre><code class=\"cpp\">#include &lt;Windows.h&gt;#include \"pch.h\"#include \"HabrEffect.h\"\/\/ \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435HWND                                        m_hwnd = nullptr;bool                                        m_windowClosed = false;bool                                        m_windowVisible = false;\/\/ Direct3D 11Microsoft::WRL::ComPtr&lt;ID3D11Device&gt;        device;Microsoft::WRL::ComPtr&lt;ID3D11DeviceContext&gt; context;Microsoft::WRL::ComPtr&lt;IDXGISwapChain1&gt;     m_swapChain;\/\/ Direct2DMicrosoft::WRL::ComPtr&lt;ID2D1Factory3&gt;           m_d2dFactory;Microsoft::WRL::ComPtr&lt;ID2D1Device2&gt;            m_d2dDevice;Microsoft::WRL::ComPtr&lt;ID2D1DeviceContext2&gt;     m_d2dContext;Microsoft::WRL::ComPtr&lt;ID2D1Bitmap1&gt;            m_d2dTargetBitmap;\/\/ \u042d\u0444\u0444\u0435\u043a\u0442 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435Microsoft::WRL::ComPtr&lt;ID2D1Effect&gt;             m_HabrEffect;Microsoft::WRL::ComPtr&lt;IDXGIDevice3&gt;            dxgiDevice;Microsoft::WRL::ComPtr&lt;IDXGIFactory2&gt;           dxgiFactory;Microsoft::WRL::ComPtr&lt;IDXGIAdapter&gt;            dxgiAdapter;Microsoft::WRL::ComPtr&lt;ID2D1Bitmap1&gt;            blackBitmap;D2D1_SIZE_F                                     m_d3dRenderTargetSize = { 0, 0 };float                                           m_dpi = 96.0f;D3D_FEATURE_LEVEL                               m_d3dFeatureLevel = D3D_FEATURE_LEVEL_11_0;\/\/ \u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439void Render1();void Shutdown();LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);void Run();void CreateIndependentResources();void CreateDependentResources();HRESULT LoadTextureFromFile(const std::wstring&amp; filename, Microsoft::WRL::ComPtr&lt;ID2D1Bitmap1&gt;&amp; bitmap);bool Initialize(HINSTANCE hInstance, int nCmdShow);void OnResize();\/\/ \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE \/*hPrevInstance*\/,    _In_ LPSTR \/*lpCmdLine*\/, _In_ int nCmdShow){    CoInitializeEx(nullptr, COINIT_MULTITHREADED);    if (!Initialize(hInstance, nCmdShow))        return 0;    Run();    Shutdown();    CoUninitialize();    return 0;}\/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044fbool Initialize(HINSTANCE hInstance, int nCmdShow){    \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043a\u043d\u0430    WNDCLASSEX wcex = {};    wcex.cbSize = sizeof(WNDCLASSEX);    wcex.style = CS_HREDRAW | CS_VREDRAW;    wcex.lpfnWndProc = WndProc;    wcex.hInstance = hInstance;    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);    wcex.lpszClassName = L\"CustomComputeShaderWindowClass\";    if (!RegisterClassEx(&amp;wcex))        return false;    \/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430    RECT rc = { 0, 0, 1920, 1080 };    AdjustWindowRect(&amp;rc, WS_OVERLAPPEDWINDOW, FALSE);    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430    m_hwnd = CreateWindowEx(        0,        L\"CustomComputeShaderWindowClass\",        L\"Direct2D Custom Compute Shader Effect\",        WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT, CW_USEDEFAULT,        rc.right - rc.left, rc.bottom - rc.top,        nullptr,        nullptr,        hInstance,        nullptr);    if (!m_hwnd)        return false;    \/\/ \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430    RECT clientRect;    GetClientRect(m_hwnd, &amp;clientRect);    m_d3dRenderTargetSize.width = static_cast&lt;FLOAT&gt;(clientRect.right - clientRect.left);    m_d3dRenderTargetSize.height = static_cast&lt;FLOAT&gt;(clientRect.bottom - clientRect.top);    \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 DPI (\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431)    HMODULE hUser32 = GetModuleHandleW(L\"user32.dll\");    if (hUser32)    {        auto pGetDpiForWindow = (UINT(WINAPI*)(HWND))GetProcAddress(hUser32, \"GetDpiForWindow\");        if (pGetDpiForWindow)            m_dpi = (float)pGetDpiForWindow(m_hwnd);        else            m_dpi = 96.0f;    }    else        m_dpi = 96.0f;    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 D2D    D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,        __uuidof(ID2D1Factory3),        &amp;m_d2dFactory);    CreateIndependentResources();    CreateDependentResources();    \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430    HabrEffect::Register(m_d2dFactory.Get());    m_d2dContext-&gt;CreateEffect(HABR_EFFECT, m_HabrEffect.GetAddressOf());    \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b    LoadTextureFromFile(L\"image.png\", blackBitmap);        m_HabrEffect-&gt;SetInput(0, blackBitmap.Get());    \/\/ \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e    ShowWindow(m_hwnd, nCmdShow);    UpdateWindow(m_hwnd);    return true;}\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (D3D11, \u0441\u0432\u044f\u0437\u044c \u0441 D2D)void CreateIndependentResources(){    D3D11CreateDevice(        nullptr,        D3D_DRIVER_TYPE_HARDWARE,        0,        D3D11_CREATE_DEVICE_BGRA_SUPPORT,        nullptr, 0,        D3D11_SDK_VERSION,        &amp;device,        &amp;m_d3dFeatureLevel,        &amp;context    );    device.As(&amp;dxgiDevice);    m_d2dFactory-&gt;CreateDevice(dxgiDevice.Get(), &amp;m_d2dDevice);    m_d2dDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &amp;m_d2dContext);    dxgiDevice-&gt;GetAdapter(&amp;dxgiAdapter);    dxgiAdapter-&gt;GetParent(IID_PPV_ARGS(&amp;dxgiFactory));}\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440)void CreateDependentResources(){    m_d2dTargetBitmap.Reset();    m_swapChain.Reset();    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};    swapChainDesc.Width = static_cast&lt;UINT&gt;(m_d3dRenderTargetSize.width);    swapChainDesc.Height = static_cast&lt;UINT&gt;(m_d3dRenderTargetSize.height);    swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;    swapChainDesc.Stereo = FALSE;    swapChainDesc.SampleDesc.Count = 1;    swapChainDesc.SampleDesc.Quality = 0;    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    swapChainDesc.BufferCount = 2;    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;    swapChainDesc.Flags = 0;    swapChainDesc.Scaling = DXGI_SCALING_NONE;    swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;    dxgiFactory-&gt;CreateSwapChainForHwnd(        device.Get(),        m_hwnd,        &amp;swapChainDesc,        nullptr,        nullptr,        &amp;m_swapChain    );    dxgiDevice-&gt;SetMaximumFrameLatency(1);    Microsoft::WRL::ComPtr&lt;IDXGISurface2&gt; dxgiBackBuffer;    m_swapChain-&gt;GetBuffer(0, IID_PPV_ARGS(&amp;dxgiBackBuffer));    D2D1_BITMAP_PROPERTIES1 bitmapProperties =        D2D1::BitmapProperties1(            D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,            D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),            m_dpi, m_dpi        );    m_d2dContext-&gt;CreateBitmapFromDxgiSurface(dxgiBackBuffer.Get(),        &amp;bitmapProperties, &amp;m_d2dTargetBitmap);    m_d2dContext-&gt;SetTarget(m_d2dTargetBitmap.Get());}\/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430HRESULT LoadTextureFromFile(const std::wstring&amp; filename, Microsoft::WRL::ComPtr&lt;ID2D1Bitmap1&gt;&amp; bitmap){    Microsoft::WRL::ComPtr&lt;IWICImagingFactory&gt; wicFactory;    HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr,        CLSCTX_INPROC_SERVER, IID_PPV_ARGS(wicFactory.GetAddressOf()));    if (FAILED(hr)) return hr;    Microsoft::WRL::ComPtr&lt;IWICBitmapDecoder&gt; decoder;    hr = wicFactory-&gt;CreateDecoderFromFilename(filename.c_str(), nullptr,        GENERIC_READ, WICDecodeMetadataCacheOnLoad, decoder.GetAddressOf());    if (FAILED(hr)) return hr;    Microsoft::WRL::ComPtr&lt;IWICBitmapFrameDecode&gt; frame;    hr = decoder-&gt;GetFrame(0, frame.GetAddressOf());    if (FAILED(hr)) return hr;    Microsoft::WRL::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;    return m_d2dContext-&gt;CreateBitmapFromWicBitmap(converter.Get(), nullptr, bitmap.GetAddressOf());}\/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430void Render1(){    m_d2dContext-&gt;BeginDraw();    m_d2dContext-&gt;Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));    m_d2dContext-&gt;DrawImage(        m_HabrEffect.Get(),        D2D1_INTERPOLATION_MODE_LINEAR,        D2D1_COMPOSITE_MODE_SOURCE_OVER    );    HRESULT hr = m_d2dContext-&gt;EndDraw();    if (hr == D2DERR_RECREATE_TARGET)    {        OnResize();        \/\/ \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f        Render1();        return;    }    m_swapChain-&gt;Present(1, 0);}\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430void OnResize(){    if (m_hwnd)    {        RECT clientRect;        GetClientRect(m_hwnd, &amp;clientRect);        m_d3dRenderTargetSize.width = static_cast&lt;FLOAT&gt;(clientRect.right - clientRect.left);        m_d3dRenderTargetSize.height = static_cast&lt;FLOAT&gt;(clientRect.bottom - clientRect.top);        if (m_swapChain)        {            m_d2dContext-&gt;SetTarget(nullptr);            m_d2dTargetBitmap.Reset();            if (m_d3dRenderTargetSize.width &gt; 0 &amp;&amp; m_d3dRenderTargetSize.height &gt; 0)            {                m_swapChain-&gt;ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);                CreateDependentResources();            }        }    }}\/\/ \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043bvoid Run(){    MSG msg = {};    while (!m_windowClosed)    {        while (PeekMessage(&amp;msg, nullptr, 0, 0, PM_REMOVE))        {            TranslateMessage(&amp;msg);            DispatchMessage(&amp;msg);        }        \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440        if (!m_windowClosed)            Render1();    }}\/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044bvoid Shutdown(){    m_windowClosed = true;    \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c COM-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044f\u0432\u043d\u043e (\u0445\u043e\u0442\u044f \u0443\u043c\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0441\u0430\u043c\u0438)    m_HabrEffect.Reset();    blackBitmap.Reset();    m_d2dTargetBitmap.Reset();    m_d2dContext.Reset();    m_d2dDevice.Reset();    m_d2dFactory.Reset();    m_swapChain.Reset();    context.Reset();    device.Reset();    dxgiDevice.Reset();    dxgiAdapter.Reset();    dxgiFactory.Reset();    if (m_hwnd)    {        DestroyWindow(m_hwnd);        m_hwnd = nullptr;    }}\/\/ \u041e\u043a\u043e\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)    {    case WM_SIZE:        if (wParam != SIZE_MINIMIZED)        {            OnResize();        }        return 0;    case WM_DESTROY:        m_windowClosed = true;        PostQuitMessage(0);        return 0;    case WM_CLOSE:        DestroyWindow(hWnd);        return 0;    }    return DefWindowProc(hWnd, message, wParam, lParam);}<\/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>\u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451 \u0447\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u043c:<\/p>\n<ol>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f WinMain. \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.<\/p>\n<ol>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 COM (CoInitializeEx).<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Initialize \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043a\u043d\u0430 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b Run.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Shutdown \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 COM (CoUninitialize).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Initialize. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u043a\u043d\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 Direct3D, Direct2D, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u0444\u0444\u0435\u043a\u0442, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.<\/p>\n<ol>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u043a\u043d\u0430 (WNDCLASSEX).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u043a\u043d\u043e (CreateWindowEx) \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 1920\u00d71080.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043e\u043a\u043d\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432 m_d3dRenderTargetSize.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 DPI \u0447\u0435\u0440\u0435\u0437 GetDpiForWindow (\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 96).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 Direct2D (D2D1CreateFactory).<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 CreateIndependentResources() \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f D3D11-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u0441 D2D.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 CreateDependentResources() \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 (HabrEffect::Register) \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 (CreateEffect).<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 image.png \u0447\u0435\u0440\u0435\u0437 LoadTextureFromFile (\u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u2013 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 fallback, \u043d\u043e \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445).<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043a\u0430\u043a \u0432\u0445\u043e\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 (SetInput).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e (ShowWindow, UpdateWindow).<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f CreateIndependentResources. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e D3D11, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0441\u0432\u044f\u0437\u044c \u0441 Direct2D. \u042d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u0440\u0430\u0437, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0441\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f CreateDependentResources. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430 (\u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0431\u0438\u0442\u043c\u0430\u043f).<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f LoadTextureFromFile. \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 ID2D1Bitmap1.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Render1. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430.<\/p>\n<ol>\n<li>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 (m_d2dContext-&gt;BeginDraw()).<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0444\u043e\u043d \u0441\u0438\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c (Clear).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0438\u0441\u0443\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 (DrawImage) \u0441 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439 LINEAR \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 D2D1_COMPOSITE_MODE_SOURCE_OVER (\u041d\u0430\u0434\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0447\u0442\u043e \u0432\u043d\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u043b\u043e\u0441\u044c) <a href=\"https:\/\/learn.microsoft.com\/ru-ru\/windows\/win32\/api\/d2d1_1\/ne-d2d1_1-d2d1_composite_mode\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0436\u0438\u043c\u043e\u0432<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 (EndDraw).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 D2DERR_RECREATE_TARGET, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 OnResize() \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u0431\u043c\u0435\u043d\u0430 (m_swapChain-&gt;Present(1, 0)) \u0441 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f OnResize. \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u0431\u043c\u0435\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Run. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Shutdown. \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f WndProc. \u041e\u043a\u043e\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0430\u0439\u043b(pch.h):<\/p>\n<pre><code class=\"cpp\">#pragma once#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0A00#endif#ifndef NOMINMAX#define NOMINMAX#endif#define WIN32_LEAN_AND_MEAN\/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 Windows#include &lt;windows.h&gt;#include &lt;windowsx.h&gt;\/\/ \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 C++#include &lt;memory&gt;#include &lt;string&gt;#include &lt;vector&gt;#include &lt;algorithm&gt;#include &lt;cmath&gt;#include &lt;cstdint&gt;#include &lt;cassert&gt;#include &lt;exception&gt;#include &lt;stdexcept&gt;\/\/ COM \u0438 WRL#include &lt;objbase.h&gt;#include &lt;wrl\/client.h&gt;          \/\/ \u0434\u043b\u044f ComPtr\/\/ Direct3D 11 (\u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438)#include &lt;d3d11.h&gt;#include &lt;d3d11_1.h&gt;#include &lt;d3d11_2.h&gt;             \/\/ ID3D11Device2#include &lt;d3d11_3.h&gt;             \/\/ ID3D11DeviceContext3\/\/ DXGI#include &lt;dxgi.h&gt;#include &lt;dxgi1_2.h&gt;\/\/ Direct2D (\u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438)#include &lt;d2d1.h&gt;#include &lt;d2d1_1.h&gt;#include &lt;d2d1_2.h&gt;              \/\/ \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b#include &lt;d2d1_3.h&gt;              \/\/ ID2D1Factory3, ID2D1Device2, ID2D1DeviceContext2\/\/ DirectWrite (\u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438)#include &lt;dwrite.h&gt;#include &lt;dwrite_1.h&gt;#include &lt;dwrite_2.h&gt;            \/\/ IDWriteFactory2\/\/ WIC#include &lt;wincodec.h&gt;\/\/ DirectXMath (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)#include &lt;DirectXMath.h&gt;<\/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>\u041f\u043e \u0438\u0434\u0435\u0435, \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0435\u0447\u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441\u0442\u0430\u043b\u0430 \u044f\u0440\u0447\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/158\/b03\/01d\/158b0301d93da865dd501689c2b1dfaf.png\" width=\"139\" height=\"146\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/158\/b03\/01d\/158b0301d93da865dd501689c2b1dfaf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/158\/b03\/01d\/158b0301d93da865dd501689c2b1dfaf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0430, \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a87\/526\/285\/a8752628539ac066889f1163137c94f4.png\" width=\"100\" height=\"100\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a87\/526\/285\/a8752628539ac066889f1163137c94f4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a87\/526\/285\/a8752628539ac066889f1163137c94f4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0443 \u043c\u0435\u043d\u044f \u0444\u0430\u0439\u043b \u043d\u043e\u0441\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 HABR_SHADER.hlsl. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 fxc, \u0447\u0435\u0440\u0435\u0437 VS (\u0435\u0451 \u043a\u043e\u043d\u0441\u043e\u043b\u044c Developer Command Prompt for VS 2022):<\/p>\n<pre><code class=\"bash\">fxc.exe \/T cs_5_0 \/E main \/Fo HABR_SHADER.hlsl HABR_SHADER.hlsl<\/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>\/T \u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u042f \u0432\u044b\u0431\u0440\u0430\u043b 5.0 \u2014 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0441 \u0435\u0451 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 2009\u20132010 \u0433\u043e\u0434\u0430\u0445. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f 6.0.<\/p>\n<p>\/E \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430.<\/p>\n<p>\/Fo \u2014 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0431\u0443\u0444\u0435\u0440\u044b.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043d\u043e \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043a\u0430\u043a \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441 \u0432\u044b\u0441\u043e\u0442\u043e\u0439 1 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438 \u0448\u0438\u0440\u0438\u043d\u043e\u0439, \u0440\u0430\u0432\u043d\u043e\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 256 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430 (\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0435\u043c \u044f\u0440\u0447\u0435 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b).<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 BufferShader.hlsl:<\/p>\n<pre><code class=\"cpp\">Texture2D&lt;float4&gt; InputTexture : register(t0);RWTexture2D&lt;float4&gt; OutputTexture : register(u0);cbuffer Constants : register(b0){    float multiplier;};[numthreads(16, 1, 1)]   \/\/ 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u0434\u043e\u043b\u044c \u043e\u0441\u0438 X, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e Y \u0438 Zvoid main(uint3 id : SV_DispatchThreadID){    uint width, height;    InputTexture.GetDimensions(width, height);    if (id.x &gt;= width || id.y &gt;= height) return;    float4 pixel = InputTexture[id.xy];    pixel.r *= multiplier;   \/\/ \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b    \/\/ \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b (g,b,a) \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c    OutputTexture[id.xy] = pixel;}<\/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>\u0412 \u044d\u0442\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c (\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445). \u0413\u0440\u0443\u043f\u043f\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 16\u00d71\u00d71, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0443 &#8212; \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c 16 \u0443\u0434\u043e\u0431\u043d\u0430 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 GPU.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0438\u0442\u043c\u0430\u043f (\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443) \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256\u00d71 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 float. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 DXGI_FORMAT_B8G8R8A8_UNORM, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,1] &#8212; \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 [0,1], \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 DXGI_FORMAT_R32G32B32A32_FLOAT, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 (\u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f).<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0438\u0442\u043c\u0430\u043f \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<pre><code class=\"cpp\">HRESULT CreateInputBitmapFromArray(    ID2D1DeviceContext2* d2dContext,    const std::vector&lt;float&gt;&amp; data,    ID2D1Bitmap1** outBitmap){    if (data.empty()) return E_INVALIDARG;    \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0442\u0438\u043f\u0430 D2D1::ColorF (RGBA)    std::vector&lt;D2D1::ColorF&gt; pixels(data.size());    for (size_t i = 0; i &lt; data.size(); ++i)    {        float v = data[i];        \/\/ \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 [0,1] \u0434\u043b\u044f UNORM \u0444\u043e\u0440\u043c\u0430\u0442\u0430 (\u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c float \u0444\u043e\u0440\u043c\u0430\u0442)        pixels[i] = D2D1::ColorF(v, 0.0f, 0.0f, 1.0f);    }    D2D1_SIZE_U size = D2D1::SizeU(static_cast&lt;UINT32&gt;(data.size()), 1);    D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1(        D2D1_BITMAP_OPTIONS_NONE,        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)    );    HRESULT hr = d2dContext-&gt;CreateBitmap(        size,        pixels.data(),        size.width * sizeof(D2D1::ColorF),        &amp;props,        outBitmap    );    return hr;}<\/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>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430. <\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Initialize \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0438\u0442\u043c\u0430\u043f \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a \u0432\u0445\u043e\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0412\u043c\u0435\u0441\u0442\u043e LoadTextureFromFilestd::vector&lt;float&gt; inputData(256);for (int i = 0; i &lt; 256; ++i)    inputData[i] = (float)i \/ 255.0f;  \/\/ \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u043e\u0442 0 \u0434\u043e 1Microsoft::WRL::ComPtr&lt;ID2D1Bitmap1&gt; inputBitmap;CreateInputBitmapFromArray(m_d2dContext.Get(), inputData, &amp;inputBitmap);m_HabrEffect-&gt;SetInput(0, inputBitmap.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<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0443\u043c\u043d\u043e\u0436\u0438\u0442 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 2.0) \u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u043e\u043b\u043e\u0441\u0443, \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0438 \u0443\u0441\u0438\u043b\u0435\u043d\u0430 \u0432\u0434\u0432\u043e\u0435.<\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0443\u0437\u043b\u0435 (HabrNodeHandler) \u043c\u0435\u0442\u043e\u0434 CalculateThreadgroups \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u0448\u0438\u0440\u0438\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 1, \u0442\u043e:<\/p>\n<pre><code class=\"cpp\">IFACEMETHODIMP HabrNodeHandler::CalculateThreadgroups(    _In_ const D2D1_RECT_L* pOutputRect,    _Out_ UINT32* pDimensionX,    _Out_ UINT32* pDimensionY,    _Out_ UINT32* pDimensionZ){    UINT32 width = pOutputRect-&gt;right - pOutputRect-&gt;left;    UINT32 height = pOutputRect-&gt;bottom - pOutputRect-&gt;top; \/\/ \u0432\u0441\u0435\u0433\u0434\u0430 1    const UINT32 groupSizeX = 16;    const UINT32 groupSizeY = 1;    *pDimensionX = (width + groupSizeX - 1) \/ groupSizeX;    *pDimensionY = (height + groupSizeY - 1) \/ groupSizeY;    *pDimensionZ = 1;    return S_OK;}<\/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>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 CPU:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 RWTexture2D, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f GPU. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Direct2D \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0447\u0435\u0440\u0435\u0437 ID2D1ResourceTexture \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u0435\u0439:<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u044b (ID2D1Buffer) &#8212; \u043e\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 Map \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0441 CPU. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438, \u0447\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 (\u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430).<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u043c\u0430\u043f\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430) \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0431\u0438\u0442\u043c\u0430\u043f \u0441 \u0444\u043b\u0430\u0433\u043e\u043c D2D1_BITMAP_OPTIONS_CPU_READ \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 ID2D1DeviceContext::CopyFromBitmap. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 &#8212; \u044d\u0442\u043e ID2D1ResourceTexture, \u0430 \u043d\u0435 ID2D1Bitmap, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435\u043b\u044c\u0437\u044f. \u041c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 &#8212; \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u0437\u0430\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 DrawBitmap \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0431\u0438\u0442\u043c\u0430\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Direct3D 11 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e &#8212; \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 Direct2D \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439 D3D11 Compute Shader \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438, \u0433\u0434\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 CPU \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 staging-\u0431\u0443\u0444\u0435\u0440\u044b. \u042d\u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u043e\u0432. \u041d\u043e \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c.<\/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\/1072742\/\">https:\/\/habr.com\/ru\/articles\/1072742\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0448\u0435\u0439\u0434\u0435\u0440, \u0442\u043e\u0447\u043d\u0435\u0435 \u2014 \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0435\u043d\u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u0434\u0430 \u0438 \u044f \u0441\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0443\u043c\u0430\u043b, \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0443 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0435\u0449\u0451 \u0438 \u043d\u0430 GitHub. \u041f\u043e\u0437\u0436\u0435 \u2014 \u0438 \u043a\u043e\u0434 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0438\u0445 \u0432\u0441\u0435 \u0438, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0443\u043c\u0431\u0443\u0440\u043d\u0430\u044f, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0431\u0435\u0437 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u043d\u0443 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432.\u0412\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u043d\u0430 C++, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 CONSOLE: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0430\u043a\u043e\u0433\u043e .exe-\u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u0422\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f main.\u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 WINDOWS: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c (GUI). \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f. \u0422\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f WinMain \u0438\u043b\u0438 wWinMain.\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u2014 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043f\u043e\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043d\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0447\u0451\u0442 \u0444\u0438\u0437\u0438\u043a\u0438 \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044f\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b).\u0427\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430:  m_d2dContext-&gt;BeginDraw();  m_d2dContext-&gt;Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));  m_d2dContext-&gt;EndDraw();\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0440\u0451\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u0445:\u042d\u0442\u0430\u043f UMD (User-Mode Driver)\u042d\u0442\u0430\u043f KMD (Kernel-Mode Driver)\u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU \u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f &#8212; \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434.BeginDraw() \u2013 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 GPU. \u041e\u043d \u043b\u0438\u0448\u044c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 Direct2D, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434. \u0412\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 UMD \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 (Command Buffer). \u042d\u0442\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u0443\u0434\u0430 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0447\u0435\u0440\u0435\u0437 UMD) \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0424\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u0435\u043d \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.m_d2dContext-&gt;Clear(\u2026) \u2013 UMD \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f GPU \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440.m_d2dContext-&gt;EndDraw() \u2013 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434 \u0433\u043e\u0442\u043e\u0432. UMD \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u044f\u0434\u0440\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f &#8212; \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u043b\u044f GPU.\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u044f\u0434\u0440\u0430. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0430\u043c KMD.\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430: DirectX Graphics Kernel Subsystem (Dxgkrnl) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0442 UMD.\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f: KMD (kernel-mode display miniport driver) \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c. \u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u2013 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430. KMD \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u2013 DMA-\u0431\u0443\u0444\u0435\u0440 (Direct Memory Access buffer).\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f (Allocation List): \u043f\u043e\u043f\u0443\u0442\u043d\u043e KMD \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u0435\u043a\u0441\u0442\u0443\u0440), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445. \u0412 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c (render target), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c.\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e: \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e DMA-\u0431\u0443\u0444\u0435\u0440 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d (not patched). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043f\u043e\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043d\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432: \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e KMD DxgkDdiBuildPagingBuffer \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 DMA-\u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u2013 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (paging buffers). \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0430\u043c\u0443 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c) \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e GPU (\u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c), \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0442\u0430\u043c \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f.\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u0442\u0430\u043f &#8212; \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU \u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b.\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 GPU. \u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u044d\u0442\u0430\u043f\u044b:Input Assembler (IA) \u2013 GPU \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b (\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043b\u0438\u043d\u0438\u0438).\u0418 \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440: Vertex Shader \u2013 \u044d\u0442\u043e \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0433\u043e \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.Hull Shader, Tessellator, Domain Shader (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0442\u0435\u0441\u0441\u0435\u043b\u044f\u0446\u0438\u044f) \u2013 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b Direct2D \u0442\u0435\u0441\u0441\u0435\u043b\u044f\u0446\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0432 Direct3D, \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e.Geometry Shader (\u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0435\u0439\u0434\u0435\u0440) \u2013 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b.\u0420\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440 (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438) \u2013 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 (\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439) \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.Pixel Shader (\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440) \u2013 \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439.Output Merger (OM) \u2013 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 (\u0431\u043b\u0435\u043d\u0434\u0438\u043d\u0433) \u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438). \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u0430 (back buffer).\u0412\u043e\u0442 \u0442\u0430\u043a, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0442\u0435\u043d\u044c\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435\u043c\u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c\u0438, \u043d\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b. \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0449\u044c GPU \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2013 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0447\u0438\u0441\u0435\u043b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u2013 \u0438 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0432\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430.\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 HLSL. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c:\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f HLSL, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438\u0437 Microsoft \u0438 NVIDIA \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0441 \u043d\u0443\u043b\u044f. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u044f\u0437\u044b\u043a C, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0431\u044b\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 NVIDIA \u043e\u043d\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u044f\u0437\u044b\u043a Cg (C for Graphics), \u0447\u0435\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0431\u044b\u043b\u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u044b HLSL.\u041b\u044e\u0431\u0430\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\/\/ \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f main[numthreads(8, 8, 1)]void main(uint3 id : SV_DispatchThreadID){    \/\/ &#8230; \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 &#8230;}\u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u044b, uint3 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 uint.\u0430 \u043a\u0430\u043a \u0436\u0435 \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 [numthreads(8, 8, 1)] \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 (attribute) \u0432 \u044f\u0437\u044b\u043a\u0435 HLSL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430. \u041e\u043d \u0437\u0430\u0434\u0430\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443.\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8 \u00d7 8 \u00d7 1 = 64 \u043f\u043e\u0442\u043e\u043a\u0430. \u041e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 (CU\/SM) GPU.\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a(\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0447\u0451\u0442 \u0441 \u043d\u0443\u043b\u044f), \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0418 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 SV_DispatchThreadID  ,  \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a (0,0,0), \u0442\u043e \u0438 \u0438\u0434 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 uint3.\u0418 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 (8,8,1) &#8212;  \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a GPU \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u0438. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Warp (\u0443 NVIDIA, \u043f\u043e 32 \u043f\u043e\u0442\u043e\u043a\u0430) \u0438\u043b\u0438 Wavefront (\u0443 AMD\/Intel, \u043f\u043e 64 \u043f\u043e\u0442\u043e\u043a\u0430).\u0410 8*8*1=64, \u0442\u043e \u0435\u0441\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c, \u043d\u0443 \u0438\u043d\u0430\u0447\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0442\u044c.\u0422\u0430\u043a \u0436\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u043d\u0430 \u0431\u043b\u043e\u043a \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 , \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439  \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0442\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 32 \u0431\u0438\u0442\u0430, 1 \u0440\u0435\u0433\u0438\u0441\u0442\u0440. \u0415\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u0442\u0430\u043a \u0436\u0435 1, \u0438\u043b\u0438 2 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 \u0432 \u043e\u0434\u0438\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440.\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0437\u043d\u0430\u0451\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0439\u043c\u0443\u0442. \u041d\u043e \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430, \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0432 \u043a \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435, \u043f\u043e\u0439\u043c\u0451\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c. \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 5.0 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u04351024 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:uint3 SV_GroupID &#8212; \u043d\u043e\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044buint3 SV_GroupThreadID &#8212; \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044buint3 SV_DispatchThreadID &#8212; ID \u043f\u043e\u0442\u043e\u043a\u0430uint SV_GroupIndex &#8212; \u043f\u043b\u043e\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ID \u043f\u043e\u0442\u043e\u043a\u0430 (7,7,0) \u0431\u0443\u0434\u0435\u0442 63, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0451\u0442 \u043f\u043e\u0442\u043e\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u0438 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c.\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446. \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:t# (\u0432 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445, # \u044d\u0442\u043e id, \u0441\u0447\u0451\u0442 \u0441 \u043d\u0443\u043b\u044f) &#8212; \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0431\u0443\u0444\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 5.0 \u043b\u0438\u043c\u0438\u0442 128 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.s# &#8212; \u0441\u044d\u043c\u043f\u043b\u0435\u0440 &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b , \u043b\u0438\u043c\u0438\u0442 16 \u0448\u0442\u0443\u043a \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 5.0u# &#8212; \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435\/\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b (UAV), \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 8 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432b# &#8212; \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b(\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0434\u043a\u043e \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f), \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u044d\u0442\u043e 4096 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 float4. \u0412\u0441\u0435\u0433\u043e \u0442\u0430\u043a\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c 15 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 r# &#8212; \u043d\u043e \u043d\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440.\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0448\u0435\u0439\u0434\u0435\u0440\u0430(\u0434\u0430 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0438 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f), \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0445 \u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0430\u043c \u0432\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 , \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442.\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443:Texture2D&lt;float4&gt; InputTexture : register(t0);RWTexture2D&lt;float4&gt; OutputTexture : register(u0);cbuffer constantBuffer : register(b0){    float magnitudeScale;}[numthreads(16,16,1)]void main(uint3 id : SV_DispatchThreadID){  uint width, height;  InputTexture.GetDimensions(width, height);  if (id.x &gt;= width || id.y &gt;= height) return; \/\/ \u041b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f    float4 colorRGBA = InputTexture[id.xy];colorRGBA *= magnitudeScale;    OutputTexture[id.xy] = colorRGBA;}\u0412\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 RGBA 50 \u043d\u0430 50 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0412\u044b\u0431\u0440\u0430\u043b \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443 \u043d\u0430\u0441 256. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0442\u043e:Texture2D \u2013 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u2013 4-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 float4. : register(t0) \u2013 \u044d\u0442\u043e, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.RWTexture2D \u2013 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c. \u0422\u0443\u0442 \u043c\u044b \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043a \u0441\u043b\u043e\u0442\u0443 0 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0442\u0438\u043f\u0430 u#.cbuffer constantBuffer \u2013 \u0431\u043b\u043e\u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 CPU. : register(b0) \u2013 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u0441\u043b\u043e\u0442\u0443 0 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (b#). float magnitudeScale \u2013 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445&#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-491650","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/491650","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=491650"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/491650\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=491650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=491650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=491650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}