{"id":383400,"date":"2024-06-29T04:53:25","date_gmt":"2024-06-29T04:53:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=383400"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=383400","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0433\u0440 \u043d\u0430 Go: \u0448\u0435\u0439\u0434\u0435\u0440\u044b<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u0432\u043d\u0435\u043d\u044c\u043a\u043e \u044f \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435.<\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0440\u0438\u044e \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e <a href=\"https:\/\/t.me\/go_gamedev\" rel=\"nofollow noopener noreferrer\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440 \u043d\u0430 Go<\/a> \u0438 \u043d\u0430\u0447\u0430\u043b \u044f \u0441 <a href=\"https:\/\/habr.com\/ru\/articles\/671556\/\">\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0442\u0435\u043a\u0441\u0442\u0430<\/a>, \u043d\u043e \u043c\u0435\u043d\u044f \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0434\u0430\u0436\u0435 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u043a\u0441\u0442. \u0427\u0442\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u0432\u0435\u0434\u044c \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u044f \u0443\u0441\u043f\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0433\u0440\u0443\u0448\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A8%D0%B5%D0%B9%D0%B4%D0%B5%D1%80\" rel=\"nofollow noopener noreferrer\">\u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445<\/a> \u0432 <a href=\"https:\/\/github.com\/hajimehoshi\/ebiten\" rel=\"nofollow noopener noreferrer\">Ebitengine<\/a>. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 <a href=\"https:\/\/quasilyte.itch.io\/roboden\" rel=\"nofollow noopener noreferrer\">Roboden<\/a> \u0438 <a href=\"https:\/\/quasilyte.itch.io\/decipherism\" rel=\"nofollow noopener noreferrer\">Decipherism<\/a> (\u043e\u0431\u0435 \u0438\u0433\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0438\u0445 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435).<\/p>\n<p>  <img decoding=\"async\" title=\"\u041d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0432\u0438\u0434\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0432\u0441\u0435\u0445\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fq\/jg\/ed\/fqjgedeltwlgpfj8h4s6v895r_8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fq\/jg\/ed\/fqjgedeltwlgpfj8h4s6v895r_8.png\"\/><a name=\"habracut\"><\/a><\/p>\n<h2 id=\"korotko-o-tom-chto-takoe-sheydery\">\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b<\/h2>\n<p>  <\/p>\n<p>\u042f \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e <a href=\"https:\/\/thebookofshaders.com\/01\/?lan=ru\" rel=\"nofollow noopener noreferrer\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445<\/a> (\u043e\u043d\u0438 \u0436\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435), \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 Ebitengine.<\/p>\n<p>  <\/p>\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u041d\u0430 \u043a\u0430\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435 \u044f\u0437\u044b\u043a\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0432\u0438\u0436\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u044c \u043e\u0442 \u0432\u0430\u0441 \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u043e\u0433\u043e, \u043f\u043e\u0434 \u043a\u0430\u043a\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 (\u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 alpha-\u043a\u0430\u043d\u0430\u043b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 0.5, \u0434\u0435\u043b\u0430\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c. \u0428\u0435\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u043c\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u044b, \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043d\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e: \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u043e\u043b\u043d\u044b, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"motivaciya\">\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0410 \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u044b \u0448\u0435\u0439\u0434\u0435\u0440\u044b? \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f alpha-\u043a\u0430\u043d\u0430\u043b\u0430 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0432\u043e\u043b\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0434\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0430\u0432\u0434\u0430: \u0437\u0430\u0434\u0430\u0447\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0438 \u0431\u0435\u0437 \u043d\u0438\u0445. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/li>\n<li>\u041e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b, \u0447\u0435\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b<\/li>\n<li>\u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439, \u0447\u0435\u043c \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u0447 \u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041c\u044b \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0436\u0438\u0437\u043d\u044c \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>  <\/p>\n<h2 id=\"raund-1-otobrazhenie-povrezhdeniy-na-obektah\">\u0420\u0430\u0443\u043d\u0434 1: \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u0437\u0434\u0430\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0434\u0430\u043d\u0438\u044f. \u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0440\u0430\u0439\u0442\u044b \u0437\u0434\u0430\u043d\u0438\u0439, \u0432\u0438\u0434 \u0441\u0432\u0435\u0440\u0445\u0443, \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0421\u043f\u0440\u0430\u0439\u0442\u044b \u043d\u0430\u0448\u0438\u0445 \u0437\u0434\u0430\u043d\u0438\u0439\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qo\/cd\/65\/qocd65hehbqrqncecv-fuace2is.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qo\/cd\/65\/qocd65hehbqrqncecv-fuace2is.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0451\u0442 \u043c\u0430\u0441\u043a\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0437\u0434\u0430\u043d\u0438\u044f? \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442, \u0443 \u044d\u0442\u043e\u0439 \u043c\u0430\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c. \u041f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u0430\u043b\u044c\u0444\u0430-\u043a\u0430\u043d\u0430\u043b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0438 \u043c\u0430\u0441\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0439.<\/p>\n<p>  <img decoding=\"async\" title=\"4 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u043a\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xf\/2d\/wl\/xf2dwlbrgjik6x7y-oez4jtaxs4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/xf\/2d\/wl\/xf2dwlbrgjik6x7y-oez4jtaxs4.png\"\/>  <\/p>\n<blockquote><p>\u042f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043c\u0430\u0441\u043a\u0443 \u0438 \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u043b \u0435\u0451 \u0448\u0430\u0433\u043e\u043c \u0432 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 4 \u0441\u043f\u0440\u0430\u0439\u0442\u0430.<\/p><\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0445. \u041f\u0443\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0440\u043e\u043d\u0430 \u0440\u0430\u0432\u043d\u043e ~100% \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u043a\u0438 \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u041d\u0430\u043b\u043e\u0436\u0438\u043b\u0438 \u043c\u0430\u0441\u043a\u0443 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u044b\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/aj\/c3\/uu\/ajc3uuhcrywvxeao_vjbmkwaaws.png\" data-src=\"https:\/\/habrastorage.org\/webt\/aj\/c3\/uu\/ajc3uuhcrywvxeao_vjbmkwaaws.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e: \u0442\u0430\u043a\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u044e\u0434\u0438 \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u044e\u0442, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u0442\u044c \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0438\u0441\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0435 \u043c\u0430\u0441\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u043f\u043e\u0434 \u0441\u043f\u0440\u0430\u0439\u0442.<\/li>\n<li>\u0418\u043b\u0438, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0432\u0435\u0437\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u0432\u0435\u0437\u0434\u0435.<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0440\u0435\u0436\u0438\u043c\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 (<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/CanvasRenderingContext2D\/globalCompositeOperation\" rel=\"nofollow noopener noreferrer\">composite mode<\/a>) \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440, \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0448\u0435\u0439\u0434\u0435\u0440, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  var HP float \/\/ \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f, \u043e\u0442 0 \u0434\u043e 1  func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     c := imageSrc0At(texCoord)    \/\/ \u041f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437 \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0437\u0434\u0430\u043d\u0438\u044f     mask := imageSrc1At(texCoord) \/\/ \u041f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437 \u043c\u0430\u0441\u043a\u0438     if c.a != 0.0 &amp;&amp; mask.a != 0.0 {         a := clamp(HP+(1.0-mask.a), 0.0, 1.0)         \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u043e\u043b\u0435\u0435 \u0442\u0451\u043c\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u0440\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f\u0445.         return vec4(c.r*a, c.g*a, c.b*a, c.a)     }     return c \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u0443 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (Src0)<\/li>\n<li>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 (Src1)<\/li>\n<li>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 HP \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/eq\/ht\/gi\/eqhtgiutnpeqyx6igdilz0mqgri.png\" data-src=\"https:\/\/habrastorage.org\/webt\/eq\/ht\/gi\/eqhtgiutnpeqyx6igdilz0mqgri.png\"\/>  <\/p>\n<p>  <\/p>\n<p>Src0 \u0438 Src1 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0438\u0437 Src0 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437 Src1. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437 Src0 \u0438 Src1 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u044b\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uo\/kc\/qn\/uokcqnu6jgp6ocxk37fkog_qfik.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uo\/kc\/qn\/uokcqnu6jgp6ocxk37fkog_qfik.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 <code>c.a<\/code>, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0432 \u044d\u0442\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<h2 id=\"o-yazyke-sheyderov-kage\">\u041e \u044f\u0437\u044b\u043a\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 Kage<\/h2>\n<p>  <\/p>\n<p>\u0412\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0448\u0435\u0439\u0434\u0435\u0440 \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 Go-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435?<\/p>\n<p>  <\/p>\n<p>\u0412 Ebitengine \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Kage, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0432\u0438\u0436\u043a\u0430. Kage \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0438\u0442 Go-\u043a\u043e\u0434, \u0430 \u0437\u0430\u0442\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u043c \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043c\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#if defined(GL_ES) precision highp float; #else #define lowp #define mediump #define highp #endif  int modInt(int x, int y) {     return x - y*(x\/y); }  uniform vec2 U0; uniform vec2 U1[4]; \/\/ ... \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 uniform-\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439.  varying vec2 V0; varying vec4 V1;  vec4 F5(in vec2 l0); vec4 F7(in vec2 l0); vec4 F12(in vec4 l0, in vec2 l1, in vec4 l2);  vec4 F5(in vec2 l0) { \/* ... *\/ }  vec4 F7(in vec2 l0) { \/* ... *\/ }  vec4 F12(in vec4 l0, in vec2 l1, in vec4 l2) {     vec4 l3 = vec4(0);     vec4 l4 = vec4(0);     l3 = F5(l1);     l4 = F7(l1);     if ((((l3).a) != (0.0)) &amp;&amp; (((l4).a) != (0.0))) {         float l5 = float(0);         l5 = clamp((U8) + ((1.0) - ((l4).a)), 0.0, 1.0);         return vec4(((l3).r)*(l5), ((l3).g)*(l5), ((l3).b)*(l5), (l3).a);     }     return l3; }  void main(void) {     gl_FragColor = F12(gl_FragCoord, V0, V1); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0434\u043b\u044f Go \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0442\u043e\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ func F0() (int, int) { return 1, 2 } void F0(out int l0, out int l1) {     l0 = 1;     l1 = 2;     return; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0451 \u043c\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0447\u0451\u0442 Kage \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, Kage \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u043a\u0430\u043a \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u0442\u0430\u043c \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043b\u044e\u0441\u044b Kage:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0443 Go: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 gofmt, \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, go to definition<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0434\u043b\u044f Go \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0442\u0438\u043f\u0430 multi-value return.<\/li>\n<li>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/li>\n<li>Kage-\u0441\u043b\u043e\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0432\u0438\u0436\u043a\u0443 \u043b\u0443\u0447\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u044b (\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f).<\/li>\n<li>\u042d\u0442\u043e \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0438\u0442 \u0441\u043c\u0435\u0448\u043d\u043e, \u043d\u043e Kage \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0430 Ebitengine \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b Kage:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u044b; \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430 Kage.<\/li>\n<li>\u041c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432<\/li>\n<li>\u041c\u0435\u043d\u044c\u0448\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u0433\u043e \u0442\u0443\u043b\u0438\u043d\u0433\u0430 (\u0436\u0434\u0443 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u0442 <a href=\"https:\/\/github.com\/sedyh\/\" rel=\"nofollow noopener noreferrer\">\u0410\u0440\u0442\u0451\u043c\u0430<\/a>).<\/li>\n<li>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c Kage \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e Kage, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>Fragment()<\/code>, \u0435\u0451 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/li>\n<li>\u0415\u0441\u0442\u044c \u0442\u0438\u043f\u044b <code>int<\/code>, <code>float<\/code>, <code>vec2<\/code>, <code>vec4<\/code><\/li>\n<li>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0438\u043f\u0430 <code>distance()<\/code>, <code>clamp()<\/code> \u0438 <code>imageSrc0At()<\/code><\/li>\n<li>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435)<\/li>\n<li>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0444\u0438\u0447\u0438 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/ebitengine.org\/en\/documents\/shader.html#Swizzling\" rel=\"nofollow noopener noreferrer\">\u0441\u0432\u0438\u0437\u0437\u043b\u0438\u043d\u0433\u0430<\/a><\/li>\n<li>\u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 <code>*<\/code> \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 (<code>vec2<\/code>, <code>vec4<\/code>)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>vec2<\/code> (x, y), \u0446\u0432\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 <code>vec4<\/code> (r, g, b, a).<\/p>\n<p>  <\/p>\n<h2 id=\"podklyuchenie-sheydera-k-izobrazheniyu\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e<\/h2>\n<p>  <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>Sprite<\/code>. \u041e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten\/v2#Image\" rel=\"nofollow noopener noreferrer\"><code>*ebiten.Image<\/code><\/a> \u0438, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">type Sprite struct {     x, y float64      img *ebiten.Image      shader        *ebiten.Shader     shaderTexture *ebiten.Image     shaderParams  map[string]any }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0431\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Sprite) Draw(dst *ebiten.Image) {     var options ebiten.DrawImageOptions     options.GeoM.Translate(s.x, s.y)     dst.DrawImage(s.img, &amp;options) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0432 \u0441\u0432\u043e\u0451\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten#Game\" rel=\"nofollow noopener noreferrer\"><code>game.Draw<\/code><\/a> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>Sprite.Draw()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (s *Sprite) Draw(dst *ebiten.Image) {     \/\/ \u0415\u0441\u043b\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043d\u0435\u0442, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.     if s.shader == nil {         var options ebiten.DrawImageOptions         options.GeoM.Translate(s.x, s.y)         dst.DrawImage(s.img, &amp;options)         return     }     \/\/ \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 options-\u0442\u0438\u043f.     var options ebiten.DrawRectShaderOptions     options.GeoM.Translate(s.x, s.y)     options.Images[0] = s.img           \/\/ Src0     options.Images[1] = s.shaderTexture \/\/ Src1     options.Uniforms = s.shaderParams     b := s.img.Bounds()     drawDest.DrawRectShader(b.Dx(), b.Dy(), s.shader, &amp;options) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0434\u0430 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0442\u0430\u043c \u043d\u0435\u0442. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten\/v2#DrawRectShaderOptions\" rel=\"nofollow noopener noreferrer\"><code>DrawRectShaderOptions<\/code><\/a> \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten\/v2#Image.DrawRectShader\" rel=\"nofollow noopener noreferrer\"><code>DrawRectShader()<\/code><\/a> \u0432\u043c\u0435\u0441\u0442\u043e <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten\/v2#Image.DrawImage\" rel=\"nofollow noopener noreferrer\"><code>DrawImage()<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f <code>s.shaderParams<\/code> \u0438 <code>s.shaderTexture<\/code>? \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u0438\u0445 \u0437\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u043c \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">type ShaderParams struct {     Compiled *ebiten.Shader     Uniforms map[string]any     Src1     *ebiten.Image     \/\/ ... \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044f Src2, Src3 }  func (s *Sprite) SetShader(params ShaderParams) {     s.shader = params.Compiled     s.shaderParams = params.Uniforms     s.shaderTexture = params.Src1 }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten\/v2#Shader\" rel=\"nofollow noopener noreferrer\"><code>*ebiten.Shader<\/code><\/a> \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u0444\u0444\u0435\u043a\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 <code>*ebiten.Image<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a <code>Src1<\/code>. \u0410 \u0432\u043e\u0442 &#171;\u0434\u0430\u043d\u043d\u044b\u0435&#187; (uniforms) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u043e\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a <code>map<\/code> \u2014 \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 <code>Sprite<\/code>. \u042d\u0442\u0438\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043f\u0440\u0430\u0439\u0442 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func (b *Building) Init() {     b.shaderData = map[string]any{\"HP\": 1.0}     b.sprite = NewSprite()     b.sprite.SetShader(damageShader, damageMask, b.shaderData) }  func (b *Building) OnDamage(damage float64) {     b.hp -= damage     if b.hp &lt;= 0 {         b.destroy()         return     }     \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0448\u0435\u0439\u0434\u0435\u0440\u0430.     \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e float32.     \/\/ \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u0430 int, float32 \u0438 []float32, \u043d\u043e \u043d\u0435 float64.     b.shaderData[\"HP\"] = float32(b.hp \/ b.maxHP) }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>damageShader<\/code> \u2014 \u044d\u0442\u043e <code>*ebiten.Shader<\/code>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440-\u0441\u043d\u0438\u043f\u043f\u0435\u0442\u0430<\/li>\n<li><code>damageMask<\/code> \u2014 \u044d\u0442\u043e <code>*ebiten.Image<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0430\u0441\u043a\u0443 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439<\/li>\n<li><code>b.shaderData<\/code> \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 <code>Building<\/code>, \u0430 \u0448\u0435\u0439\u0434\u0435\u0440 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0438\u0448\u044c \u0447\u0438\u0442\u0430\u0435\u0442<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0434\u0430\u043d\u043d\u044b\u0435. \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u043b\u0438 \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043b\u0438\u0431\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0447\u0435\u0440\u0435\u0437 <code>go:embed<\/code>. \u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0430\u0439\u0442\u0438\u043a\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/pkg.go.dev\/github.com\/hajimehoshi\/ebiten#NewShader\" rel=\"nofollow noopener noreferrer\"><code>ebiten.NewShader()<\/code><\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"raund-2-pick-effekt\">\u0420\u0430\u0443\u043d\u0434 2: pick-\u044d\u0444\u0444\u0435\u043a\u0442<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0448\u0440\u0438\u0444\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a \u0447\u0442\u043e-\u0442\u043e \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e. \u041d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0441\u0442\u0438\u0447\u044c \u044d\u0442\u043e\u0439 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043d\u043e \u044f \u0432 \u0438\u0433\u0440\u0435 <a href=\"https:\/\/quasilyte.itch.io\/decipherism\" rel=\"nofollow noopener noreferrer\">Decipherism<\/a> \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u0438 \u0431\u0435\u0437\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/n1\/k-\/yk\/n1k-yk7m4ggcr1j4fzlhxkeoluc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/n1\/k-\/yk\/n1k-yk7m4ggcr1j4fzlhxkeoluc.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b):<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Fragment(_ vec4, texCoord vec2, _ vec4) vec4<\/code><\/pre>\n<p>  <\/p>\n<p><code>texCoord<\/code> \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 (source) \u0434\u043b\u044f \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (destination).<\/p>\n<p>  <\/p>\n<p>\u041e \u0442\u0435\u043a\u0441\u0435\u043b\u044f\u0445 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 0 \u0434\u043e 1. \u0423\u0441\u043b\u043e\u0432\u043d\u043e, \u0435\u0441\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 500 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0442\u043e 0.5 \u0442\u0435\u043a\u0441\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 250 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>imageSrc0At()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <strong>\u0442\u0435\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435<\/strong> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439? \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>Ebitengine \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0447\u0435\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">\/\/ tex2pixCoord \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0442\u0435\u043a\u0441\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 texCoord \/\/ \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0430\u0442\u043b\u0430\u0441\u0435. func tex2pixCoord(texCoord vec2) vec2 {     pixSize := imageSrcTextureSize()     originTexCoord, _ := imageSrcRegionOnTexture()     actualTexCoord := texCoord - originTexCoord     actualPixCoord := actualTexCoord * pixSize     return actualPixCoord }<\/code><\/pre>\n<p>  <\/p>\n<p>Ebitengine \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0430\u0442\u043b\u0430\u0441\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0448 source image \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c origin \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0442\u0430\u043a\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0435\u043b\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b;<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u0434 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438;<\/li>\n<li>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0432 \u0442\u0435\u043a\u0441\u0435\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u0444\u0438\u043d\u0430\u043b\u0435.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0448\u0430\u0433\u0430 \u043d\u0443\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f <code>tex2pixCoord()<\/code> \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func pix2texCoord(actualPixCoord vec2) vec2 {     pixSize := imageSrcTextureSize()     actualTexCoord := actualPixCoord \/ pixSize     originTexCoord, _ := imageSrcRegionOnTexture()     texCoord := actualTexCoord + originTexCoord     return texCoord }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 <a href=\"https:\/\/docs.gimp.org\/2.10\/nl\/gimp-filter-noise-pick.html\" rel=\"nofollow noopener noreferrer\">pick<\/a>. \u042f \u043c\u043e\u0433\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func applyPixPick(pixCoord vec2, dist float, m, hash int) vec2 {     \/\/ dist - \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c;     \/\/ dir - \u043a\u0443\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c.     \/\/ \u0412 Kage (\u044f\u0437\u044b\u043a \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432) \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 switch,     \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c if\/else.     dir := hash % m     \/\/ \u0415\u0441\u043b\u0438 \u044f\u0432\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u043a int, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430     \/\/ \"operands of `==' must have the same type\",     \/\/ \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Ebitengine \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u0438\u0442\u0435\u0440\u0430\u043b 0 \u0432 0.0     \/\/ \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u0438\u043f\u043e\u043c float.     if dir == int(0) {         pixCoord.x += dist     } else if dir == int(1) {         pixCoord.x -= dist     } else if dir == int(2) {         pixCoord.y += dist     } else if dir == int(3) {         pixCoord.y -= dist     }     \/\/ \u0410 \u0438\u043d\u0430\u0447\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c.     return pixCoord }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>m<\/code>, \u0442\u0435\u043c \u0447\u0430\u0449\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d.<\/p><\/blockquote>\n<p>\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u0430 \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u0442\u044c <code>hash<\/code>? \u041f\u043e \u0438\u0434\u0435\u0435, \u044d\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ\" rel=\"nofollow noopener noreferrer\"><code>rand()<\/code><\/a> \u0432\u043d\u0443\u0442\u0440\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func shaderRand(pixCoord vec2) int {     return int(pixCoord.x+pixCoord.y) * int(pixCoord.y*5) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0435\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u044b\u0440\u0430\u0437\u0438\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     c := imageSrc0At(texCoord)     actualPixCoord := tex2pixCoord(texCoord)     if c.a != 0.0 {         h := shaderRand(actualPixCoord)         p := applyPixPick(actualPixCoord, 1.0, 15, h)         return imageSrc0At(pix2texCoord(p))     }     return c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u043d\u0430\u043c\u0438 pick-\u044d\u0444\u0444\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<h2 id=\"raund-3-effekt-crt-displeya\">\u0420\u0430\u0443\u043d\u0434 3: \u044d\u0444\u0444\u0435\u043a\u0442 CRT-\u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/h2>\n<p>  <\/p>\n<p>\u0412 <a href=\"https:\/\/quasilyte.itch.io\/decipherism\" rel=\"nofollow noopener noreferrer\">Decipherism<\/a> \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0431\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 \u0440\u0435\u0442\u0440\u043e. \u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0445\u0435\u043c\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043a\u0438\u0439 \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" src=\"https:\/\/habrastorage.org\/webt\/zw\/13\/9r\/zw139rxmwe6fvvlhxl861pdfje8.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/zw\/13\/9r\/zw139rxmwe6fvvlhxl861pdfje8.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5g\/m5\/nv\/5gm5nvpsn3ruarhtyvsxtl_aony.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5g\/m5\/nv\/5gm5nvpsn3ruarhtyvsxtl_aony.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u0432\u0435\u0434\u0451\u043c \u0434\u0432\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Tick<\/code> \u2014 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0435 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/li>\n<li><code>Seed<\/code> \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0432\u043e\u0439 \u0441\u0438\u0434 \u0434\u043b\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>shaderRand()<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func shaderRand(pixCoord vec2) (seedMod, randValue int) {     pixSize := imageSrcTextureSize()     pixelOffset := int(pixCoord.x) + int(pixCoord.y*pixSize.x)     seedMod = pixelOffset % int(Seed)     pixelOffset += seedMod     return seedMod, pixelOffset + int(Seed) }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><code>seedMod<\/code> \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438.<\/p><\/blockquote>\n<p>\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u0438\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043c\u0435\u0445\u0438. \u042f \u0431\u044b \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442 <a href=\"https:\/\/docs.gimp.org\/2.10\/en\/gimp-filter-video-degradation.html\" rel=\"nofollow noopener noreferrer\">video degradation<\/a>, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func applyVideoDegradation(y float, c vec4) vec4 {     if c.a != 0.0 {         \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 4-\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u043e \u043e\u0441\u0438 Y \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0435\u043d\u0451\u043d.         if int(y+Tick)%4 != int(0) {             return c * 0.6         }     }     return c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Fragment(pos vec4, texCoord vec2, _ vec4) vec4 {     c := imageSrc0At(texCoord)      actualPixCoord := tex2pixCoord(texCoord)     if c.a != 0.0 {         seedMod, h := shaderRand(actualPixCoord)         dist := 1.0         if seedMod == int(0) {             dist = 2.0         }         p := applyPixPick(actualPixCoord, dist, 5, h)         return applyVideoDegradation(pos.y, imageSrc0At(pix2texCoord(p)))     }      return c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>pos<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c (destination) \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f \u0438\u0437\u0431\u0435\u0433\u0430\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 source \u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u043e\u043b\u043d\u044b \u043f\u043e\u043c\u0435\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0443\u0442 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0430 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0430-\u043d\u0430\u043b\u0435\u0432\u043e, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<h2 id=\"raund-4-ciklichnaya-animaciya-tekstury\">\u0420\u0430\u0443\u043d\u0434 4: \u0446\u0438\u043a\u043b\u0438\u0447\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b<\/h2>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u044d\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043b\u0443\u0447\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043b\u0430\u0437\u0435\u0440\u0430\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ej\/uq\/d2\/ejuqd2gdaviqspfyk1z4ler1cs8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ej\/uq\/d2\/ejuqd2gdaviqspfyk1z4ler1cs8.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u2026 \u0438 \u043d\u0430\u0447\u043d\u0451\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0435\u0451 \u043f\u043e \u043e\u0441\u0438 X:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u041b\u0430\u0437\u0435\u0440 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c 1\" src=\"https:\/\/habrastorage.org\/webt\/eu\/wy\/lh\/euwylhgbj0jb5q5pe2gbtxvm_pw.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/eu\/wy\/lh\/euwylhgbj0jb5q5pe2gbtxvm_pw.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u041b\u0430\u0437\u0435\u0440 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c 2\" src=\"https:\/\/habrastorage.org\/webt\/wt\/cl\/fm\/wtclfmg0rico_9la1n0oqbfl_w0.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/wt\/cl\/fm\/wtclfmg0rico_9la1n0oqbfl_w0.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">var Time float  func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     pixSize := imageSrcTextureSize()     _, srcRegion := imageSrcRegionOnTexture()     width := pixSize.x * srcRegion.x     actualPixCoord := tex2pixCoord(texCoord)     p := vec2(slide(actualPixCoord.x, width), actualPixCoord.y)     return imageSrc0At(pix2texCoord(p)) }  func slide(v, size float) float {     return mod(v-(100*Time), size) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/se\/qw\/o2\/seqwo2qrzblwbv5dafni5trc344.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/se\/qw\/o2\/seqwo2qrzblwbv5dafni5trc344.gif\"\/>  <\/p>\n<blockquote><p>\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>Time<\/code>.<\/p><\/blockquote>\n<p>\u042d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0446\u0438\u043a\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u043a\u0438\u043c \u0438\u0437-\u0437\u0430 \u0433\u0440\u0443\u0431\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043d\u0446\u0430\u0445 \u043e\u0442\u0440\u0435\u0437\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432\u044b\u0448\u0435, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     pixSize := imageSrcTextureSize()     _, srcRegion := imageSrcRegionOnTexture()     width := pixSize.x * srcRegion.x     actualPixCoord := tex2pixCoord(texCoord)     p := vec2(slide(actualPixCoord.x, width), actualPixCoord.y)      c := imageSrc0At(pix2texCoord(p))     const cutoffThreshold = 10.0     if actualPixCoord.x &lt;= cutoffThreshold {         c *= actualPixCoord.x * 0.1     } else if actualPixCoord.x >= (width - cutoffThreshold) {         c *= (width - actualPixCoord.x) * 0.1     }      return c }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0427\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0430\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0430, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u0448\u0435\u0439\u0434\u0435\u0440? \u041f\u043b\u0430\u043d\u0435\u0442\u044b. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/kx\/y9\/mo\/kxy9moqosqov78akosruiifoql0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/kx\/y9\/mo\/kxy9moqosqov78akosruiifoql0.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435, \u043d\u043e \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043d\u0438 \u0438 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">var Time float  func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     _, srcRegion := imageSrcRegionOnTexture()     pixSize := imageSrcTextureSize()     sizes := pixSize * srcRegion     width := sizes.x     height := sizes.y     actualPixCoord := tex2pixCoord(texCoord)      \/\/ \u0422\u043e, \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 (32) \u043c\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.     \/\/ \u0422\u0430\u043a \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0437 \u0432\u0441\u0435\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c.     const planetSize = 64.0     center := vec2(width, height) * 0.5     if distance(center, actualPixCoord) > planetSize {         return vec4(0)     }      \/\/ \u0421\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u043b\u0435\u0432\u0435\u0435 \u0438 \u0432\u044b\u0448\u0435 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430.     lightPos := vec2(center.x*0.85, center.y*0.9)     lightDist := distance(lightPos, actualPixCoord) \/ planetSize     colorMultiplier := vec4(1, 1, 1, 1)     \/\/ \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043e\u0442 \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0442\u0435\u043c \u0442\u0435\u043c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0446\u0432\u0435\u0442.     colorMultiplier.xyz *= clamp(1.8-lightDist*1.6, 0.0, 1.0)      \/\/ \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u043d\u0430\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e.     p := vec2(slide(actualPixCoord.x, width), actualPixCoord.y)     return imageSrc0At(pix2texCoord(p)) * colorMultiplier }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n9\/zi\/qs\/n9ziqsfxvnbx3zikgdjvtqpdto4.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/n9\/zi\/qs\/n9ziqsfxvnbx3zikgdjvtqpdto4.gif\"\/>  <\/p>\n<h2 id=\"raund-5-effekt-postroeniya-zdaniya\">\u0420\u0430\u0443\u043d\u0434 5: \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0437\u0434\u0430\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0412 <a href=\"https:\/\/quasilyte.itch.io\/roboden\" rel=\"nofollow noopener noreferrer\">Roboden<\/a> \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0430\u0437\u044b \u0438 \u0442\u0443\u0440\u0435\u043b\u0438. \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0433\u0440\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u0434\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u043b\u043e\u043d\u0438\u0438 \u0432 Roboden\" src=\"https:\/\/habrastorage.org\/webt\/-5\/0h\/ol\/-50holsyyz4vg7in_qhx92hyuv8.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/-5\/0h\/ol\/-50holsyyz4vg7in_qhx92hyuv8.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0432\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u044b \u0438\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u044b\u0448\u0435, \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" title=\"\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0434\u0438\u0439 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/if\/eh\/et\/ifehetkbibgsa46_s3emuxu3kjk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/if\/eh\/et\/ifehetkbibgsa46_s3emuxu3kjk.png\"\/>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>t<\/code> (\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043d\u0430\u0437\u0432\u0430\u043d <code>Time<\/code>) \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0438\u0433\u0440\u044b. \u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0441\u0442\u0440\u043e\u044f\u0442 \u0437\u0434\u0430\u043d\u0438\u0435, <code>t<\/code> \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. <code>t<\/code> \u2014 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 (\u043e\u0442 0 \u0434\u043e 1).<\/p>\n<p>  <\/p>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043c\u0435\u0441\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438;<\/li>\n<li>\u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0437\u0430\u0442\u0435\u043c\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430;<\/li>\n<li>\u041f\u0438\u043a\u0441\u0435\u043b\u0438 \u0431\u043b\u0438\u0437 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f (\u044d\u0444\u0444\u0435\u043a\u0442 pick) \u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0445\u0435\u043b\u043f\u0435\u0440-\u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func shaderRand(p vec2) int {     return int(p.x+p.y) * int(p.y*5) }  func sourceSize() vec2 {     pixSize := imageSrcTextureSize()     _, srcRegion := imageSrcRegionOnTexture()     return pixSize.x * srcRegion }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u043b \u0434\u043b\u044f \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">func Fragment(_ vec4, texCoord vec2, _ vec4) vec4 {     \/\/ texCoord \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 Src0, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e     \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c unsafe \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435,     \/\/ \u043d\u043e out-of-bounds \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e.     c := imageSrc0UnsafeAt(texCoord)     if c.a == 0 {         return c     }      actualPixPos := tex2pixCoord(texCoord)      \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.     \/\/ \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.     sizes := sourceSize()     width := sizes.x \/\/ \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e width      \/\/ \u0417\u0430\u0434\u0430\u0451\u043c \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438 \u0435\u0451 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e dt.     initialY := -2.0     offsetY := width * 0.15 * Time     circleCenter := vec2(width*0.5, initialY-offsetY)     dist := distance(actualPixPos, circleCenter)      progress := 1.4 - Time     if dist > ((width * 0.95) * progress) {         \/\/ \u0422\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438, \u0440\u0438\u0441\u0443\u0435\u043c \u0431\u0435\u0437 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439.         return c     }      spread := 0     colorMultiplier := vec4(0)      \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u0435\u0446 \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0439.     \/\/ \u0421\u0432\u0438\u0447\u0430 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0434\u0451\u043c \u0447\u0435\u0440\u0435\u0437 if\/else.     if dist > ((width * 0.85) * progress) {         spread = 15         colorMultiplier = vec4(1, 1.1, 1.3, 1.0)     } else if dist > ((width * 0.75) * progress) {         spread = 11         colorMultiplier = vec4(0.9, 1.2, 1.6, 1.0)     } else if dist > ((width * 0.65) * progress) {         spread = 7         colorMultiplier = vec4(0.8, 1.4, 2.0, 1.0)     } else if dist > ((width * 0.62) * progress) {         spread = 6         colorMultiplier = vec4(0.25, 0.25, 0.25, 1.0)     } else {         \/\/ \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c.         return vec4(0)     }      h := shaderRand(actualPixPos)     p := applyPixPick(actualPixPos, 1, spread, h)     if p == actualPixPos {         \/\/ \u0415\u0441\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f, \u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0433\u043e \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430.         return c     }     return imageSrc0At(pix2texCoord(p)) * colorMultiplier }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c <code>Time<\/code> \u043c\u044b \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445, \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437-\u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0439 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0445\u043e\u0442\u0435\u043b \u0432\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432? \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 <a href=\"https:\/\/github.com\/hajimehoshi\/ebiten\/tree\/main\/examples\/shader\" rel=\"nofollow noopener noreferrer\">examples\/shader<\/a> \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Ebitengine, \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0441\u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 (dissolve)<\/li>\n<li>\u0420\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u0435<\/li>\n<li>\u042d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0432\u043e\u0434\u0435<\/li>\n<li>\u0425\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0430\u0431\u0435\u0440\u0440\u0430\u0446\u0438\u044e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u0432 Ebitengine:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0425\u0440\u0430\u043d\u0438\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u0447\u0435\u0440\u0435\u0437 <code>go:embed<\/code>.<\/li>\n<li>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>*ebiten.Shader<\/code>.<\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d*, \u0440\u0438\u0441\u0443\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 <code>DrawImage<\/code>, \u0430 \u043d\u0435 <code>DrawRectShader<\/code>.<\/li>\n<li>\u041f\u0438\u0448\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0445\u0435\u043b\u043f\u0435\u0440-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445, \u043e\u043d\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0439\u0442\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>(*) \u041f\u0440\u0438\u043c\u0435\u0440: \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438 <code>HP=1.0<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0439\u0442 \u0447\u0435\u0440\u0435\u0437 <code>DrawImage()<\/code>, \u0430 \u043d\u0435 <code>DrawRectShader()<\/code>.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"chek-list-dlya-zainteresovannyh\">\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0438 \u043d\u0430 Go, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0441 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c?<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u0441\u0442\u0443\u043f\u0430\u0439\u0442\u0435 \u0432 <a href=\"https:\/\/t.me\/go_gamedev\" rel=\"nofollow noopener noreferrer\">\u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440 \u043d\u0430 Go<\/a>.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439, <a href=\"https:\/\/discord.gg\/3tVdM5H8cC\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435\u0441\u044c \u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u0438\u0441\u043a\u043e\u0440\u0434\u0443<\/a>.<\/li>\n<li>\u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 <a href=\"https:\/\/ebitengine.org\/en\/tour\/\" rel=\"nofollow noopener noreferrer\">\u043c\u0438\u043d\u0438-\u0442\u0443\u0440<\/a> \u043f\u043e Ebitengine.<\/li>\n<li>\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0438\u0434\u0435\u044e \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 Go, \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0435.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u044d\u0442\u0438\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e \u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b, \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0439\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/hajimehoshi\/ebiten\/tree\/main\/examples\" rel=\"nofollow noopener noreferrer\">examples<\/a>.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0438\u0449\u0435\u0442\u0435 3rd-party \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/sedyh\/awesome-ebitengine\" rel=\"nofollow noopener noreferrer\">awesome-ebitengine<\/a>.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c, \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u0445, \u0432\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0443\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0443 \u0441\u043f\u0430\u0441\u0438\u0431\u043e? \u0421\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043b\u044e\u0441\u0438\u043a. \u041c\u043d\u0435 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c, \u043e \u0447\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0430 \u0432\u0430\u0448\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0448\u0430\u043d\u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044f \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043c\u043e\u0438 \u0438\u0433\u0440\u044b. \u041e\u043d\u0438 \u0432\u0441\u0435 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u0434\u0430\u043c\u0438, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0421\u0441\u044b\u043b\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"ssylki-i-poleznye-resursy\">\u0421\u0441\u044b\u043b\u043a\u0438 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/hajimehoshi\/ebiten\" rel=\"nofollow noopener noreferrer\">Ebitengine<\/a><\/li>\n<li><a href=\"https:\/\/t.me\/go_gamedev\" rel=\"nofollow noopener noreferrer\">\u0420\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440 \u043d\u0430 Go<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/tinne26\/kage-desk\" rel=\"nofollow noopener noreferrer\">Kage desk<\/a> \u2014 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u044f\u0437\u044b\u043a\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/li>\n<li><a href=\"https:\/\/ebitengine.org\/en\/documents\/shader.html\" rel=\"nofollow noopener noreferrer\">\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0438\u0437 Ebitengine<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/quasilyte\/roboden-game\" rel=\"nofollow noopener noreferrer\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0433\u0440\u044b Roboden<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/quasilyte\/decipherism-game\/\" rel=\"nofollow noopener noreferrer\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0433\u0440\u044b Decipherism<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sedyh\/awesome-ebitengine\" rel=\"nofollow noopener noreferrer\">awesome-ebitengine<\/a><\/li>\n<\/ul>\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\/730848\/\"> https:\/\/habr.com\/ru\/articles\/730848\/<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u0432\u043d\u0435\u043d\u044c\u043a\u043e \u044f \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435.<\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0440\u0438\u044e \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e <a href=\"https:\/\/t.me\/go_gamedev\" rel=\"nofollow noopener noreferrer\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440 \u043d\u0430 Go<\/a> \u0438 \u043d\u0430\u0447\u0430\u043b \u044f \u0441 <a href=\"https:\/\/habr.com\/ru\/articles\/671556\/\">\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0442\u0435\u043a\u0441\u0442\u0430<\/a>, \u043d\u043e \u043c\u0435\u043d\u044f \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0434\u0430\u0436\u0435 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u043a\u0441\u0442. \u0427\u0442\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u0432\u0435\u0434\u044c \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u044f \u0443\u0441\u043f\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0433\u0440\u0443\u0448\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A8%D0%B5%D0%B9%D0%B4%D0%B5%D1%80\" rel=\"nofollow noopener noreferrer\">\u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445<\/a> \u0432 <a href=\"https:\/\/github.com\/hajimehoshi\/ebiten\" rel=\"nofollow noopener noreferrer\">Ebitengine<\/a>. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 <a href=\"https:\/\/quasilyte.itch.io\/roboden\" rel=\"nofollow noopener noreferrer\">Roboden<\/a> \u0438 <a href=\"https:\/\/quasilyte.itch.io\/decipherism\" rel=\"nofollow noopener noreferrer\">Decipherism<\/a> (\u043e\u0431\u0435 \u0438\u0433\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0438\u0445 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435).<\/p>\n<p>  <img decoding=\"async\" title=\"\u041d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0432\u0438\u0434\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0432\u0441\u0435\u0445\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fq\/jg\/ed\/fqjgedeltwlgpfj8h4s6v895r_8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fq\/jg\/ed\/fqjgedeltwlgpfj8h4s6v895r_8.png\"\/><\/p>\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-383400","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383400","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=383400"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383400\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=383400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=383400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=383400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}