{"id":376027,"date":"2024-05-21T06:39:53","date_gmt":"2024-05-21T06:39:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=376027"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=376027","title":{"rendered":"<span>\u041a\u043e\u043f\u0430\u0435\u043c\u0441\u044f \u0432 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0441\u0442\u0430\u0440\u043e\u0433\u043e Xiaomi. \u0427\u0430\u0441\u0442\u044c 2<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0441 \u0432\u043e\u0441\u044c\u043c\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0435 \u0441\u0442\u0430\u0440\u0438\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0441 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u041b\u043e\u043c\u043e\u00bb. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/791794\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043f\u043e\u0434\u0430\u043b\u0435\u043a\u0443<\/a>.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0436\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u2013<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d24\/c1e\/913\/d24c1e913ecd290db945aabaa7ea1a2d.jpg\" alt=\"\u0421\u043b\u0435\u0432\u0430 \u0414\u041e, \u0441\u043f\u0440\u0430\u0432\u0430 \u041f\u041e\u0421\u041b\u0415\" title=\"\u0421\u043b\u0435\u0432\u0430 \u0414\u041e, \u0441\u043f\u0440\u0430\u0432\u0430 \u041f\u041e\u0421\u041b\u0415\" width=\"3060\" height=\"2052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d24\/c1e\/913\/d24c1e913ecd290db945aabaa7ea1a2d.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0421\u043b\u0435\u0432\u0430 \u0414\u041e, \u0441\u043f\u0440\u0430\u0432\u0430 \u041f\u041e\u0421\u041b\u0415<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0435\u0444\u043b\u0430\u0433\u043c\u0430\u043d\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1) \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 3-4 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0442.\u043a. \u0438\u043d\u0430\u0447\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043d\u0430 Mi A1 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c).<\/p>\n<p>\u041d\u0443 \u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0412\u044b\u0442\u0440\u0435\u043c \u043f\u044b\u043b\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0436\u0435 \u0446\u0435\u043b\u044b\u0445 8 \u043b\u0435\u0442!<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/120cKvu_oLGFnFNGoJeHzJvvPGISh4BG2\/view?usp=sharing\" rel=\"noopener noreferrer nofollow\">Camera<\/a> \u2013 apk \u0444\u0430\u0439\u043b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/www.javadecompilers.com\/apk\" rel=\"noopener noreferrer nofollow\">ApkDecompiler<\/a> \u2013 \u043e\u043d\u043b\u0430\u0439\u043d \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 apk \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/dfranx\/SHADERed\" rel=\"noopener noreferrer nofollow\">SHADERed<\/a> \u2013 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 (\u0434\u0430, \u0432\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442))<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u0438\u043c\u044b\u0439 \u00ab\u0431\u043b\u043e\u043a\u043d\u043e\u0442\u00bb, \u044f \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e VSCode<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0412 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c! \u0424\u0430\u0439\u043b apk \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0435\u0433\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/www.javadecompilers.com\/apk\" rel=\"noopener noreferrer nofollow\">\u043e\u043d\u043b\u0430\u0439\u043d \u0440\u0435\u0441\u0443\u0440\u0441\u0430<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 VSCode \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u0432\u0438\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043f\u0430\u043f\u043a\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b\u043e-\u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c. \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0437\u0430\u0446\u0435\u043f\u043e\u043a \u2013<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ef1\/a49\/154\/ef1a49154e7a93e376c792233f82122d.png\" alt=\"\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 Mi A1\" title=\"\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 Mi A1\" width=\"392\" height=\"722\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef1\/a49\/154\/ef1a49154e7a93e376c792233f82122d.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 Mi A1<\/figcaption><\/div>\n<\/figure>\n<p>\u0425\u043c, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0442\u0438 \u0432 \u043b\u043e\u0431 \u2013 \u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u00ab\u041b\u043e\u043c\u043e\u00bb \u0432 \u0441\u043e\u0440\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e, \u043f\u043e \u043f\u0443\u0442\u0438  <code>resources\\res\\values-ru<\/code> \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d \u0440\u0435\u0441\u0443\u0440\u0441 <code>pref_camera_coloreffect_entry_instagram_rise<\/code> &#8212;<\/p>\n<pre><code class=\"xml\">... &lt;string name=\"pref_camera_coloreffect_entry_blackwhite\">\u0427\/\u0411&lt;\/string> &lt;string name=\"pref_camera_coloreffect_entry_instagram_rise\">\u041b\u043e\u043c\u043e&lt;\/string> &lt;string name=\"pref_camera_coloreffect_entry_instagram_hudson\">\u041b\u0435\u0434&lt;\/string> ...<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u0434\u0435 \u0440\u044f\u0434\u043e\u043c \u0441 \u043c\u0435\u0441\u0442\u043e\u043c, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u043c \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u0438\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 &#8212;   <\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/027\/685\/6b0\/0276856b08fe1f9510e0aa6c74e8489f.png\" alt=\"\u0418\u0449\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441 \u0432 VSCode\" title=\"\u0418\u0449\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441 \u0432 VSCode\" width=\"398\" height=\"476\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/027\/685\/6b0\/0276856b08fe1f9510e0aa6c74e8489f.png\"\/><\/p>\n<div><figcaption>\u0418\u0449\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441 \u0432 VSCode<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c \u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u043c \u043d\u0430\u043c \u0444\u0430\u0439\u043b\u0435 <code>strings.xml<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u0439\u043b\u0435 <code>R.java<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>strings.xml<\/code>. \u0410 \u0447\u0442\u043e \u0437\u0430 \u0444\u0430\u0439\u043b <code>EffectController.java<\/code>? \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0446\u0435\u043f\u043a\u043e\u0439 \u043f\u043e\u043a\u0440\u0443\u043f\u043d\u0435\u0435.<\/p>\n<h2>\u041e\u0431\u0449\u0435\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>EffectController.java<\/code> \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 <code>pref_camera_coloreffect_entry_instagram_rise<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u043d\u0430 370 \u0441\u0442\u0440\u043e\u043a\u0435 (\u0432 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u043d\u0438\u0436\u0435 \u043d\u0430 30 \u0441\u0442\u0440\u043e\u043a\u0435) \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>getEffectGroup<\/code>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e Xiaomi \u0447\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public RenderGroup getEffectGroup(GLCanvas canvas, RenderGroup renderGroup, boolean wholeRender, boolean isSnapShotRender, int index) {     boolean matchPartRender0;     boolean matchPartRender1;     Render gradienterEffectRender;     if (!Device.isSupportedShaderEffect()) {         return null;     }     boolean addEntry = canvas == null;     boolean initOne = false;     if (canvas == null) {         this.mEffectEntries = new ArrayList&lt;>();         this.mEffectEntryValues = new ArrayList&lt;>();         this.mEffectImageIds = new ArrayList&lt;>();         this.mEffectKeys = new ArrayList&lt;>();         this.mNeedRectSet = new ArrayList&lt;>();         this.mNeedScaleDownSet = new ArrayList&lt;>();         addEntry = true;     } else if (renderGroup == null) {         renderGroup = new RenderGroup(canvas, this.mEffectGroupSize);         if (!wholeRender &amp;&amp; index &lt; 0) {             return renderGroup;         }     } else if (!renderGroup.isNeedInit(index)) {         return renderGroup;     }     int id = 0;     ...     id = 0 + 1;     if (addEntry) {         addEntryItem(R.string.pref_camera_coloreffect_entry_instagram_rise, id);         this.mEffectImageIds.add(Integer.valueOf(R.drawable.camera_effect_image_instagram_rise));         this.mEffectKeys.add(\"effect_instagram_rise_picture_taken_key\");     } else if (renderGroup.getRender(id) == null &amp;&amp; (V6ModulePicker.isCameraModule() || isSnapShotRender)) {         if (!wholeRender &amp;&amp; index != id) {             if (index &lt; 0) {                 if (0 != 0) {                 }             }         }         renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id);         initOne = true;     }     ... }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0438\u0436\u0435 \u043d\u0430\u0441 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u0438\u0434\u0430 &#8212;   <\/p>\n<pre><code class=\"java\">int id = ...; if (addEntry) { ... } else if (...) { ... }<\/code><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0441 InstagramRise &#8212;<\/p>\n<pre><code class=\"java\">id = 0 + 1; if (addEntry) {     addEntryItem(R.string.pref_camera_coloreffect_entry_instagram_rise, id);     this.mEffectImageIds.add(Integer.valueOf(R.drawable.camera_effect_image_instagram_rise));     this.mEffectKeys.add(\"effect_instagram_rise_picture_taken_key\"); } else if (renderGroup.getRender(id) == null &amp;&amp; (V6ModulePicker.isCameraModule() || isSnapShotRender)) {     if (!wholeRender &amp;&amp; index != id) {         if (index &lt; 0) {             if (0 != 0) {             }         }     }     renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id);     initOne = true; }<\/code><\/pre>\n<p>\u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u043d\u0430 6 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c id \u0432 \u043d\u0435\u043a\u043e\u043c renderGroup, \u0438 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442, \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 13 \u0441\u0442\u0440\u043e\u043a\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u044d\u0442\u043e\u0442 RenderGroup \u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u043a\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u00abgetEffectGroup\u00bb \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u043f\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0438\u0436\u0435 \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0432\u0438\u0434\u0430 \u2013<\/p>\n<pre><code class=\"java\">renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id); renderGroup.setRender(InstagramClarendonEffectRender.create(canvas, id2), id2); renderGroup.setRender(InstagramCremaEffectRender.create(canvas, id3), id3); ...<\/code><\/pre>\n<p>\u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044d\u0442\u0438 id \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0438\u0445 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438. \u0412\u0441\u0435 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e renderGroup \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438\u0437\u0443\u0447\u0438\u043c \u043c\u0435\u0442\u043e\u0434 create \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abInstagramRiseEffectRender\u00bb &#8212;<\/p>\n<pre><code class=\"java\">public static Render create(GLCanvas canvas, int id) {     CurveEffectRender firstPassRender = new CurveEffectRender(canvas, id);     firstPassRender.setRGBTransLutBuffer(getCurveRGBLutBuffer());     InstagramRiseEffectRender secondPassRender = new InstagramRiseEffectRender(canvas, id);     secondPassRender.setRGBTransLutBuffer(getSelfRGBLutBuffer());     return new PipeRenderPair(canvas, firstPassRender, secondPassRender, false); }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 <strong>CurveEffectRender<\/strong> \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <strong>InstagramRiseEffectRender<\/strong>, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043c \u043a\u0430\u043a\u0438\u0445-\u0442\u043e LUT-\u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 <strong>PipeRenderPair<\/strong>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 <strong>RGBTransEffectRender<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 <strong>PixelEffectRender<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u2026 \u0422\u0430\u043a! \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0441\u0445\u0435\u043c\u0443 \u044f \u0431\u0443\u0434\u0443 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435, \u043d\u0430\u0447\u0430\u043b \u044f \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <strong>InstagramRiseEffectRender<\/strong> \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u00ab\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438\u00bb. \u041d\u0430 \u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0443\u0439\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0438 \u0440\u043e\u043b\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043e\u0442\u0440\u044b\u0432\u0438\u0441\u0442\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438 \u043f\u0430\u0440\u0443 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u0438 \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0442.\u043a. \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043a \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u044f \u043f\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u0443 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a4\/218\/f07\/6a4218f07a8f37c8bc6e99729008270b.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439\" width=\"1928\" height=\"2728\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a4\/218\/f07\/6a4218f07a8f37c8bc6e99729008270b.png\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <a href=\"https:\/\/drive.google.com\/file\/d\/1_10exJ6X9dKfhvkPro5gF6Ops89sDY1q\/view?usp=sharing\" rel=\"noopener noreferrer nofollow\">\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432 \u044d\u0442\u043e\u0439 \u043a\u0443\u0447\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 create \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.<\/p>\n<ol>\n<li>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442 InstagramRiseEffectRender \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c (\u043b\u043e\u0433\u0438\u043a\u0430 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 create). \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 CurveEffectRender \u0438 \u0441\u0435\u0431\u044f (\u043d\u0430\u0432\u0435\u044f\u043b\u043e \u0431\u043e\u0440\u043e\u0434\u0430\u0442\u044b\u0439 \u0430\u043d\u0435\u043a\u0434\u043e\u0442 \u043f\u0440\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e: \u0441\u043e\u0441\u0442\u0430\u0432 \u0441\u0430\u043b\u0430\u0442\u0430 \u2013 \u043f\u043e\u043c\u0438\u0434\u043e\u0440, \u043e\u0433\u0443\u0440\u0435\u0446, \u0441\u0430\u043b\u0430\u0442).<\/p>\n<\/li>\n<li>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u044b InstagramRiseEffectRender \u0438 CurveEffectRender \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u0442.\u043a. \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434 <code>String getFragShaderString()<\/code>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0442 \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <strong>setRGBTransLutBuffer<\/strong> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 RGBTransEffectRender).<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0441\u0442\u0430\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b (\u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0434\u0432\u0443\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043d\u043e\u0432\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 create, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 &#8212;<\/p>\n<pre><code class=\"java\">public static Render create(GLCanvas canvas, int id) {     \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 - \u0448\u0435\u0439\u0434\u0435\u0440\u0430 CurveEffectRender     CurveEffectRender firstPassRender = new CurveEffectRender(canvas, id);     \/\/ \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 getCurveRGBLutBuffer()     firstPassRender.setRGBTransLutBuffer(getCurveRGBLutBuffer());     \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 - \u0448\u0435\u0439\u0434\u0435\u0440\u0430 InstagramRiseEffectRender     InstagramRiseEffectRender secondPassRender = new InstagramRiseEffectRender(canvas, id);     \/\/ \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 getSelfRGBLutBuffer()     secondPassRender.setRGBTransLutBuffer(getSelfRGBLutBuffer());     \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432     return new PipeRenderPair(canvas, firstPassRender, secondPassRender, false); }<\/code><\/pre>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u2013<\/p>\n<ol>\n<li>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u0445?<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e \u0437\u0430 LUT \u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0435\u0438\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c?<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e.<\/p>\n<h2>\u0420\u0430\u0437\u0431\u043e\u0440 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/h2>\n<p><em>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b?<\/em><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 X, Y \u0438 \u0435\u0449\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (\u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439) \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 X, Y.<\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a &#8212;<\/p>\n<pre><code class=\"cpp\">Color F(int x, int y) {     \/\/ \u0412\u0430\u0448 \u0448\u0435\u0439\u0434\u0435\u0440 }  void applyShader() {     Canvas canva = new Canvas(1080, 1920);     for (int y = 0; y &lt; canva.height; y++) {         for (int x = 0; x &lt; canva.width; x++) {             canva.setPixel(x, y, F(x, y));         }     } } <\/code><\/pre>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u0441\u043e\u0442\u043d\u0438 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043a\u043e\u0434 \u0432\u044b\u0448\u0435, \u0442.\u043a. \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0438\u043b\u0430\u043c\u0438 GPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <strong>F<\/strong> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043f\u0438\u0448\u0443\u0442 \u043d\u0430 C \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 HLSL, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b &#8212;<\/p>\n<pre><code class=\"cpp\">void mainImage( out vec4 fragColor, in vec2 fragCoord ) {     \/\/ \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 (0..1) \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b X, Y      vec2 uv = fragCoord\/iResolution.xy;      \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     float col = 0.5 + 0.5*cos(iTime + uv.x * uv.y);      \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 - \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 X, Y     fragColor = vec4(0.0, 0.0, col ,1.0); }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/18c\/a3c\/eec\/18ca3ceec662b7ff41405a57634427c2.gif\" alt=\"\u0417\u0430\u043f\u0443\u0441\u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u0448\u0435\" title=\"\u0417\u0430\u043f\u0443\u0441\u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u0448\u0435\" width=\"640\" height=\"480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/18c\/a3c\/eec\/18ca3ceec662b7ff41405a57634427c2.gif\"\/><\/p>\n<div><figcaption>\u0417\u0430\u043f\u0443\u0441\u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u0448\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0443\u043c\u0430\u044e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u044b \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0432\u043e\u0442 \u043a <a href=\"https:\/\/habr.com\/ru\/articles\/333002\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0442\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0447\u0438\u0442\u0430\u043b \u044f.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 <a href=\"https:\/\/www.shadertoy.com\/\" rel=\"noopener noreferrer nofollow\">ShaderToy<\/a>.<\/p>\n<p>\u041d\u0430\u0448\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b InstagramRiseEffectRender \u0438 CurveEffectRender \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 getFragShaderString, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.<\/p>\n<p><em>\u0420\u0430\u0437\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430<\/em><\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043e\u0431\u0435\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 &#8212;<\/p>\n<pre><code class=\"java\">firstPassRender.setRGBTransLutBuffer(getCurveRGBLutBuffer()); secondPassRender.setRGBTransLutBuffer(getSelfRGBLutBuffer());<\/code><\/pre>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e getCurveRGBLutBuffer, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 &#8212;<\/p>\n<pre><code class=\"java\">private static IntBuffer getCurveRGBLutBuffer() {     if (sCurveRGBLutBuffer == null) {         int[] rgbLut = new int[sCurveRLut.length];         for (int i = 0; i &lt; rgbLut.length; i++) {             rgbLut[i] = (sCurveBLut[i] &lt;&lt; 16) | -16777216 | (sCurveGLut[i] &lt;&lt; 8) | sCurveRLut[i];         }         sCurveRGBLutBuffer = IntBuffer.wrap(rgbLut);     }     sCurveRGBLutBuffer.rewind();     return sCurveRGBLutBuffer; }<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435! \u0412\u0435\u0434\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b sCurveBLut, sCurveGLut, sCurveRLut \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 rgbLut.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b &#8212;<\/p>\n<pre><code class=\"java\">private static final int[] sCurveBLut = {34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 53, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 107, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 179, 180, 181, 182, 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}; private static final int[] sCurveGLut = {23, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 226, 227, 228, 229, 230, 231, 232, 233, 233, 234, 235, 236, 237, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 244, 245, 245, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255}; private static final int[] sCurveRLut = {35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 238, 239, 240, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 255};<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0446\u0432\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 int, \u043c\u043b\u0430\u0434\u0448\u0438\u0435 8 \u0431\u0438\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0446\u0432\u0435\u0442, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 8 \u0437\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 8 \u0437\u0430 \u0441\u0438\u043d\u0438\u0439, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 8 \u0437\u0430 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48b\/302\/d64\/48b302d6470936f8e1709afb8ee8b186.png\" width=\"1321\" height=\"82\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/48b\/302\/d64\/48b302d6470936f8e1709afb8ee8b186.png\"\/><\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b sCurveBLut, sCurveGLut, sCurveRLut \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0446\u0432\u0435\u0442\u0430 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (\u043a\u0440\u0430\u0441\u043d\u043e\u0439, \u0437\u0435\u043b\u0435\u043d\u043e\u0439 \u0438 \u0441\u0438\u043d\u0435\u0439), \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f getCurveRGBLutBuffer \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (rgbLut)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>sCurveBLut<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>sCurveGLut<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>sCurveRLut<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(35, 23, 34)<\/p>\n<\/td>\n<td>\n<p align=\"left\">34<\/p>\n<\/td>\n<td>\n<p align=\"left\">23<\/p>\n<\/td>\n<td>\n<p align=\"left\">35<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(35, 23, 34)<\/p>\n<\/td>\n<td>\n<p align=\"left\">34<\/p>\n<\/td>\n<td>\n<p align=\"left\">23<\/p>\n<\/td>\n<td>\n<p align=\"left\">35<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(36, 24, 35)<\/p>\n<\/td>\n<td>\n<p align=\"left\">35<\/p>\n<\/td>\n<td>\n<p align=\"left\">24<\/p>\n<\/td>\n<td>\n<p align=\"left\">36<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(37, 25, 35)<\/p>\n<\/td>\n<td>\n<p align=\"left\">35<\/p>\n<\/td>\n<td>\n<p align=\"left\">25<\/p>\n<\/td>\n<td>\n<p align=\"left\">37<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(38, 26, 36)<\/p>\n<\/td>\n<td>\n<p align=\"left\">36<\/p>\n<\/td>\n<td>\n<p align=\"left\">26<\/p>\n<\/td>\n<td>\n<p align=\"left\">38<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 getSelfRGBLutBuffer? \u0422\u0443\u0442 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435, \u043e\u043d \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (\u0442.\u0435. <code>X = sSelfRGBLut[i]; result = rgb(X, X, X)<\/code>) &#8212;<\/p>\n<pre><code class=\"java\">private static IntBuffer getSelfRGBLutBuffer() {     if (sSelfRGBLutBuffer == null) {         for (int i = 0; i &lt; sSelfRGBLut.length; i++) {             sSelfRGBLut[i] = (sSelfRGBLut[i] &lt;&lt; 16) | -16777216 | (sSelfRGBLut[i] &lt;&lt; 8) | sSelfRGBLut[i];         }         sSelfRGBLutBuffer = IntBuffer.wrap(sSelfRGBLut);     }     sSelfRGBLutBuffer.rewind();     return sSelfRGBLutBuffer; }<\/code><\/pre>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0414\u0430\u043b\u0435\u0435 \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0448\u0435\u0439\u0434\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 setRGBTransLutBuffer &#8212;<\/p>\n<pre><code class=\"java\">public void setRGBTransLutBuffer(IntBuffer lut) {     GLId.glGenTextures(1, sTextureIds, 0);     this.mRGBLutId = sTextureIds[0];     GLES20.glBindTexture(3553, this.mRGBLutId);     GLES20.glTexParameteri(3553, 10242, 33071);     GLES20.glTexParameteri(3553, 10243, 33071);     GLES20.glTexParameterf(3553, 10241, 9728.0f);     GLES20.glTexParameterf(3553, 10240, 9728.0f);     GLES20.glTexImage2D(3553, 0, 6408, lut.capacity(), 1, 0, 6408, 5121, lut);     this.mRGBLutLoaded = true; }<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u0430 \u0447\u0442\u043e \u0437\u0430 \u043a\u0443\u0447\u0430 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b? \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0438\u0437 <a href=\"https:\/\/developer.android.com\/reference\/android\/opengl\/GLES20\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<pre><code class=\"java\">public void setRGBTransLutBuffer(IntBuffer lut) {     GLId.glGenTextures(1, sTextureIds, 0);     this.mRGBLutId = sTextureIds[0];     GLES20.glBindTexture(3553, this.mRGBLutId);     GLES20.glTexParameteri(3553, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);     GLES20.glTexParameteri(3553, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);     GLES20.glTexParameterf(3553, GL_TEXTURE_MIN_FILTER, GL_NEAREST);     GLES20.glTexParameterf(3553, GL_TEXTURE_MAG_FILTER, GL_NEAREST);     GLES20.glTexImage2D(3553, 0, GL_RGBA, lut.capacity(), 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, lut);     this.mRGBLutLoaded = true; }<\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e! \u041c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0431\u044b\u043b \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0438\u0434\u0430 <code>A[i]<\/code>, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a &#8212; <code>texture(sRGBLut, vec2(i, 0.0)<\/code>).<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 0..1. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u043b\u0438 \u0431\u044b\u043b \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 [5, 10, 15], \u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 (\u0440\u0430\u0432\u043d\u044b\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e 10), \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c (0.5, 0.0). \u0422.\u0435. X = 0.5 \u0442.\u043a. \u043e\u043d \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 Y \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u0435\u043d 0.0.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e 3553 \u044d\u0442\u043e id \u0431\u0443\u0444\u0435\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u2013<\/p>\n<ol>\n<li>\n<p><code>GL_TEXTURE_WRAP_S<\/code> \u0438 <code>GL_TEXTURE_WRAP_T<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0444\u0435\u0440\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>GL_CLAMP_TO_EDGE<\/code> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b).<\/p>\n<\/li>\n<li>\n<p>\u0422.\u043a. \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 0..1, <code>GL_TEXTURE_MIN_FILTER<\/code> \u0438 <code>GL_TEXTURE_MAG_FILTER<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438. <code>GL_NEAREST<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440, \u0430 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 LUT?<\/p>\n<p><em>\u0424\u0438\u043b\u044c\u0442\u0440 LUT<\/em><\/p>\n<p>LUT \u2013 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043e \u043e\u0442 LookUp Table, \u0442.\u0435. \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. \u0422\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043d \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435, \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0442\u043e \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u0435\u0435, \u044f\u0440\u0447\u0435, \u0438 \u0435\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0435.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a &#8212;<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(255, 0, 0)<\/p>\n<\/td>\n<td>\n<p align=\"left\">rgb(230, 0, 0)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(254, 0, 0)<\/p>\n<\/td>\n<td>\n<p align=\"left\">rgb(228, 0, 0)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(253, 0, 0)<\/p>\n<\/td>\n<td>\n<p align=\"left\">rgb(227, 0, 0)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\">\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">rgb(130, 45, 11)<\/p>\n<\/td>\n<td>\n<p align=\"left\">rgb(120, 40, 5)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 (\u0442.\u0435. 256 * 256 * 256 = 16.7 \u043c\u043b\u043d. \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439).<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 3D LUT, (3D \u0442.\u043a. \u0442\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u0439, \u0437\u0435\u043b\u0435\u043d\u044b\u0439, \u0441\u0438\u043d\u0438\u0439), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c 16.7 \u043c\u043b\u043d. \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439, \u043d\u043e \u0432\u0435\u0434\u044c \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043d\u0435\u0442? \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440, \u043e\u043d \u0431\u044b\u043b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f LUT \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u043c, \u043d\u043e \u0438 \u043f\u043e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u043f\u0438\u043b\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u0442\u0440\u0438 1D LUT \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0446\u0432\u0435\u0442\u0430? \u0422.\u0435. \u0441\u0432\u043e\u0439 LUT \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e, \u0441\u0432\u043e\u0439 \u0434\u043b\u044f \u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e, \u0438 \u0441\u0432\u043e\u0439 \u0434\u043b\u044f \u0441\u0438\u043d\u0435\u0433\u043e.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0448\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0443\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0430\u0447\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u043e\u0439 &#8212;<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e R<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e R<\/strong><\/p>\n<\/td>\n<td rowspan=\"4\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e G<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e G<\/strong><\/p>\n<\/td>\n<td rowspan=\"4\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e B<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e B<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">230<\/p>\n<\/td>\n<td>\n<p align=\"left\">225<\/p>\n<\/td>\n<td>\n<p align=\"left\">130<\/p>\n<\/td>\n<td>\n<p align=\"left\">125<\/p>\n<\/td>\n<td>\n<p align=\"left\">30<\/p>\n<\/td>\n<td>\n<p align=\"left\">25<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">229<\/p>\n<\/td>\n<td>\n<p align=\"left\">223<\/p>\n<\/td>\n<td>\n<p align=\"left\">129<\/p>\n<\/td>\n<td>\n<p align=\"left\">123<\/p>\n<\/td>\n<td>\n<p align=\"left\">29<\/p>\n<\/td>\n<td>\n<p align=\"left\">23<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">228<\/p>\n<\/td>\n<td>\n<p align=\"left\">221<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">121<\/p>\n<\/td>\n<td>\n<p align=\"left\">28<\/p>\n<\/td>\n<td>\n<p align=\"left\">21<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0440\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0446\u0432\u0435\u0442\u0430. \u0418 \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0430 \u0432\u0445\u043e\u0434, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u0438\u0434\u0435\u0442 \u0446\u0432\u0435\u0442 <strong>rgb(229, 128, 30)<\/strong>, \u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>rgb(223, 121, 25),<\/strong> \u043f\u0440\u043e\u0432\u043e\u0434\u044f \u0437\u0430\u043c\u0435\u043d\u0443 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/p>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435-\u043a\u0430! \u0412\u0435\u0434\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u0438\u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u0442 256, \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0440\u043e\u0438\u0445 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 int, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setRGBTransLutBuffer! \u0412\u044b\u0445\u043e\u0434\u0438\u0442, \u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438, \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 LUT (\u043f\u043e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435) \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0437\u0430\u043c\u0435\u043d\u044b \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p><em>\u0428\u0430\u0433 1. LUT<\/em><\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0431\u0449\u0435\u043c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0430\u043c\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u2013 <strong>CurveEffectRender<\/strong>, \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u043c \u0435\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>getFragShaderString<\/strong> &#8212;<\/p>\n<pre><code class=\"cpp\">precision mediump int; precision mediump float;  \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 uniform sampler2D sTexture; \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 LUT uniform sampler2D sRGBLut;  \/\/ \u0422\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044f varying vec2 vTexCoord; \/\/ \u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u044f\u0440\u043a\u043e\u0441\u0442\u0438, \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0440\u0430\u0432\u0435\u043d 1.0 uniform float uAlpha;  void main() {     vec3 color = texture2D(sTexture, vTexCoord).rgb;     vec3 index;     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f LUT \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441)     index.r = float(int(color.r * 255.0)) \/ 256.0;     index.g = float(int(color.g * 255.0)) \/ 256.0;     index.b = float(int(color.b * 255.0)) \/ 256.0;     color.r = texture2D(sRGBLut, vec2(index.r, 0.0)).r;     color.g = texture2D(sRGBLut, vec2(index.g, 0.0)).g;     color.b = texture2D(sRGBLut, vec2(index.b, 0.0)).b;     \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0446\u0432\u0435\u0442     gl_FragColor = vec4(color, 1.0) * uAlpha; }<\/code><\/pre>\n<p>\u042f \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u044f\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443:<\/p>\n<ol>\n<li>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 (\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0434\u043b\u044f LUT).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0446\u0432\u0435\u0442\u0430 (\u0442.\u0435. \u0446\u0432\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441).<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 LUT.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c LUT, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u0438 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b (\u043e\u043d\u0438 \u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0446\u0432\u0435\u0442), \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0438 \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b &#8212;<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e R (\u0438\u043d\u0434\u0435\u043a\u0441)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e R<\/strong><\/p>\n<\/td>\n<td rowspan=\"4\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e G (\u0438\u043d\u0434\u0435\u043a\u0441)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e G<\/strong><\/p>\n<\/td>\n<td rowspan=\"4\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0411\u044b\u043b\u043e B (\u0438\u043d\u0434\u0435\u043a\u0441)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0430\u043b\u043e B<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">230<\/p>\n<\/td>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">225<\/p>\n<\/td>\n<td>\n<p align=\"left\">130<\/p>\n<\/td>\n<td>\n<p align=\"left\">125<\/p>\n<\/td>\n<td>\n<p align=\"left\">30<\/p>\n<\/td>\n<td>\n<p align=\"left\">25<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">229<\/p>\n<\/td>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">223<\/p>\n<\/td>\n<td>\n<p align=\"left\">129<\/p>\n<\/td>\n<td>\n<p align=\"left\">123<\/p>\n<\/td>\n<td>\n<p align=\"left\">29<\/p>\n<\/td>\n<td>\n<p align=\"left\">23<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">228<\/p>\n<\/td>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">221<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">121<\/p>\n<\/td>\n<td>\n<p align=\"left\">28<\/p>\n<\/td>\n<td>\n<p align=\"left\">21<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 R, G, B. \u0425\u043e\u0440\u043e\u0448\u043e, \u0430 \u043a\u0430\u043a\u0438\u0435 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f? \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b sCurveBLut, sCurveGLut, sCurveRLut. \u041c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 <strong>[i]<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <strong>i<\/strong> \u0432 \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u0433\u0434\u0435 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0440\u0447\u0435, \u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0437\u0430\u0442\u0435\u043c\u043d\u0451\u043d) &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/902\/2b7\/9a1\/9022b79a197f529419d069e542be6f9f.png\" width=\"557\" height=\"730\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/902\/2b7\/9a1\/9022b79a197f529419d069e542be6f9f.png\"\/><\/figure>\n<p>\u041e\u0441\u044c X \u2013 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b), \u043e\u0441\u044c Y \u2013 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b). \u0427\u0435\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0442\u0443\u0442 \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u0442.\u0435. \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0438\u0434\u0430 Y = X). \u0410 \u0446\u0432\u0435\u0442\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u2013 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e, \u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u0438 \u0441\u0438\u043d\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c? \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0438 \u0437\u0435\u043b\u0435\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u0435\u0442\u043b\u0435\u0435 (\u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 \u0447\u0435\u0440\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u043e\u043d\u0438 \u043f\u043b\u0430\u0432\u043d\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0443 \u043d\u0430\u0441 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0446\u0432\u0435\u0442. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0438\u0439 \u0446\u0432\u0435\u0442 \u0443 \u043d\u0430\u0441 \u0432 \u0442\u043e\u0447\u043a\u0435 ~180 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0443\u0441\u043a\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u043e\u0442\u043e, \u0438 \u0441 ~200 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u00ab\u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f\u00bb \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0441 0, \u0430 \u0441 ~35, \u0442.\u0435. \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u043e \u00ab\u0447\u0435\u0440\u043d\u044b\u0439\u00bb \u0446\u0432\u0435\u0442.<\/p>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7da\/707\/d08\/7da707d082478b0cb18baa3867836b00.jpg\" width=\"3060\" height=\"2044\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7da\/707\/d08\/7da707d082478b0cb18baa3867836b00.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 Rise, \u043d\u043e \u044d\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440! \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d.<\/p>\n<p><em>\u0428\u0430\u0433 2.1. \u0415\u0449\u0435 \u043e\u0434\u0438\u043d LUT<\/em><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 getFragShaderString \u043a\u043b\u0430\u0441\u0441\u0430 InstagramRiseEffectRender &#8212;<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">precision mediump int; precision mediump float;  \/\/ \u0412\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 uniform sampler2D sTexture; \/\/ \u041c\u0430\u0441\u0441\u0438\u0432 LUT uniform sampler2D sRGBLut; \/\/ \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 varying vec2 vTexCoord;  \/\/ \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0437\u0430\u0434\u0430\u043d\u044b \u0432 InstagramRiseEffectRender) uniform float uAlpha;   \/\/ 1.0 uniform float uCon;     \/\/ -7.0 uniform vec2  uCenPos;  \/\/ vec2(0.57, 0.5814) uniform vec2  uGCenPos; \/\/ vec2(0.5, 0.64) uniform float uRadius;  \/\/ 0.491 uniform float uStd;     \/\/ 0.236 uniform vec2  uWH;      \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 vec2(1080, 1920)  vec3 CProcess(vec3 color) {     vec3 dstcolor;     float cValue = uCon\/100.0 + 1.0;     dstcolor = clamp((color - 0.5) *cValue + 0.5,0.0,1.0);     return dstcolor; }  float WJianbianProcess() {     float disx,disy,dis,f1,f2,f,pf = uWH.x \/ uWH.y,x,y;     f1 = max(uCenPos.x,1.0 - uCenPos.x);f2 = max(uCenPos.y,1.0 - uCenPos.y);     if (pf &lt; 1.0) {         disx = (vTexCoord.x - uCenPos.x) * (vTexCoord.x - uCenPos.x);         if (vTexCoord.y\/pf &lt; uCenPos.y) {             y = vTexCoord.y;         } else if ((1.0 - vTexCoord.y)\/pf &lt; (1.0 - uCenPos.y)) {             y = pf - (1.0 - vTexCoord.y);         } else {             y = uCenPos.y * pf;         }         disy = (y\/pf - uCenPos.y) * (y\/pf - uCenPos.y);     } else {         disy = (vTexCoord.y - uCenPos.y) * (vTexCoord.y - uCenPos.y);         if (vTexCoord.x * pf &lt; uCenPos.x) {             x = vTexCoord.x;         } else if ((1.0 - vTexCoord.x)*pf &lt; (1.0 - uCenPos.x)) {             x = 1.0\/pf - (1.0 - vTexCoord.x);         } else {             x = uCenPos.x \/ pf;         }         disx = (x * pf - uCenPos.x) * (x * pf - uCenPos.x);     }     dis = disx + disy;     f1 = sqrt(dis)\/(sqrt(f1 * f1 + f2 * f2) * uRadius);     if (f1 > 1.0) {         f = 0.4;     } else {         f2 = 0.9908 * pow(f1,3.0) -1.4934 * pow(f1,2.0) -0.4974 * f1 + 1.0;         f = 0.6 * f2 + 0.4;     }     return f; }  float WEraserProcess() {     float disx,disy,dis,f1,f2,f,pf = uWH.x \/ uWH.y,x,y,std1;     f1 = max(uGCenPos.x,1.0 - uGCenPos.x);f2 = max(uGCenPos.y,1.0 - uGCenPos.y);     std1 = 2.0 * uStd * uStd * (f1 * f1 + f2 * f2);     if (pf &lt; 1.0) {         disx = (vTexCoord.x - uGCenPos.x) * (vTexCoord.x - uGCenPos.x);         if (vTexCoord.y \/pf &lt; uCenPos.y) {             y = vTexCoord.y;         } else if ((1.0 - vTexCoord.y)\/pf &lt; (1.0 - uCenPos.y)) {             y = pf - (1.0 - vTexCoord.y);         } else {             y = uCenPos.y * pf;         }         disy = (y\/pf - uGCenPos.y) * (y\/pf - uGCenPos.y);     } else {         disy = (vTexCoord.y - uCenPos.y) * (vTexCoord.y - uCenPos.y);         if (vTexCoord.x * pf &lt; uCenPos.x) {             x = vTexCoord.x;         } else if ((1.0 - vTexCoord.x)*pf &lt; (1.0 - uCenPos.x)) {             x = 1.0\/pf - (1.0 - vTexCoord.x);         } else {             x = uCenPos.x \/ pf;         }         disx =  (x * pf - uCenPos.x) * (x * pf - uCenPos.x);     }     dis = disx + disy;     f = exp(-1.0 * (disx + disy)\/std1);     return f; }  float BlendOverlayF(float base, float blend) {     return (base &lt; 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))); }  vec3 BlendOverlay(vec3 base, vec3 blend) {     vec3 destColor;     destColor.r = BlendOverlayF(base.r, blend.r);     destColor.g = BlendOverlayF(base.g, blend.g);     destColor.b = BlendOverlayF(base.b, blend.b);     return destColor; }  \/\/ \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 void main() {     \/\/ \u0415\u0449\u0435 \u043e\u0434\u0438\u043d LUT, \u043d\u043e \u043f\u0435\u0440\u0435\u0444\u0440\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439)     vec3 color = texture2D(sTexture, vTexCoord).rgb;     int index = int(color.r * 255.0);     float index1 = float(index) \/ 256.0;     color.r = texture2D(sRGBLut,vec2(index1,0.0)).r;     index = int(color.g * 255.0);     index1 = float(index) \/ 256.0;     color.g = texture2D(sRGBLut,vec2(index1,0.0)).r;     index = int(color.b * 255.0);     index1 = float(index) \/ 256.0;     color.b = texture2D(sRGBLut,vec2(index1,0.0)).r;     vec3 oricolor = vec3(color.r,color.g,color.b);     \/\/ \u0411\u0435\u043b\u044c\u043c\u043e     oricolor = CProcess(oricolor);     \/\/ \u0417\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435     vec3 dstcolor = BlendOverlay(oricolor,vec3(0.0,0.0,0.0));     \/\/ \u041e\u0432\u0430\u043b\u044b \u0444\u043e\u043a\u0443\u0441\u0430     float f1 = WJianbianProcess();     float f2 = WEraserProcess();     float f = (1.0 - f2) * f1 + f2;     f = (1.0 - f2) * f + f2;     f = 1.0 - f;     \/\/ \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \"\u0411\u0435\u043b\u044c\u043c\u043e\" \u0438 \"\u0417\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435\" \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0432\u0430\u043b\u043e\u0432 \u0444\u043e\u043a\u0443\u0441\u0430     dstcolor = dstcolor * f + oricolor * (1.0 - f);     gl_FragColor = vec4(dstcolor.rgb,1.0) * uAlpha; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 (\u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 InstagramRiseEffectRender, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a uAlpha, uCon \u0438 \u0442.\u0434.). \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u0438\u0445 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u0423\u0445, \u0442\u0443\u0442 \u044f\u0432\u043d\u043e \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041b\u0430\u0434\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 main. \u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435-\u043a\u0430! \u0423\u0437\u043d\u0430\u0435\u0442\u0435? \u041d\u0430\u0447\u0430\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0434\u0430 \u044d\u0442\u043e \u043e\u043d \u0438 \u0435\u0441\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439 &#8212;<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\"><strong>\u0428\u0430\u0433<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0449\u0435 \u043e\u0434\u0438\u043d LUT<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0438 107 &#8212; 117<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0435\u043b\u044c\u043c\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0430 119<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0430 121<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0432\u0430\u043b\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0438 123 &#8212; 127<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0438 129 &#8212; 130<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u0432\u044b\u043d\u0435\u0441 \u0432\u044b\u0437\u043e\u0432 BlendOverlay \u043f\u043e\u0432\u044b\u0448\u0435 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0448\u0430\u0433\u0443.<\/p>\n<p>\u0418 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u043d\u0430\u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 LUT! \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u044b \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438? \u0414\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 getSelfRGBLutBuffer (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442). \u0422\u0430\u043a \u0432\u043e\u0442, \u0442\u0443\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435. \u041e\u043f\u044f\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 LUT.<\/p>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u0438\u043d LUT \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (\u0430 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 LUT \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439, \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c LUT). \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e LUT? \u0421\u0442\u0440\u043e\u0438\u043c \u0435\u0433\u043e \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c sSelfRGBLut.<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b14\/b66\/256\/b14b662563c8a2535b046e501f5fbd00.png\" width=\"556\" height=\"729\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b14\/b66\/256\/b14b662563c8a2535b046e501f5fbd00.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435 \u2013 \u0447\u0435\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0442\u0443\u0442 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u043e\u043b\u043e\u0442\u0438\u0441\u0442\u0430\u044f \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u0439, \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0439, \u0438 \u0441\u0438\u043d\u0438\u0439).<\/p>\n<p>\u0425\u043c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430. \u0414\u043e ~54 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0446\u0432\u0435\u0442\u0430 \u0442\u0443\u0441\u043a\u043b\u0435\u0435, \u0437\u0430\u0442\u0435\u043c \u0434\u043e ~209 \u044f\u0440\u0447\u0435, \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0432\u043d\u043e\u0432\u044c \u0442\u0443\u0441\u043a\u043b\u0435\u0435. \u041b\u0438\u0447\u043d\u043e \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u0441 \u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0441\u0432\u0435\u0442\u0430 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 (\u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u044f \u0435\u0435 \u043e\u0448\u0438\u0431\u043a\u0438) \u0438\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e)).<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0444\u043e\u0442\u043e \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 (\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0434\u0432\u0443\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 LUT) &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/fe7\/19e\/816\/fe719e8167c4c461210937daafce550a.jpg\" width=\"3060\" height=\"2052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fe7\/19e\/816\/fe719e8167c4c461210937daafce550a.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0424\u043e\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0441\u0432\u0435\u0442\u043b\u0435\u0435, \u0438 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 Rise.<\/p>\n<p><em>\u0428\u0430\u0433 2.2. \u0411\u0435\u043b\u044c\u043c\u043e<\/em><\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a &#8212;<\/p>\n<pre><code class=\"cpp\">oricolor = CProcess(oricolor);<\/code><\/pre>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e Cprocess &#8212;<\/p>\n<pre><code class=\"cpp\">vec3 CProcess(vec3 color) {     vec3 dstcolor;     float cValue = uCon\/100.0 + 1.0;     dstcolor = clamp((color - 0.5) *cValue + 0.5,0.0,1.0);     return dstcolor; }<\/code><\/pre>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e uCon \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u0435\u043d -7, \u043f\u043e \u0438\u0442\u043e\u0433\u0443 cValue \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u0435\u043d 0.93.<\/p>\n<p>\u0418\u0437 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u0430 -0.5 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443, \u0437\u0430\u0442\u0435\u043c \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u044d\u0442\u043e \u043d\u0430 0.93 \u0438 \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 +0.5. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/364\/aaf\/7bc\/364aaf7bc44327afb45e45434b2967a5.png\" width=\"557\" height=\"729\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/364\/aaf\/7bc\/364aaf7bc44327afb45e45434b2967a5.png\"\/><\/figure>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u2013 \u0447\u0435\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u044d\u0442\u043e \u044d\u0442\u0430\u043b\u043e\u043d Y = X. \u0412\u044b\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441 0..255 \u0434\u043e 8..247. \u0422.\u0435. \u0441 <strong>1 \u2013 uCon<\/strong> \u0434\u043e <strong>255 + uCon<\/strong>. \u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/4c1\/2fd\/741\/4c12fd741e08067668d97d280cd918a4.jpg\" width=\"3060\" height=\"2052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4c1\/2fd\/741\/4c12fd741e08067668d97d280cd918a4.jpg\" data-blurred=\"true\"\/><\/figure>\n<p> \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u043b\u043a\u043e\u0435, \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0433\u043b\u0430\u0437, \u043d\u043e \u0440\u0430\u0437 \u043e\u043d\u043e \u0435\u0441\u0442\u044c, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442)<\/p>\n<p><em>\u0428\u0430\u0433 2.3. \u0417\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435<\/em><\/p>\n<p>\u0425\u0443\u0445, \u0447\u0442\u043e-\u0442\u043e \u044d\u0442\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u0430\u043b\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0438\u0447\u043a\u0430 Xiaomi. \u0418 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 &#8212;<\/p>\n<pre><code class=\"cpp\">vec3 dstcolor = BlendOverlay(oricolor,vec3(0.0,0.0,0.0));<\/code><\/pre>\n<p>\u0417\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0443\u0432\u0438\u0434\u0438\u043c &#8212;<\/p>\n<pre><code class=\"cpp\">float BlendOverlayF(float base, float blend) {     return (base &lt; 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))); }  vec3 BlendOverlay(vec3 base, vec3 blend) {     vec3 destColor;     destColor.r = BlendOverlayF(base.r, blend.r);     destColor.g = BlendOverlayF(base.g, blend.g);     destColor.b = BlendOverlayF(base.b, blend.b);     return destColor; }<\/code><\/pre>\n<p>\u041d\u0430\u0441 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c (\u043f\u0440\u044f\u043c \u043a\u0430\u043a \u0432 \u0444\u043e\u0442\u043e\u0448\u043e\u043f\u0435).<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0447\u0442\u043e blend \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 0, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e BlendOverlayF &#8212;<\/p>\n<pre><code class=\"cpp\">float BlendOverlayF(float base) {     return (base &lt; 0.5 ? 0 : (2.0 * base - 1.0)); }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/515\/45f\/abc\/51545fabc84faee963adc3eba2857c30.png\" width=\"557\" height=\"729\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/515\/45f\/abc\/51545fabc84faee963adc3eba2857c30.png\"\/><\/figure>\n<p>\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u043a. \u0412\u044b\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0438\u0436\u0435 128 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 0, \u0430 \u0442\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0438\u043b\u0443 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430, \u0438 \u0432 \u0442\u043e\u0447\u043a\u0435 255 \u0434\u043e\u0433\u043e\u043d\u0438\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ba5\/e1a\/36e\/ba5e1a36edb2fbf52f37baf6bf63e6da.jpg\" width=\"3060\" height=\"2052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ba5\/e1a\/36e\/ba5e1a36edb2fbf52f37baf6bf63e6da.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0424\u043e\u0442\u043e \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u043b\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0442\u0435\u043c\u043d\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f dstcolor) \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0446\u0432\u0435\u0442, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0440\u0430\u043d\u0435\u0435.<\/p>\n<p><em>\u0428\u0430\u0433 2.4. \u041e\u0432\u0430\u043b\u044b \u0444\u043e\u043a\u0443\u0441\u0430<\/em><\/p>\n<p>\u041d\u0430\u0448 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 &#8212;<\/p>\n<pre><code class=\"cpp\">float f1 = WJianbianProcess(); float f2 = WEraserProcess(); float f = (1.0 - f2) * f1 + f2; f = (1.0 - f2) * f + f2; f = 1.0 - f;<\/code><\/pre>\n<p>\u041e\u0439, \u0447\u0442\u043e-\u0442\u043e \u0442\u0443\u0442 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u042f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Jianbian, \u0433\u0443\u0433\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0447\u0442\u043e \u044d\u0442\u043e \u0433\u043e\u0440\u043e\u0434 \u0432 \u041a\u0438\u0442\u0430\u0435)<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 <strong>WjianbianProcess<\/strong> &#8212;<\/p>\n<pre><code class=\"cpp\">float WJianbianProcess() {     \/*     pf   - \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0448\u0438\u0440\u0438\u043d\u044b \u043a \u0432\u044b\u0441\u043e\u0442\u0435 \u044d\u043a\u0440\u0430\u043d\u0430     disx - \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u0432\u0430\u043b\u0430 \u043f\u043e X     disy - \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u0432\u0430\u043b\u0430 \u043f\u043e Y      dis  - \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u0432\u0430\u043b\u0430     f1   - \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 dis (\u043e\u0442 0..1)     *\/     float disx,disy,dis,f1,f2,f,pf = uWH.x \/ uWH.y,x,y;     f1 = max(uCenPos.x,1.0 - uCenPos.x);f2 = max(uCenPos.y,1.0 - uCenPos.y);     if (pf &lt; 1.0) {         disx = (vTexCoord.x - uCenPos.x) * (vTexCoord.x - uCenPos.x);         if (vTexCoord.y\/pf &lt; uCenPos.y) {             y = vTexCoord.y;         } else if ((1.0 - vTexCoord.y)\/pf &lt; (1.0 - uCenPos.y)) {             y = pf - (1.0 - vTexCoord.y);         } else {             y = uCenPos.y * pf;         }         disy = (y\/pf - uCenPos.y) * (y\/pf - uCenPos.y);     } else {         disy = (vTexCoord.y - uCenPos.y) * (vTexCoord.y - uCenPos.y);         if (vTexCoord.x * pf &lt; uCenPos.x) {             x = vTexCoord.x;         } else if ((1.0 - vTexCoord.x)*pf &lt; (1.0 - uCenPos.x)) {             x = 1.0\/pf - (1.0 - vTexCoord.x);         } else {             x = uCenPos.x \/ pf;         }         disx = (x * pf - uCenPos.x) * (x * pf - uCenPos.x);     }     dis = disx + disy;     f1 = sqrt(dis)\/(sqrt(f1 * f1 + f2 * f2) * uRadius);     if (f1 > 1.0) {         f = 0.4;     } else {         f2 = 0.9908 * pow(f1,3.0) -1.4934 * pow(f1,2.0) -0.4974 * f1 + 1.0;         f = 0.6 * f2 + 0.4;     }     return f; }<\/code><\/pre>\n<p>\u042f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u0448\u043d\u0443\u044e \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443, \u0432\u0441\u0435 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u2013 \u0440\u0438\u0441\u0443\u0435\u0442 \u0437\u0430\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0432\u0430\u043b, \u0441 \u043f\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043e\u0442 0.4 \u0434\u043e 1.0. \u0410 \u0432\u0435\u0442\u043a\u0438 if \u0438 else \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0433\u0434\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0441\u043e\u0442\u044b, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043e\u0432\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0435\u0441\u043b\u0438 \u044f\u0432\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>f1<\/strong> &#8212;<\/p>\n<pre><code class=\"cpp\">float f1 = WJianbianProcess(); float f2 = WEraserProcess(); float f = (1.0 - f2) * f1 + f2; gl_FragColor = vec4(0, 0, 1  ,1.0) * uAlpha; return;<\/code><\/pre>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b \u0435\u0433\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c? \u0412\u043e\u0442 \u043e\u043d &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d25\/0eb\/d6a\/d250ebd6aca4d9d3992f1871ed899add.png\" width=\"1500\" height=\"2000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d25\/0eb\/d6a\/d250ebd6aca4d9d3992f1871ed899add.png\"\/><\/figure>\n<p>\u0427\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Jianbian \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0417\u0430\u043c\u0435\u0442\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u0440\u0430\u0434\u0438\u0443\u0441 \u044d\u0442\u043e\u0433\u043e \u043e\u0432\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u044b \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 uCenPos \u0438 uRadius.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0430 \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u00abWEraserProcess\u00bb? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043c &#8212;<\/p>\n<pre><code class=\"cpp\">float WEraserProcess() {     float disx,disy,dis,f1,f2,f,pf = uWH.x \/ uWH.y,x,y,std1;     f1 = max(uGCenPos.x,1.0 - uGCenPos.x);f2 = max(uGCenPos.y,1.0 - uGCenPos.y);     std1 = 2.0 * uStd * uStd * (f1 * f1 + f2 * f2);     if (pf &lt; 1.0) {         disx = (vTexCoord.x - uGCenPos.x) * (vTexCoord.x - uGCenPos.x);         if (vTexCoord.y \/pf &lt; uCenPos.y) {             y = vTexCoord.y;         } else if ((1.0 - vTexCoord.y)\/pf &lt; (1.0 - uCenPos.y)) {             y = pf - (1.0 - vTexCoord.y);         } else {             y = uCenPos.y * pf;         }         disy = (y\/pf - uGCenPos.y) * (y\/pf - uGCenPos.y);     } else {         disy = (vTexCoord.y - uCenPos.y) * (vTexCoord.y - uCenPos.y);         if (vTexCoord.x * pf &lt; uCenPos.x) {             x = vTexCoord.x;         } else if ((1.0 - vTexCoord.x)*pf &lt; (1.0 - uCenPos.x)) {             x = 1.0\/pf - (1.0 - vTexCoord.x);         } else {             x = uCenPos.x \/ pf;         }         disx =  (x * pf - uCenPos.x) * (x * pf - uCenPos.x);     }     dis = disx + disy;     f = exp(-1.0 * (disx + disy)\/std1);     return f; }<\/code><\/pre>\n<p>\u00ab\u0422\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435!\u00bb \u0432\u043e\u0441\u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0432\u044b, \u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u0440\u0430\u0432\u044b. \u042d\u0442\u043e \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0432\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0434\u043e \u043e\u0432\u0430\u043b\u0430.<\/p>\n<p>\u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0442\u0430\u043a \u0441\u043f\u0435\u0448\u0438\u043b \u043a\u043e\u043f\u0438\u0440\u0443\u044f \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0437\u0430\u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e dis \u043f\u043e\u0441\u043b\u0435 \u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f)<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0432\u0430\u043b &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b13\/89c\/f5d\/b1389cf5def51ef0287c8381e4ca7007.png\" width=\"1500\" height=\"2000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b13\/89c\/f5d\/b1389cf5def51ef0287c8381e4ca7007.png\"\/><\/figure>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u044f \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u043d\u0438 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u0437\u0430 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 f1 \u0438 f2 \u0441 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0438\u0445 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e f? \u042d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u043e\u0432\u0430\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0437\u043a\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430. \u042d\u0442\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 <code>float f = (1.0 - f2) * f1 + f2;<\/code> \u0435\u0441\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0441 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c f1, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043d\u0438\u0436\u0435 \u0435\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u043a\u043e\u0441\u0442\u0438. \u041d\u0443 \u0430 \u0441\u0442\u0440\u043e\u043a\u0430 3 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0432\u0430\u043b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a &#8212;<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f24\/aa2\/782\/f24aa27821064a9f519f9ab66ce8c624.png\" width=\"1500\" height=\"2000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f24\/aa2\/782\/f24aa27821064a9f519f9ab66ce8c624.png\"\/><\/figure>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0432\u0430\u043b \u043d\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u043d \u043f\u043e X, \u0441\u043b\u0435\u0432\u0430 \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u044b\u0439. \u042d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043e\u0432\u0430\u043b\u0430 f2 (uGCenPos \u0438 uStd) \u043e\u0442\u043b\u0438\u0447\u043d\u044b \u043e\u0442 f1. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u044d\u0442\u0438 \u043e\u0432\u0430\u043b\u044b?<\/p>\n<p><em>\u0428\u0430\u0433 2.5. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/em><\/p>\n<p>\u0423 \u043d\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0448\u0430\u0433!<\/p>\n<pre><code class=\"cpp\">dstcolor = dstcolor * f + oricolor * (1.0 - f); gl_FragColor = vec4(dstcolor.rgb,1.0) * uAlpha;<\/code><\/pre>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043c\u044b \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e dstcolor? \u041e\u043d\u043e \u043d\u0430\u043c \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u043e\u0441\u044c. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u0444\u043e\u0442\u043e \u0441 \u0448\u0430\u0433\u0430 2.2. \u0438 \u0441 \u0448\u0430\u0433\u0430 2.3. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f f \u043a\u0430\u043a \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 (\u0442.\u0435. \u0435\u0441\u043b\u0438 f = 0.3, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 0.3 \u043e\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0438 0.7 \u043e\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u00ab\u0431\u0435\u043b\u044c\u043c\u043e\u00bb). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043e\u0432\u0430\u043b), \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0441 \u043e\u0432\u0430\u043b\u0430\u043c\u0438 \u2013 \u0447\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0442\u0435\u043c\u043d\u0435\u0435 (\u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435) \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0443\u0442 \u0432\u043a\u043b\u0430\u0434 \u0441\u0432\u0435\u0442\u043b\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0430 \u0447\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0441\u0438\u043d\u0435\u0435 (\u043a\u0430\u043a \u043f\u043e \u043a\u0440\u0430\u044f\u043c), \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043a\u043b\u0430\u0434 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0435\u043a\u043e\u0433\u043e \u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043f\u043e \u043a\u0440\u0430\u044f\u043c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/8c5\/3ea\/55f\/8c53ea55f76b510e3505dfd14d26be7c.jpg\" width=\"3060\" height=\"2052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c5\/3ea\/55f\/8c53ea55f76b510e3505dfd14d26be7c.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u041e\u0433\u043e! \u041e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d)<\/p>\n<p><em>\u0412\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435<\/em><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0448\u0435\u043c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u2013<\/p>\n<ol start=\"0\">\n<li>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>LUT<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 LUT<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u043b\u044c\u043c\u043e<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u041e\u0432\u0430\u043b\u044b \u0444\u043e\u043a\u0443\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/cc2\/a60\/9bd\/cc2a609bde4418bb043ae84924208e41.jpg\" width=\"4674\" height=\"3022\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc2\/a60\/9bd\/cc2a609bde4418bb043ae84924208e41.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u041d\u0443 \u0438 \u043a\u0430\u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a &#8212;<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/958\/863\/644\/9588636446ad52a7e0454fb29685f5c0.gif\" width=\"480\" height=\"640\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/958\/863\/644\/9588636446ad52a7e0454fb29685f5c0.gif\"\/><\/figure>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439 \u0442\u0430\u043a \u044d\u0442\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u0430\u0439\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 Rise \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430!<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u0434\u0432\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b \u0435\u0433\u043e \u0432 <a href=\"https:\/\/drive.google.com\/file\/d\/1WRurCdyxCZRoxD2uDILx3wLJaPNDpj3h\/view?usp=sharing\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0445\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c<\/a> \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043d\u0438\u043c.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u00abriseEffect.sprj\u00bb \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u2013 <a href=\"https:\/\/github.com\/dfranx\/SHADERed\" rel=\"noopener noreferrer nofollow\">SHAREDed<\/a>. \u041e\u043d \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 &#8212;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82e\/7c4\/936\/82e7c4936662999655fa11dc3ae55a34.png\" alt=\"\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SHAREDed\" title=\"\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SHAREDed\" width=\"974\" height=\"525\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/82e\/7c4\/936\/82e7c4936662999655fa11dc3ae55a34.png\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SHAREDed<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 C#, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e FFMPEG \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u043e\u043a\u0430\u0434\u0440\u043e\u0432\u043e \u043a mp4 \u0432\u0438\u0434\u0435\u043e. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043c\u043e\u0435\u043c \u0413\u0438\u0442\u0445\u0430\u0431\u0435 \u2013 <a href=\"https:\/\/github.com\/x64BitWorm\/RiseEffect\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u043e\u0439, \u043a\u0440\u043e\u043c\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 Rise.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h2>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u0432\u0441\u0435! \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043a \u0432\u0438\u0434\u0435\u043e, \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u0442\u0430\u0439\u043d\u044b 8 \u043b\u0435\u0442\u043d\u0435\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0442\u043e \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0437\u0430 \u044d\u0442\u0438\u043c \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435\u043c \u0438 \u0434\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/814049\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0415\u0441\u0442\u044c \u043b\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u0430\u043c\u0435\u0440\u0430\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u0432?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">25% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 25%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">50% <\/span><span class=\"tm-article-poll__answer-label\">50\/50, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043d\u0435 \u0447\u0430\u0441\u0442\u043e<\/span><span class=\"tm-article-poll__answer-votes\">8<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 50%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">25% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442, \u0442\u0430\u043a\u0438\u043c \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 25%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 16 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 6 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/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\/814049\/\"> https:\/\/habr.com\/ru\/articles\/814049\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0441 \u0432\u043e\u0441\u044c\u043c\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0435 \u0441\u0442\u0430\u0440\u0438\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0441 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u041b\u043e\u043c\u043e\u00bb. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/791794\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043f\u043e\u0434\u0430\u043b\u0435\u043a\u0443<\/a>.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0436\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u2013<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043b\u0435\u0432\u0430 \u0414\u041e, \u0441\u043f\u0440\u0430\u0432\u0430 \u041f\u041e\u0421\u041b\u0415<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0435\u0444\u043b\u0430\u0433\u043c\u0430\u043d\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1) \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 3-4 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0442.\u043a. \u0438\u043d\u0430\u0447\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043d\u0430 Mi A1 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c).<\/p>\n<p>\u041d\u0443 \u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0412\u044b\u0442\u0440\u0435\u043c \u043f\u044b\u043b\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0436\u0435 \u0446\u0435\u043b\u044b\u0445 8 \u043b\u0435\u0442!<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/120cKvu_oLGFnFNGoJeHzJvvPGISh4BG2\/view?usp=sharing\" rel=\"noopener noreferrer nofollow\">Camera<\/a> \u2013 apk \u0444\u0430\u0439\u043b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b Xiaomi Mi A1<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/www.javadecompilers.com\/apk\" rel=\"noopener noreferrer nofollow\">ApkDecompiler<\/a> \u2013 \u043e\u043d\u043b\u0430\u0439\u043d \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 apk \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/dfranx\/SHADERed\" rel=\"noopener noreferrer nofollow\">SHADERed<\/a> \u2013 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 (\u0434\u0430, \u0432\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442))<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u0438\u043c\u044b\u0439 \u00ab\u0431\u043b\u043e\u043a\u043d\u043e\u0442\u00bb, \u044f \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e VSCode<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0412 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c! \u0424\u0430\u0439\u043b apk \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0435\u0433\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/www.javadecompilers.com\/apk\" rel=\"noopener noreferrer nofollow\">\u043e\u043d\u043b\u0430\u0439\u043d \u0440\u0435\u0441\u0443\u0440\u0441\u0430<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 VSCode \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u0432\u0438\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043f\u0430\u043f\u043a\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b\u043e-\u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c. \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0437\u0430\u0446\u0435\u043f\u043e\u043a \u2013<\/p>\n<figure class=\"\">\n<div><figcaption>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 Mi A1<\/figcaption><\/div>\n<\/figure>\n<p>\u0425\u043c, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0442\u0438 \u0432 \u043b\u043e\u0431 \u2013 \u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u00ab\u041b\u043e\u043c\u043e\u00bb \u0432 \u0441\u043e\u0440\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e, \u043f\u043e \u043f\u0443\u0442\u0438  <code>resources\\res\\values-ru<\/code> \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d \u0440\u0435\u0441\u0443\u0440\u0441 <code>pref_camera_coloreffect_entry_instagram_rise<\/code> &#8212;<\/p>\n<pre><code class=\"xml\">... &lt;string name=\"pref_camera_coloreffect_entry_blackwhite\">\u0427\/\u0411&lt;\/string> &lt;string name=\"pref_camera_coloreffect_entry_instagram_rise\">\u041b\u043e\u043c\u043e&lt;\/string> &lt;string name=\"pref_camera_coloreffect_entry_instagram_hudson\">\u041b\u0435\u0434&lt;\/string> ...<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u0434\u0435 \u0440\u044f\u0434\u043e\u043c \u0441 \u043c\u0435\u0441\u0442\u043e\u043c, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u043c \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u0438\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 &#8212;   <\/p>\n<figure class=\"float\">\n<div><figcaption>\u0418\u0449\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441 \u0432 VSCode<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c \u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u043c \u043d\u0430\u043c \u0444\u0430\u0439\u043b\u0435 <code>strings.xml<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u0439\u043b\u0435 <code>R.java<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>strings.xml<\/code>. \u0410 \u0447\u0442\u043e \u0437\u0430 \u0444\u0430\u0439\u043b <code>EffectController.java<\/code>? \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0446\u0435\u043f\u043a\u043e\u0439 \u043f\u043e\u043a\u0440\u0443\u043f\u043d\u0435\u0435.<\/p>\n<h2>\u041e\u0431\u0449\u0435\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>EffectController.java<\/code> \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 <code>pref_camera_coloreffect_entry_instagram_rise<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u043d\u0430 370 \u0441\u0442\u0440\u043e\u043a\u0435 (\u0432 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u043d\u0438\u0436\u0435 \u043d\u0430 30 \u0441\u0442\u0440\u043e\u043a\u0435) \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>getEffectGroup<\/code>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e Xiaomi \u0447\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public RenderGroup getEffectGroup(GLCanvas canvas, RenderGroup renderGroup, boolean wholeRender, boolean isSnapShotRender, int index) {     boolean matchPartRender0;     boolean matchPartRender1;     Render gradienterEffectRender;     if (!Device.isSupportedShaderEffect()) {         return null;     }     boolean addEntry = canvas == null;     boolean initOne = false;     if (canvas == null) {         this.mEffectEntries = new ArrayList&lt;>();         this.mEffectEntryValues = new ArrayList&lt;>();         this.mEffectImageIds = new ArrayList&lt;>();         this.mEffectKeys = new ArrayList&lt;>();         this.mNeedRectSet = new ArrayList&lt;>();         this.mNeedScaleDownSet = new ArrayList&lt;>();         addEntry = true;     } else if (renderGroup == null) {         renderGroup = new RenderGroup(canvas, this.mEffectGroupSize);         if (!wholeRender &amp;&amp; index &lt; 0) {             return renderGroup;         }     } else if (!renderGroup.isNeedInit(index)) {         return renderGroup;     }     int id = 0;     ...     id = 0 + 1;     if (addEntry) {         addEntryItem(R.string.pref_camera_coloreffect_entry_instagram_rise, id);         this.mEffectImageIds.add(Integer.valueOf(R.drawable.camera_effect_image_instagram_rise));         this.mEffectKeys.add(\"effect_instagram_rise_picture_taken_key\");     } else if (renderGroup.getRender(id) == null &amp;&amp; (V6ModulePicker.isCameraModule() || isSnapShotRender)) {         if (!wholeRender &amp;&amp; index != id) {             if (index &lt; 0) {                 if (0 != 0) {                 }             }         }         renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id);         initOne = true;     }     ... }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0438\u0436\u0435 \u043d\u0430\u0441 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u0438\u0434\u0430 &#8212;   <\/p>\n<pre><code class=\"java\">int id = ...; if (addEntry) { ... } else if (...) { ... }<\/code><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0441 InstagramRise &#8212;<\/p>\n<pre><code class=\"java\">id = 0 + 1; if (addEntry) {     addEntryItem(R.string.pref_camera_coloreffect_entry_instagram_rise, id);     this.mEffectImageIds.add(Integer.valueOf(R.drawable.camera_effect_image_instagram_rise));     this.mEffectKeys.add(\"effect_instagram_rise_picture_taken_key\"); } else if (renderGroup.getRender(id) == null &amp;&amp; (V6ModulePicker.isCameraModule() || isSnapShotRender)) {     if (!wholeRender &amp;&amp; index != id) {         if (index &lt; 0) {             if (0 != 0) {             }         }     }     renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id);     initOne = true; }<\/code><\/pre>\n<p>\u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u043d\u0430 6 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c id \u0432 \u043d\u0435\u043a\u043e\u043c renderGroup, \u0438 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442, \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 13 \u0441\u0442\u0440\u043e\u043a\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u044d\u0442\u043e\u0442 RenderGroup \u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u043a\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u00abgetEffectGroup\u00bb \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u043f\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0438\u0436\u0435 \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0432\u0438\u0434\u0430 \u2013<\/p>\n<pre><code class=\"java\">renderGroup.setRender(InstagramRiseEffectRender.create(canvas, id), id); renderGroup.setRender(InstagramClarendonEffectRender.create(canvas, id2), id2); renderGroup.setRender(InstagramCremaEffectRender.create(canvas, id3), id3); ...<\/code><\/pre>\n<p>\u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044d\u0442\u0438 id \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0438\u0445 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438. \u0412\u0441\u0435 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e renderGroup \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438\u0437\u0443\u0447\u0438\u043c \u043c\u0435\u0442\u043e\u0434 create \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abInstagramRiseEffectRender\u00bb &#8212;<\/p>\n<pre><code class=\"java\">public static Render create(GLCanvas canvas, int id) {     CurveEffectRender firstPassRender = new CurveEffectRender(canvas, id);     firstPassRender.setRGBTransLutBuffer(getCurveRGBLutBuffer());     InstagramRiseEffectRender secondPassRender = new InstagramRiseEffectRender(canvas, id);     secondPassRender.setRGBTransLutBuffer(getSelfRGBLutBuffer());     return new PipeRenderPair(canvas, firstPassRender, secondPassRender, false); }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 <strong>CurveEffectRender<\/strong> \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <strong>InstagramRiseEffectRender<\/strong>, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043c \u043a\u0430\u043a\u0438\u0445-\u0442\u043e LUT-\u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 <strong>PipeRenderPair<\/strong>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 <strong>RGBTransEffectRender<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 <strong>PixelEffectRender<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u2026 \u0422\u0430\u043a! \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0441\u0445\u0435\u043c\u0443 \u044f \u0431\u0443\u0434\u0443 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435, \u043d\u0430\u0447\u0430\u043b \u044f \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <strong>InstagramRiseEffectRender<\/strong> \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u00ab\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438\u00bb. \u041d\u0430 \u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0443\u0439\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0438 \u0440\u043e\u043b\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043e\u0442\u0440\u044b\u0432\u0438\u0441\u0442\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438 \u043f\u0430\u0440\u0443 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u0438 \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0442.\u043a. \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043a \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u044f \u043f\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u0443 &#8212;<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 <a href=\"https:\/\/drive.google.com\/file\/d\/1_10exJ6X9dKfhvkPro5gF6Ops89sDY1q\/view?usp=sharing\" rel=\"noopener noreferrer nofollow\">\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432 \u044d\u0442\u043e\u0439 \u043a\u0443\u0447\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 create \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435.<\/p>\n<ol>\n<li>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442 InstagramRiseEffectRender \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c (\u043b\u043e\u0433\u0438\u043a\u0430 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 create). \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 CurveEffectRender \u0438 \u0441\u0435\u0431\u044f (\u043d\u0430\u0432\u0435\u044f\u043b\u043e \u0431\u043e\u0440\u043e\u0434\u0430\u0442\u044b\u0439 \u0430\u043d\u0435\u043a\u0434\u043e\u0442 \u043f\u0440\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e: \u0441\u043e\u0441\u0442\u0430\u0432 \u0441\u0430\u043b\u0430\u0442\u0430 \u2013 \u043f\u043e\u043c\u0438\u0434\u043e\u0440, \u043e\u0433\u0443\u0440\u0435\u0446, \u0441\u0430\u043b\u0430\u0442).<\/p>\n<\/li>\n<li>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u044b InstagramRiseEffectRender \u0438 CurveEffectRender \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u0442.\u043a. \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434 <code>String getFragShaderString()<\/code>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0442 \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <strong>setRGBTransLutBuffer<\/strong> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 RGBTransEffectRender).<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0441\u0442\u0430\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u044b (\u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0434\u0432\u0443\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043d\u043e\u0432\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 create, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 &#8212;<\/p>\n<pre><code class=\"java\">public static Render create(GLCanvas canvas, int id) {     \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 - \u0448\u0435\u0439\u0434\u0435\u0440\u0430 CurveEffectRender     CurveEffectRender firstPassRender = new CurveEffectRender(canvas, id);     \/\/ \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 getCurveRGBLutBuffer()     firstPassRender.setRGBTransLutBuffer(getCurveRGBLutBuffer());     \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 - \u0448\u0435\u0439\u0434\u0435\u0440\u0430 InstagramRiseEffectRender     InstagramRiseEffectRender secondPassRender = new InstagramRiseEffectRender(canvas, id);     \/\/ \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 getSelfRGBLutBuffer()     secondPassRender.setRGBTransLutBuffer(getSelfRGBLutBuffer());     \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432     return new PipeRenderPair(canvas, firstPassRender, secondPassRender, false); }<\/code><\/pre>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u2013<\/p>\n<ol>\n<li>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u0445?<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e \u0437\u0430 LUT \u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0435\u0438\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c?<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e.<\/p>\n<h2>\u0420\u0430\u0437\u0431\u043e\u0440 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/h2>\n<p><em>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b?<\/em><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 X, Y \u0438 \u0435\u0449\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (\u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439) \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 X, Y.<\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a &#8212;<\/p>\n<pre><code class=\"cpp\">Color F(int x, int y) {     \/\/ \u0412\u0430\u0448 \u0448\u0435\u0439\u0434\u0435\u0440 }  void<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-376027","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/376027","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=376027"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/376027\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=376027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=376027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=376027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}