{"id":475630,"date":"2026-04-12T14:31:17","date_gmt":"2026-04-12T14:31:17","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=475630"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=475630","title":{"rendered":"\u041c\u0430\u044f\u043a \u0432 \u043f\u0443\u0441\u0442\u044b\u043d\u0435: Kotlin DSL \u0434\u043b\u044f Android-\u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0441\u0435\u043b \u043f\u0438\u0441\u0430\u0442\u044c AGSL \u043f\u043e\u0434 Android, \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440,\u00a0<code>RuntimeShader<\/code>,\u00a0<code>RenderEffect<\/code>, \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0438 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u0445\u043d\u043e-\u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432,\u00a0<code>uniform<\/code>-\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430: \u00ab\u0432 \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b?\u00bb<\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u00ab\u043a\u0438\u043d-\u0434\u0437\u0430-\u0434\u0437\u043e\u0432\u0441\u043a\u043e\u0435\u00bb \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435: \u0432\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0449\u0443\u0449\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0442\u0435\u0431\u0435 \u0432\u044b\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u0432\u0438\u0446\u0430\u043f\u0443 \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0441\u043a\u0430\u0437\u0430\u043b\u0438: \u00ab\u043d\u0443 \u0442\u044b \u044d\u0442\u043e&#8230; \u043b\u0435\u0442\u0438\u00bb. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u041d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0442\u0435\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0443\u043f\u043e\u0440\u043d\u044b\u0435.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f\u00a0<a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\" rel=\"noopener noreferrer nofollow\"><strong>RedByteFX<\/strong><\/a>. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0433\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443: \u0441\u0434\u0435\u043b\u0430\u0442\u044c AGSL \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0434\u043b\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 AGSL \u043c\u043e\u0449\u043d\u044b\u0439, \u043d\u043e \u043f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u00ab\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0439, \u044d\u0442\u043e \u043d\u0430 \u041d\u043e\u0432\u044b\u0439 \u0433\u043e\u0434\u00bb. \u0410 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u0431\u0435\u0437 \u0434\u0440\u043e\u0436\u0438 \u0432 \u043a\u043e\u043b\u0435\u043d\u044f\u0445 \u0438 \u0431\u0435\u0437 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c \u0441 \u0433\u043e\u0441\u043f\u043e\u0434\u0438\u043d\u043e\u043c \u041f\u0416 \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c \u043f\u0430\u0446\u0430\u043a\u0441\u043a\u043e\u043c \u043d\u0430\u0440\u0435\u0447\u0438\u0438.<\/p>\n<p>\u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f:<\/p>\n<blockquote>\n<p><strong>Kotlin DSL \u2192 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 AGSL \u2192 RuntimeShader \/ RenderEffect<\/strong><\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 AGSL. \u042f \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0432\u043e\u0438\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0438 \u043d\u0435 \u043f\u0440\u044f\u0447\u0443 \u043c\u0430\u0433\u0438\u044e \u043f\u043e\u0434 \u043a\u043e\u0432\u0451\u0440. \u042f \u043c\u0435\u043d\u044f\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u043a\u0430\u043a \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f: \u0432\u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0443\u043f\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Kotlin DSL, \u0430 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0447\u0435\u0441\u0442\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u00a0<code>agslSource()<\/code>.<\/p>\n<figure class=\"bordered full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc1\/0fc\/486\/bc10fc486e6cfdb68efa8491113504b2.png\" alt=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 RedByteFX\" title=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 RedByteFX\" width=\"1600\" height=\"900\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bc1\/0fc\/486\/bc10fc486e6cfdb68efa8491113504b2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc1\/0fc\/486\/bc10fc486e6cfdb68efa8491113504b2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 RedByteFX<\/figcaption><\/div>\n<\/figure>\n<div class=\"floating-image\">\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443:<\/p>\n<\/div>\n<ul>\n<li>\n<p>\u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u043b\u044b\u0439 AGSL \u0432 Android-\u043a\u043e\u0434\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432 RedByteFX;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 &#8212; \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d DSL: \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b,\u00a0<code>uniform<\/code>-\u044b,\u00a0<code>let(...)<\/code>,\u00a0<code>fn(...)<\/code>,\u00a0<code>sample()<\/code>,\u00a0<code>sampleUv()<\/code>, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Compose;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u0430 \u0433\u0434\u0435 \u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/157\/7ef\/f41\/1577eff41f67c4d5cc6e0cc576dd2eca.png\" alt=\"RedByteFx demo\" title=\"RedByteFx demo\" width=\"1024\" height=\"1536\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/157\/7ef\/f41\/1577eff41f67c4d5cc6e0cc576dd2eca.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/157\/7ef\/f41\/1577eff41f67c4d5cc6e0cc576dd2eca.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>RedByteFx demo<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u043b\u044b\u0439 AGSL \u0432 Android-\u043a\u043e\u0434\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u043a\u0430\u0437\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u0441\u0430\u043c AGSL \u043d\u0435 \u043f\u043b\u043e\u0445\u043e\u0439. \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0448\u0442\u0443\u043a\u0430 \u043c\u043e\u0449\u043d\u0430\u044f \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0430 \u0432 \u0442\u043e\u043c,\u00a0<strong>\u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0435\u043c \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437 Kotlin<\/strong>.<\/p>\n<p>\u0412\u043e\u0442 \u0433\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 IDE \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043c\u043e\u0433\u043b\u0430 \u0431\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u043d\u0430\u00a0<code>uniform<\/code>-\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0438 \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0430\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0440\u0432\u043d\u044b\u043c: \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u0447\u0442\u043e-\u0442\u043e \u0432 Kotlin, \u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043b &#8212; \u043f\u0440\u0438\u0432\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0443\u043f \u0438\u0437\u00a0<code>smoothstep<\/code>,\u00a0<code>fract<\/code>,\u00a0<code>mix<\/code>\u00a0\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0432 Compose \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0451 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0435\u043b \u00ab\u043b\u0451\u0433\u043a\u043e\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u0435\u00bb, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0441\u043a\u0430\u0445 \u041f\u043b\u044e\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0445\u043e\u0442\u0435\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0438\u043b\u0443 AGSL, \u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0432\u044b\u0440\u044f\u0435\u0448\u044c\u0441\u044f \u043e\u0442\u0432\u0451\u0440\u0442\u043a\u043e\u0439 \u0432 \u0442\u0451\u043c\u043d\u043e\u043c \u043e\u0442\u0441\u0435\u043a\u0435 \u043a\u043e\u0440\u0430\u0431\u043b\u044f.<\/p>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>RedByteFX \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0432 Maven Central. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430\u00a0<strong>Android API 33+<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a\u00a0<code>AGSL \/ RuntimeShader \/ RenderEffect<\/code>.<\/p>\n<pre><code class=\"kotlin\">dependencies {    implementation(\"io.github.i-redbyte:redbytefx-core:1.0.0\")    implementation(\"io.github.i-redbyte:redbytefx-compose:1.0.0\")    implementation(\"io.github.i-redbyte:redbytefx-stdlib:1.0.0\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:\u00a0<a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\" rel=\"noopener noreferrer nofollow\">github.com\/i-redbyte\/redbytefx<\/a><\/p>\n<h3>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0448\u0435\u0439\u0434\u0435\u0440, \u0434\u0432\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u044b\u0442\u0430<\/h3>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438\u00a0<code>Y<\/code>. \u042d\u0442\u043e \u0434\u0435\u043c\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u0430\u043a\u00a0<code>DemoWave.kt<\/code>.<\/p>\n<h4>\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430 AGSL<\/h4>\n<pre><code>uniform shader content;uniform float wave_amplitude;uniform float wave_frequency;half4 main(float2 fragCoord) {  float2 offset = float2(    0.0,    sin(fragCoord.x * wave_frequency) * wave_amplitude  );  return content.eval(fragCoord + offset);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043b\u043e\u0433\u0438\u043a\u0438 &#8212; \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0443\u044e\u0442\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c.<\/p>\n<h4>\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430 RedByteFX<\/h4>\n<pre><code class=\"kotlin\">val effect = redbytefx {    val amplitudeUniform = uniformFloat(0f, \"wave_amplitude\")    val frequencyUniform = uniformFloat(0.08f, \"wave_frequency\")    val x = let(fragCoord.x, \"x\")    val waveOffset = let(        float2(0f, sin(x * frequencyUniform) * amplitudeUniform),        \"wave_offset\"    )    sample(fragCoord + waveOffset)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0443\u0442 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u00ab\u0441\u0442\u0430\u043b\u0430 \u0434\u0440\u0443\u0433\u043e\u0439\u00bb. \u041e\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437\u00a0<strong>\u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u0439 \u0436\u0435<\/strong>. \u041d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>uniform<\/code>-\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p><code>let(...)<\/code>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0448\u0430\u0433\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0<code>sample(...)<\/code>, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0440\u0443\u0447\u043d\u0430\u044f \u0432\u043e\u0437\u043d\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0434 \u0436\u0438\u0432\u0451\u0442 \u0432 Kotlin, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 IDE \u0441\u043d\u043e\u0432\u0430 \u0432\u0430\u0448 \u0441\u043e\u044e\u0437\u043d\u0438\u043a, \u0430 \u043d\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432, \u0447\u0442\u043e DSL \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u043c\u0430\u043d\u0441\u0442\u0432\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 AGSL. \u0414\u043b\u044f \u0432\u043e\u043b\u043d\u044b \u043e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d:<\/p>\n<pre><code>uniform shader uContent;uniform float2 uResolution;uniform float u_amp;uniform float u_freq;half4 main(float2 fragCoord) {  return rb_sample(    fragCoord + float2(0.0, sin(fragCoord.x * u_freq) * u_amp)  );}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. RedByteFX \u043d\u0435 \u043f\u0440\u044f\u0447\u0435\u0442 AGSL. \u041e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u043e AGSL \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0434\u043e\u0439\u0442\u0438 \u0436\u0438\u0432\u044b\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c.<\/p>\n<h3>\u041e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c<\/h3>\n<p>\u041d\u0438\u0436\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437<a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\/tree\/master\/sample\" rel=\"noopener noreferrer nofollow\"> \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a>. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0443 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439: \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432\u0438\u0442\u0440\u0438\u043d\u043d\u044b\u0439.<\/p>\n<h4>1. Wave: \u0441\u0430\u043c\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442<\/h4>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u0447\u0438\u0441\u0442\u043e\u043c\u0443 AGSL \u043f\u043e \u0444\u043e\u0440\u043c\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u043d\u0451\u043c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435\u00a0<code>fragCoord<\/code>,\u00a0<code>sample()<\/code>\u00a0\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435\u00a0<code>uniform<\/code>-\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0430\u00a0<code>let(...)<\/code>, \u043d\u043e \u0435\u0449\u0451 \u043d\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432\u0430\u043c \u0434\u0430\u043b\u0438 \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u043d\u043e\u0436 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0442\u0440\u0430\u043a\u0442\u043e\u0440.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7de\/f2f\/01d\/7def2f01d5d36d23b9be98f77db26356.gif\" width=\"320\" height=\"568\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7de\/f2f\/01d\/7def2f01d5d36d23b9be98f77db26356.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7de\/f2f\/01d\/7def2f01d5d36d23b9be98f77db26356.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b RedByteFX \u043e\u0434\u043d\u043e\u0439 \u0444\u0440\u0430\u0437\u043e\u0439, \u044f \u0431\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u0442\u0430\u043a:\u00a0<strong>\u044d\u0442\u043e AGSL, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b\u0438 \u0436\u0438\u0442\u044c \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c Kotlin-\u043a\u043e\u0434\u0435<\/strong>.<\/p>\n<h4>2. Signal: \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043c\u0430\u0441\u043a\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432:<\/p>\n<pre><code class=\"kotlin\">val effect = redbytefx {    val densityUniform = uniformFloat(8f, \"signal_density\")    val lineWidthUniform = uniformFloat(0.08f, \"signal_line_width\")    val amountUniform = uniformFloat(0.85f, \"signal_amount\")    val pulseBand = fn(        name = \"pulse_band\",        arg1 = FloatType,        arg2 = FloatType,        returns = FloatType    ) { phase, threshold -&gt;        step(threshold, smoothstep(0.08f, 0.92f, fract(phase)))    }    val base = let(sample(), \"base\")    val uv = let(normalizedUv(), \"uv\")    val grid = let(gridMask(uv, densityUniform, lineWidthUniform), \"grid\")    val scan = let(scanlines(fragCoord.y, 14f, 3f), \"scan\")    val pulse = let(pulseBand(uv.y * densityUniform * 0.5f + grid * 0.35f, 0.55f), \"pulse\")    val hardMask = let(step(0.45f, scan * pulse), \"hard_mask\")    val active = let((grid gt 0.05f) or (hardMask gt 0.5f), \"active\")    val accent = let(color(float3(0.05f, 0.95f, 0.82f), base.a), \"accent\")    val mixed = let(mix(base, accent, min(grid * 0.85f + hardMask * 0.35f, 1f)), \"mixed\")    ifElse(active, mix(base, mixed, amountUniform), base)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p><code>fn(...)<\/code>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e AGSL-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p><code>normalizedUv()<\/code>\u00a0\u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442;<\/p>\n<\/li>\n<li>\n<p><code>gridMask(...)<\/code>\u00a0\u0438\u00a0<code>scanlines(...)<\/code>\u00a0\u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u0448\u0443\u043c \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p><code>ifElse(...)<\/code>\u00a0\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u044b\u0440\u043e\u043c AGSL \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0442\u043e-\u0442\u043e \u0432\u0438\u0434\u0430 \u00ab\u0441\u043e\u0440\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0438 \u0434\u043d\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f\u00bb. \u0410 \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u043d\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0430: \u0431\u0430\u0437\u0430, UV, \u0441\u0435\u0442\u043a\u0430, \u0441\u043a\u0430\u043d, \u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u043c\u0430\u0441\u043a\u0430, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435. \u041d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0430 \u0441\u044e\u0436\u0435\u0442.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/b4a\/66c\/707b4a66cf71bda8e0b4bdb98ebe8c2f.gif\" width=\"320\" height=\"568\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/b4a\/66c\/707b4a66cf71bda8e0b4bdb98ebe8c2f.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/b4a\/66c\/707b4a66cf71bda8e0b4bdb98ebe8c2f.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>3. Radar: \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u043c \u0434\u043d\u0438 \u0436\u0438\u0437\u043d\u0438<\/h4>\n<p>\u0420\u0430\u0434\u0430\u0440 &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u0433\u0434\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 AGSL \u0435\u0449\u0451 \u043d\u0435 \u0443\u0436\u0430\u0441\u0435\u043d, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043b\u0443\u0447, \u0434\u0443\u0433\u0430, \u043a\u043e\u043b\u044c\u0446\u0430, \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0451\u0432 &#8212; \u0432\u0441\u0451 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"kotlin\">val effect = redbytefx {    val time by autoUniformTime()    val speed by autoUniformFloat(0.72f)    val radius by autoUniformFloat(0.34f)    val amount by autoUniformFloat(0.86f)    val base = let(sample(), \"base\")    val uv = let(fragCoord \/ resolution, \"uv\")    val polar = let(polarCoordinates(uv), \"polar\")    val sweepAngle = let(fract(time * speed * 0.08f), \"sweep_angle\")    val sweep = let(angularSweep(uv = uv, angle = sweepAngle, width = 0.12f, feather = 0.03f), \"sweep\")    val arc = let(        arcMask(            uv = uv,            radius = radius,            ringWidth = 0.09f,            angle = sweepAngle,            arcWidth = 0.18f,            feather = 0.03f        ),        \"arc\"    )    val outerRing = let(ringMask(uv, radius = radius, width = 0.016f, feather = 0.012f), \"outer_ring\")    val innerRing = let(ringMask(uv, radius = max(radius * 0.58f, 0.08f), width = 0.014f, feather = 0.012f), \"inner_ring\")    val beam = let(radialRamp(uv = uv, innerRadius = float(0.06f), outerRadius = radius + 0.18f), \"beam\")    val mask = let(max(max(sweep * beam, arc), max(outerRing, innerRing)), \"mask\")    val tint = let(        color(            mix(0.05f, 0.18f, polar.x * 1.4f),            mix(0.24f, 1f, sweep + arc * 0.55f),            mix(0.10f, 0.62f, polar.y * 0.45f + outerRing * 0.35f),            base.a        ),        \"tint\"    )    val screened = let(maskedScreen(base, tint, mask, amount), \"screened\")    maskedOverlay(screened, color(float3(0.82f, 1f, 0.72f), base.a), arc, amount * 0.32f)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 RedByteFX \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0435\u0441\u044c \u0440\u043e\u0441\u0442:<\/p>\n<ul>\n<li>\n<p><code>polarCoordinates(...)<\/code>\u00a0\u0438\u00a0<code>angularSweep(...)<\/code>\u00a0\u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p><code>arcMask(...)<\/code>,\u00a0<code>ringMask(...)<\/code>,\u00a0<code>radialRamp(...)<\/code>\u00a0\u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0442 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u044b \u0438\u0437\u00a0<code>smoothstep<\/code>\u00a0\u0438 \u0440\u0443\u0447\u043d\u044b\u0445 \u043a\u0440\u0438\u0432\u044b\u0445 \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>maskedScreen(...)<\/code>\u00a0\u0438\u00a0<code>maskedOverlay(...)<\/code>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0430 \u043d\u0435 \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e: &#171;\u0441\u044b\u0440\u043e\u0439&#187; AGSL \u0442\u0443\u0442 \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u0443\u0440\u043e\u0432\u043d\u044f \u00ab\u043f\u0430\u0446\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043b &#8212; \u043f\u0430\u0446\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u00bb. RedByteFX \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u0443\u043c\u0430\u0442\u044c \u043f\u0440\u043e \u044d\u0444\u0444\u0435\u043a\u0442, \u0430 \u043d\u0435 \u043f\u0440\u043e \u0442\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc3\/1a6\/c12\/fc31a6c1257a5562919b930d59c7f1bf.gif\" width=\"320\" height=\"568\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc3\/1a6\/c12\/fc31a6c1257a5562919b930d59c7f1bf.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc3\/1a6\/c12\/fc31a6c1257a5562919b930d59c7f1bf.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>4. Metaballs: \u043a\u043e\u0433\u0434\u0430 \u0448\u0435\u0439\u0434\u0435\u0440 \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0436\u0438\u0432\u0430\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u044f<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447. \u042d\u0442\u043e \u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u043d\u0435 \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043b\u0443\u0447 \u0438 \u043d\u0435 \u043c\u0430\u0441\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0430\u044f \u00ab\u0436\u0438\u0432\u0430\u044f\u00bb \u0444\u043e\u0440\u043c\u0430: \u0442\u0440\u0438 SDF-\u043a\u0440\u0443\u0433\u0430 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0433\u043b\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0432 \u043c\u044f\u0433\u043a\u0438\u0435 \u043d\u0435\u043e\u043d\u043e\u0432\u044b\u0435 \u0441\u0433\u0443\u0441\u0442\u043a\u0438. \u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e RedByteFX \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u0431\u0432\u044f\u0437\u043a\u0438 AGSL, \u043d\u043e \u0438 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043a\u0430\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e Kotlin-\u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"kotlin\">val effect = redbytefx {    val timeUniform = uniformTime(name = \"meta_time\")    val blendK = uniformFloat(0.1f, \"meta_blend\")    val uv = let(fragCoord \/ resolution, \"uv\")    val c1 = let(float2(0.35f + sin(timeUniform * 0.7f) * 0.11f, 0.42f + cos(timeUniform * 0.52f) * 0.09f), \"c1\")    val c2 = let(float2(0.64f + cos(timeUniform * 0.58f) * 0.1f, 0.54f + sin(timeUniform * 0.63f) * 0.08f), \"c2\")    val c3 = let(float2(0.48f + sin(timeUniform * 0.33f) * 0.13f, 0.74f + cos(timeUniform * 0.41f) * 0.07f), \"c3\")    val d1 = let(sdCircle(uv - c1, 0.11f), \"d1\")    val d2 = let(sdCircle(uv - c2, 0.1155f), \"d2\")    val d3 = let(sdCircle(uv - c3, 0.1045f), \"d3\")    val m12 = let(sminPoly(d1, d2, 0.085f), \"m12\")    val field = let(sminPoly(m12, d3, blendK), \"field\")    val blob = softFill(field, feather = 0.035f)    val bg = color(float3(0.03f, 0.04f, 0.07f), 1f)    val fill = color(float3(0.15f, 0.95f, 0.82f), 1f)    val rim = color(float3(0.95f, 0.35f, 0.85f), 1f)    val shaded = mix(fill, rim, saturate(blob * 1.15f - 0.35f))    mix(bg, shaded, blob)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0<code>sminPoly(...)<\/code>\u00a0&#8212; \u043d\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f, \u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u044f\u043c\u043e \u0440\u044f\u0434\u043e\u043c \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u0422\u043e \u0435\u0441\u0442\u044c DSL \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u0443\u0431\u0438\u043a\u0438, \u043d\u043e \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u0427\u0435\u043c \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u043e\u043d \u0440\u0435\u0437\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u00a0<code>Radar<\/code>\u00a0\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e, \u0438 \u043f\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435: \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u0441\u043e\u043a \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043b\u0443\u0447\u0430 \u0437\u0434\u0435\u0441\u044c SDF \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u043d\u0451\u043c \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e DSL \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0438 AGSL, \u043d\u043e \u0438 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435\u00a0<code>sminPoly(...)<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>sdCircle(...)<\/code>,\u00a0<code>softFill(...)<\/code>\u00a0\u0438 \u0441\u0433\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u044f\u0442\u0441\u044f \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438: \u0441\u0433\u0443\u0441\u0442\u043a\u0438 \u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f, \u0441\u043b\u0438\u043f\u0430\u044e\u0442\u0441\u044f \u0438, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u00ab\u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442. \u041d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c AGSL \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0430\u0448\u0430\u0440\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u043f\u043a\u0443\u044e \u0441\u0443\u0431\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043d\u043e \u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u0410 \u0442\u0443\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0439: \u0446\u0435\u043d\u0442\u0440\u044b \u043a\u0440\u0443\u0433\u043e\u0432, \u043f\u043e\u043b\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043f\u043b\u0430\u0432\u043d\u043e\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435, \u043c\u044f\u0433\u043a\u0430\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0430, \u0446\u0432\u0435\u0442. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f: &#171;\u041a\u0443!&#187;.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98f\/3ed\/3bd\/98f3ed3bdae8b0cff5269b04f15e1610.gif\" width=\"320\" height=\"568\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98f\/3ed\/3bd\/98f3ed3bdae8b0cff5269b04f15e1610.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98f\/3ed\/3bd\/98f3ed3bdae8b0cff5269b04f15e1610.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0411\u043e\u043d\u0443\u0441: \u0447\u0442\u043e \u0435\u0449\u0451 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c<\/h3>\n<p>\u0412 <a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\/tree\/master\/sample\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <\/a>\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0432\u043a\u0443\u0441: \u043e\u0442 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445, \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u0438 \u043f\u043e\u0447\u0442\u0438 \u0441\u0446\u0435\u043d\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0448\u0442\u0443\u043a. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430 RedByteFX, \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/659\/f89\/072\/659f8907232c3f2214265c5522d3b448.gif\" width=\"320\" height=\"568\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/659\/f89\/072\/659f8907232c3f2214265c5522d3b448.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/659\/f89\/072\/659f8907232c3f2214265c5522d3b448.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>C\u0430\u043c\u043e\u0435 \u0432\u043a\u0443\u0441\u043d\u043e\u0435: \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d DSL RedByteFX<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c RedByteFX \u043a\u0430\u043a \u00ab\u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043e\u043a\u00bb, \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e DSL \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f AGSL \u0432 Kotlin. \u041d\u0438\u0436\u0435 &#8212; \u043a\u0440\u0430\u0442\u043a\u0430\u044f, \u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f <strong>roadmap<\/strong>.<\/p>\n<h4>1. \u041a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b:\u00a0fragCoord\u00a0\u0438\u00a0resolution<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 AGSL:<\/p>\n<ul>\n<li>\n<p><code>fragCoord<\/code>\u00a0&#8212; \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445;<\/p>\n<\/li>\n<li>\n<p><code>resolution<\/code>\u00a0&#8212; \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">val uv = fragCoord \/ resolutionval center = resolution * 0.5f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 AGSL \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442: \u043c\u043e\u0437\u0433 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u0443\u043b\u044c\u0431\u0438\u0442.<\/p>\n<h4>2. \u0427\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430:\u00a0sample()\u00a0\u0438\u00a0sampleUv()<\/h4>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435:<\/p>\n<ul>\n<li>\n<p><code>sample()<\/code>\u00a0\u0438\u00a0<code>sample(coord)<\/code>\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435;<\/p>\n<\/li>\n<li>\n<p><code>sampleUv(uv)<\/code>\u00a0\u0438\u0437 stdlib \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c UV-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u00a0<code>[0, 1]<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>sampleUnclamped(...)<\/code>\u00a0\u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0432 AGSL-\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 &#8212; \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<\/p>\n<pre><code class=\"kotlin\">val base = sample()                  \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e fragCoordval uv = normalizedUv()             \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 UVval reread = sampleUv(uv + drift)   \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0443\u0436\u0435 \u0432 UV-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>3. Uniform-\u044b: \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/h4>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 DSL:<\/p>\n<pre><code class=\"kotlin\">val amount = uniformFloat(0.5f, \"amount\")val shift = uniformFloat2(0f, 0f, \"shift\")val time = uniformTime(name = \"time\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043b\u0438 \u0435\u0449\u0451 \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435 &#8212; \u0447\u0435\u0440\u0435\u0437 auto-\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b:<\/p>\n<pre><code class=\"kotlin\">val amount by autoUniformFloat(0.5f)val time by autoUniformTime()val shift by autoUniformFloat2(0f, 0f)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0438\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0430\u0441\u043a\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<code>FxParam<\/code>\u00a0&#8212; \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 DSL \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 Kotlin \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f\u00a0<code>uniform<\/code>-\u0430 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c AGSL.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong>\u00a0\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u00a0<code>uniform<\/code>-\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443. \u041d\u0435\u043b\u044c\u0437\u044f \u0432\u0437\u044f\u0442\u044c\u00a0<code>FxParam<\/code>\u00a0\u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e\u00a0<code>redbytefx { ... }<\/code>\u00a0\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u043f\u043e\u0445\u043e\u0436\u0438.<\/p>\n<h4>4. \u0422\u0438\u043f\u044b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h4>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 DSL \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><code>FloatExpr<\/code>\u00a0&#8212; \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439\u00a0<code>float<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>BoolExpr<\/code>\u00a0&#8212; \u0431\u0443\u043b\u0435\u0432\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p><code>Float2Expr<\/code>,\u00a0<code>Float3Expr<\/code>,\u00a0<code>Float4Expr<\/code>\u00a0&#8212; \u0432\u0435\u043a\u0442\u043e\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p><code>ColorExpr<\/code>\u00a0&#8212; \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e AGSL. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0435 \u00ab\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb, \u0430 \u00ab\u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0442\u043e\u043c \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 AGSL\u00bb.<\/p>\n<h4>5. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/h4>\n<pre><code class=\"kotlin\">val scalar = float(0.5f)val offset = float2(0f, 12f)val rgb = float3(0.2f, 0.8f, 1f)val rgba = float4(rgb, 1f)val tint = color(0.2f, 0.8f, 1f, 1f)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0447\u0438\u0441\u0442\u043e\u043c AGSL \u0432\u044b \u0438 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u0412 RedByteFX \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<h4>6. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h4>\n<p>\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e:\u00a0<code>+<\/code>,\u00a0<code>-<\/code>,\u00a0<code>*<\/code>,\u00a0<code>\/<\/code>. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0435\u0441\u0442\u044c\u00a0<code>lt<\/code>,\u00a0<code>lte<\/code>,\u00a0<code>gt<\/code>,\u00a0<code>gte<\/code>,\u00a0<code>eq<\/code>,\u00a0<code>neq<\/code>. \u0414\u043b\u044f \u0431\u0443\u043b\u0435\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 &#8212;\u00a0<code>and<\/code>,\u00a0<code>or<\/code>,\u00a0<code>!<\/code>.<\/p>\n<pre><code class=\"kotlin\">val active = (amount gt 0.5f) and (edge lt 0.9f)val mask = ifElse(active, 1f, 0f)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439\u00a0<code>if<\/code>? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c Kotlin-\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 CPU.<\/p>\n<h4>7. \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>\u0412 core \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f AGSL-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>mix<\/code>,\u00a0<code>clamp<\/code>,\u00a0<code>smoothstep<\/code>,\u00a0<code>step<\/code>,\u00a0<code>saturate<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>sin<\/code>,\u00a0<code>cos<\/code>,\u00a0<code>atan<\/code>,\u00a0<code>pow<\/code>,\u00a0<code>sqrt<\/code>,\u00a0<code>abs<\/code>,\u00a0<code>floor<\/code>,\u00a0<code>ceil<\/code>,\u00a0<code>fract<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>min<\/code>,\u00a0<code>max<\/code>,\u00a0<code>mod<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>dot<\/code>,\u00a0<code>length<\/code>,\u00a0<code>distance<\/code>,\u00a0<code>normalize<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>luminance<\/code>,\u00a0<code>grayscale<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u043a AGSL-\u043b\u0435\u043a\u0441\u0438\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043d\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<h4>8. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437\u00a0let(&#8230;)<\/h4>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u0412 \u0447\u0438\u0441\u0442\u043e\u043c AGSL \u0432\u044b \u0438 \u0442\u0430\u043a \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u0432 DSL?<\/p>\n<pre><code class=\"kotlin\">val base = let(sample(), \"base\")val luma = let(luminance(base), \"luma\")val mono = let(grayscale(base), \"mono\")mix(base, mono, luma)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>let(...)<\/code>\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c AGSL. \u042d\u0442\u043e \u0440\u0435\u0437\u043a\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432. \u0410 \u0435\u0449\u0451 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0447\u0435\u0440\u0435\u0437\u00a0<code>agslSource()<\/code>: \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0435 \u043c\u0435\u0448\u0430\u043d\u0438\u043d\u0443, \u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0433\u0438.<\/p>\n<h4>9. \u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437\u00a0fn(&#8230;)\u00a0\u0438\u00a0fnN(&#8230;)<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432 AGSL, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0432\u044b \u0431\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<pre><code class=\"kotlin\">val palette = fn(    name = \"palette_rgb\",    arg1 = FloatType,    arg2 = FloatType,    returns = Float3Type) { tone, warmth -&gt;    val phase = let(tone * 6.2831855f, \"phase\")    float3(        0.24f + 0.45f * sin(phase + warmth * 0.90f + 0.10f),        0.30f + 0.42f * sin(phase + warmth * 1.50f + 2.10f),        0.42f + 0.36f * sin(phase + warmth * 2.10f + 4.20f)    )}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u0442\u0438\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0436\u0438\u0432\u0443\u044e \u0432\u00a0<a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\/blob\/master\/sample\/src\/main\/java\/ru\/redbyte\/redbytefx\/sample\/ui\/demos\/DemoDuotone.kt\" rel=\"noopener noreferrer nofollow\">DemoDuotone.kt<\/a>. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u0442\u044b\u0440\u0451\u0445, \u0435\u0441\u0442\u044c\u00a0<code>fnN(...)<\/code>.<\/p>\n<h4>10.\u00a0core\u00a0\u0438\u00a0stdlib: \u0433\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0447\u0438\u0441\u0442\u044b\u0439 DSL\u00bb \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u00ab\u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432\u00bb<\/h4>\n<p>\u042f \u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><code><strong>redbytefx-core<\/strong><\/code>\u00a0&#8212; \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u0418\u0434\u0435\u0430\u043b\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 AGSL \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d.<\/p>\n<\/li>\n<li>\n<p><code><strong>redbytefx-stdlib<\/strong><\/code>\u00a0&#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445 \u044f\u0437\u044b\u043a\u0430. \u041e\u043d \u043d\u0443\u0436\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u043c\u0430\u0441\u043a\u0438, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b, \u0441\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0451\u043c\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, \u043f\u043e\u043b\u044f\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, SDF \u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u0438\u043d\u0433.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0445\u0435\u043b\u043f\u0435\u0440\u043e\u0432 \u0438\u0437\u00a0<code>stdlib<\/code>:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b:\u00a0<code>normalizedUv<\/code>,\u00a0<code>sampleUv<\/code>,\u00a0<code>centeredUv<\/code>,\u00a0<code>aspectCenteredUv<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0441\u043a\u0438:\u00a0<code>circleMask<\/code>,\u00a0<code>rectMask<\/code>,\u00a0<code>ringMask<\/code>,\u00a0<code>arcMask<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438:\u00a0<code>horizontalReveal<\/code>,\u00a0<code>verticalReveal<\/code>,\u00a0<code>radialReveal<\/code>,\u00a0<code>radialRamp<\/code>,\u00a0<code>angularSweep<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0451\u0432:\u00a0<code>maskedMix<\/code>,\u00a0<code>alphaMask<\/code>,\u00a0<code>maskedScreen<\/code>,\u00a0<code>maskedOverlay<\/code>,\u00a0<code>blendMultiply<\/code>,\u00a0<code>blendScreen<\/code>,\u00a0<code>blendOverlay<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430:\u00a0<code>rimLight<\/code>, SDF-\u0445\u0435\u043b\u043f\u0435\u0440\u044b, \u0445\u0435\u043b\u043f\u0435\u0440\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432, \u0448\u0443\u043c\u044b \u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435\u00a0<code>domainWarp<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435:<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 AGSL, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u0431\u043b\u0438\u0436\u0435 \u043a\u00a0<code>core<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a\u00a0<code>stdlib<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u00a0<code>agslSource()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0430\u0436\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0443\u0442 \u0442\u0430\u043a\u0438\u0435:<\/p>\n<ul>\n<li>\n<p><code>rememberFxController(effect)<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f Compose \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p><code>bindFloat(...)<\/code>,\u00a0<code>bindFloat2(...)<\/code>,\u00a0<code>bindTime(...)<\/code>\u00a0\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u0432\u043e\u0437\u043d\u0438;<\/p>\n<\/li>\n<li>\n<p><code>Modifier.redbyteFx(fx)<\/code>\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043a composable.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u0443\u0442\u044c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c\u00a0<code>effect.agslSource()<\/code>, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0437\u0430\u0442\u0435\u043c \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435\u00a0<code>FxParam<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u044d\u0442\u0438\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c.<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430: \u043a\u0430\u043a \u043c\u044b\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 AGSL \u0432 RedByteFX<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0431\u044b\u043b\u043e \u0432 AGSL<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0435\u043c \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432 RedByteFX<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>main(float2 fragCoord)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u0435\u043b\u043e\u00a0<code>redbytefx { ... }<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439\u00a0<code>ColorExpr<\/code>.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>uniform float u_amount;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>val amount by autoUniformFloat(0.5f)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435, \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>content.eval(fragCoord)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>sample()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f UV-\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f &#8212;\u00a0<code>sampleUv(...)<\/code>.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>float2 uv = fragCoord \/ resolution;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>val uv = let(normalizedUv(), \"uv\")<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\u00a0<code>fragCoord \/ resolution<\/code>.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>float foo(float x) { ... }<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>val foo = fn(...)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0438 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c AGSL.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>float tmp = ...;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>val tmp = let(..., \"tmp\")<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c\u0438.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>if (cond) a else b<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ifElse(cond, a, b)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 DSL \u043c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0432\u0435\u0442\u0432\u0438\u043c Kotlin-\u043a\u043e\u0434.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0437\u0434\u0435\u0441\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442<\/h3>\n<p>\u041d\u0438\u0436\u0435 &#8212; \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430. \u041d\u0435 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u0430\u044f \u043c\u0430\u043d\u0442\u0440\u0430, \u0430 \u043c\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0413\u043e\u043b\u044b\u0439 AGSL<\/p>\n<\/th>\n<th>\n<p align=\"left\">RedByteFX<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0434\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0431\u0435\u0437 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u043c\u0435\u0442\u043d\u043e \u043d\u0438\u0436\u0435: Kotlin-\u043a\u043e\u0434, \u0442\u0438\u043f\u044b, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0442\u0435\u0445\u043d\u043e-\u0431\u043e\u0440\u0449.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>let(...)<\/code>,\u00a0<code>fn(...)<\/code>\u00a0\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u0441\u044e\u0436\u0435\u0442\u043d\u044b\u043c.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 uniform-\u0430\u043c\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0443\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00a0<code>FxParam<\/code>, auto-uniform-\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0434\u0438\u043d\u0433.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Compose-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0436\u043d\u043e, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u0431\u0432\u044f\u0437\u043a\u0438.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>FxController<\/code>,\u00a0<code>bindTime<\/code>,\u00a0<code>Modifier.redbyteFx<\/code>\u00a0\u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f, \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 AGSL \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0436\u0435 \u0432\u044b\u0441\u043e\u043a\u0430\u044f: \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u00a0<code>agslSource()<\/code>.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0440\u0432\u043d\u044b\u0439: \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0440\u0443\u0447\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u043d\u044b.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435: \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Kotlin-\u043a\u043e\u0434.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u0438\u043b\u0438 \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 AGSL-\u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>fn(...)<\/code>\u00a0\u0438 stdlib \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0426\u0435\u043d\u0430 \u0437\u0430 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043b\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0443\u0442\u0438\u043d\u044b.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c DSL, \u0437\u0430\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0438\u0434\u0451\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0442\u043e\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0440\u043e\u0448 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0433\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f.<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0413\u0434\u0435 \u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h3>\n<ul>\n<li>\n<p>\u044d\u0442\u043e Android API 33+; \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0442\u0435\u043a, \u0447\u0443\u0434\u0435\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0432\u0430\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043f\u0440\u044f\u043c\u043e \u043d\u0430 AGSL, \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0442\u043a\u0440\u044b\u0442;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 DSL, RedByteFX \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f: \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 AGSL \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0446\u0435\u043d\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0451 \u0441 \u0442\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0435.<\/p>\n<h3>\u0427\u0442\u043e \u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h3>\n<p>\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b AGSL \u0432 Android \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u00ab\u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u043b \u0442\u0440\u0438 \u0440\u0438\u0442\u0443\u0430\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u044f\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0433 \u043e\u0442\u043a\u0440\u044b\u0442\u044c sample, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b &#8212; \u0438 \u043d\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u00ab\u043e\u0439 \u043d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f\u00bb, \u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u00ab\u041e, \u0430 \u044f \u0436\u0435 \u043c\u043e\u0433\u0443 \u044d\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0435\u0447\u0435\u0440\u043e\u043c!\u00bb.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0443 \u0432\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c, \u0437\u043d\u0430\u0447\u0438\u0442 \u044f \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u043b \u043d\u0435 \u0437\u0440\u044f.<\/p>\n<h3>\u0424\u0438\u043d\u0430\u043b<\/h3>\n<p>RedByteFX &#8212; \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0432\u0435\u0436\u0430\u044f. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0432\u0441\u0451, \u0432\u044b\u0441\u0435\u0447\u0435\u043d\u043e \u0432 \u043a\u0430\u043c\u043d\u0435\u00bb, \u0430 \u0436\u0438\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043b\u044e\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0440\u0443\u0433\u0430\u0442\u044c \u043f\u043e \u0434\u0435\u043b\u0443, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0434\u0435\u0438, \u0437\u0430\u0432\u0435\u0441\u0442\u0438 issue \u0438\u043b\u0438 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 PR.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0431\u043b\u0438\u0437\u043a\u0430 \u0438\u0434\u0435\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c AGSL \u0432 Android \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u043c, \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u043c \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f &#8212; \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0437\u0434\u0435\u0441\u044c:\u00a0<a href=\"https:\/\/github.com\/i-redbyte\/redbytefx\" rel=\"noopener noreferrer nofollow\">github.com\/i-redbyte\/redbytefx<\/a>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0446\u0438\u043b\u043e\u043f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u0438\u0442\u044c \u0432\u0430\u0441 \u043f\u043e \u043d\u043e\u0447\u0430\u043c, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043d\u0435 \u0437\u0440\u044f.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1022546\/\">https:\/\/habr.com\/ru\/articles\/1022546\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0441\u0435\u043b \u043f\u0438\u0441\u0430\u0442\u044c AGSL \u043f\u043e\u0434 Android, \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440,\u00a0RuntimeShader,\u00a0RenderEffect, \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0438 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0442\u0435\u0445\u043d\u043e-\u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432,\u00a0uniform-\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430: \u00ab\u0432 \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b?\u00bb\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u00ab\u043a\u0438\u043d-\u0434\u0437\u0430-\u0434\u0437\u043e\u0432\u0441\u043a\u043e\u0435\u00bb \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435: \u0432\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0449\u0443\u0449\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0442\u0435\u0431\u0435 \u0432\u044b\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u0432\u0438\u0446\u0430\u043f\u0443 \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0441\u043a\u0430\u0437\u0430\u043b\u0438: \u00ab\u043d\u0443 \u0442\u044b \u044d\u0442\u043e&#8230; \u043b\u0435\u0442\u0438\u00bb. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u041d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0442\u0435\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0443\u043f\u043e\u0440\u043d\u044b\u0435.\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f\u00a0RedByteFX. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0433\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443: \u0441\u0434\u0435\u043b\u0430\u0442\u044c AGSL \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0434\u043b\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 AGSL \u043c\u043e\u0449\u043d\u044b\u0439, \u043d\u043e \u043f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u00ab\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0439, \u044d\u0442\u043e \u043d\u0430 \u041d\u043e\u0432\u044b\u0439 \u0433\u043e\u0434\u00bb. \u0410 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u0431\u0435\u0437 \u0434\u0440\u043e\u0436\u0438 \u0432 \u043a\u043e\u043b\u0435\u043d\u044f\u0445 \u0438 \u0431\u0435\u0437 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c \u0441 \u0433\u043e\u0441\u043f\u043e\u0434\u0438\u043d\u043e\u043c \u041f\u0416 \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c \u043f\u0430\u0446\u0430\u043a\u0441\u043a\u043e\u043c \u043d\u0430\u0440\u0435\u0447\u0438\u0438.\u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f:Kotlin DSL \u2192 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 AGSL \u2192 RuntimeShader \/ RenderEffect\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 AGSL. \u042f \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0432\u043e\u0438\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0438 \u043d\u0435 \u043f\u0440\u044f\u0447\u0443 \u043c\u0430\u0433\u0438\u044e \u043f\u043e\u0434 \u043a\u043e\u0432\u0451\u0440. \u042f \u043c\u0435\u043d\u044f\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u043a\u0430\u043a \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f: \u0432\u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0443\u043f\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0441 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Kotlin DSL, \u0430 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0447\u0435\u0441\u0442\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u00a0agslSource().\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 RedByteFX\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443:\u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u043b\u044b\u0439 AGSL \u0432 Android-\u043a\u043e\u0434\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u0442\u043e\u043c\u043b\u044f\u0442\u044c;\u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432 RedByteFX;\u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 &#8212; \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c;\u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d DSL: \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b,\u00a0uniform-\u044b,\u00a0let(&#8230;),\u00a0fn(&#8230;),\u00a0sample(),\u00a0sampleUv(), \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Compose;\u0433\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u0430 \u0433\u0434\u0435 \u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.RedByteFx demo\u041f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u043b\u044b\u0439 AGSL \u0432 Android-\u043a\u043e\u0434\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u0421\u0440\u0430\u0437\u0443 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u0441\u0430\u043c AGSL \u043d\u0435 \u043f\u043b\u043e\u0445\u043e\u0439. \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0448\u0442\u0443\u043a\u0430 \u043c\u043e\u0449\u043d\u0430\u044f \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0430 \u0432 \u0442\u043e\u043c,\u00a0\u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0435\u043c \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437 Kotlin.\u0412\u043e\u0442 \u0433\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0442\u044c:\u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 IDE \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043c\u043e\u0433\u043b\u0430 \u0431\u044b;\u0438\u043c\u0435\u043d\u0430\u00a0uniform-\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0438 \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0430\u0445;\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0440\u0432\u043d\u044b\u043c: \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u0447\u0442\u043e-\u0442\u043e \u0432 Kotlin, \u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043b &#8212; \u043f\u0440\u0438\u0432\u0435\u0442;\u0434\u0430\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0443\u043f \u0438\u0437\u00a0smoothstep,\u00a0fract,\u00a0mix\u00a0\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445;\u0432 Compose \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0451 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435;\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0435\u043b \u00ab\u043b\u0451\u0433\u043a\u043e\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u0435\u00bb, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0441\u043a\u0430\u0445 \u041f\u043b\u044e\u043a\u0430.\u042f \u0445\u043e\u0442\u0435\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0438\u043b\u0443 AGSL, \u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0432\u044b\u0440\u044f\u0435\u0448\u044c\u0441\u044f \u043e\u0442\u0432\u0451\u0440\u0442\u043a\u043e\u0439 \u0432 \u0442\u0451\u043c\u043d\u043e\u043c \u043e\u0442\u0441\u0435\u043a\u0435 \u043a\u043e\u0440\u0430\u0431\u043b\u044f.\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435RedByteFX \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0432 Maven Central. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430\u00a0Android API 33+, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a\u00a0AGSL \/ RuntimeShader \/ RenderEffect.dependencies {    implementation(&#171;io.github.i-redbyte:redbytefx-core:1.0.0&#187;)    implementation(&#171;io.github.i-redbyte:redbytefx-compose:1.0.0&#187;)    implementation(&#171;io.github.i-redbyte:redbytefx-stdlib:1.0.0&#187;)}\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:\u00a0github.com\/i-redbyte\/redbytefx\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0448\u0435\u0439\u0434\u0435\u0440, \u0434\u0432\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u044b\u0442\u0430\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438\u00a0Y. \u042d\u0442\u043e \u0434\u0435\u043c\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u0430\u043a\u00a0DemoWave.kt.\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430 AGSLuniform shader content;uniform float wave_amplitude;uniform float wave_frequency;half4 main(float2 fragCoord) {  float2 offset = float2(    0.0,    sin(fragCoord.x * wave_frequency) * wave_amplitude  );  return content.eval(fragCoord + offset);}\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043b\u043e\u0433\u0438\u043a\u0438 &#8212; \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0443\u044e\u0442\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c.\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430 RedByteFXval effect = redbytefx {    val amplitudeUniform = uniformFloat(0f, &#171;wave_amplitude&#187;)    val frequencyUniform = uniformFloat(0.08f, &#171;wave_frequency&#187;)    val x = let(fragCoord.x, &#171;x&#187;)    val waveOffset = let(        float2(0f, sin(x * frequencyUniform) * amplitudeUniform),        &#171;wave_offset&#187;    )    sample(fragCoord + waveOffset)}\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0443\u0442 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u00ab\u0441\u0442\u0430\u043b\u0430 \u0434\u0440\u0443\u0433\u043e\u0439\u00bb. \u041e\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437\u00a0\u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u0439 \u0436\u0435. \u041d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:uniform-\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b;let(&#8230;)\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0448\u0430\u0433\u0438;\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0sample(&#8230;), \u0430 \u043d\u0435 \u043a\u0430\u043a \u0440\u0443\u0447\u043d\u0430\u044f \u0432\u043e\u0437\u043d\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439;\u043a\u043e\u0434 \u0436\u0438\u0432\u0451\u0442 \u0432 Kotlin, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 IDE \u0441\u043d\u043e\u0432\u0430 \u0432\u0430\u0448 \u0441\u043e\u044e\u0437\u043d\u0438\u043a, \u0430 \u043d\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c.\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432, \u0447\u0442\u043e DSL \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u043c\u0430\u043d\u0441\u0442\u0432\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 AGSL. \u0414\u043b\u044f \u0432\u043e\u043b\u043d\u044b \u043e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d:uniform shader uContent;uniform float2 uResolution;uniform float u_amp;uniform float u_freq;half4 main(float2 fragCoord) {  return rb_sample(    fragCoord + float2(0.0, sin(fragCoord.x * u_freq) * u_amp)  );}\u0418 \u0432\u043e\u0442 \u044d\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. RedByteFX \u043d\u0435 \u043f\u0440\u044f\u0447\u0435\u0442 AGSL. \u041e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u043e AGSL \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0434\u043e\u0439\u0442\u0438 \u0436\u0438\u0432\u044b\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c.\u041e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c\u041d\u0438\u0436\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0443 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439: \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432\u0438\u0442\u0440\u0438\u043d\u043d\u044b\u0439.1. Wave: \u0441\u0430\u043c\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0433\u043e:\u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u0447\u0438\u0441\u0442\u043e\u043c\u0443 AGSL \u043f\u043e \u0444\u043e\u0440\u043c\u0435;\u043d\u0430 \u043d\u0451\u043c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435\u00a0fragCoord,\u00a0sample()\u00a0\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435\u00a0uniform-\u044b;\u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0430\u00a0let(&#8230;), \u043d\u043e \u0435\u0449\u0451 \u043d\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432\u0430\u043c \u0434\u0430\u043b\u0438 \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u043d\u043e\u0436 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0442\u0440\u0430\u043a\u0442\u043e\u0440.\u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b RedByteFX \u043e\u0434\u043d\u043e\u0439 \u0444\u0440\u0430\u0437\u043e\u0439, \u044f \u0431\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u0442\u0430\u043a:\u00a0\u044d\u0442\u043e AGSL, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b\u0438 \u0436\u0438\u0442\u044c \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c Kotlin-\u043a\u043e\u0434\u0435.2. Signal: \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043c\u0430\u0441\u043a\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432:val effect = redbytefx {    val densityUniform = uniformFloat(8f, &#171;signal_density&#187;)    val lineWidthUniform = uniformFloat(0.08f, &#171;signal_line_width&#187;)    val amountUniform = uniformFloat(0.85f, &#171;signal_amount&#187;)    val pulseBand = fn(        name = &#171;pulse_band&#187;,        arg1 = FloatType,        arg2 = FloatType,        returns = FloatType    ) { phase, threshold -&gt;        step(threshold, smoothstep(0.08f, 0.92f, fract(phase)))    }    val base = let(sample(), &#171;base&#187;)    val uv = let(normalizedUv(), &#171;uv&#187;)    val grid = let(gridMask(uv, densityUniform, lineWidthUniform), &#171;grid&#187;)    val scan = let(scanlines(fragCoord.y, 14f, 3f), &#171;scan&#187;)    val pulse = let(pulseBand(uv.y * densityUniform * 0.5f + grid * 0.35f, 0.55f), &#171;pulse&#187;)    val hardMask = let(step(0.45f, scan * pulse), &#171;hard_mask&#187;)    val active = let((grid gt 0.05f) or (hardMask gt 0.5f), &#171;active&#187;)    val accent = let(color(float3(0.05f, 0.95f, 0.82f), base.a), &#171;accent&#187;)    val mixed = let(mix(base, accent, min(grid * 0.85f + hardMask * 0.35f, 1f)), &#171;mixed&#187;)    ifElse(active, mix(base, mixed, amountUniform), base)}\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e:fn(&#8230;)\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e AGSL-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a;normalizedUv()\u00a0\u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442;gridMask(&#8230;)\u00a0\u0438\u00a0scanlines(&#8230;)\u00a0\u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u0448\u0443\u043c \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c;ifElse(&#8230;)\u00a0\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438.\u0412 \u0441\u044b\u0440\u043e\u043c AGSL \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0442\u043e-\u0442\u043e \u0432\u0438\u0434\u0430 \u00ab\u0441\u043e\u0440\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0438 \u0434\u043d\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f\u00bb. \u0410 \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u043d\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0430: \u0431\u0430\u0437\u0430, UV, \u0441\u0435\u0442\u043a\u0430, \u0441\u043a\u0430\u043d, \u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u043c\u0430\u0441\u043a\u0430, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435. \u041d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0430 \u0441\u044e\u0436\u0435\u0442.3. Radar: \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u043c \u0434\u043d\u0438 \u0436\u0438\u0437\u043d\u0438\u0420\u0430\u0434\u0430\u0440 &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u0433\u0434\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 AGSL \u0435\u0449\u0451 \u043d\u0435 \u0443\u0436\u0430\u0441\u0435\u043d, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043b\u0443\u0447, \u0434\u0443\u0433\u0430, \u043a\u043e\u043b\u044c\u0446\u0430, \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0451\u0432 &#8212; \u0432\u0441\u0451 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f.val effect = redbytefx {    val time by autoUniformTime()    val speed by autoUniformFloat(0.72f)    val radius by autoUniformFloat(0.34f)    val amount by autoUniformFloat(0.86f)    val base = let(sample(), &#171;base&#187;)    val uv = let(fragCoord \/ resolution, &#171;uv&#187;)    val polar = let(polarCoordinates(uv), &#171;polar&#187;)    val sweepAngle = let(fract(time * speed * 0.08f), &#171;sweep_angle&#187;)    val sweep = let(angularSweep(uv = uv, angle = sweepAngle, width = 0.12f, feather = 0.03f), &#171;sweep&#187;)    val arc = let(        arcMask(            uv = uv,            radius = radius,            ringWidth = 0.09f,            angle = sweepAngle,            arcWidth = 0.18f,            feather = 0.03f        ),        &#171;arc&#187;    )    val outerRing = let(ringMask(uv, radius = radius, width = 0.016f, feather = 0.012f), &#171;outer_ring&#187;)    val innerRing = let(ringMask(uv, radius = max(radius * 0.58f, 0.08f), width = 0.014f, feather = 0.012f), &#171;inner_ring&#187;)    val beam = let(radialRamp(uv = uv, innerRadius = float(0.06f), outerRadius = radius + 0.18f), &#171;beam&#187;)    val mask = let(max(max(sweep * beam, arc), max(outerRing, innerRing)), &#171;mask&#187;)    val tint = let(        color(            mix(0.05f, 0.18f, polar.x * 1.4f),            mix(0.24f, 1f, sweep + arc * 0.55f),            mix(0.10f, 0.62f, polar.y * 0.45f + outerRing * 0.35f),            base.a        ),        &#171;tint&#187;    )    val screened = let(maskedScreen(base, tint, mask, amount), &#171;screened&#187;)    maskedOverlay(screened, color(float3(0.82f, 1f, 0.72f), base.a), arc, amount * 0.32f)}\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 RedByteFX \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0435\u0441\u044c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-475630","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475630","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=475630"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475630\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=475630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=475630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=475630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}