{"id":355563,"date":"2024-05-20T23:11:18","date_gmt":"2024-05-20T23:11:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=355563"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=355563","title":{"rendered":"<span>CD-\u0434\u0438\u0441\u043a \u043d\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445 \u0438 NameDrop \u0432 iOS 17<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a03\/e11\/f88\/a03e11f887aba9a77ab1ef2071c98174.png\" width=\"2000\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a03\/e11\/f88\/a03e11f887aba9a77ab1ef2071c98174.png\"\/><\/figure>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432. \u0412 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 \u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0432\u0435\u0442\u043e\u043c, \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043b\u044e\u0440 \u0432 iOS \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u0442\u0430\u043b \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Apple Vision Pro.<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u2014 \u0435\u0449\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432: \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0434\u0438\u0441\u043a \u0438 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0439 NameDrop \u0432 iOS 17.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b<\/h2>\n<p>\u0417\u043e\u043b\u043e\u0442\u043e \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c, \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0438\u0437 \u0436\u0435\u043b\u0442\u043e-\u0431\u0435\u043b\u043e\u0433\u043e \u0432 \u0447\u0435\u0440\u043d\u044b\u0439. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u043b\u0430\u0442\u044c\u044f: \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0446\u0432\u0435\u0442\u043e\u043c, \u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u2014 <em>\u0441\u0432\u0435\u0442<\/em> \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 <em>\u0446\u0432\u0435\u0442<\/em>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/23d\/250\/fcf\/23d250fcfe434a086c8fd856d121960c.png\" width=\"2000\" height=\"972\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/23d\/250\/fcf\/23d250fcfe434a086c8fd856d121960c.png\"\/><\/figure>\n<p>CD-\u0434\u0438\u0441\u043a \u0442\u043e\u0436\u0435 \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430 \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430 \u043e\u0442 <a href=\"https:\/\/twitter.com\/dankuntz\/status\/1675964974508937216?s=20\">Daniel Kuntz<\/a>. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 \u0442\u0435\u043c\u0435, \u0442\u043e \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0433\u0434\u0435 \u043c\u044b <a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/759574\/\">\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442.<\/a><\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0438\u0437\u0438\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043e\u0431\u0449\u0438\u0439 \u043f\u043b\u0430\u043d:<\/p>\n<ul>\n<li>\n<p>\u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u044f\u0433\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0443, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440 \u0434\u0438\u0441\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043b\u043e\u0436\u0438\u043c \u043f\u0430\u0440\u0443 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u0412 \u043c\u0435\u0441\u0442\u0430\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u043e \u044f\u0440\u043a\u043e\u0433\u043e \u0431\u0435\u043b\u043e\u0433\u043e, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0443, \u0447\u0442\u043e\u0431\u044b \u0434\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430 \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043b\u0435\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c24\/81a\/9b4\/c2481a9b4b84e0526a251487bf3a0bf1.png\" width=\"1062\" height=\"916\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c24\/81a\/9b4\/c2481a9b4b84e0526a251487bf3a0bf1.png\"\/><\/figure>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 \u0434\u043b\u044f \u0434\u0438\u0441\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0448\u0430\u0433\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0432\u0438\u043d\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437 \u0443\u0433\u043b\u0430 View \u0432 \u0446\u0435\u043d\u0442\u0440 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430 \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0432\u043e\u043b\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440 \u0434\u0438\u0441\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043a \u043e\u0431\u0449\u0435\u0439 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 (\u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e streak);<\/p>\n<\/li>\n<li>\n<p>\u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0437 HSV \u0432 RGB.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u0432\u0438\u0434\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<pre><code class=\"swift\">[[ stitchable ]] half4 cd(float2 position, half4 color, float2 viewSize) {     \/\/ Move coordinates to circle center     float2 uv = centeredRelativeUV(position, viewSize);           float minBrightness = 0.4;     float3 streakHSV = streak(uv,                               0.3, \/\/ color                               20., \/\/ width                               1 - minBrightness                               );          float4 resultColor = float4(float3(minBrightness),                                   1.0); \/\/ Default brightness and alpha      resultColor += HSVtoRGB(streakHSV);          return half4(resultColor); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c.<\/p>\n<p><strong>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0446\u0435\u043d\u0442\u0440 View.<\/strong> \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043e\u0442 0 \u0434\u043e 1 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 View. \u0418 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430, \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443, <\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0443. <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e UV \u2014 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442: X, Y \u0438 Z \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u0438 V \u0434\u043b\u044f \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. 3D \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u0442, \u0430 \u0432\u043e\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 UV \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0446\u0435\u043d\u0442\u0440, \u0432\u044b\u0447\u0438\u0442\u0430\u044f \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e 0.5, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443. \u041f\u043e\u0441\u043b\u0435 \u0441\u0434\u0432\u0438\u0433\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 (0, 0) \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442 -0.5 \u0434\u043e +0.5.<\/p>\n<pre><code class=\"swift\">float2 centeredRelativeUV(float2 position, float2 viewSize) {     \/\/ Relative texture coordinates with values from 0 to 1     float2 uv = position \/ viewSize;       \/\/ Move origin to center     uv -= .5;      return uv; }<\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u043b\u043d\u0443 \u0438 \u043e\u0442\u0440\u0435\u0436\u0435\u043c \u043e\u0442 \u043d\u0435\u0451 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443.<\/p>\n<p><strong>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u043b\u043d\u044b<\/strong> \u0432\u043e\u0437\u044c\u043c\u0451\u043c Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u0435\u0451 \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u044b \u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043a\u043e\u0441\u0438\u043d\u0443\u0441 \u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u0441\u0438\u043d\u0443\u0441 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. Width \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0433 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438, \u0432\u0435\u0434\u044c \u043d\u0430\u0448\u0430 \u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 color \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 Brightness.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     \/\/ Create waves     float streak = cos(uv.y * width); \/\/ make waves      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak, 0., maxBrightness);                                                                        \/\/ Use value as brightness     return float3(color.x,          \/\/ H                   color.y,          \/\/ S                   centralStreak);   \/\/ V }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u043a Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a0\/faa\/87a\/7a0faa87a14bda59194a261d3dcdb2d8.png\" width=\"1084\" height=\"672\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a0\/faa\/87a\/7a0faa87a14bda59194a261d3dcdb2d8.png\"\/><\/figure>\n<p><strong>\u041e\u0442\u0440\u0435\u0436\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 -33% \u0434\u043e 33%, \u043d\u043e \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u0435 \u043f\u043e\u043b\u043e\u0441\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u043d\u0430 mask, \u0442.\u0435. \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0446\u0432\u0435\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     ...          \/\/ Get only center waves     float limit = 3 \/ width;     float mask = 0.0;     if (uvY >= -limit &amp;&amp; uvY &lt;= limit) { \/\/ [-0.125; +0.125]         mask = 1.0; \/\/ show only single wave near 0     }      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak * mask,  0.,  maxBrightness);      ... }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u043c\u044f\u0433\u043a\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f6\/2b3\/1e3\/8f62b31e3d3f31858ea1b90b6a0aa848.png\" width=\"1148\" height=\"1064\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f6\/2b3\/1e3\/8f62b31e3d3f31858ea1b90b6a0aa848.png\"\/><\/figure>\n<p><strong>\u0421\u0443\u0437\u0438\u043c \u043f\u043e\u043b\u043e\u0441\u0443 \u043a \u0446\u0435\u043d\u0442\u0440\u0443<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 U \u0438 V \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 length (\u043a\u0430\u043a \u0433\u0438\u043f\u043e\u0442\u0435\u043d\u0443\u0437\u0443 \u043f\u043e \u0442\u0435\u043e\u0440\u0435\u043c\u0435 \u041f\u0438\u0444\u0430\u0433\u043e\u0440\u0430). \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a \u0446\u0435\u043d\u0442\u0440\u0443, \u0442\u0435\u043c \u043e\u043d\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0432\u0438\u043d\u0443\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e) \u0438 \u0442\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u044f\u0440\u043a\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0446\u0432\u0435\u0442. \u0410 \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0440\u0430\u044e, \u0442\u0435\u043c \u044f\u0440\u0447\u0435. \u0421\u0430\u043c\u043e\u0435 \u044f\u0440\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043f\u0440\u0438 X = 0 \u0438 Y = 0.5, \u0433\u0434\u0435 \u0434\u043b\u0438\u043d\u0430 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 0.5 (\u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 0^2 + 0.5^2). \u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043a\u0440\u0430\u0435\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442 \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float uvY = uv.y; \/\/ 0 to 1 with rotation, no need for X          \/\/ Create waves     float streak = cos(uvY * width) \/\/ wake waves                    * diameter; \/\/ brighter on the edge ... }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u044f\u0433\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0443 (\u043e\u043d\u0430 \u043c\u044f\u0433\u043a\u0430\u044f \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430) \u0438 \u0431\u043e\u043b\u0435\u0435 \u044f\u0440\u043a\u0443\u044e \u043a \u043a\u0440\u0430\u044f\u043c (\u0438\u0437-\u0437\u0430 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/934\/9d7\/f5c\/9349d7f5c982e4cd2d3514828d3289c8.png\" width=\"1082\" height=\"936\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/934\/9d7\/f5c\/9349d7f5c982e4cd2d3514828d3289c8.png\"\/><\/figure>\n<h3>\u0412\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u043e\u043b\u043e\u0441\u043a\u0443<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0433\u043e\u043b \u043f\u043e\u043b\u043e\u0441\u044b \u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0443 \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0\">\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430<\/a> \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0435\u0451 \u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c:<\/p>\n<pre><code class=\"swift\">float2x2 Rotate(float a) {     float x=cos(a), y=sin(a);     return float2x2(x, -y, y, x); }  float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float2 rotUV = uv * Rotate(angle);     float uvY = rotUV.y; \/\/ 0 to 1 with rotation, no need for X ... }<\/code><\/pre>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u044f\u0433\u043a\u043e\u0439 \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0438:<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float2 rotUV = uv * Rotate(angle);     float uvY = rotUV.y; \/\/ 0 to 1 with rotation, no need for X          \/\/ Create waves     float streak = cos(uvY * width) \/\/ wake waves                  * diameter; \/\/ brighter on the edge          \/\/ Get only center waves     float limit = 1\/(width\/3.);     float mask = 0.0;     if (uvY >= -limit &amp;&amp; uvY &lt;= limit) { \/\/ [-0.125; +0.125]         mask = 1.0; \/\/ show only single wave near 0     }      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak * mask, 0., maxBrightness);           \/\/ Use value as brightness     return float3(color.x,          \/\/ H                   color.y,          \/\/ S                   centralStreak);   \/\/ V }<\/code><\/pre>\n<h4>\u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u0437\u0430\u0434\u0438: \u043c\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u2014 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441 \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u041a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043c\u044b \u0431\u0435\u0440\u0451\u043c 25 \u043f\u043e\u043b\u043e\u0441\u043e\u043a:<\/p>\n<\/li>\n<\/ul>\n<p><code>for (float i = 0; i &lt; 25; i++) {<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u0438\u043c \u0440\u0430\u0437\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443:<\/p>\n<\/li>\n<\/ul>\n<p><code>float width = clamp((sin(i+1)+1) * 100, 10., 180.); \/\/ [10, 180]<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 (streakColor):<\/p>\n<\/li>\n<\/ul>\n<p><code>float hue = sin(i*8.11)+1.0; \/\/ 220 is max radian, hue in [0, 2]<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u0443\u0433\u043e\u043b, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0448\u0430 \u043f\u043e\u043b\u043e\u0441\u043a\u0430. \u0423\u0433\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 accel:<\/p>\n<\/li>\n<\/ul>\n<p><code>float angle = (9*i+sin(accel*i*3));<\/code><\/p>\n<ul>\n<li>\n<p>\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0430\u043c\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 (\u044d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435):<\/p>\n<\/li>\n<\/ul>\n<p><code>float3 streakHSV = streak(uv, angle, streakColor, width, 1 - minBrightness);<\/code><\/p>\n<ul>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043e\u0442 \u044d\u0442\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e. \u0412\u0430\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u043f\u043e-\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u044d\u0442\u0438 25 \u043f\u043e\u043b\u043e\u0441 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:<\/p>\n<\/li>\n<\/ul>\n<p><code>float o = saturate(1 - (width \/ 180.0)) * 0.9; \/\/ [0, 0.9]<br \/> resultColor += HSVtoRGB(streakHSV) * o;<\/code><\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0441\u044b\u043f\u0430\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u2014 \u043c\u044b \u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<pre><code class=\"swift\">[[ stitchable ]] half4 cd(float2 position, half4 color, float2 viewSize, float accel) {     float2 uv = centeredRelativeUV(position, viewSize); \/\/ Move coordinates to circle center          float minBrightness = 0.4;     float4 resultColor = float4(float3(minBrightness), 1.0); \/\/ Default brightness and alpha          for (float i = 0; i &lt; 25; i++) {         float width = clamp((sin(i+1)+1) * 100, 10., 180.); \/\/ [10, 180]          float hue = sin(i*8.11)+1.0; \/\/ 220 is max radian, hue in [0, 2]         float3 streakColor = saturate(float3(hue,                                            0.7,  \/\/ saturation                                            0.5)); \/\/ brightness                  float angle = (9*i+sin(accel*i*3));         float3 streakHSV = streak(uv, angle, streakColor, width, 1 - minBrightness);                  float o = saturate(1 - (width \/ 180.0)) * 0.9; \/\/ [0, 0.9]         resultColor += HSVtoRGB(streakHSV) * o;     }      return half4(resultColor); }<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 accel \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0438\u043b\u0438 \u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 SwiftUI Canvas.<\/p>\n<p><a href=\"https:\/\/github.com\/akaDuality\/SwiftUIShaderSamples\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c<\/a><\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6511b6ce72e08276d7a593c9\" data-style=\"\" id=\"6511b6ce72e08276d7a593c9\" width=\"\"><\/div>\n<h3>\u042d\u0444\u0444\u0435\u043a\u0442, \u043a\u0430\u043a \u0443 NameDrop \u0432 iOS 17<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0432\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/twitter.com\/dankuntz\/status\/1685858065067978752?s=20\">\u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0435 NameDrop<\/a>.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6511b72d627c4d3097fa7d48\" data-style=\"\" id=\"6511b72d627c4d3097fa7d48\" width=\"\"><\/div>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c:<\/p>\n<ul>\n<li>\n<p>\u044d\u0444\u0444\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0437\u0430\u0431\u043b\u044e\u0440\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0437\u0440\u044b\u0432\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u043e\u0432\u043d\u043e \u043f\u043e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442 0.01 \u0434\u043e 2 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u0448\u0430\u0433\u043e\u043c \u0432 0.01;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u043e \u0448\u0435\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>layer.sample<\/code>: \u043c\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0431\u0435\u0440\u0451\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0432\u043e\u043b\u043d\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>mix<\/code> \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430. <\/p>\n<\/li>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>smoothStep<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043d\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e, \u0430 \u043d\u0435 \u043f\u043b\u0430\u0432\u043d\u043e;<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/developer.apple.com\/metal\/Metal-Shading-Language-Specification.pdf\">\u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e Metal.<\/a><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>airdrop.metal<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\/\/ \/\/  airdrop.metal \/\/  Airdrop Demo \/\/ \/\/  Created by Daniel Kuntz on 7\/30\/23. \/\/  #include &lt;metal_stdlib> #include &lt;SwiftUI\/SwiftUI_Metal.h> using namespace metal;  [[ stitchable ]] half4 airdrop(float2 position, SwiftUI::Layer layer, float t, float2 viewSize) {     float2 position_yflip = float2(position.x, viewSize.y - position.y);     float uv_y_dynamic_island_offset = 0.46;      float t2 = pow(t, 2);     float t3 = pow(t, 3);      \/\/ Normalized pixel coordinates (from 0 to 1)     float2 uv = position_yflip \/ viewSize;     float2 uv_stretch = float2(uv.x+((uv.x-0.5)*pow(uv.y,6)*t3*0.1), uv.y * (uv.y * pow((1-(t2*0.01)), 8.0)) + (1-uv.y) * uv.y);     uv_stretch = mix(uv, uv_stretch, smoothstep(1.1, 1.0, t));     float4 color = float4(layer.sample(uv_stretch * viewSize));      float2 bang_offset = float2(0.0);     float bang_d = 0.0;     if (t >= 1.0) {         float aT = t - 1.0;         float2 uv2 = uv;         uv2 -= 0.5;         uv2.x *= viewSize.x \/ viewSize.y;          float2 uv_bang = float2(uv2.x, uv2.y);         float2 uv_bang_origin = float2(uv_bang.x, uv_bang.y-uv_y_dynamic_island_offset);         bang_d = (aT*0.16)\/length(uv_bang_origin);         bang_d = smoothstep(0.09, 0.05, bang_d) * smoothstep(0.04, 0.07, bang_d) * (uv.y+0.05);         bang_offset = float2(-8.0*bang_d*uv2.x, -4.0*bang_d*(uv2.y-0.4))*0.1;          float bang_d2 = ((aT-0.085) * 0.14)\/length(uv_bang_origin);         bang_d2 = smoothstep(0.09, 0.05, bang_d2) * smoothstep(0.04, 0.07, bang_d2) * (uv.y+0.05);         bang_offset += float2(-8.0*bang_d2*uv2.x, -4.0*bang_d2*(uv2.y-0.4))*-0.02;     }      float2 uv_stretch_bang = uv_stretch+bang_offset;     color = float4(layer.sample(uv_stretch_bang * viewSize));     color += bang_d*500.0 * smoothstep(1.05, 1.1, t);      float Pi = 6.28318530718 * 2;     float Directions = 60.0;     float Quality = 10.0;     float Radius = t2*0.1 * pow(uv.y, 6.0) * 0.5;     Radius *= smoothstep(1.3, 0.9, t);     Radius += bang_d*0.05;     \/\/ Blur calculations     for( float d=0.0; d&lt;Pi; d+=Pi\/Directions)     {         for(float i=1.0\/Quality; i&lt;=1.0; i+=1.0\/Quality)         {             float2 blurPos = (uv_stretch_bang + float2(cos(d),sin(d))*Radius*i);             color += float4(layer.sample(blurPos*viewSize));         }     }     color \/= Quality * Directions;      uv -= 0.5;     uv.x *= viewSize.x \/ viewSize.y;      float2 lighten_uv = float2(uv.x*0.65, uv.y - t + 0.5);     float d = smoothstep(0, 0.6, 0.1\/length(lighten_uv)-uv_y_dynamic_island_offset)*0.25;     float t_smooth = smoothstep(0.0, 0.3, t);     d *= t_smooth;     color = color + float4(color.r*d, color.g*d, 0.0, 1.0); \/\/ yellow blob      float2 lighten2_uv = float2(uv.x*0.4, uv.y-uv_y_dynamic_island_offset);     float d2 = smoothstep(0, 0.5, pow(1-length(lighten2_uv), 28))*0.5;     float t2_smooth = smoothstep(0.0, 1.0, t2)*1.;     d2 *= t2_smooth;     d2 *= smoothstep(1.13, 1.0, t);     color = float4(color.rgb*(1-d2), 1.0) + float4(float3(d2), 1.0); \/\/ white blob      return half4(color); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>Content.View.swift<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\/\/ \/\/  ContentView.swift \/\/  Airdrop Demo \/\/ \/\/  Created by Daniel Kuntz on 7\/30\/23. \/\/  import SwiftUI  struct ContentView: View {      @State private var timer: Timer?     @State private var t: Float = 0.0      private let shaderFunction = ShaderFunction(library: .default, name: \"airdrop\")      var body: some View {         VStack {             Image(\"mick\")                 .resizable()                 .aspectRatio(contentMode: .fill)                 .scaleEffect(x: 1.0, y: -1.0)                 .layerEffect(                     Shader(function: shaderFunction,                            arguments: [                             .float(t),                             .float2(Float(UIScreen.main.bounds.width),                                     Float(UIScreen.main.bounds.height))                            ]), maxSampleOffset: CGSize(width: 800.0, height: 800.0)                 )         }         .ignoresSafeArea()         .onAppear {             timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { _ in                 t = (t + 0.01).truncatingRemainder(dividingBy: 2.0)             })         }     } }  #Preview {     ContentView() }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c <a href=\"https:\/\/twitter.com\/DLX\/status\/1686390307066372097?s=20\">\u044d\u0444\u0444\u0435\u043a\u0442 \u0448\u0442\u043e\u0440\u043a\u0438 \u0432 \u0432\u0430\u043d\u043d\u043e\u0439<\/a> \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u043e\u0442 \u043a\u043d\u0438\u0433\u0438 \u0432 iBooks. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u043f\u043e\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u043e\u0434, \u0430 \u0442\u043e \u044f \u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \ud83d\ude00<\/p>\n<h2>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 UIKit<\/h2>\n<p>SwiftUI \u0438 iOS 17 \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 UIKit \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 iOS? \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/developer.apple.com\/documentation\/metalkit\/mtkview\">MTKView<\/a>, \u043e\u043d \u0434\u0430\u0432\u043d\u043e \u0441 \u043d\u0430\u043c\u0438. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432 iOS 17 \u2014 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0438 \u0441\u0440\u0435\u0437\u0430\u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0430\u0440\u0438\u0442\u044c\u0441\u044f \u0441 3D \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u043a 2D-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0442\u0435\u043c\u0430 \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0443\u0442:<\/p>\n<ul>\n<li>\n<p>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f <a href=\"https:\/\/developer.apple.com\/documentation\/metal\/onscreen_presentation\/creating_a_custom_metal_view\">Creating a Custom Metal View<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/blog.canopas.com\/how-to-get-started-with-metal-apis-with-uiview-and-swiftui-124643d8209e\">How to get started with Metal APIs\u2014 with UIView and SwiftUI<\/a> .<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p><a href=\"https:\/\/github.com\/akaDuality\/SwiftUIShaderSamples\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/twostraws\/Inferno\">\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=EgzWwgRpUuw\">\u041b\u0430\u0439\u0432\u043a\u043e\u0434\u0438\u043d\u0433 \u043f\u0440\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/nerdyak.tech\/development\/2023\/06\/16\/distortionEffect-with-Metal-shaders-for-better-transitions.html\">\u0422\u0440\u0430\u043d\u0437\u0438\u0448\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/twitter.com\/jrrthestar\/status\/1689066814720892929?s=46&amp;t=xK1vwdtLZEXxo21WCgXjlA\">\u041f\u0435\u0440\u0435\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/markusmoenig\/ShaderMania\">\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 ShaderMania<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/jtrivedi\/MagnificationLoupe\">\u041b\u0443\u043f\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.hackingwithswift.com\/quick-start\/swiftui\/how-to-add-metal-shaders-to-swiftui-views-using-layer-effects\">\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/jmade\/MetalNoise\">\u0428\u0443\u043c (\u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/nthState\/CurtainRaiser\">\u0428\u0442\u043e\u0440\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/mikeroyal\/Metal-Guide\">\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e Metal<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u0410 \u043d\u0430 Android \u0442\u043e\u0436\u0435 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e?<\/h3>\n<p>\u0410\u0433\u0430. <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/736192\/\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0432 Jetpack Compose<\/a><\/p>\n<hr\/>\n<p><a href=\"https:\/\/www.notion.so\/iOS-17-362dad3d5f974e299d8fe668096d268e?pvs=21\">\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043a\u0430\u043d\u0430\u043b Dodo Mobile<\/a> \u2014 \u0441\u043a\u043e\u0440\u043e \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0438 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0430\u043a\u0442\u043e\u0440\u044b \u0432 Swift.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/762656\/\"> https:\/\/habr.com\/ru\/articles\/762656\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0428\u0435\u0439\u0434\u0435\u0440\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432. \u0412 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 \u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0432\u0435\u0442\u043e\u043c, \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043b\u044e\u0440 \u0432 iOS \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u0442\u0430\u043b \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Apple Vision Pro.<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u2014 \u0435\u0449\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432: \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0434\u0438\u0441\u043a \u0438 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0439 NameDrop \u0432 iOS 17.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b<\/h2>\n<p>\u0417\u043e\u043b\u043e\u0442\u043e \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c, \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0438\u0437 \u0436\u0435\u043b\u0442\u043e-\u0431\u0435\u043b\u043e\u0433\u043e \u0432 \u0447\u0435\u0440\u043d\u044b\u0439. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u043b\u0430\u0442\u044c\u044f: \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0446\u0432\u0435\u0442\u043e\u043c, \u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u2014 <em>\u0441\u0432\u0435\u0442<\/em> \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 <em>\u0446\u0432\u0435\u0442<\/em>.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>CD-\u0434\u0438\u0441\u043a \u0442\u043e\u0436\u0435 \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430 \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430 \u043e\u0442 <a href=\"https:\/\/twitter.com\/dankuntz\/status\/1675964974508937216?s=20\">Daniel Kuntz<\/a>. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 \u0442\u0435\u043c\u0435, \u0442\u043e \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0433\u0434\u0435 \u043c\u044b <a href=\"https:\/\/habr.com\/ru\/companies\/dododev\/articles\/759574\/\">\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442.<\/a><\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0438\u0437\u0438\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043e\u0431\u0449\u0438\u0439 \u043f\u043b\u0430\u043d:<\/p>\n<ul>\n<li>\n<p>\u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u044f\u0433\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0443, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440 \u0434\u0438\u0441\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043b\u043e\u0436\u0438\u043c \u043f\u0430\u0440\u0443 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u0412 \u043c\u0435\u0441\u0442\u0430\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u043e \u044f\u0440\u043a\u043e\u0433\u043e \u0431\u0435\u043b\u043e\u0433\u043e, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0443, \u0447\u0442\u043e\u0431\u044b \u0434\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430 \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043b\u0435\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 \u0434\u043b\u044f \u0434\u0438\u0441\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0448\u0430\u0433\u0430:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0432\u0438\u043d\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437 \u0443\u0433\u043b\u0430 View \u0432 \u0446\u0435\u043d\u0442\u0440 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430 \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0432\u043e\u043b\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440 \u0434\u0438\u0441\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043a \u043e\u0431\u0449\u0435\u0439 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 (\u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e streak);<\/p>\n<\/li>\n<li>\n<p>\u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0437 HSV \u0432 RGB.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u0432\u0438\u0434\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<pre><code class=\"swift\">[[ stitchable ]] half4 cd(float2 position, half4 color, float2 viewSize) {     \/\/ Move coordinates to circle center     float2 uv = centeredRelativeUV(position, viewSize);           float minBrightness = 0.4;     float3 streakHSV = streak(uv,                               0.3, \/\/ color                               20., \/\/ width                               1 - minBrightness                               );          float4 resultColor = float4(float3(minBrightness),                                   1.0); \/\/ Default brightness and alpha      resultColor += HSVtoRGB(streakHSV);          return half4(resultColor); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c.<\/p>\n<p><strong>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0446\u0435\u043d\u0442\u0440 View.<\/strong> \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043e\u0442 0 \u0434\u043e 1 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 View. \u0418 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430, \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443, <\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0443. <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e UV \u2014 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442: X, Y \u0438 Z \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u0438 V \u0434\u043b\u044f \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. 3D \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u0442, \u0430 \u0432\u043e\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 UV \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0446\u0435\u043d\u0442\u0440, \u0432\u044b\u0447\u0438\u0442\u0430\u044f \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e 0.5, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443. \u041f\u043e\u0441\u043b\u0435 \u0441\u0434\u0432\u0438\u0433\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 (0, 0) \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442 -0.5 \u0434\u043e +0.5.<\/p>\n<pre><code class=\"swift\">float2 centeredRelativeUV(float2 position, float2 viewSize) {     \/\/ Relative texture coordinates with values from 0 to 1     float2 uv = position \/ viewSize;       \/\/ Move origin to center     uv -= .5;      return uv; }<\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u043b\u043d\u0443 \u0438 \u043e\u0442\u0440\u0435\u0436\u0435\u043c \u043e\u0442 \u043d\u0435\u0451 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443.<\/p>\n<p><strong>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u043b\u043d\u044b<\/strong> \u0432\u043e\u0437\u044c\u043c\u0451\u043c Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u0435\u0451 \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u044b \u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043a\u043e\u0441\u0438\u043d\u0443\u0441 \u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u0441\u0438\u043d\u0443\u0441 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. Width \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0433 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438, \u0432\u0435\u0434\u044c \u043d\u0430\u0448\u0430 \u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 color \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 Brightness.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     \/\/ Create waves     float streak = cos(uv.y * width); \/\/ make waves      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak, 0., maxBrightness);                                                                        \/\/ Use value as brightness     return float3(color.x,          \/\/ H                   color.y,          \/\/ S                   centralStreak);   \/\/ V }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u043a Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>\u041e\u0442\u0440\u0435\u0436\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 -33% \u0434\u043e 33%, \u043d\u043e \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u0435 \u043f\u043e\u043b\u043e\u0441\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u043f\u043e\u043b\u043e\u0441\u043e\u043a \u043d\u0430 mask, \u0442.\u0435. \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0446\u0432\u0435\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     ...          \/\/ Get only center waves     float limit = 3 \/ width;     float mask = 0.0;     if (uvY >= -limit &amp;&amp; uvY &lt;= limit) { \/\/ [-0.125; +0.125]         mask = 1.0; \/\/ show only single wave near 0     }      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak * mask,  0.,  maxBrightness);      ... }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u043c\u044f\u0433\u043a\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u0430.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>\u0421\u0443\u0437\u0438\u043c \u043f\u043e\u043b\u043e\u0441\u0443 \u043a \u0446\u0435\u043d\u0442\u0440\u0443<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 U \u0438 V \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 length (\u043a\u0430\u043a \u0433\u0438\u043f\u043e\u0442\u0435\u043d\u0443\u0437\u0443 \u043f\u043e \u0442\u0435\u043e\u0440\u0435\u043c\u0435 \u041f\u0438\u0444\u0430\u0433\u043e\u0440\u0430). \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a \u0446\u0435\u043d\u0442\u0440\u0443, \u0442\u0435\u043c \u043e\u043d\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0432\u0438\u043d\u0443\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e) \u0438 \u0442\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u044f\u0440\u043a\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0446\u0432\u0435\u0442. \u0410 \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0440\u0430\u044e, \u0442\u0435\u043c \u044f\u0440\u0447\u0435. \u0421\u0430\u043c\u043e\u0435 \u044f\u0440\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043f\u0440\u0438 X = 0 \u0438 Y = 0.5, \u0433\u0434\u0435 \u0434\u043b\u0438\u043d\u0430 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 0.5 (\u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 0^2 + 0.5^2). \u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043a\u0440\u0430\u0435\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442 \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float uvY = uv.y; \/\/ 0 to 1 with rotation, no need for X          \/\/ Create waves     float streak = cos(uvY * width) \/\/ wake waves                    * diameter; \/\/ brighter on the edge ... }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u044f\u0433\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0443 (\u043e\u043d\u0430 \u043c\u044f\u0433\u043a\u0430\u044f \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430) \u0438 \u0431\u043e\u043b\u0435\u0435 \u044f\u0440\u043a\u0443\u044e \u043a \u043a\u0440\u0430\u044f\u043c (\u0438\u0437-\u0437\u0430 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438).<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0412\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u043e\u043b\u043e\u0441\u043a\u0443<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0433\u043e\u043b \u043f\u043e\u043b\u043e\u0441\u044b \u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0443 \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0\">\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430<\/a> \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0435\u0451 \u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c:<\/p>\n<pre><code class=\"swift\">float2x2 Rotate(float a) {     float x=cos(a), y=sin(a);     return float2x2(x, -y, y, x); }  float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float2 rotUV = uv * Rotate(angle);     float uvY = rotUV.y; \/\/ 0 to 1 with rotation, no need for X ... }<\/code><\/pre>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u044f\u0433\u043a\u043e\u0439 \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0438:<\/p>\n<pre><code class=\"swift\">float3 streak(float2 uv, float angle, float3 color, float width, float maxBrightness) {     float diameter = length(uv); \/\/ higher value on the edge          float2 rotUV = uv * Rotate(angle);     float uvY = rotUV.y; \/\/ 0 to 1 with rotation, no need for X          \/\/ Create waves     float streak = cos(uvY * width) \/\/ wake waves                  * diameter; \/\/ brighter on the edge          \/\/ Get only center waves     float limit = 1\/(width\/3.);     float mask = 0.0;     if (uvY >= -limit &amp;&amp; uvY &lt;= limit) { \/\/ [-0.125; +0.125]         mask = 1.0; \/\/ show only single wave near 0     }      \/\/ limit higher value by 0.6     \/\/ for addition to default 0.4     float centralStreak = clamp(streak * mask, 0., maxBrightness);           \/\/ Use value as brightness     return float3(color.x,          \/\/ H                   color.y,          \/\/ S                   centralStreak);   \/\/ V }<\/code><\/pre>\n<h4>\u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u0437\u0430\u0434\u0438: \u043c\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u2014 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0441 \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u041a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043c\u044b \u0431\u0435\u0440\u0451\u043c 25 \u043f\u043e\u043b\u043e\u0441\u043e\u043a:<\/p>\n<\/li>\n<\/ul>\n<p><code>for (float i = 0; i &lt; 25; i++) {<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u0438\u043c \u0440\u0430\u0437\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443:<\/p>\n<\/li>\n<\/ul>\n<p><code>float width = clamp((sin(i+1)+1) * 100, 10., 180.); \/\/ [10, 180]<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 (streakColor):<\/p>\n<\/li>\n<\/ul>\n<p><code>float hue = sin(i*8.11)+1.0; \/\/ 220 is max radian, hue in [0, 2]<\/code><\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0434\u0430\u0451\u043c \u0443\u0433\u043e\u043b, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0448\u0430 \u043f\u043e\u043b\u043e\u0441\u043a\u0430. \u0423\u0433\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 accel:<\/p>\n<\/li>\n<\/ul>\n<p><code>float angle = (9*i+sin(accel*i*3));<\/code><\/p>\n<ul>\n<li>\n<p>\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0430\u043c\u0443 \u043f\u043e\u043b\u043e\u0441\u0443 (\u044d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435):<\/p>\n<\/li>\n<\/ul>\n<p><code>float3 streakHSV = streak(uv, angle, streakColor, width, 1 - minBrightness);<\/code><\/p>\n<ul>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043e\u0442 \u044d\u0442\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e. \u0412\u0430\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u043f\u043e-\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u044d\u0442\u0438 25 \u043f\u043e\u043b\u043e\u0441 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:<\/p>\n<\/li>\n<\/ul>\n<p><code>float o = saturate(1 - (width \/ 180.0)) * 0.9; \/\/ [0, 0.9]<br \/> resultColor += HSVtoRGB(streakHSV) * o;<\/code><\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0441\u044b\u043f\u0430\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u2014 \u043c\u044b \u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<pre><code class=\"swift\">[[ stitchable ]] half4 cd(float2 position, half4 color, float2 viewSize, float accel) {     float2 uv = centeredRelativeUV(position, viewSize); \/\/ Move coordinates to circle center          float minBrightness = 0.4;     float4 resultColor = float4(float3(minBrightness), 1.0); \/\/ Default brightness and alpha          for (float i = 0; i &lt; 25; i++) {         float width =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-355563","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355563","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=355563"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355563\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355563"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355563"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}