{"id":459554,"date":"2025-05-14T09:03:35","date_gmt":"2025-05-14T09:03:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=459554"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=459554","title":{"rendered":"<span>Multi-GPU Rendering \u0434\u043b\u044f \u0438\u0433\u0440 \u0436\u0438\u0432?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<blockquote>\n<p>TLDR: \u0412\u00a0\u0442\u0435\u043e\u0440\u0438\u0438\u00a0\u2014 \u0434\u0430, \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435\u00a0\u2014 \u043d\u0435\u0442.<\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0441\u0442\u0443\u0434\u0435\u043d\u0442 2\u00a0\u043a\u0443\u0440\u0441\u0430 \u043c\u0430\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u0443\u0440\u044b \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \u0418\u0422\u041c\u041e \u0444\u0430\u043a\u0443\u043b\u044c\u0442\u0435\u0442\u0430 \u00ab\u0428\u043a\u043e\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0438\u0434\u0435\u043e\u0438\u0433\u0440\u00bb. \u0412\u00a0\u0441\u0432\u043e\u0435\u0439 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u00ab<em>\u0410\u043d\u0430\u043b\u0438\u0437 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Shadow Mapping \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430 \u0434\u043b\u044f\u00a0\u0441\u0438\u0441\u0442\u0435\u043c \u0441\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 GPU<\/em>\u00bb \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 Cascaded Shadow Maps \u043d\u0430\u00a0\u0432\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b <strong>40% \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u043a\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e\u00a0\u044f \u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043b\u044e\u0431\u044b\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u043c\u043e\u0438\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0432\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<\/details>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p><span class=\"habrahidden\">\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u0442\u0435\u043d\u0438\u00a0\u2014 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u00a0\u0438\u0433\u0440\u0430\u0445, \u0432\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u041d\u0418\u0420, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/span><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e: \u0435\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430\u00a0\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 <a href=\"https:\/\/store.steampowered.com\/hwsurvey\/directx\/?sort=chg\" rel=\"noopener noreferrer nofollow\">Steam Survey<\/a>, \u0442\u043e \u0441\u0440\u0435\u0434\u0438\u00a0\u043b\u0438\u0434\u0435\u0440\u043e\u0432 \u043f\u043e\u00a0\u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0443\u00a0\u2014 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u043e\u0432. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0438 \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e77\/4e5\/df1\/e774e5df14fb263479f606f4a56d22d5.png\" alt=\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u00ab\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u00bb\" title=\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u00ab\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u00bb\" width=\"715\" height=\"291\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e77\/4e5\/df1\/e774e5df14fb263479f606f4a56d22d5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e77\/4e5\/df1\/e774e5df14fb263479f606f4a56d22d5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u00ab\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u00bb<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e\u0432\u0430\u044f\u00a0\u043b\u0438\u043d\u0435\u0439\u043a\u0430 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u043e\u0442\u00a0AMD \u0441\u0435\u0440\u0438\u0438 7XXX \u0438 9XXX \u043e\u0441\u043d\u0430\u0449\u0435\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443\u00a0\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443?<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, multi\u2011GPU \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0418\u0418, \u043d\u043e\u00a0\u0442\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442, \u0447\u0442\u043e\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f\u00a0\u0433\u0435\u0439\u043c\u0435\u0440\u0441\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0422\u0435\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u0434\u0432\u0443\u0445 GPU \u0432\u00a0\u0438\u0433\u0440\u0430\u0445 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c. <\/p>\n<h3>SLI \u0436\u0435 \u043c\u0435\u0440\u0442\u0432<\/h3>\n<p>\u0421\u0442\u0430\u0440\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043a\u00a0\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043e\u0442\u00a0Nvidia\u00a0\u0431\u044b\u043b <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Nvidia_SLI\" rel=\"noopener noreferrer nofollow\">SLI<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 2018\u00a0\u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/NVLink\" rel=\"noopener noreferrer nofollow\">NVLink Bridge<\/a>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u00a0AMD\u00a0\u2014 CrossFireX. \u042d\u0442\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0438 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0438\u043c \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. NVLink \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043d\u0430\u0445\u043e\u0434\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u00a0\u0432\u00a0\u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 (Quadro, Tesla), \u0442\u0430\u043a \u0438 \u0432\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 (GeForce) \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0443\u00a0\u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432\u00a0\u0431\u044b\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043e\u0442\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044f\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 multi\u2011GPU \u0432\u00a0\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 API, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a\u00a0DirectX 12\u00a0\u0438 Vulkan. \u0412 2015\u00a0\u0433\u043e\u0434\u0443 Microsoft <a href=\"https:\/\/devblogs.microsoft.com\/directx\/directx-12-multiadapter-lighting-up-dormant-silicon-and-making-it-work-for-you\/\" rel=\"noopener noreferrer nofollow\">\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u043b\u0430<\/a> Explicit Multi\u2011GPU \u043a\u0430\u043a \u00ab\u043a\u0438\u043b\u043b\u0435\u0440 \u0444\u0438\u0447\u0443\u00bb DirectX 12. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435. <\/p>\n<h3>\u0418\u043c\u0435\u0435\u0442 \u043b\u0438 \u0441\u043c\u044b\u0441\u043b multi-GPU?<\/h3>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u043b\u0438\u0437\u043a\u0443\u044e \u043a\u00a0\u043c\u043e\u0435\u0439 \u0442\u0435\u043c\u0435: \u00ab<a href=\"https:\/\/andrewcjp.wordpress.com\/tag\/multi-gpu\/\" rel=\"noopener noreferrer nofollow\">Techniques for the utilization of heterogenous multi\u2011GPU configurations in realtime rendering<\/a>\u00bb. \u0412\u00a0\u043d\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0410\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Alternate Frame Rendering, Split Frame Rendering \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 Shadow Map \u0434\u043b\u044f\u00a0\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e GPU. <\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432\u00a0\u2014 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0434\u0440\u0430. \u041f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0441\u00a0\u0440\u0430\u0437\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u00a0\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c \u0438\u0437\u2011\u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u044f \u043d\u0435\u00a0\u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d:<\/p>\n<blockquote>\n<p><em>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/em><\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u0435\u0440\u043d\u043e. \u041d\u043e\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>\u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445<\/strong>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 16.6\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u041d\u0430\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0436\u0434\u0443 GPU \u043f\u0440\u0438\u00a0\u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u043a\u0430\u0440\u0442 \u0442\u0435\u043d\u0435\u0439 \u0434\u043b\u044f 4\u00a0\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430. \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0434\u0440\u0430 \u043e\u043a\u043e\u043b\u043e 18\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447 multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0410\u0432\u0442\u043e\u0440 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u042d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0432\u0435\u0434\u044c \u043f\u0440\u0438\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a8\/725\/024\/9a8725024c7393a115e5a49f8925fd79.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445\" width=\"888\" height=\"254\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9a8\/725\/024\/9a8725024c7393a115e5a49f8925fd79.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a8\/725\/024\/9a8725024c7393a115e5a49f8925fd79.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445<\/figcaption><\/div>\n<\/figure>\n<h2>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0443 <a href=\"https:\/\/github.com\/o3de\/sig-graphics-audio\/discussions\/32\" rel=\"noopener noreferrer nofollow\">o3de \u0434\u0432\u0438\u0436\u043a\u0430<\/a>.<\/p>\n<h3>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c 2\u00a0\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f <em>\u00ab\u041e\u0434\u0438\u043d Device \u043a\u00a0\u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443\u00bb (1:1) <\/em>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0434\u0432\u0438\u0436\u043a\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 multi\u2011GPU \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043c\u0435\u0448\u0435\u0439, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><em>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u00ab\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Device\u00bb\u043e\u0432 \u043a\u00a0\u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443\u00bb (1:N) <\/em>\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0440\u0435\u0441\u0443\u0440\u0441 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u00a0\u0441\u0435\u0431\u044f \u043f\u043e\u0434\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c API \u0438 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0434\u0432\u0438\u0436\u043a\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<h3>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/h3>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f<em> \u00abRenderGraph \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u00bb <\/em>\u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e\u00a0\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441\u0446\u0435\u043d \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0435 viewport. \u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 1:N<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f<em> \u00ab\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 RenderPass\u00bb\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438<\/em>\u00bb \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0438\u043b\u0438\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 RenderPass, \u0438 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0RenderGraph \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0414\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044b 1:1\u00a0\u0438 1:N<\/p>\n<\/li>\n<li>\n<p><em>\u00ab\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e RenderPass\u00bb\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438\u00bb<\/em>\u00a0\u2014 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 Split Frame Rendering, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 RenderPass\u00bb\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<h3>\u041a\u0430\u043a \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438?<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0432\u0443\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u0438\u043a \u0448\u0435\u0439\u0434\u0438\u043d\u0433\u0430\u00a0\u2014 <a href=\"https:\/\/www.3dgep.com\/forward-plus\/\" rel=\"noopener noreferrer nofollow\">forward \u0438 deferred<\/a>, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>Multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 Forward Rendering<\/h4>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 <em>Forward Rendering <\/em>\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 Cascaded Shadow Maps (CSM) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435, \u0430\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u00a0\u2014 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439.<\/p>\n<p>\u041d\u0430\u00a0\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0442\u0435\u0440\u043c\u0438\u043d \u00ab<em>Cross Resource<\/em>\u00bb \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c67\/3c4\/daa\/c673c4daaeed3e823be760690c7fb235.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Forward Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Forward Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" width=\"3845\" height=\"798\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c67\/3c4\/daa\/c673c4daaeed3e823be760690c7fb235.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c67\/3c4\/daa\/c673c4daaeed3e823be760690c7fb235.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Forward Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/47c\/c3f\/594\/47cc3f5944da8baa4c803b2bf762627c.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Forward Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Forward Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" width=\"1747\" height=\"591\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/47c\/c3f\/594\/47cc3f5944da8baa4c803b2bf762627c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/47c\/c3f\/594\/47cc3f5944da8baa4c803b2bf762627c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Forward Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <\/strong>\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0442\u0435\u0445\u043d\u0438\u043a\u0430 Forward Rendering \u043d\u0435\u00a0\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0438\u0439 \u044d\u0442\u0430\u043f Forward Pass, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u00a0\u0432\u0441\u0435\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0441\u0446\u0435\u043d\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <\/strong>\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0434\u043b\u044f\u00a0Forward Rendering, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 multi\u2011GPU. \u0414\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0432\u043d\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u0430\u043a\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432\u00a0\u043e\u0434\u0438\u043d \u043a\u0430\u0434\u0440 \u0438\u0437\u2011\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 multi\u2011GPU \u0434\u043b\u044f\u00a0Shadow Mapping \u0432\u00a0Forward Rendering \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u043e\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u0430\u043a\u00a0\u0432\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0438\u0437\u2011\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<h4>Multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 Deferred Rendering<\/h4>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <em>Deferred Rendering<\/em>, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0445 \u0442\u0435\u043d\u0435\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u0412\u00a0\u0442\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u044b geometry pass, light pass (\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430) \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, SSAO:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2ef\/562\/640\/2ef562640bb1f652ebde3a1be3ff5064.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Deferred Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Deferred Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" width=\"2663\" height=\"523\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2ef\/562\/640\/2ef562640bb1f652ebde3a1be3ff5064.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2ef\/562\/640\/2ef562640bb1f652ebde3a1be3ff5064.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Deferred Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f61\/ba2\/ee2\/f61ba2ee205c661c6fcef1fa2f632560.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Deferred Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432 Deferred Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\" width=\"2053\" height=\"585\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f61\/ba2\/ee2\/f61ba2ee205c661c6fcef1fa2f632560.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f61\/ba2\/ee2\/f61ba2ee205c661c6fcef1fa2f632560.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Deferred Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c CSM \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442.<\/p>\n<p>\u0421\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 multi\u2011GPU \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e: multi-GPU Shadow Mapping with Shadow Mask<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \u0441\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 4096\u00d74096\u00a0\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 256\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0412\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 PCI\u2011e 4.0\u00a0\u0441 16\u00a0\u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0434\u043e 32\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0\u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0445 \u0442\u0435\u043d\u0435\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41e\/aa2\/161\/41eaa216171b7cdb9adda0903bb8152e.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Screen-Space Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Screen-Space Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\" width=\"2791\" height=\"459\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/41e\/aa2\/161\/41eaa216171b7cdb9adda0903bb8152e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41e\/aa2\/161\/41eaa216171b7cdb9adda0903bb8152e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Screen-Space Shadow Mapping<br \/> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b Shadow Mask \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u00a0\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c \u0438\u0437\u00a0Shadow Mask, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0435\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 <\/p>\n<\/li>\n<li>\n<p>\u0410\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0435\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u0430\u044f Shadow Mask \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0435\u0439 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 Shadow Mask. \u041a\u0430\u043a\u00a0\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u00a0\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/p>\n<\/li>\n<li>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u0437\u2011\u0437\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u0442\u0435\u043d\u044f\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, percentage\u2011closer filtering \u0438\u043b\u0438\u00a0\u043c\u044f\u0433\u043a\u0438\u0435 \u0442\u0435\u043d\u0438), \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 <strong>multi\u2011GPU Shadow Mapping \u0432\u00a0Deferred Rendering<\/strong>, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n<h2>\u041a \u043a\u043e\u0434\u0443<\/h2>\n<p>\u041f\u0440\u0438\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438: <\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/www.wihlidal.com\/projects\/seed-halcyon-1\/\" rel=\"noopener noreferrer nofollow\">Halcyon by SEED<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/enginearchitecture.realtimerendering.com\/downloads\/reac2023_modern_mobile_rendering_at_hypehype.pdf\" rel=\"noopener noreferrer nofollow\">Modern Mobile Rendering @ HypeHype<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/kvark\/blade\" rel=\"noopener noreferrer nofollow\">blade by kvark<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430, \u044f \u0445\u043e\u0442\u0435\u043b\u00a0\u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u00a0\u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<h3>DirectX 12 \u0438\u043b\u0438 Vulkan<\/h3>\n<p>\u041a\u0430\u043a\u00a0\u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 API: Vulkan \u0438 DirectX 12. \u041e\u0431\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 <em>linked <\/em>\u0438 <em>unlinked <\/em>\u0440\u0435\u0436\u0438\u043c\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. <em>Linked <\/em>\u0440\u0435\u0436\u0438\u043c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0SLI \u0438\u043b\u0438\u00a0CrossFire, \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u00a0\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0412\u00a0\u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 <em>unlinked <\/em>\u0440\u0435\u0436\u0438\u043c\u0435. \u041f\u0440\u0438\u00a0\u0432\u044b\u0431\u043e\u0440\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0432\u00a0\u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>\u0412\u00a0Vulkan API \u0434\u043b\u044f <em>unlinked <\/em>\u0440\u0435\u0436\u0438\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 CPU. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a\u0438\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043d\u043e\u00a0\u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u043b\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, Vulkan \u043d\u0435\u00a0\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f\u00a0\u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 multi\u2011GPU \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b DirectX 12. \u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0Vulkan DirectX 12\u00a0\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043e\u0431\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6dd\/030\/376\/6dd030376cd5dd26ee2477d72e5aea65.png\" alt=\"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 Unlinked \u0440\u0435\u0436\u0438\u043c\u0435\" title=\"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 Unlinked \u0440\u0435\u0436\u0438\u043c\u0435\" width=\"1331\" height=\"340\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6dd\/030\/376\/6dd030376cd5dd26ee2477d72e5aea65.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6dd\/030\/376\/6dd030376cd5dd26ee2477d72e5aea65.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 Unlinked \u0440\u0435\u0436\u0438\u043c\u0435<\/figcaption><\/div>\n<\/figure>\n<h3>Rust<\/h3>\n<p> \u0412\u044b\u0431\u043e\u0440 Rust\u00a0\u0431\u044b\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c:<\/p>\n<ol>\n<li>\n<p>\u042f \u0432\u043b\u0430\u0434\u0435\u044e \u0438\u043c \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c C++<\/p>\n<\/li>\n<li>\n<p>\u041c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043d\u0451\u043c \u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432\u00a0\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430 \u0434\u043b\u044f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f DirectX 12\u00a0\u0432\u00a0Rust. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/github.com\/microsoft\/windows-rs\" rel=\"noopener noreferrer nofollow\">windows\u2011rs<\/a>, \u043d\u043e\u00a0\u043c\u043d\u0435 \u043d\u0435\u00a0\u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f API \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Builder\u2011\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u0432\u0435\u0441\u043d\u043e\u0439 \u0438 \u043b\u0435\u0442\u043e\u043c \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 <a href=\"https:\/\/github.com\/if0ne\/oxidx\" rel=\"noopener noreferrer nofollow\">oxidx <\/a>\u0434\u043b\u044f\u00a0DirectX 12, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0430\u044f \u043a\u043d\u0438\u0433\u0443 \u0424\u0440\u044d\u043d\u043a\u0430 \u041b\u0443\u043d\u044b \u00abIntroduction to 3D Game Programming with DirectX 12\u00bb.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 2\u00a0\u043c\u043e\u0434\u0443\u043b\u0435\u0439: <em>Render Hardware Interface (RHI)<\/em> \u0438 <em>High\u2011Level Rendering<\/em>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/427\/342\/5de\/4273425de7d4eb43faa9e9d63c8fad6c.png\" alt=\"C\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440-\u0434\u0432\u0438\u0436\u043a\u043e\u0432\" title=\"C\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440-\u0434\u0432\u0438\u0436\u043a\u043e\u0432\" width=\"1019\" height=\"644\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/427\/342\/5de\/4273425de7d4eb43faa9e9d63c8fad6c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/427\/342\/5de\/4273425de7d4eb43faa9e9d63c8fad6c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>C\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440-\u0434\u0432\u0438\u0436\u043a\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438 \u0432\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\u00a0\u0431\u044b\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c\u00a0\u2014 <strong>Mid\u2011Level Rendering<\/strong>. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0434 RHI, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c GPU \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Handle<\/code>:<\/p>\n<pre><code class=\"rust\">pub struct Handle&lt;T&gt; {     pub(super) index: u32,     pub(super) cookie: NonZero&lt;u32&gt;,     _marker: PhantomData&lt;T&gt;, }<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/051\/464\/b8d\/051464b8dceb1344575d63c0a340504e.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430\" width=\"821\" height=\"721\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/051\/464\/b8d\/051464b8dceb1344575d63c0a340504e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/051\/464\/b8d\/051464b8dceb1344575d63c0a340504e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>\u041c\u044b \u043a\u0440\u0443\u0442\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u00a0\u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0433\u043b\u0438 \u0432\u00a0\u043e\u0441\u043d\u043e\u0432\u0443 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<h4>HandleAllocator<\/h4>\n<p>\u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 <code>Handle<\/code>&#8216;\u043e\u0432. \u0410\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u00a0\u043b\u0438\u043d\u0435\u0439\u043d\u043e \u00ab\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u00bb \u0445\u0435\u043d\u0434\u043b\u044b, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u00a0\u0441\u0435\u0431\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>handle.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">#[derive(Debug)] pub struct HandleAllocator&lt;T&gt; {     gens: Vec&lt;u32&gt;,     free_list: Vec&lt;u32&gt;,     _marker: PhantomData&lt;T&gt;, }  impl&lt;T&gt; HandleAllocator&lt;T&gt; {     #[inline]     pub fn new() -&gt; Self {         Self {             gens: Vec::new(),             free_list: Vec::new(),             _marker: PhantomData,         }     }      #[inline]     pub fn allocate(&amp;mut self) -&gt; Handle&lt;T&gt; {         if let Some(idx) = self.free_list.pop() {             Handle::new(idx, self.gens[idx as usize])         } else {             let idx = self.gens.len();       #[derive(Debug)] pub struct HandleAllocator&lt;T&gt; {     gens: Vec&lt;u32&gt;,     free_list: Vec&lt;u32&gt;,     _marker: PhantomData&lt;T&gt;, }  impl&lt;T&gt; HandleAllocator&lt;T&gt; {     #[inline]     pub fn new() -&gt; Self {         Self {             gens: Vec::new(),             free_list: Vec::new(),             _marker: PhantomData,         }     }      #[inline]     pub fn allocate(&amp;mut self) -&gt; Handle&lt;T&gt; {         if let Some(idx) = self.free_list.pop() {             Handle::new(idx, self.gens[idx as usize])         } else {             let idx = self.gens.len();             self.gens.push(1);              Handle::new(idx as u32, 1)         }     }      #[inline]     pub fn is_valid(&amp;self, handle: Handle&lt;T&gt;) -&gt; bool {         self.gens             .get(handle.index as usize)             .is_some_and(|h| *h == handle.cookie.get())     }      #[inline]     pub fn free(&amp;mut self, handle: Handle&lt;T&gt;) {         if let Some(cookie) = self.gens.get_mut(handle.index as usize) {             *cookie += 1;             self.free_list.push(handle.index);         }     } }        self.gens.push(1);              Handle::new(idx as u32, 1)         }     }      #[inline]     pub fn is_valid(&amp;self, handle: Handle&lt;T&gt;) -&gt; bool {         self.gens   #[derive(Debug)] pub struct HandleAllocator&lt;T&gt; {     gens: Vec&lt;u32&gt;,     free_list: Vec&lt;u32&gt;,     _marker: PhantomData&lt;T&gt;, }  impl&lt;T&gt; HandleAllocator&lt;T&gt; {     #[inline]     pub fn new() -&gt; Self {         Self {             gens: Vec::new(),             free_list: Vec::new(),             _marker: PhantomData,         }     }      #[inline]     pub fn allocate(&amp;mut self) -&gt; Handle&lt;T&gt; {         if let Some(idx) = self.free_list.pop() {             Handle::new(idx, self.gens[idx as usize])         } else {             let idx = self.gens.len();       #[derive(Debug)] pub struct HandleAllocator&lt;T&gt; {     gens: Vec&lt;u32&gt;,     free_list: Vec&lt;u32&gt;,     _marker: PhantomData&lt;T&gt;, }  impl&lt;T&gt; HandleAllocator&lt;T&gt; {     #[inline]     pub fn new() -&gt; Self {         Self {             gens: Vec::new(),             free_list: Vec::new(),             _marker: PhantomData,         }     }      #[inline]     pub fn allocate(&amp;mut self) -&gt; Handle&lt;T&gt; {         if let Some(idx) = self.free_list.pop() {             Handle::new(idx, self.gens[idx as usize])         } else {             let idx = self.gens.len();             self.gens.push(1);              Handle::new(idx as u32, 1)         }     }      #[inline]     pub fn is_valid(&amp;self, handle: Handle&lt;T&gt;) -&gt; bool {         self.gens             .get(handle.index as usize)             .is_some_and(|h| *h == handle.cookie.get())     }      #[inline]     pub fn free(&amp;mut self, handle: Handle&lt;T&gt;) {         if let Some(cookie) = self.gens.get_mut(handle.index as usize) {             *cookie += 1;             self.free_list.push(handle.index);         }     } }        self.gens.push(1);              Handle::new(idx as u32, 1)         }     }      #[inline]     pub fn is_valid(&amp;self, handle: Handle&lt;T&gt;) -&gt; bool {         self.gens             .get(handle.index as usize)             .is_some_and(|h| *h == handle.cookie.get())     }      #[inline]     pub fn free(&amp;mut self, handle: Handle&lt;T&gt;) {         if let Some(cookie) = self.gens.get_mut(handle.index as usize) {             *cookie += 1;             self.free_list.push(handle.index);         }     } }            .get(handle.index as usize)             .is_some_and(|h| *h == handle.cookie.get())     }      #[inline]     pub fn free(&amp;mut self, handle: Handle&lt;T&gt;) {         if let Some(cookie) = self.gens.get_mut(handle.index as usize) {             *cookie += 1;             self.free_list.push(handle.index);         }     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<h4>RangeAllocator<\/h4>\n<p>\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u043d\u0430\u00a0\u0431\u044b\u043b\u0430\u00a0\u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 <code>DescriptorHeap<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u043c\u043d\u0435\u00a0\u0431\u044b\u043b\u043e \u043b\u0435\u043d\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<pre><code class=\"rust\">\/\/ Cargo.toml range-alloc = \"0.1.4\"<\/code><\/pre>\n<h4>SparseMap<\/h4>\n<p><em>SparseMap <\/em>\u2014 \u044d\u0442\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u00a0\u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f\u00a0\u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 <code>Handle<\/code> \u0432 <code>Resource<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>sparse_map.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">#[derive(Clone, Copy, Debug)] struct SparseEntry {     dense_index: usize,     dense_cookie: NonZero&lt;u32&gt;, }  #[derive(Debug)] pub struct SparseMap&lt;U, W&gt; {     sparse: Vec&lt;Option&lt;SparseEntry&gt;&gt;,     dense: Vec&lt;MaybeUninit&lt;W&gt;&gt;,     dense_to_sparse: Vec&lt;usize&gt;,     _marker: PhantomData&lt;U&gt;, }  impl&lt;U, W&gt; Default for SparseMap&lt;U, W&gt; {     fn default() -&gt; Self {         Self::new(128)     } }  impl&lt;U, W&gt; SparseMap&lt;U, W&gt; {     pub fn new(capacity: usize) -&gt; Self {         Self {             sparse: vec![None; capacity],             dense: Vec::new(),             dense_to_sparse: Vec::new(),             _marker: PhantomData,         }     }      pub fn contains(&amp;self, handle: Handle&lt;U&gt;) -&gt; bool {         self.sparse             .get(handle.index as usize)             .is_some_and(|h| h.is_some_and(|h| h.dense_cookie == handle.cookie))     }      pub fn set(&amp;mut self, handle: Handle&lt;U&gt;, value: W) -&gt; Option&lt;W&gt; {         if self.sparse.len() &lt;= handle.index as usize {             self.sparse.resize((handle.index + 1) as usize, None);         }          if let Some(ref mut h) = self.sparse[handle.index as usize] {             let value = std::mem::replace(                 &amp;mut self.dense[h.dense_index as usize],                 MaybeUninit::new(value),             );              h.dense_cookie = handle.cookie;             unsafe { Some(value.assume_init()) }         } else {             let pos = self.dense.len();             self.dense.push(MaybeUninit::new(value));             self.dense_to_sparse.push(handle.index as usize);             self.sparse[handle.index as usize] = Some(SparseEntry {                 dense_index: pos,                 dense_cookie: handle.cookie,             });              None         }     }      pub fn get(&amp;self, handle: Handle&lt;U&gt;) -&gt; Option&lt;&amp;W&gt; {         self.sparse.get(handle.index as usize).and_then(|h| {             if let Some(h) = h {                 if h.dense_cookie == handle.cookie {                     unsafe { Some(self.dense[h.dense_index as usize].assume_init_ref()) }                 } else {                     None                 }             } else {                 None             }         })     }      pub fn get_mut(&amp;mut self, handle: Handle&lt;U&gt;) -&gt; Option&lt;&amp;mut W&gt; {         self.sparse.get(handle.index as usize).and_then(|h| {             if let Some(h) = h {                 if h.dense_cookie == handle.cookie {                     unsafe { Some(self.dense[h.dense_index as usize].assume_init_mut()) }                 } else {                     None                 }             } else {                 None             }         })     }      pub fn remove(&amp;mut self, handle: Handle&lt;U&gt;) -&gt; Option&lt;W&gt; {         let Some(Some(SparseEntry {             dense_index,             dense_cookie,         })) = self.sparse.get(handle.index as usize).cloned()         else {             return None;         };          if dense_cookie != handle.cookie {             return None;         }          let value = std::mem::replace(&amp;mut self.dense[dense_index], MaybeUninit::uninit());         let value = unsafe { value.assume_init() };          self.dense.swap_remove(dense_index);         self.dense_to_sparse.swap_remove(dense_index);         self.sparse[handle.index as usize] = None;          let Some(Some(handle)) = self             .dense_to_sparse             .get(dense_index)             .and_then(|idx| self.sparse.get_mut(*idx))         else {             return Some(value);         };          handle.dense_index = dense_index;          Some(value)     } }  impl&lt;U, W&gt; Drop for SparseMap&lt;U, W&gt; {     fn drop(&amp;mut self) {         for handle in self.sparse.iter_mut() {             if let Some(handle) = handle.take() {                 unsafe {                     self.dense[handle.dense_index as usize].assume_init_drop();                 }             }         }     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e <em>unsafe&#8217;<\/em>\u0430. \u041c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437\u00a0\u043d\u0435\u0433\u043e, \u0440\u0430\u0437\u0431\u0430\u0432\u0438\u0432 \u043a\u043e\u0434 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>Option <\/em>\u0438 <em>unwrap<\/em>&#8216;\u043e\u0432. \u0414\u043b\u044f\u00a0\u0432\u0430\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 challenge\u00a0\u2014 \u043d\u0430\u0439\u0442\u0438 UB.<\/p>\n<h4>ReadWriteCopyRingBuffer<\/h4>\n<p>\u042d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f\u00a0\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0421\u0430\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u00a0\u0431\u0443\u0444\u0435\u0440\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438, \u043d\u043e\u00a0\u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043d\u0430\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430:<\/p>\n<pre><code class=\"rust\">#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum RwcState {     #[default]     WaitForWrite,     WaitForCopy(u64),     WaitForRead(u64), }<\/code><\/pre>\n<p>\u0427\u0438\u0441\u043b\u0430 \u0432\u00a0\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043d\u0430\u00a0GPU\u2011timeline, \u043a\u043e\u0433\u0434\u0430 \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>rwc_ring_buffer.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">#[derive(Debug)] pub struct RwcRingBuffer&lt;T, const N: usize&gt; {     buffer: SmallVec&lt;[T; N]&gt;,     size: usize,     states: SmallVec&lt;[RwcState; N]&gt;,      pub head: usize,     pub tail: usize, }  impl&lt;T, const N: usize&gt; RwcRingBuffer&lt;T, N&gt; {     pub fn new(buffer: SmallVec&lt;[T; N]&gt;) -&gt; Self {         let size = buffer.len();         Self {             buffer,             head: 0,             tail: 0,             size,             states: (0..size).map(|_| Default::default()).collect(),         }     }      #[inline]     pub fn head_state(&amp;self) -&gt; RwcState {         self.states[self.head]     }      #[inline]     pub fn tail_state(&amp;self) -&gt; RwcState {         self.states[self.tail]     }      #[inline]     pub fn advance_head(&amp;mut self) {         self.head = (self.head + 1) % self.size;     }      #[inline]     pub fn advance_tail(&amp;mut self) {         self.tail = (self.tail + 1) % self.size;     }      #[inline]     pub fn update_head_state(&amp;mut self, state: RwcState) {         self.states[self.head] = state;     }      #[inline]     pub fn update_tail_state(&amp;mut self, state: RwcState) {         self.states[self.tail] = state;     }      #[inline]     pub fn head_data(&amp;self) -&gt; &amp;T {         &amp;self.buffer[self.head]     }      #[inline]     pub fn tail_data(&amp;self) -&gt; &amp;T {         &amp;self.buffer[self.tail]     }      #[inline]     pub fn tip_index(&amp;self) -&gt; usize {         if self.tail == 0 {             self.size - 1         } else {             self.tail - 1         }     }      #[inline]     pub fn tip_data(&amp;self) -&gt; &amp;T {         &amp;self.buffer[self.tip_index()]     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p><strong>WaitForWrite: <\/strong>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0431\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps<\/p>\n<\/li>\n<li>\n<p><strong>WaitForCopy: <\/strong>\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>fence<\/code>&#8216;\u0430, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043d\u0430\u00a0\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430\u00a0\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u00a0\u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c fence \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 GPU (<code>fence.GetCompletedValue()<\/code>)<\/p>\n<\/li>\n<li>\n<p><strong>WaitForRead: <\/strong>\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>WaitForCopy<\/code>, \u043d\u043e\u00a0\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 GPU. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>fence<\/code>, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c, \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<h3>RHI<\/h3>\n<p><em>Another try, another fail&#8230;<\/em><\/p>\n<p>\u0418\u0437\u2011\u0437\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u043f\u044b\u0442\u0430 \u0432\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0432\u00a0N\u2011\u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c API.<\/p>\n<p>\u042f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438 \u00ab\u0447\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434\u00bb. \u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u043d\u043a\u0435\u043d\u0448\u0442\u0435\u0439\u043d:<\/p>\n<pre><code class=\"rust\">pub trait RenderDevice:     RenderResourceDevice     + RenderCommandDevice&lt;         CommandQueue: for&lt;'a&gt; RenderCommandQueue&lt;             CommandBuffer: RenderCommandBuffer&lt;                 Device = Self,                 RenderEncoder&lt;'a&gt;: RenderEncoder&lt;                     Buffer = Self::Buffer,                     Texture = Self::Texture,                     ShaderArgument = Self::ShaderArgument,                     RasterPipeline = Self::RasterPipeline,                 &gt;,                 TransferEncoder&lt;'a&gt;: TransferEncoder&lt;Texture = Self::Texture&gt;,             &gt;,             Event = Self::Event,         &gt;,     &gt; + RenderShaderDevice     + RenderSwapchainDevice&lt;Swapchain: Surface&lt;Texture = Self::Texture&gt;, Queue = Self::CommandQueue&gt;     + Send     + Sync { }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u0442 \u0434\u043b\u044f\u00a0Mid\u2011Level Rendering \u043c\u043e\u0434\u0443\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043d\u0435\u00a0\u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0435 \u043a\u00a0\u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a\u00a0\u0442\u0430\u043a\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u043a\u0430\u043a\u00a0\u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"rust\">#[derive(Clone, Debug)] pub struct ShaderArgumentDesc&lt;     'a,     D: RenderResourceDevice,     V: IntoIterator&lt;Item = ShaderEntry&lt;'a, D&gt;&gt;,     S: IntoIterator&lt;Item = &amp;'a D::Sampler&gt;, &gt; {     pub views: V,     pub samplers: S,     pub dynamic_buffer: Option&lt;&amp;'a D::Buffer&gt;, }<\/code><\/pre>\n<p><s>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430\u00a0\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (\u0445\u043e\u0442\u044f \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u00a0\u043e\u0434\u043d\u0438\u043c\u0438 \u0438 \u0442\u0435\u043c\u0438\u00a0\u0436\u0435 D, V, S).<\/s><\/p>\n<p>\u0412\u00a0\u0433\u043e\u043b\u043e\u0432\u0435 \u043d\u0435\u00a0\u0440\u0430\u0437 \u043f\u0440\u043e\u043c\u0435\u043b\u044c\u043a\u0430\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u00ab\u041d\u0430\u0434\u043e\u00a0\u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>dyn Trait<\/code> \u0438 <code>&amp;[T]<\/code>&#8230;\u00bb.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 RHI.<\/p>\n<h4>\u0417\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434<\/h4>\n<p><code>CommandQueue <\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439\u00bb \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>CommandBuffer<\/code>. \u041e\u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0438\u0445 \u0434\u043b\u044f\u00a0\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0GPU \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442 \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0438\u043b\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043d\u043e\u0432\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 <code>CommandBuffer<\/code>&#8216;\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><em>Enqueue <\/em>\u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 <code>CommandQueue<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0438\u0437\u00a0\u044d\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/p>\n<\/li>\n<li>\n<p><em>Commit<\/em> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u0432\u00a0\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u042d\u0442\u0438 \u0431\u0443\u0444\u0435\u0440\u044b \u043f\u043e\u0437\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043d\u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0GPU<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0436\u0434\u043e\u043c\u0443 <code>CommandBuffer <\/code>&#8216;\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>TimestampQueryHeap<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430\u00a0GPU. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e <code>Encoder<\/code>&#8216;\u043e\u0432 \u0434\u043b\u044f\u00a0\u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432\u00a0\u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/if0ne\/fotia\/blob\/64309e8a4ef97a2ae800ccc7b41e4519d42487bd\/src\/rhi\/dx12\/command.rs#L342\" rel=\"noopener noreferrer nofollow\">begin <\/a>\u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Option&lt;Timings&gt;<\/code>.<\/p>\n<h4>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u044b<\/h4>\n<p>\u0412\u00a0\u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u044f\u0432\u043d\u044b\u0435 <code>TextureView<\/code>. \u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0451 \u0442\u0438\u043f (<code>RenderTarget<\/code>, <code>DepthStencil <\/code>\u0438\u043b\u0438 <code>ShaderResource<\/code>) \u0438 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>TextureView<\/code> \u0438\u043b\u0438\u00a0\u043d\u0435\u0442.<\/p>\n<pre><code class=\"rust\">let descriptor = match view.view_ty {     TextureViewType::RenderTarget =&gt; {         Some(self.descriptors.allocate(dx::DescriptorHeapType::Rtv, 1))     }     TextureViewType::DepthStencil =&gt; {         Some(self.descriptors.allocate(dx::DescriptorHeapType::Dsv, 1))     }     _ =&gt; None, };<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e <code>View<\/code> \u0434\u043b\u044f\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>fn create_texture_view(&amp;self, texture: &amp;Self::Texture, desc: TextureViewDesc) -&gt; Self::Texture;<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u00ab\u043d\u043e\u0432\u0443\u044e\u00bb \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443. \u041d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u043d\u0435\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u043b\u0438\u00a0\u0445\u0435\u043d\u0434\u043b \u043d\u0430\u00a0\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>View<\/code>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u0410\u00a0\u043a\u0430\u043a\u00a0\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u0431\u0449\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b?<\/p>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub enum TextureFlavor {     Local,     CrossAdapter {         heap: dx::Heap,     },     Binded {         heap: dx::Heap,         cross: dx::Resource,         cross_state: Mutex&lt;dx::ResourceStates&gt;,     }, }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 Intel: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u0444\u043b\u0430\u0433\u043e\u043c <code>RenderTarget<\/code>, \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u0432\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u0430\u043f\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u00a0\u043e\u0431\u0449\u0443\u044e \u043d\u0430\u00a0\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043e\u0442\u00a0Intel. <\/p>\n<p>\u0414\u043b\u044f\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u0437\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 DirectX 12\u00a0Features:<\/p>\n<pre><code class=\"rust\">let mut feature = OptionsFeature::default(); device     .check_feature_support(&amp;mut feature)     .expect(\"failed to check options\");  if feature.cross_adapter_row_major_texture_supported() {   \/\/ \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f } else {   \/\/ \u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f }<\/code><\/pre>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437\u00a0\u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>TextureFlavor<\/code> \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:<\/p>\n<ul>\n<li>\n<p><code>Local<\/code>: \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u0430\u044f \u0432\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 GPU<\/p>\n<\/li>\n<li>\n<p><code>CrossAdapter<\/code>: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f\u0441\u044f \u0432\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043e\u0431\u043e\u0438\u043c\u0438 GPU. <code>dx::Heap<\/code>\u00a0\u2014 \u044d\u0442\u043e shared\u2011\u043a\u0443\u0447\u0430, \u0433\u0434\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434\u00a0\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p><code>Binded<\/code>: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 GPU, \u043d\u043e\u00a0\u043e\u043d\u0430 \u043d\u0435\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0414\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u0443\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0434\u0440\u0443\u0433\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0435\u0435 \u00ab\u043e\u0442\u043a\u0440\u044b\u0442\u044c\u00bb \u0434\u043b\u044f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: <\/p>\n<pre><code class=\"rust\">  fn open_texture(       &amp;self,       texture: &amp;Self::Texture,       other_gpu: &amp;Self,       overrided_view: Option&lt;TextureViewDesc&gt;,   ) -&gt; Self::Texture {       let heap = match &amp;texture.flavor {           TextureFlavor::Local =&gt; panic!(\"Texture is local, can not open handle\"),           TextureFlavor::CrossAdapter { heap } =&gt; heap,           TextureFlavor::Binded { heap, .. } =&gt; heap,       };        let handle = other_gpu           .gpu           .create_shared_handle(heap, None)           .expect(\"Failed to open handle\");       let open_heap: dx::Heap = self           .gpu           .open_shared_handle(handle)           .expect(\"Failed to open heap\");       handle.close().expect(\"Failed to close handle\");        self.create_shared_texture(           texture               .desc               .clone()               .with_name(std::borrow::Cow::Owned(format!(                   \"{} Opened\",                   texture                       .desc                       .name                       .as_ref()                       .unwrap_or(&amp;std::borrow::Cow::Borrowed(\"Unnamed\"))               ))),           open_heap,           overrided_view,       )   }<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <code>TextureFlavor::Binded<\/code>) \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f <code>TransferEncoder<\/code>:<\/p>\n<pre><code class=\"rust\">impl&lt;'a&gt; TransferEncoder for DxTransferEncoder&lt;'a&gt; {     type Texture = DxTexture;      fn pull_texture(&amp;self, texture: &amp;Self::Texture) {         match &amp;texture.flavor {             TextureFlavor::Binded { cross, .. } =&gt; {                 self.cmd.list.copy_resource(&amp;texture.raw, cross);             }             _ =&gt; { \/* NOOP *\/ }         }     }      fn push_texture(&amp;self, texture: &amp;Self::Texture) {         match &amp;texture.flavor {             TextureFlavor::Binded { cross, .. } =&gt; {                 self.cmd.list.copy_resource(cross, &amp;texture.raw);             }             _ =&gt; { \/* NOOP *\/ }         }     } } <\/code><\/pre>\n<h4>Resource Binding<\/h4>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u00a0\u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430\u00a0\u043d\u0435\u00a0\u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430.<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub struct DxShaderArgument {     pub(super) views: Option&lt;Descriptor&gt;,     pub(super) samplers: Option&lt;Descriptor&gt;,     pub(super) dynamic_address: Option&lt;u64&gt;, }<\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>ShaderArgument<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442:<\/p>\n<ul>\n<li>\n<p><code>views<\/code>: \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0434\u043b\u044f\u00a0\u0442\u0435\u043a\u0441\u0442\u0443\u0440<\/p>\n<\/li>\n<li>\n<p><code>samplers<\/code>: \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0434\u043b\u044f\u00a0\u0441\u0435\u043c\u043f\u043b\u0435\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><code>dynamic_address<\/code>: \u0430\u0434\u0440\u0435\u0441 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 (uniform buffer) \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 GPU<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 uniform\u2011\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00bb \u0431\u0443\u0444\u0435\u0440. \u0412\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 <code>ShaderArgument<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u00a0CPU, \u043e\u0442\u00a0\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u00abframes in flight\u00bb. <\/p>\n<p>\u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 <code>ShaderArgument<\/code>&#8216;\u043e\u0432, \u0447\u0442\u043e\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 uniform\u2011\u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0447\u0435\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f\u00a0\u043c\u043e\u0438\u0445 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. <\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u00a0HLSL:<\/p>\n<pre><code class=\"cpp\">SamplerState linear_clamp_s : register(s0);  cbuffer GlobalBuffer : register(b0, space0) {     Globals g_data; }  Texture2D diffuse_t : register(t0, space1); Texture2D normal_t : register(t1, space1);  cbuffer MaterialBuffer : register(b0, space1) {     Material material_data; }  cbuffer ObjectTransform : register(b0, space2) {     matrix transform; }<\/code><\/pre>\n<p> \u0410\u00a0\u0432\u043e\u0442 \u043a\u0430\u043a\u00a0\u044d\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u00a0Rust:<\/p>\n<pre><code class=\"rust\">let gpass_layout_desc = PipelineLayoutDesc {     sets: &amp;[         BindingSet {             entries: &amp;[],             use_dynamic_buffer: true,         },         BindingSet {             entries: &amp;[BindingEntry::new(BindingType::Srv, 2)],             use_dynamic_buffer: true,         },         BindingSet {             entries: &amp;[],             use_dynamic_buffer: true,         },     ],     static_samplers: &amp;[StaticSampler {         ty: SamplerType::Sample(Filter::Linear),         address_mode: AddressMode::Wrap,     }], };<\/code><\/pre>\n<h2>Mid-Level Rendering<\/h2>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>RenderSystem<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u0431\u0435\u043a\u0435\u043d\u0434\u044b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e API \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0435\u043d\u0434\u043b\u0430\u043c\u0438:<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub struct RenderSystem {     pub(super) dx_backend: Option&lt;Arc&lt;Backend&lt;DxBackend&gt;&gt;&gt;,      pub handles: HandleContainer, }  impl RenderSystem {     pub fn new(backend_settings: &amp;[RenderBackendSettings]) -&gt; Self {         let dx_backend = backend_settings             .iter()             .find(|b| b.api == RenderBackend::Dx12)             .and_then(|settings| Some(Arc::new(Backend::new(DxBackend::new(settings.debug)))));          Self {             dx_backend,             handles: HandleContainer::new(),         }     }      #[inline]     pub fn dx_backend(&amp;self) -&gt; Option&lt;Arc&lt;Backend&lt;DxBackend&gt;&gt;&gt; {         self.dx_backend.clone()     }      \/*\u0422\u0443\u0442 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0445\u0435\u043d\u0434\u043b\u0430\u043c\u0438 (create, free \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432)*\/ }  #[derive(Clone, Debug, PartialEq, Eq)] pub struct RenderBackendSettings {     pub api: RenderBackend,     pub debug: DebugFlags, }  #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum RenderBackend {     Dx12, }<\/code><\/pre>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>HandleContainer<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub struct HandleContainer {     pub(super) buffers: Mutex&lt;HandleAllocator&lt;Buffer&gt;&gt;,     pub(super) textures: Mutex&lt;HandleAllocator&lt;Texture&gt;&gt;,     pub(super) samplers: Mutex&lt;HandleAllocator&lt;Sampler&gt;&gt;,      pub(super) pipeline_layouts: Mutex&lt;HandleAllocator&lt;PipelineLayout&gt;&gt;,     pub(super) shader_arguments: Mutex&lt;HandleAllocator&lt;ShaderArgument&gt;&gt;,     pub(super) raster_pipeline: Mutex&lt;HandleAllocator&lt;RasterPipeline&gt;&gt;, }<\/code><\/pre>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 <code>HandleAllocator<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d unit\u2011\u0442\u0438\u043f\u0430\u043c\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043d\u0430\u00a0\u0442\u0438\u043f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 (Buffer, Texture \u0438\u00a0\u0442.\u00a0\u0434.). <\/p>\n<p>\u0414\u043b\u044f\u00a0\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 RHI \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 MLR \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 <code>Context<\/code>. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u043e\u043c\u0430\u043d\u0434, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435\u00a0\u2014 \u043c\u0430\u043f\u043f\u0435\u0440 <code>Handle<\/code>&#8216;\u043e\u0432: <\/p>\n<pre><code class=\"rust\">pub struct Context&lt;D: RenderDevice&gt; {     pub(super) gpu: D,      pub(super) graphics_queue: CommandQueue&lt;D&gt;,     pub(super) compute_queue: CommandQueue&lt;D&gt;,     pub(super) transfer_queue: CommandQueue&lt;D&gt;,      pub(super) uploader: D::ResourceUploader,      pub(super) mapper: Arc&lt;ResourceMapper&lt;D&gt;&gt;, }<\/code><\/pre>\n<p><code>ResourceMapper<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f Handle \u0441\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 RHI. \u041e\u043d \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <code>HandleContainer<\/code>, \u043d\u043e\u00a0\u0432\u043c\u0435\u0441\u0442\u043e <code>HandleAllocator<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 <code>SparseMap<\/code> \u0434\u043b\u044f\u00a0\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043f\u043e\u00a0\u0435\u0433\u043e <code>Handle<\/code>: <\/p>\n<pre><code class=\"rust\"> pub(super) struct ResourceMapper&lt;D: RenderDevice&gt; {     pub(super) buffers: RwLock&lt;SparseMap&lt;Buffer, D::Buffer&gt;&gt;,     pub(super) textures: RwLock&lt;SparseMap&lt;Texture, D::Texture&gt;&gt;,     pub(super) samplers: RwLock&lt;SparseMap&lt;Sampler, D::Sampler&gt;&gt;,      pub(super) pipeline_layouts: RwLock&lt;SparseMap&lt;PipelineLayout, D::PipelineLayout&gt;&gt;,     pub(super) shader_arguments: RwLock&lt;SparseMap&lt;ShaderArgument, D::ShaderArgument&gt;&gt;,     pub(super) raster_pipelines: RwLock&lt;SparseMap&lt;RasterPipeline, D::RasterPipeline&gt;&gt;, }<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 multi\u2011GPU)\u00a0\u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>ContextDual<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0432\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>Context<\/code> \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e\u00a0\u0436\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430\u00a0\u043e\u0431\u043e\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445:<\/p>\n<pre><code class=\"rust\">pub struct ContextDual&lt;D: RenderDevice&gt; {     pub primary: Arc&lt;Context&lt;D&gt;&gt;,     pub secondary: Arc&lt;Context&lt;D&gt;&gt;, }  impl&lt;D: RenderDevice&gt; ContextDual&lt;D&gt; {     pub fn new(primary: Arc&lt;Context&lt;D&gt;&gt;, secondary: Arc&lt;Context&lt;D&gt;&gt;) -&gt; Self {         Self { primary, secondary }     }      pub fn call(&amp;self, func: impl Fn(&amp;Context&lt;D&gt;)) {         func(&amp;self.primary);         func(&amp;self.secondary);     }      pub fn parallel(&amp;self, func: impl Fn(&amp;Context&lt;D&gt;) + Sync) {         std::thread::scope(|s| {             s.spawn(|| func(&amp;self.primary));             s.spawn(|| func(&amp;self.secondary));         });     }      pub fn call_primary(&amp;self, mut func: impl FnMut(&amp;Context&lt;D&gt;)) {         func(&amp;self.primary);     }      pub fn call_secondary(&amp;self, mut func: impl FnMut(&amp;Context&lt;D&gt;)) {         func(&amp;self.secondary);     } }<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0445\u0435\u043d\u0434\u043b\u0430 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430:<\/p>\n<pre><code class=\"rust\">pub trait RenderResourceContext {     fn bind_buffer(&amp;self, handle: Handle&lt;Buffer&gt;, desc: BufferDesc, init_data: Option&lt;&amp;[u8]&gt;);     fn unbind_buffer(&amp;self, handle: Handle&lt;Buffer&gt;);     fn update_buffer&lt;T: Clone&gt;(&amp;self, handle: Handle&lt;Buffer&gt;, offset: usize, data: &amp;[T]);      fn bind_texture(&amp;self, handle: Handle&lt;Texture&gt;, desc: TextureDesc, init_data: Option&lt;&amp;[u8]&gt;);     fn unbind_texture(&amp;self, handle: Handle&lt;Texture&gt;);      fn bind_texture_view(         &amp;self,         handle: Handle&lt;Texture&gt;,         texture: Handle&lt;Texture&gt;,         desc: TextureViewDesc,     );      fn open_texture_handle(         &amp;self,         handle: Handle&lt;Texture&gt;,         other: &amp;Self,         overrided_view: Option&lt;TextureViewDesc&gt;,     );      fn bind_sampler(&amp;self, handle: Handle&lt;Sampler&gt;, desc: SamplerDesc);     fn unbind_sampler(&amp;self, handle: Handle&lt;Sampler&gt;); }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438\u0437 <code>RenderDevice<\/code>. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u0441\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b RHI \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u0445 \u0441\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c Handle.<\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u0441\u0442\u043e\u0438\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043a\u00a0\u0445\u0435\u043d\u0434\u043b\u0443. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e\u00a0\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u044f \u0432 <code>Swapchain<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Handle\u00a0\u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0432\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u043f\u0440\u043e\u0445\u043e\u0434\u0430\u043c, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c \u043e\u0442\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432, \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0432\u044f\u0437\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0447\u0435\u0440\u0435\u0437 <code>Handle<\/code>.<\/p>\n<blockquote>\n<p>\u0412\u00a0\u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0433\u0440\u0430\u0444. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u043f\u0440\u043e\u0445\u043e\u0434\u044b, \u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. <\/p>\n<\/blockquote>\n<h2>Renderer<\/h2>\n<p> \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 Mid\u2011Level Rendering \u0432\u00a0\u043a\u043e\u0434\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/p>\n<h4>\u0414\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u0445\u0435\u043d\u0434\u043b\u0443:<\/h4>\n<pre><code class=\"rust\">\/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0438\u0437 GLTF-\u0444\u043e\u0440\u043c\u0430\u0442\u0430 let prepared = scene.prepare(rs);  \/\/ \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0435 group.parallel(|ctx| {     ctx.bind_buffer(         prepared.positions, \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b         BufferDesc {             name: Some(\"Position Vertex Buffer\".into()),             size: size_of_val(&amp;scene.positions[..]),             stride: size_of::&lt;[f32; 3]&gt;(),             usage: BufferUsages::Vertex,             memory_location: MemoryLocation::GpuToGpu,         },         Some(bytemuck::cast_slice(&amp;scene.positions)),     );      ctx.bind_buffer(         prepared.indices, \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b         BufferDesc {             name: Some(\"Index Buffer\".into()),             size: size_of_val(&amp;scene.indices[..]),             stride: size_of::&lt;u32&gt;(),             usage: BufferUsages::Index,             memory_location: MemoryLocation::GpuToGpu,         },         Some(bytemuck::cast_slice(&amp;scene.indices)),     );      for (buffer, argument) in prepared.submeshes.iter() {         let data = (0..settings.frames_in_flight)             .map(|_| GpuTransform {                 mat: glam::Mat4::from_scale(vec3(                     settings.scene_scale,                     settings.scene_scale,                     settings.scene_scale,                 )),             })             .collect::&lt;Vec&lt;_&gt;&gt;();          ctx.bind_buffer(             *buffer, \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b             BufferDesc {                 name: Some(\"Object Position\".into()),                 size: settings.frames_in_flight * size_of::&lt;GpuTransform&gt;(),                 stride: 0,                 usage: BufferUsages::Uniform,                 memory_location: MemoryLocation::CpuToGpu,             },             None,         );          ctx.update_buffer(*buffer, 0, &amp;data);          ctx.bind_shader_argument(             *argument, \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b             ShaderArgumentDesc {                 views: &amp;[],                 samplers: &amp;[],                 dynamic_buffer: Some(*buffer),             },         );     } });<\/code><\/pre>\n<h4>\u041e\u0431\u0449\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b:<\/h4>\n<pre><code class=\"rust\">\/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0435\u043d\u0434\u043b\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440 let shared = (0..texture_count)     .map(|_| rs.create_texture_handle())     .collect::&lt;SmallVec&lt;_&gt;&gt;();  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0434\u043b\u044f Cascaded Shadow Maps, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c  \/\/ \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 group.call_secondary(|ctx| {     shared.iter().enumerate().for_each(|(i, t)| {         ctx.bind_texture(             *t,             TextureDesc::new_2d(                 [2 * settings.cascade_size, 2 * settings.cascade_size],                 Format::R32,                 TextureUsages::RenderTarget                     | TextureUsages::Resource                     | TextureUsages::Shared,             )             .with_name(format!(\"Shared Cascaded Shadow Maps {i}\").into())             .with_color(ClearColor::Color([1.0, 1.0, 1.0, 1.0])),             None,         );     }); });  \/\/ \"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\" \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \/\/ \u043a\u0430\u043a Shader Resource group.call_primary(|ctx| {     shared.iter().enumerate().for_each(|(_, t)| {         ctx.open_texture_handle(             *t,             &amp;group.secondary,             Some(                 TextureViewDesc::default()                     .with_view_type(TextureViewType::ShaderResource)                     .with_format(Format::R32),             ),         );     }); });<\/code><\/pre>\n<p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u00a0\u043e\u043f\u044b\u0442\u043e\u043c \u0432\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u043c\u043e\u0433 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e\u00a0\u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 2, \u0447\u0442\u043e\u00a0\u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b R32, \u0430\u00a0\u043d\u0435\u00a0D32, \u0447\u0442\u043e\u00a0\u0441\u0442\u043e\u0438\u0442 \u0444\u043b\u0430\u0433 <code>TextureUsages::RenderTarget<\/code>, \u0430\u00a0\u043d\u0435 <code>TextureUsages::DepthStencil<\/code>. <\/p>\n<p>\u0414\u0430, \u044d\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u00a0\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430\u0445 Intel. \u0412\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c <code>TextureArray<\/code> \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0441\u00a0\u0444\u043b\u0430\u0433\u043e\u043c <code>DepthStencil<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043c\u043e\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u0442\u043b\u0430\u0441 \u0434\u043b\u044f\u00a0\u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 R32\u00a0\u0441\u00a0\u0444\u043b\u0430\u0433\u043e\u043c <code>RenderTarget<\/code>. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34d\/213\/729\/34d2137299b522577d3839fc090310ec.png\" alt=\"\u0410\u0442\u043b\u0430\u0441 Cascaded Shadow Maps\" title=\"\u0410\u0442\u043b\u0430\u0441 Cascaded Shadow Maps\" width=\"4096\" height=\"4096\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/34d\/213\/729\/34d2137299b522577d3839fc090310ec.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34d\/213\/729\/34d2137299b522577d3839fc090310ec.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0442\u043b\u0430\u0441 Cascaded Shadow Maps<\/figcaption><\/div>\n<\/figure>\n<h4>\u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ReadWriteCopyRingBuffer?<\/h4>\n<blockquote>\n<p>Talk is cheap. Show me the code.<\/p>\n<\/blockquote>\n<pre><code class=\"rust\">pub fn render(     &amp;mut self,     world: &amp;World,     globals: Handle&lt;ShaderArgument&gt;,     swapchain_view: Handle&lt;Texture&gt;,     camera: &amp;Camera,     light_dir: glam::Vec3,     frame_idx: usize, ) {     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u0430 \u043b\u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430     \/\/ \u0418 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e head-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \"\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438\/\u0440\u0435\u043d\u0434\u0435\u0440\u0430\"     if self.ctx.secondary.is_ready(CommandType::Graphics)         &amp;&amp; self.csm.shared.head_state() == RwcState::WaitForWrite     {         \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432         self.csm.update(camera, light_dir);          \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443         self.ctx.call_secondary(|ctx| {             let mut cmd = ctx.create_encoder(CommandType::Graphics);             let timings = cmd.begin(ctx);              \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0430\u0445, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c             if let Some(sdr) = &amp;mut self.sender {                 if let Some(timings) = timings {                     sdr.send(TimingsInfo::SecondaryMultiGpu(timings))                         .expect(\"failed to send\");                 }             } else {                 info!(\"Secondary Timings: {:?}\", timings);             }              \/\/ \u0421\u0442\u0435\u0448\u0438\u043c CommandBuffer\/CommandEncoder             ctx.enqueue(cmd);              \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440-\u043f\u0440\u043e\u0445\u043e\u0434 Cascaded Shadow Maps             self.csm.render(world);              \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c Cascaded Shadow Maps \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043e\u0431\u0449\u0443\u044e             \/\/ \u041d\u0430 Intel \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442             let mut cmd = ctx.create_encoder(CommandType::Graphics);              cmd.set_barriers(&amp;[                 Barrier::Texture(                     *self.csm.shared.head_data(), \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b                     ResourceState::CopySrc,                     Subresource::Local(None),                 ),                 Barrier::Texture(                     *self.csm.shared.head_data(), \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b                     ResourceState::CopyDst,                     Subresource::Shared,                 ),             ]);             {                 let encoder = cmd.transfer(\"Push CSM\".into());                 encoder.push_texture(*self.csm.shared.head_data());             }              \/\/ \u041f\u0443\u0448\u0438\u043c CommandBuffer\/CommandEncoder             ctx.commit(cmd);              \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 head-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \"\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\"             self.csm                 .shared                 .update_head_state(RwcState::WaitForCopy(ctx.submit(CommandType::Graphics)));         });     }      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 WaitForCopy     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432     if let RwcState::WaitForCopy(v) = self.csm.shared.tail_state() {         if self.ctx.primary.is_ready(CommandType::Transfer)             &amp;&amp; self.ctx.secondary.is_ready_for(CommandType::Graphics, v)         {             \/\/ \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u043c head-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435             self.csm.shared.advance_head();              \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435             self.ctx.call_primary(|ctx| {                 let mut cmd = ctx.create_encoder(CommandType::Transfer);                 let timings = cmd.begin(ctx);                  if let Some(sdr) = &amp;mut self.sender {                     if let Some(timings) = timings {                         sdr.send(TimingsInfo::PrimaryCopyMultiGpu(timings))                             .expect(\"failed to send\");                     }                 } else {                     info!(\"Copy Timings: {:?}\", timings);                 }                  cmd.set_barriers(&amp;[                     Barrier::Texture(                         *self.csm.shared.tail_data(), \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b                         ResourceState::CopyDst,                         Subresource::Local(None),                     ),                     Barrier::Texture(                         *self.csm.shared.tail_data(), \/\/ \u042d\u0442\u043e \u0445\u0435\u043d\u0434\u043b                         ResourceState::CopySrc,                         Subresource::Shared,                     ),                 ]);                 {                     let encoder = cmd.transfer(\"Pull CSM\".into());                     encoder.pull_texture(*self.csm.shared.tail_data());                 }                  ctx.commit(cmd);                 \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \"\u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\"                 self.csm.shared.update_tail_state(RwcState::WaitForRead(                     ctx.submit(CommandType::Transfer),                 ));             });         }     }      \/\/ Z-prepass     self.zpass.render(globals, frame_idx, world);      \/\/ G-pass     self.gpass.render(globals, frame_idx, world);      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 WaitForRead     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e     let copy_texture = if let RwcState::WaitForRead(v) = self.csm.shared.tail_state() {         if self.ctx.primary.is_ready_for(CommandType::Transfer, v) {             \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 WaitForWrite             self.csm.shared.update_tail_state(RwcState::WaitForWrite);             let csm = *self.csm.shared.tail_data();             Some(csm)         } else {             None         }     } else {         None     };      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Cascaded Shadow Maps \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043d\u0435\u0442     let (csm, idx) = match copy_texture {         \/\/ Cascaded Shadow Maps \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f         Some(texture) =&gt; {             let idx = self.csm.shared.tail;             \/\/ \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u043c tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435             self.csm.shared.advance_tail();             (texture, idx)         }         None =&gt; {             \/\/ \u0411\u0435\u0440\u0435\u043c Cascaded Shadow Maps \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f tail-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f             let idx = self.csm.shared.tip_index();             let texture = *self.csm.shared.tip_data();             (texture, idx)         }     };      \/\/ Directional Light Pass     self.dir_pass         .render(globals, csm, self.csm.argument[idx], frame_idx, idx);      \/\/ Gamma Correction Pass and Swapchain Output     self.final_pass.render(swapchain_view); }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043a\u0430\u0434\u0440. \u0421\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u00a0\u043c\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0444\u0438\u0448\u0435\u043a. \u0422\u0443\u0442 \u043d\u0435\u0442 frustrum culling&#8217;\u0430, indirect draw, bindless textures. \u0420\u0435\u043d\u0434\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e draw indexed.<\/p>\n<h3>\u0410 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438?<\/h3>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u0430\u043a\u00a0\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0435\u00a0\u043b\u0438\u0448\u0435\u043d \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043f\u0440\u0438\u00a0\u0440\u0435\u0437\u043a\u043e\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b<\/em>. Cascaded Shadow Maps \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e View\u2011Space. \u041f\u0440\u0438\u00a0\u0440\u0435\u0437\u043a\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u00a0\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0437\u0430\u043f\u0430\u0437\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u00a0\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0435\u043d\u0435\u0439. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u2011\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b CSM \u0441\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043a\u0430\u0434\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0435\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f87\/959\/a31\/f87959a3191c989d66d20d43de921b0f.gif\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0435\u0439 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043a\u0430\u043c\u0435\u0440\u044b\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0435\u0439 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043a\u0430\u043c\u0435\u0440\u044b\" width=\"915\" height=\"628\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f87\/959\/a31\/f87959a3191c989d66d20d43de921b0f.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f87\/959\/a31\/f87959a3191c989d66d20d43de921b0f.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0435\u0439 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043a\u0430\u043c\u0435\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u044d\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f multi\u2011GPU \u0434\u043b\u044f\u00a0\u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a\u00a0\u0440\u0430\u0441\u0447\u0435\u0442 \u0442\u0435\u043d\u0435\u0439. <\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437<\/h2>\n<p><span class=\"habrahidden\">\u0420\u0430\u0434\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u043e\u0431\u043d\u043e\u0432\u0438\u043b \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0438 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b AMD Ryzen 5 7600\u00a0\u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. <\/span><\/p>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445 \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>NVIDIA GeForce RTX 3060\u00a0+ AMD Radeon\u2122 Graphics;\u00a0\u2014 \u0421\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u044b\u0439 \u041f\u041a<\/p>\n<\/li>\n<li>\n<p>NVIDIA GeForce GTX 1050\u00a0+ Intel\u00ae UHD Graphics 630;\u00a0\u2014 \u041d\u043e\u0443\u0442\u0431\u0443\u043a<\/p>\n<\/li>\n<li>\n<p>NVIDIA GeForce GTX 1650\u00a0Ti + Intel\u00ae UHD Graphics;\u00a0\u2014 \u041d\u043e\u0443\u0442\u0431\u0443\u043a<\/p>\n<\/li>\n<li>\n<p>NVIDIA GeForce RTX 4070\u00a0Laptop GPU + Intel\u00ae Iris\u00ae Xe Graphics.\u00a0\u2014 \u041d\u043e\u0443\u0442\u0431\u0443\u043a<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0446\u0435\u043d\u00a0\u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>Pica Pica \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 76\u00a0274\u00a0\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 <\/p>\n<\/li>\n<li>\n<p>The town on capital isle \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 193\u00a0485\u00a0\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 <\/p>\n<\/li>\n<li>\n<p>Bistro \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 2\u00a0829\u00a0238\u00a0\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 <\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\u00a0\u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0434\u0432\u0435 \u0438\u0437\u00a0\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0441\u0446\u0435\u043d \u043d\u0435\u00a0\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u043e\u0442\u00a0\u0441\u0446\u0435\u043d\u044b Bistro, \u043d\u043e\u00a0\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\u00a0\u0431\u044b\u043b \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043d \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/699\/5f3\/193\/6995f31933eab0f79c21c120991e7083.png\" alt=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \" title=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \" width=\"471\" height=\"220\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/699\/5f3\/193\/6995f31933eab0f79c21c120991e7083.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/699\/5f3\/193\/6995f31933eab0f79c21c120991e7083.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 <\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430\u00a0\u0440\u0438\u0441\u0443\u043d\u043a\u0435, \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0442\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0442\u0435\u043d\u0435\u0439 \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Cascaded Shadow Maps. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043d\u0430\u00a0\u0432\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/p>\n<p>\u041f\u0440\u0438\u00a0\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430\u00a0\u0441\u0446\u0435\u043d\u0435 \u00abBistro\u00bb \u0441\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048\u00d72048\u00a0\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432, \u0440\u0430\u0432\u043d\u044b\u043c 4,\u00a0\u0431\u044b\u043b\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u0430 69%:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb4\/20e\/273\/bb420e27311600aff896da96bb56a2d8.png\" alt=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abBistro\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" title=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abBistro\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" width=\"1391\" height=\"461\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bb4\/20e\/273\/bb420e27311600aff896da96bb56a2d8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb4\/20e\/273\/bb420e27311600aff896da96bb56a2d8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abBistro\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 <\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u00a0\u0441\u0446\u0435\u043d\u0430\u0445 \u00abThe Town on Capital Isle\u00bb \u0438 \u00abPica Pica\u00bb \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u0430 34% \u0438 27% \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u042d\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0446\u0435\u043d\u044b. \u0427\u0442\u043e\u00a0\u0438 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0442\u00a0\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0446\u0435\u043d\u044b:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b3f\/ccd\/2f8\/b3fccd2f8eb61cdb5864c670a0d60942.png\" alt=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abThe town on capital isle\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" title=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abThe town on capital isle\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" width=\"1397\" height=\"462\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b3f\/ccd\/2f8\/b3fccd2f8eb61cdb5864c670a0d60942.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b3f\/ccd\/2f8\/b3fccd2f8eb61cdb5864c670a0d60942.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abThe town on capital isle\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 <\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd1\/1da\/2a0\/cd11da2a025d1fa4715058ffa437047a.png\" alt=\"C\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abPica pica\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" title=\"C\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abPica pica\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 \" width=\"1388\" height=\"456\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cd1\/1da\/2a0\/cd11da2a025d1fa4715058ffa437047a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd1\/1da\/2a0\/cd11da2a025d1fa4715058ffa437047a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>C\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u00abPica pica\u00bb \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048 \u043d\u0430 2048 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 4 <\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u043d\u0438\u0436\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043e\u0442\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0435\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432. \u041a\u0430\u043a\u00a0\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445 \u043e\u0442\u00a0Intel \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/56a\/45e\/948\/56a45e9481b13158a618c1ef170b69fe.png\" alt=\"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0434\u043d\u043e\u0439 GPU \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e GPU \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0435\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \" title=\"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0434\u043d\u043e\u0439 GPU \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e GPU \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0435\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \" width=\"1135\" height=\"615\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/56a\/45e\/948\/56a45e9481b13158a618c1ef170b69fe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/56a\/45e\/948\/56a45e9481b13158a618c1ef170b69fe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0434\u043d\u043e\u0439 GPU \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e GPU \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0435\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 <\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00a0\u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432. \u041f\u043e\u00a0\u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u043d\u0438\u044e, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 2048\u00d72048\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041f\u0440\u0438\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u043e 4096\u00d74096\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps. <\/p>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u043a\u0430\u0436\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps \u043e\u0442\u00a0\u0441\u0446\u0435\u043d\u044b \u043d\u0430\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 AMD Radeon\u2122 Graphics. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u00a0\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0435\u00a0\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u00a0\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/374\/4dd\/bc3\/3744ddbc385076451123fbbe4f613629.png\" alt=\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 GPU \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0445 \" title=\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 GPU \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0445 \" width=\"1294\" height=\"562\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/374\/4dd\/bc3\/3744ddbc385076451123fbbe4f613629.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/374\/4dd\/bc3\/3744ddbc385076451123fbbe4f613629.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Cascaded Shadow Maps \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 GPU \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0445 <\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0435\u0439\u043b \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443\u2011\u0431\u0435\u043d\u0447\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 \u0441\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u043e\u0439 \u0438 \u0441\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u00a0TCP. \u0412\u0441\u0451\u00a0\u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e, \u043d\u043e\u00a0\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u00a0JSON \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0434\u0440\u0443\u0437\u0435\u0439, \u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0443. \u042f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e\u00a0\u0444\u043e\u0440\u043c\u0430\u0442 JSON \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432\u00a0Excel \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042f\u00a0\u0431\u044b \u043c\u043e\u0433 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b\u00a0\u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u0434\u0435\u0440\u0433\u0430\u0442\u044c \u0434\u0440\u0443\u0437\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0438\u0437\u00a0JSON \u0432\u00a0CSV. <\/p>\n<\/blockquote>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b 40%<\/p>\n<\/li>\n<li>\n<p>\u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0438\u0437\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>Screen\u2011space \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0434\u043b\u044f\u00a0\u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0412\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0434\u043b\u044f\u00a0\u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 CPU \u0438 GPU \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f DirectX 12\u00a0\u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 API \u0434\u043b\u044f\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0434\u043b\u044f\u00a0\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u041f\u041a<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0439\u0442\u0438 Issue, \u043a\u0438\u043d\u0443\u0442\u044c Pull Request, \u0444\u043e\u0440\u043a\u043d\u0443\u0442\u044c, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/if0ne\/fotia\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/904726\/\"> https:\/\/habr.com\/ru\/articles\/904726\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<blockquote>\n<p>TLDR: \u0412\u00a0\u0442\u0435\u043e\u0440\u0438\u0438\u00a0\u2014 \u0434\u0430, \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435\u00a0\u2014 \u043d\u0435\u0442.<\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0441\u0442\u0443\u0434\u0435\u043d\u0442 2\u00a0\u043a\u0443\u0440\u0441\u0430 \u043c\u0430\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u0443\u0440\u044b \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \u0418\u0422\u041c\u041e \u0444\u0430\u043a\u0443\u043b\u044c\u0442\u0435\u0442\u0430 \u00ab\u0428\u043a\u043e\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0438\u0434\u0435\u043e\u0438\u0433\u0440\u00bb. \u0412\u00a0\u0441\u0432\u043e\u0435\u0439 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u00ab<em>\u0410\u043d\u0430\u043b\u0438\u0437 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Shadow Mapping \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430 \u0434\u043b\u044f\u00a0\u0441\u0438\u0441\u0442\u0435\u043c \u0441\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 GPU<\/em>\u00bb \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 Cascaded Shadow Maps \u043d\u0430\u00a0\u0432\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b <strong>40% \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u043a\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e\u00a0\u044f \u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043b\u044e\u0431\u044b\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u043c\u043e\u0438\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0432\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<\/details>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p><span class=\"habrahidden\">\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u0442\u0435\u043d\u0438\u00a0\u2014 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u00a0\u0438\u0433\u0440\u0430\u0445, \u0432\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u041d\u0418\u0420, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/span><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e: \u0435\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430\u00a0\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 <a href=\"https:\/\/store.steampowered.com\/hwsurvey\/directx\/?sort=chg\" rel=\"noopener noreferrer nofollow\">Steam Survey<\/a>, \u0442\u043e \u0441\u0440\u0435\u0434\u0438\u00a0\u043b\u0438\u0434\u0435\u0440\u043e\u0432 \u043f\u043e\u00a0\u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0443\u00a0\u2014 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u043e\u0432. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0438 \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u00ab\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u00bb<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e\u0432\u0430\u044f\u00a0\u043b\u0438\u043d\u0435\u0439\u043a\u0430 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u043e\u0442\u00a0AMD \u0441\u0435\u0440\u0438\u0438 7XXX \u0438 9XXX \u043e\u0441\u043d\u0430\u0449\u0435\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443\u00a0\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443?<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, multi\u2011GPU \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0418\u0418, \u043d\u043e\u00a0\u0442\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442, \u0447\u0442\u043e\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f\u00a0\u0433\u0435\u0439\u043c\u0435\u0440\u0441\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0422\u0435\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u0434\u0432\u0443\u0445 GPU \u0432\u00a0\u0438\u0433\u0440\u0430\u0445 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c. <\/p>\n<h3>SLI \u0436\u0435 \u043c\u0435\u0440\u0442\u0432<\/h3>\n<p>\u0421\u0442\u0430\u0440\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043a\u00a0\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043e\u0442\u00a0Nvidia\u00a0\u0431\u044b\u043b <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Nvidia_SLI\" rel=\"noopener noreferrer nofollow\">SLI<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 2018\u00a0\u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/NVLink\" rel=\"noopener noreferrer nofollow\">NVLink Bridge<\/a>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u00a0AMD\u00a0\u2014 CrossFireX. \u042d\u0442\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0438 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0438\u043c \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. NVLink \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043d\u0430\u0445\u043e\u0434\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u00a0\u0432\u00a0\u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 (Quadro, Tesla), \u0442\u0430\u043a \u0438 \u0432\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 (GeForce) \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0443\u00a0\u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432\u00a0\u0431\u044b\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043e\u0442\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044f\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 multi\u2011GPU \u0432\u00a0\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 API, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a\u00a0DirectX 12\u00a0\u0438 Vulkan. \u0412 2015\u00a0\u0433\u043e\u0434\u0443 Microsoft <a href=\"https:\/\/devblogs.microsoft.com\/directx\/directx-12-multiadapter-lighting-up-dormant-silicon-and-making-it-work-for-you\/\" rel=\"noopener noreferrer nofollow\">\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u043b\u0430<\/a> Explicit Multi\u2011GPU \u043a\u0430\u043a \u00ab\u043a\u0438\u043b\u043b\u0435\u0440 \u0444\u0438\u0447\u0443\u00bb DirectX 12. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435. <\/p>\n<h3>\u0418\u043c\u0435\u0435\u0442 \u043b\u0438 \u0441\u043c\u044b\u0441\u043b multi-GPU?<\/h3>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u043b\u0438\u0437\u043a\u0443\u044e \u043a\u00a0\u043c\u043e\u0435\u0439 \u0442\u0435\u043c\u0435: \u00ab<a href=\"https:\/\/andrewcjp.wordpress.com\/tag\/multi-gpu\/\" rel=\"noopener noreferrer nofollow\">Techniques for the utilization of heterogenous multi\u2011GPU configurations in realtime rendering<\/a>\u00bb. \u0412\u00a0\u043d\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0410\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Alternate Frame Rendering, Split Frame Rendering \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 Shadow Map \u0434\u043b\u044f\u00a0\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e GPU. <\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432\u00a0\u2014 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0434\u0440\u0430. \u041f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0441\u00a0\u0440\u0430\u0437\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u00a0\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c \u0438\u0437\u2011\u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u044f \u043d\u0435\u00a0\u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d:<\/p>\n<blockquote>\n<p><em>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430.<\/em><\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u0435\u0440\u043d\u043e. \u041d\u043e\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0434\u0440\u0430.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>\u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445<\/strong>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440, \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 16.6\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u041d\u0430\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0436\u0434\u0443 GPU \u043f\u0440\u0438\u00a0\u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u043a\u0430\u0440\u0442 \u0442\u0435\u043d\u0435\u0439 \u0434\u043b\u044f 4\u00a0\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430. \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0434\u0440\u0430 \u043e\u043a\u043e\u043b\u043e 18\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447 multi\u2011GPU \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0410\u0432\u0442\u043e\u0440 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u042d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0432\u0435\u0434\u044c \u043f\u0440\u0438\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445<\/figcaption><\/div>\n<\/figure>\n<h2>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0443 <a href=\"https:\/\/github.com\/o3de\/sig-graphics-audio\/discussions\/32\" rel=\"noopener noreferrer nofollow\">o3de \u0434\u0432\u0438\u0436\u043a\u0430<\/a>.<\/p>\n<h3>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c 2\u00a0\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f <em>\u00ab\u041e\u0434\u0438\u043d Device \u043a\u00a0\u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443\u00bb (1:1) <\/em>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0434\u0432\u0438\u0436\u043a\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 multi\u2011GPU \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043c\u0435\u0448\u0435\u0439, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><em>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u00ab\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Device\u00bb\u043e\u0432 \u043a\u00a0\u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443\u00bb (1:N) <\/em>\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0440\u0435\u0441\u0443\u0440\u0441 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u00a0\u0441\u0435\u0431\u044f \u043f\u043e\u0434\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c API \u0438 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u2011\u0434\u0432\u0438\u0436\u043a\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<h3>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/h3>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f<em> \u00abRenderGraph \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u00bb <\/em>\u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e\u00a0\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441\u0446\u0435\u043d \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0435 viewport. \u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 1:N<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f<em> \u00ab\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 RenderPass\u00bb\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438<\/em>\u00bb \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0438\u043b\u0438\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 RenderPass, \u0438 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0RenderGraph \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0414\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044b 1:1\u00a0\u0438 1:N<\/p>\n<\/li>\n<li>\n<p><em>\u00ab\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e RenderPass\u00bb\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438\u00bb<\/em>\u00a0\u2014 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 Split Frame Rendering, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 RenderPass\u00bb\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<h3>\u041a\u0430\u043a \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438?<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0432\u0443\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u0438\u043a \u0448\u0435\u0439\u0434\u0438\u043d\u0433\u0430\u00a0\u2014 <a href=\"https:\/\/www.3dgep.com\/forward-plus\/\" rel=\"noopener noreferrer nofollow\">forward \u0438 deferred<\/a>, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>Multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 Forward Rendering<\/h4>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 <em>Forward Rendering <\/em>\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 Cascaded Shadow Maps (CSM) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435, \u0430\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u00a0\u2014 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439.<\/p>\n<p>\u041d\u0430\u00a0\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0442\u0435\u0440\u043c\u0438\u043d \u00ab<em>Cross Resource<\/em>\u00bb \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Forward Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Forward Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <\/strong>\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0442\u0435\u0445\u043d\u0438\u043a\u0430 Forward Rendering \u043d\u0435\u00a0\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u00a0multi\u2011GPU \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0438\u0439 \u044d\u0442\u0430\u043f Forward Pass, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u00a0\u0432\u0441\u0435\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0432\u0435\u0442\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0441\u0446\u0435\u043d\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <\/strong>\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0434\u043b\u044f\u00a0Forward Rendering, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 multi\u2011GPU. \u0414\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0432\u043d\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u0430\u043a\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432\u00a0\u043e\u0434\u0438\u043d \u043a\u0430\u0434\u0440 \u0438\u0437\u2011\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 multi\u2011GPU \u0434\u043b\u044f\u00a0Shadow Mapping \u0432\u00a0Forward Rendering \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u043e\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u0430\u043a\u00a0\u0432\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0438\u0437\u2011\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<h4>Multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 Deferred Rendering<\/h4>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <em>Deferred Rendering<\/em>, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0445 \u0442\u0435\u043d\u0435\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u0412\u00a0\u0442\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u044b geometry pass, light pass (\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430) \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, SSAO:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Deferred Rendering \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Shadow Mapping \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432<br \/> Deferred Rendering \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c CSM \u043d\u0430\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442.<\/p>\n<p>\u0421\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 multi\u2011GPU \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e: multi-GPU Shadow Mapping with Shadow Mask<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u0432 \u0441\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 4096\u00d74096\u00a0\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 256\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0412\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 PCI\u2011e 4.0\u00a0\u0441 16\u00a0\u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0434\u043e 32\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0\u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0445 \u0442\u0435\u043d\u0435\u0439:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 multi-GPU Screen-Space Shadow Mapping<br \/> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b Shadow Mask \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u00a0\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c \u0438\u0437\u00a0Shadow Mask, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0435\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-459554","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459554","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=459554"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459554\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=459554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=459554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=459554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}