{"id":204260,"date":"2014-04-08T23:41:02","date_gmt":"2014-04-08T19:41:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=204260"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=204260","title":{"rendered":"<span class=\"post_title\">SSAO \u043d\u0430 OpenGL ES 3.0<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/326\/955\/9ae\/3269559aee89dbc6575ee594bca6b330.png\"\/><br \/>  \u041e\u0434\u043d\u0430\u0436\u0434\u044b, \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0434\u0435\u043c\u043a\u0443 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c, \u0432\u043e\u0437\u043d\u0438\u043a \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Screen_Space_Ambient_Occlusion\">SSAO<\/a> \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u043e?<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 Galaxy Note 3, \u0446\u0435\u043b\u044c \u2014 \u0444\u043f\u0441 \u043d\u0435 \u043d\u0438\u0436\u0435 30, \u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u044b\u0448\u0435.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0435, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e \u0441\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 (<a href=\"http:\/\/ru.wikipedia.org\/wiki\/Screen_Space_Ambient_Occlusion\">wiki<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/steps3d.narod.ru\/tutorials\/ssao-tutorial.html\">steps3d<\/a>). \u0423\u043f\u043e\u0440 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0420\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 SSAO\u00bb.<\/p>\n<p>  SSAO \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u0435\u0433\u043e \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u044f \u0435\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 <a href=\"http:\/\/www.gamedev.ru\/terms\/MRT\">MRT<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 OpenGL ES \u0432\u0435\u0440\u0441\u0438\u0438 3.0.<\/p>\n<h3>\u0420\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 SSAO<\/h3>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 \u043d\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u0442\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0430 \u0442\u043e\u0447\u043a\u0430.<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/ee7\/7b1\/b67\/ee77b1b67096787f0d2cd8f05f8b5b3a.png\"\/><br \/>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <b>screen space<\/b> ambient occlusion). \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0432 \u0440\u043e\u043b\u0438 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 SSAO \u0447\u0430\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0435 \u0438\u043b\u0438 \u043a\u0430\u0434\u0440\u0435). \u0422\u0430\u043a \u0436\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 <i>\u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 <\/i>\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<\/p>\n<p>  \u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u2014 \u0442\u0430\u043a z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432\u044b\u0448\u0435 \u2014 \u043d\u0430 \u043d\u0435\u0439 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u0432\u043e\u0439 (\u00ab\u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439\u00bb) \u0432\u043a\u043b\u0430\u0434 \u0432 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u043e\u0441\u0438\u0442 \u0438 \u0441\u0430\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434 \u0442\u043e\u0447\u043a\u043e\u0439. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u044b\u0445 \u0442\u043e\u043d\u0430\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043c \u0433\u0434\u0435 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u2014 \u043e\u043d\u043e \u0435\u0441\u0442\u044c. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/86c\/743\/166\/86c7431662ef360ce0b4785d3781c671.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0435, \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0441\u0446\u0435\u043d\u044b \u043f\u043e\u043c\u0438\u043c\u043e \u0446\u0432\u0435\u0442\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0435\u0449\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u043d\u043e\u0441\u0438\u043b\u0430 \u00ab\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439\u00bb \u0432\u043a\u043b\u0430\u0434. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0433\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d ()\u0443\u0433\u043e\u043b \u0431\u043e\u043b\u044c\u0448\u0435 90\u00b0 \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0430\u044f \u0435\u0439 \u0442\u043e\u0447\u043a\u0430. \u0422\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u0430\u0435\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d\u043e \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0410 \u0441\u0430\u043c\u043e\u0435 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 SSAO \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0442\u0435\u043d\u0438\u0439 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u043e\u043c \u0434\u043b\u044f \u043a\u044d\u0448\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.<\/p>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0441\u0444\u0435\u0440\u0443, \u0430 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0443, \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044d\u0442\u0443 \u0441\u0444\u0435\u0440\u0443 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/932\/3a9\/a30\/9323a9a306631b59aaaf33d486878fe1.png\"\/><br \/>  \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043a\u0430\u043a \u043d\u0430\u0434\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u043a \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0435.<\/p>\n<p>  \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0435\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0438 \u0446\u0432\u0435\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0438\u0437 OpenGL ES 3.0 \u2014 Multiple Render Targets, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0438\u0445. \u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u044f \u0432\u044b\u043d\u0435\u0441 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e):  <\/p>\n<pre><code class=\"cpp\">\/\/ \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0443 \u0434\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b (\u0446\u0432\u0435\u0442 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438), \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; GLuint fbo; GLuint colorBuff; GLuint normBuff; GLuint depthBuff;  \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b void createTexture(GLuint &id, int inFormat, int w, int h, int format, int type, int filter, int wrap, void* pix=NULL) { \tglGenTextures(1, &id); \tglBindTexture(GL_TEXTURE_2D, id); \tglTexImage2D(GL_TEXTURE_2D, 0, inFormat, w, h, 0, format, type, pix); \tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); \tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); \tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap); \tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap); } ... \tglGenFramebuffers(1, &fbo); \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \tglBindFramebuffer(GL_FRAMEBUFFER, fbo); \t\/\/ width \u0438 height - \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \tcreateTexture(colorBuff, GL_RGB8, width, height, GL_RGB, GL_UNSIGNED_BYTE, GL_NEAREST, GL_MIRRORED_REPEAT); \tcreateTexture(normBuff, GL_RGB8, width, height, GL_RGB, GL_UNSIGNED_BYTE, GL_NEAREST, GL_MIRRORED_REPEAT); \tcreateTexture(depthBuff, GL_DEPTH_COMPONENT24, width, height, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_NEAREST, GL_MIRRORED_REPEAT); \t\/\/ \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0443, \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuff, 0); \tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, normBuff, 0); \tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthBuff, 0); \tint err = glCheckFramebufferStatus(GL_FRAMEBUFFER); \tif (err != GL_FRAMEBUFFER_COMPLETE) \t\tLOGE(&quot;Main framebuffer error: %i&quot;, err); \tglDrawBuffers(2, buffers); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0443\u0436\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0434 SSAO.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0434 SSAO<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">glGenFramebuffers(1, &ssaoFbo1); glBindFramebuffer(GL_FRAMEBUFFER, ssaoFbo1); \/\/ \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0438\u043f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b GL_R8 createTexture(ssaoBuff1, GL_R8, width\/ssaoScaleW, height\/ssaoScaleH, GL_RED, GL_UNSIGNED_BYTE, GL_LINEAR, GL_MIRRORED_REPEAT); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoBuff1, 0); \/\/ glDrawBuffers \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0443 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e\u0442 \u0431\u0443\u0444\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043d\u043e \u043f\u043e\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0433\u043e \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043a\u0430\u043a \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 1920\u04451080).<\/p>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e z-\u0431\u0443\u0444\u0435\u0440. \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 SSAO \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u0438\u0448\u0443\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0447\u0430\u0441\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c z-\u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0439, \u0442\u0430\u043a\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u041c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u0435\u0449\u0435 \u0438 MRT \u043d\u0435 \u0434\u0440\u0443\u0436\u0438\u0442 \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0444\u0435\u0440 \u0446\u0432\u0435\u0442\u0430 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438\u043c\u0435\u044e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 RGB8, \u0442\u043e \u0438 \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0433\u043e \u0436\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c (\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c) \u043f\u043e \u0442\u0440\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c. \u0412\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u0441\u0443\u043b\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0438\u043d\u0435\u0430\u0440\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b (gl_FragDepth). \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435 (\u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e\u043c, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0431\u043b\u0438\u0437\u0438 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f), \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0420\u0435\u043d\u0434\u0435\u0440 \u0441\u0446\u0435\u043d\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0441 \u0442\u043e\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0446\u0432\u0435\u0442\u0430 \u043c\u044b \u0435\u0449\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438 \u0447\u0443\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b. \u0412\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0441\u0446\u0435\u043d\u044b:  <\/p>\n<pre><code class=\"cpp\">#version 300 es  uniform mat4 matrixProj; uniform mat4 matrixView; uniform vec3 lightPos;  layout(location = 0) in vec3 vPos; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b layout(location = 1) in vec3 nPos; \/\/ \u043d\u043e\u0440\u043c\u0430\u043b\u044c layout(location = 2) in vec3 tPos; \/\/ \u0442\u0430\u043d\u0433\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 layout(location = 3) in vec2 tCoord; \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b  out vec3 light; out vec3 gNorm; out float zPos; out vec2 texCoord;  void main() { \tvec4 p = matrixProj*matrixView*vec4(vPos, 1.0); \tgl_Position = p; \ttexCoord = tCoord;  \t\/\/ \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \tvec3 bitangent = cross(tPos, nPos); \tmat3 tbn = mat3(tPos, bitangent, nPos); \tlight = normalize(lightPos-vPos)*tbn;  \tzPos = p.z; \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0442\u043e\u0447\u043a\u0438 - \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \tvec4 n = (matrixView*vec4(nPos, 0.0)); \/\/ \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432\u0438\u0434\u0430 \tgNorm = normalize(n.xyz); } <\/code><\/pre>\n<p>  \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">#version 300 es precision highp float; \/\/ \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0432 24-\u0431\u0438\u0442\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 24 \u0431\u0438\u0442\u0430\u043c, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u0435\u0440\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438  uniform sampler2D texDiff; \/\/ \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 uniform sampler2D texNorm; \/\/ \u043a\u0430\u0440\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u0441\u0446\u0435\u043d\u044b  layout(location = 0) out vec3 colorBuff; \/\/ \u0441\u044e\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0446\u0432\u0435\u0442 layout(location = 1) out vec3 normBuff; \/\/ \u0441\u044e\u0434\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438  in vec3 light; in vec3 gNorm; in float zPos; in vec2 texCoord;  const vec3 ambientColor = vec3(0.3); const float zFar = 40.0; \/\/ \u0434\u0430\u043b\u044c\u043d\u044f\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f  void main() { \tvec3 n = normalize(texture(texNorm, texCoord).xyz*2.0-1.0); \tvec3 l = normalize(light); \tvec3 c = texture(texDiff, texCoord).rgb; \tfloat a = clamp(dot(n, l), 0.0, 1.0); \tcolorBuff = c*(a+ambientColor); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442  \tnormBuff = normalize(gNorm)*0.5+0.5; \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \tgl_FragDepth = zPos\/zFar; \/\/ \u0432 \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f }  <\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 (\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u043a\u0430). \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f, \u0431\u043e\u043b\u0435\u0435 \u0444\u0438\u0437\u0438\u0447\u043d\u044b\u043c) \u2014 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0432 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u044b\u0448\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443 \u0438 \u043d\u0438\u0436\u0435 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.  <\/p>\n<pre><code class=\"cpp\">for (int i=0; i&lt;samples; i++) { \trndTable[i] = vec3(random(-1, 1), random(-1, 1), random(-1, -0)); \/\/\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0443\u043a\u0443\u0431\u0435 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0441\u043b\u0435\u0432\u0430) \trndTable[i].normalize(); \/\/ \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0443 \trndTable[i] *= (i+1.0f)\/samples; \/\/\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0441\u043f\u0440\u0430\u0432\u0430) } <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/d90\/1ef\/34f\/d901ef34fc96461baa24ffdf652f2a65.png\" align=\"left\"\/><br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/006\/d9b\/e6a\/006d9be6ae0d449d917a075f82a165da.png\" align=\"right\"\/><br \/>  <br clear=\"left\"\/>   <br clear=\"right\"\/>   <br \/>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043a\u0430 \u0440\u0430\u0432\u043d\u044b\u043c 10.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0430\u043b\u043e \u2014 \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0442\u043e\u0447\u043a\u0438, \u0445\u043e\u0442\u044c \u0438 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c. \u0414\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0443 (\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 4\u04454 \u043f\u0438\u043a\u0441\u0435\u043b\u044f) \u0441 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u044b. \u0410 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043c\u043d\u043e\u0436\u0430\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440. \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81_%D0%93%D1%80%D0%B0%D0%BC%D0%B0_%E2%80%95_%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0\">\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0413\u0440\u0430\u043c\u043c\u0430-\u0428\u043c\u0438\u0434\u0442\u0430<\/a>.<\/p>\n<p>  \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">vec3 normal = texture(normBuff, texCoord).xyz*2.0-1.0; vec3 rvec = texture(randMap, texCoord*scr).xyz*2.0-1.0; vec3 tangent = normalize(rvec-normal*dot(rvec, normal)); vec3 bitangent = cross(tangent, normal); mat3 rotate = mat3(tangent, bitangent, normal); <\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0449\u0435: \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 (\u043b\u0443\u0447) \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f. Z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443 \u043d\u0430\u0441 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u0430 \u043b\u0443\u0447 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0433\u043b\u0430 \u043e\u0431\u0437\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438) \u2014 \u044d\u0442\u043e fov. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0430 uniform-\u0430\u0445, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u043b \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043a\u0430\u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443.  <\/p>\n<pre><code class=\"cpp\">#version 300 es  const fov = 0.57735;  layout(location = 0) in vec2 vPos; layout(location = 1) in vec2 tCoord;  uniform float aspect;  out vec2 texCoord; out vec3 viewRay;  void main() { \tgl_Position = vec4(vPos, 0.0, 1.0); \ttexCoord = tCoord; \tviewRay = vec3(-vPos.x*aspect*fov, -vPos.y*fov, 1.0); \/\/ \u043b\u0443\u0447 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b, \u043e\u043d \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 } <\/code><\/pre>\n<p>  \u0412 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0443\u0447\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">float depth = texture(depthBuff, texCoord).x; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u043e\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e depth *= zFar; \/\/ \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 vec3 pos = viewRay*depth; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0432\u0438\u0434\u0430 <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u043e\u0447\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0432\u044b\u0431\u043e\u0440\u043e\u043a:  <\/p>\n<pre><code class=\"cpp\">float acc = 0.0; for (int i=0; i&lt;samples; i++) { \tvec3 samplePos = rotate*rndTable[i]; \/\/\u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \tsamplePos = samplePos*radius+pos; \/\/\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0442\u043e\u0447\u043a\u0443  \t\/\/ \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0432\u0438\u0434\u0430, \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \tvec4 shift = proj*vec4(samplePos, 1.0); \tshift.xy \/= shift.w; \tshift.xy = shift.xy*0.5+0.5; \t\/\/ \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \tfloat sampleDepth = texture(depthBuff, shift.xy).x*zFar; \t\/\/ \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 - \u043e\u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043d\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0437\u043a\u0438\u043c\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0432\u044b\u0445\u043e\u0436\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043b\u0430\u0432\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 smoothstep, \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 - \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \tfloat distanceCheck = smoothstep(0.0, 1.0, radius\/abs(pos.z-sampleDepth)); \t\/\/ \u0435\u0441\u043b\u0438 \u0441\u044d\u043c\u043f\u043b \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 - \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d \u0435\u0435 \u043d\u0435 \u0437\u0430\u0442\u0435\u043d\u044f\u0435\u0442. \u0418\u043d\u0430\u0447\u0435 - \u0437\u0430\u0442\u0435\u043d\u044f\u0435\u0442, \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f step \tacc += step(sampleDepth, samplePos.z)*distanceCheck; } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f \u043f\u043e \u0433\u0430\u0443\u0441\u0441\u0443. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0435\u043d\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b. \u0417\u0434\u0435\u0441\u044c \u043a\u044d\u0448 \u0443\u0436\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0435\u0441\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0440\u0435\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0432 SSAO \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u044d\u0448-\u043f\u0440\u043e\u043c\u0430\u0445\u0438, \u0442\u043e \u0442\u0443\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#version 300 es precision mediump float;  uniform sampler2D ssaoBuff;  layout(location = 0) out float outColor;  in vec2 texCoord;  const float blurSize = 2.5\/1920.0;  void main() { \tfloat sum = 0.0; \tsum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y - 2.0*blurSize)).r * 0.0625; \tsum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y -     blurSize)).r * 0.25; \tsum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y               )).r * 0.375; \tsum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y +     blurSize)).r * 0.25; \tsum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y + 2.0*blurSize)).r * 0.0625;  \toutColor = sum; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#version 300 es precision mediump float;  uniform sampler2D ssaoBuff;  layout(location = 0) out float outColor;  in vec2 texCoord;  const float blurSize = 2.5\/1080.0;  void main() { \tfloat sum = 0.0; \tsum += texture(ssaoBuff, vec2(texCoord.x - 2.0*blurSize, texCoord.y)).r * 0.0625; \tsum += texture(ssaoBuff, vec2(texCoord.x -     blurSize, texCoord.y)).r * 0.25; \tsum += texture(ssaoBuff, vec2(texCoord.x,                texCoord.y)).r * 0.375; \tsum += texture(ssaoBuff, vec2(texCoord.x +     blurSize, texCoord.y)).r * 0.25; \tsum += texture(ssaoBuff, vec2(texCoord.x + 2.0*blurSize, texCoord.y)).r * 0.0625;  \toutColor = sum; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/d79\/250\/7ec\/d792507ec4c140d58d2eff7b92be286c.png\"\/><br \/>  \u0426\u0438\u0444\u0440\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041d\u0435 \u0433\u0443\u0441\u0442\u043e. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0434\u043a\u0430\u044f. \u0422\u0430\u043c \u0432\u0441\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e \u0438 \u043b\u044e\u0431\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u0435\u0441\u0435\u043d\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u044c \u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u00ab\u0441\u0442\u0443\u043f\u0435\u043d\u0435\u043a\u00bb:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/1ce\/cbb\/2da\/1cecbb2da18c4c5c8d5d631d9aa3bf9f.png\"\/><br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0435 \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 0,1. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0430 \u043a\u0430\u043a \u0431\u044b \u0443\u0440\u0435\u0436\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/1e2\/ff8\/7db\/1e2ff87db1e14e7dab542e29148ba80f.png\"\/><br \/>  \u0438 \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u00ab\u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0438\u00bb. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0448\u0435:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/4d0\/aaf\/b3c\/4d0aafb3cb4745d198f4163deae42411.png\"\/><br \/>  \u041d\u043e \u0444\u043f\u0441 \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435 \u0432\u044b\u0441\u043e\u043a.<\/p>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0438 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 SSAO. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u0434\u0432\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u043a\u0443 \u043a \u0444\u043f\u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 150%. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2014 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u043b\u0430\u044f \u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f. \u0410 \u0432\u0435\u0434\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u0443\u044e \u043c\u0430\u0441\u043a\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b.<br \/>  \u042d\u0442\u0443 \u043c\u0430\u0441\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u0440\u0443\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0432 SSAO \u0434\u043b\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0435\u0440, \u0441\u043a\u0430\u0436\u0435\u043c \u0432 16 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 \u0438 \u0432\u044b\u0441\u043e\u0442\u0435, \u0447\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f SSAO. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u0434\u043e \u043f\u044f\u0442\u0438 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438, \u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u044b:  <\/p>\n<pre><code class=\"cpp\">for (int i=0; i&lt;samplesLow; i++) { \tfloat angle = DEG2RAD*360.0f*i\/samplesLow; \trndTableLow[i] = vec3(sinf(angle), cosf(angle), -0.1); } <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043c\u0430\u0441\u043a\u0430, \u0431\u0435\u0437 \u043f\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0442\u0435\u043d\u0435\u0439, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u044b\u043c \u2014 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u043d\u044b\u0439, \u043b\u0438\u0431\u043e \u0431\u0435\u043b\u044b\u0439:  <\/p>\n<pre><code class=\"cpp\">outColor = step(254.0\/255.0, 1.0-(acc\/float(samples))); <\/code><\/pre>\n<p>  \u0428\u0435\u0439\u0434\u0435\u0440 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f \u0442\u043e\u0436\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043c, \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0434\u0432\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u0430 \u043e\u0434\u0438\u043d \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430\u043c\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0443\u0433\u043b\u0430\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430:  <\/p>\n<pre><code class=\"cpp\">#version 300 es precision mediump float;  uniform sampler2D ssaoLowBuff; uniform float aspect;  layout(location = 0) out float outColor;  in vec2 texCoord;  const float blurSize = 0.01;  void main() { \tfloat sum = 0.0; \tsum += texture(ssaoLowBuff, vec2(texCoord.x - blurSize, texCoord.y - blurSize*aspect)).r; \tsum += texture(ssaoLowBuff, vec2(texCoord.x - blurSize, texCoord.y + blurSize*aspect)).r; \tsum += texture(ssaoLowBuff, vec2(texCoord.x,            texCoord.y                  )).r; \tsum += texture(ssaoLowBuff, vec2(texCoord.x + blurSize, texCoord.y - blurSize*aspect)).r; \tsum += texture(ssaoLowBuff, vec2(texCoord.x + blurSize, texCoord.y + blurSize*aspect)).r;  \toutColor = step(254.0\/255.0, sum\/5.0); } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043c\u0430\u0441\u043a\u0443:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/62f\/fee\/8b9\/62ffee8b99e04a23a17f0fbf5a751da8.png\"\/><br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c SSAO (\u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u0432 1.5 \u0440\u0430\u0437\u0430, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b \u0434\u043e 8):<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/16b\/ca2\/3a0\/16bca23a0f1e43ed99ac5002d01bc8f2.png\"\/><br \/>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0444\u043f\u0441 \u0432\u043e\u0437\u0440\u043e\u0441 \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430, \u0431\u0435\u0437 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u0423 \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u0435\u0441\u043b\u0438 \u0432 \u0441\u0446\u0435\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u043e\u0432 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043c\u0435\u0441\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u0430\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0447\u0435\u0440\u043d\u043e\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u0441\u044f \u0438 \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u043e\u0433\u043e SSAO.<br \/>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 SSAO:  <\/p>\n<pre><code class=\"cpp\">#version 300 es precision highp float; \/\/\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 24-\u0431\u0438\u0442\u043d\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0433\u043b\u0443\u0431\u0438\u043d\u044b  const int samples = 8; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a const float radius = 0.5; \/\/ \u0440\u0430\u0434\u0438\u0443\u0441 \u0442\u0435\u043d\u0438 const float power = 2.0; \/\/ \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 const float zFar = 40.0; \/\/ \u0434\u0430\u043b\u044c\u043d\u044f\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f  uniform sampler2D normBuff; \/\/ \u0431\u0443\u0444\u0435\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 uniform sampler2D depthBuff; \/\/ \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b uniform sampler2D randMap; \/\/ \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 uniform sampler2D ssaoMask; \/\/ \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u044b\u0439 SSAO - \u043c\u0430\u0441\u043a\u0430 uniform vec2 scr; \/\/\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043b\u044f randMap, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 SSAO uniform vec3 rndTable[samples]; \/\/ \u0432\u044b\u0431\u043e\u0440\u043a\u0438 uniform mat4 proj; \/\/ \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438  layout(location = 0) out float outColor; \/\/ \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440  in vec2 texCoord; \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b in vec3 viewRay; \/\/ \u043b\u0443\u0447 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b  void main() { \t\/\/ \u0435\u0441\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u043c\u0430\u0441\u043a\u0435 \u0431\u0435\u043b\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0442 - \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \tfloat k = texture(ssaoMask, texCoord).x; \tif (k==1.0) \t\tdiscard;  \t\/\/ \u0435\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u043f\u0430\u043b \u0432 \u044d\u0442\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 - \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \tfloat depth = texture(depthBuff, texCoord).x; \tif (depth==1.0) \t\tdiscard;  \tdepth *= zFar; \tvec3 pos = viewRay*depth; \tvec3 normal = texture(normBuff, texCoord).xyz*2.0-1.0; \tvec3 rvec = texture(randMap, texCoord*scr).xyz*2.0-1.0; \tvec3 tangent = normalize(rvec-normal*dot(rvec, normal)); \tvec3 bitangent = cross(tangent, normal); \tmat3 rotate = mat3(tangent, bitangent, normal);  \tfloat acc = 0.0; \tfor (int i=0; i&lt;samples; i++) { \t\tvec3 samplePos = rotate*rndTable[i]; \/\/\u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \t\tsamplePos = samplePos*radius+pos; \/\/\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0442\u043e\u0447\u043a\u0443  \t\t\/\/ \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0432\u0438\u0434\u0430, \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \t\tvec4 shift = proj*vec4(samplePos, 1.0); \t\tshift.xy \/= shift.w; \t\tshift.xy = shift.xy*0.5+0.5; \t\t\/\/ \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 z-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \t\tfloat sampleDepth = texture(depthBuff, shift.xy).x*zFar; \t\t\/\/ \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 - \u043e\u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043d\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0437\u043a\u0438\u043c\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043b\u0430\u0432\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 smoothstep, \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 - \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \t\tfloat distanceCheck = smoothstep(0.0, 1.0, radius\/abs(pos.z-sampleDepth)); \t\t\/\/ \u0435\u0441\u043b\u0438 \u0441\u044d\u043c\u043f\u043b \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 - \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d \u0435\u0435 \u043d\u0435 \u0437\u0430\u0442\u0435\u043d\u044f\u0435\u0442. \u0418\u043d\u0430\u0447\u0435 - \u0437\u0430\u0442\u0435\u043d\u044f\u0435\u0442, \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f step \t\tacc += step(sampleDepth, samplePos.z)*distanceCheck; \t}  \toutColor = pow(1.0-(acc\/float(samples)), power); \/\/ \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/f77\/3f5\/ef1\/f773f5ef1c3e4f218d109b795c94a01f.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/366\/9f7\/502\/3669f75023274107a809bf8e50c600f6.png\"\/>  <\/div>\n<\/div>\n<p>  \u0412\u0438\u0434\u0435\u043e \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 (\u0440\u0430\u0437\u043c\u0435\u0440 SSAO \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u043a\u0440\u0430\u043d\u0430): <br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/zccQsbKagZc?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>  (\u0440\u0430\u0437\u043c\u0435\u0440 SSAO \u0432 1.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u043a\u0440\u0430\u043d\u0430):<br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"349\" src=\"\/\/www.youtube.com\/embed\/2Co7fzFoDss?wmode=opaque\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<h3>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u0438<\/h3>\n<p>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0444\u0444\u0442\u043e\u043f\u0438\u043a \u2014 \u0441\u043f\u0440\u044f\u0442\u0430\u043b \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u044b.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0442\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 ARM \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2\">\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432<\/a> \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 x86. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0434\u043b\u0438\u043d\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043d\u0430 \u0434\u0435\u0432\u0430\u0439\u0441\u0435. <br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438:  <\/p>\n<ul>\n<li>uint32_t htonl(uint32_t hostlong);<\/li>\n<li>uint16_t htons(uint16_t hostshort);<\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0432\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0431\u0430\u0439\u0442 (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Qt):  <\/p>\n<pre><code class=\"cpp\">#include &lt;netinet\/in.h&gt; ... QDataStream out(&file); out &lt;&lt; htons(s); \/\/\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0430 unsigned short out &lt;&lt; htonl(*((unsigned int*)&f));  \/\/\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0430 float <\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0432 \u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u044f sscanf \u043c\u043e\u0436\u0435\u0442 \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u0413\u0434\u0435-\u0442\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438 \u0446\u0435\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0447\u043a\u0430, \u0433\u0434\u0435-\u0442\u043e \u2014 \u0437\u0430\u043f\u044f\u0442\u0430\u044f.<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">readed1 = sscanf(&quot;float: 1,5&quot;, &quot;float: %f&quot;, &f); readed2 = sscanf(&quot;float: 1.5&quot;, &quot;float: %f&quot;, &f); <\/code><\/pre>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f readed1 \u0438 readed2 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u043b\u044f *.obj \u0444\u0430\u0439\u043b\u043e\u0432.  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u043e\u0440\u043c\u043e\u0437\u0430 \u0438\u0437-\u0437\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 logcat, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u043b\u043e\u0433 \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 Note 3 n9000 \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043b\u043e\u0433 (\u044f \u043f\u0438\u0441\u0430\u043b \u0442\u0443\u0434\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0440\u0435\u0439\u0442), \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u0441\u0435 \u0436\u0443\u0442\u043a\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c. \u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c \u0432 \u0447\u0435\u043c \u0434\u0435\u043b\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u043b \u043b\u043e\u0433 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 adb logcat -c).  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u043d\u044b\u0435 GPU<\/b><\/p>\n<div class=\"spoiler_text\">\u041d\u0430\u043f\u0438\u0441\u0430\u0432 \u0448\u0435\u0439\u0434\u0435\u0440, \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u0430\u0445 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 gpu. \u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 SSAO \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 mali, \u043d\u043e \u0433\u043b\u044e\u0447\u0438\u0442 \u043d\u0430 adreno (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 320 \u0438 330). \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430 adreno (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 es 300) \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0446\u0438\u043a\u043b\u044b, \u0442\u043e\u0447\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f, \u0445\u043e\u0442\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043b\u0435\u0433\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0446\u0438\u043a\u043b\u0430:  <\/p>\n<pre><code class=\"cpp\">... float getSample(in int i, in mat3 rotate, in vec3 pos, in vec3 rnd) { \tvec3 samplePos = rotate*rnd; \tsamplePos = samplePos*radius+pos;  \tvec4 shift = proj*vec4(samplePos, 1.0); \tshift.xy \/= shift.w; \tshift.xy = shift.xy*0.5+0.5;  \tfloat sampleDepth = texture(depthBuff, shift.xy).x*zFar; \tfloat distanceCheck = smoothstep(0.0, 1.0, radius\/abs(pos.z-sampleDepth)); \treturn step(sampleDepth, samplePos.z)*distanceCheck; }  void main() { ... \tfloat acc = 0.0; \tacc += getSample(0, rotate, pos, rndTable[0]); \tacc += getSample(1, rotate, pos, rndTable[1]); \tacc += getSample(2, rotate, pos, rndTable[2]); \tacc += getSample(3, rotate, pos, rndTable[3]); \tacc += getSample(4, rotate, pos, rndTable[4]); \tacc += getSample(5, rotate, pos, rndTable[5]); \tacc += getSample(6, rotate, pos, rndTable[6]); \tacc += getSample(7, rotate, pos, rndTable[7]); \toutColor = pow(1.0-(acc\/float(samples)), power); } <\/code><\/pre>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0430\u0441\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043d\u0430\u0435\u0442 \u0432 \u0447\u0435\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u2014 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0438\u043b\u0438 \u0432 \u043b\u0441.  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">QtCreator \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 IDE \u0434\u043b\u044f NDK-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\u041c\u043d\u0435 \u043b\u0438\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f QtCreator, \u0447\u0435\u043c Eclipse \u0438\u043b\u0438 Android Studio, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u043f\u0438\u0448\u0443 \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430 NDK. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e \u0432 Eclipse \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0448\u0443 \u0435\u0433\u043e \u0432 QtCreator. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<br \/>  \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Qt Creator \u0438 \u0438\u0434\u0435\u043c File -&gt; New File or Project\u2026 -&gt; Import Project -&gt; Import Existing Project  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/7c8\/c3d\/200\/7c8c3d200365d6918c1c1a285b3d15ea.png\"\/>  <\/div>\n<\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f Android \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043e\u0444\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"http:\/\/developer.android.com\/tools\/projects\/projects-eclipse.html\">\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Eclipse<\/a>, <a href=\"http:\/\/developer.android.com\/tools\/projects\/projects-cmdline.html\">\u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438<\/a> \u0438 <a href=\"https:\/\/developer.android.com\/tools\/sdk\/ndk\/index.html#GetStarted\">\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 NDK<\/a>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/a91\/cd6\/389\/a91cd63893bc0bf88d0ffff587f8913a.png\"\/>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442. Qt Creator \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b:<br \/>  <b>MyProject.config<\/b> \u2014 \u0441\u044e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0438\u0444\u0430\u0439\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 NEON \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0443\u0434\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 #define __ARM_NEON__<br \/>  <b>MyProject.files<\/b> \u2014 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0434\u0440\u0435\u0432\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<br \/>  <b>MyProject.includes<\/b> \u2014 \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a \u0438\u043d\u043a\u043b\u0443\u0434\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code>\/home\/torvald\/android-ndk-r9\/sources\/android\/cpufeatures \/home\/torvald\/android-ndk-r9\/sources\/cxx-stl\/stlport\/stlport \/home\/torvald\/android-ndk-r9\/sources\/cxx-stl\/gabi++\/include \/home\/torvald\/android-ndk-r9\/toolchains\/arm-linux-androideabi-4.6\/prebuilt\/darwin-x86_64\/lib\/gcc\/arm-linux-androideabi\/4.6\/include \/home\/torvald\/android-ndk-r9\/toolchains\/arm-linux-androideabi-4.6\/prebuilt\/darwin-x86_64\/lib\/gcc\/arm-linux-androideabi\/4.6\/include-fixed \/home\/torvald\/android-ndk-r9\/platforms\/android-18\/arch-arm\/usr\/include \/home\/torvald\/android-ndk-r9\/toolchains\/arm-linux-androideabi-4.6\/prebuilt\/linux-x86_64\/lib\/gcc\/arm-linux-androideabi\/4.6\/include\/ \/home\/torvald\/android-ndk-r9\/toolchains\/arm-linux-androideabi-4.6\/prebuilt\/linux-x86_64\/lib\/gcc\/arm-linux-androideabi\/4.6\/include\/-fixed<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u0438 \u0434\u0435\u043f\u043b\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430:  <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh case &quot;$1&quot; in \tclean) ndk-build clean && ant clean \t\t;; \tdeploy) adb install -r bin\/MainActivity-debug.apk &gt; \/dev\/null 2&gt;&1 & # && adb logcat -c && adb logcat -s &quot;SSAOTest&quot; #\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434 \u043b\u043e\u0433\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c Qt Creator - \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \t\t;; \trun) #adb shell am start -n com.torvald.ssaotest\/com.torvald.ssaotest.MainActivity &gt; \/dev\/null 2&gt;&1 & \t\t;; \t*) #kill $(ps aux | grep &quot;adb logcat&quot; | grep -v &quot;grep&quot; | awk '{print $2}') &gt; \/dev\/null 2&gt;&1 & \t\tndk-build NDK_DEBUG=0 -j9 && ant debug \t\t;; esac <\/code><\/pre>\n<p>  \u0412\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u00abProjects\u00bb \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/0ff\/b8d\/ad3\/0ffb8dad331c91d53ddaf306aa2041c2.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/ec4\/f68\/c3f\/ec4f68c3fdc7bf7884c6c675a0c8b8c1.png\"\/>  <\/div>\n<\/div>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Qt Creator \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u0438 \u0437\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043f\u043b\u044e\u0448\u043a\u0438 \u0434\u043b\u044f GLSL \u0438 C++.  <\/div>\n<\/div>\n<h3>\u0414\u0435\u043c\u043a\u0430<\/h3>\n<p>  \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0432\u0430\u0439\u0441 \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u0441 OpenGL ES 3.0, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0430 GUI \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u043e\u0431\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435\u0442, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/26a\/f35\/aae\/26af35aae24976e6f042b28b835ad11d.png\" align=\"left\"\/>   <\/p>\n<ol>\n<li>\u0441\u043b\u0430\u0439\u0434 \u0432\u0432\u0435\u0440\u0445\/\u0432\u043d\u0438\u0437 \u2014 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\/\u043e\u0442\u0434\u0430\u043b\u0438\u0442\u044c <\/li>\n<li>\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 (ssao, low ssao, ssao+color, color only) <\/li>\n<li>\u0432\u043a\u043b\/\u0432\u044b\u043a\u043b \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u0435 <\/li>\n<li> \u0441\u043c\u0435\u043d\u0430 \u0441\u0446\u0435\u043d\u043a\u0438<\/li>\n<\/ol>\n<p>  \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430 \u2014 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b<br \/>  <br clear=\"left\"\/>   <br \/>  \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0442\u0430\u043a\u0438\u0435:  <\/p>\n<ul>\n<li>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a = 8.<\/li>\n<li>\u0440\u0430\u0437\u043c\u0435\u0440 ssao \u0438 blur \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/li>\n<li>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u043e\u0433\u043e ssao = 5.<\/li>\n<li>\u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u043e\u0433\u043e ssao \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 16 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/github.com\/Torvald3d\/Torvald3d-SSAO-OpenGL-ES-3.0\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a> \u2014 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0443\u0442\u0438 \u043d\u0430 \u0441\u0432\u043e\u0438<br \/>  <a href=\"https:\/\/github.com\/Torvald3d\/Torvald3d-SSAO-OpenGL-ES-3.0\/raw\/master\/bin\/MainActivity-debug.apk\">apk<\/a> \u2014 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 Note 3 n9000 (mali T62), Note 3 n9005 (adreno 330), Nexus 5 (adreno 330), HTC One (adreno 320).<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<p>  \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435:<br \/>  <a href=\"http:\/\/steps3d.narod.ru\/tutorials\/ssao-tutorial.html\">Screen-Space Ambient Occlusion<\/a> \u043d\u0430 steps3d. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f SSAO<br \/>  <a href=\"https:\/\/www.khronos.org\/files\/opengles3-quick-reference-card.pdf\">OpenGL ES 3.0 API Reference Card<\/a> \u2014 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e OpenGL ES 3.0 \u0441\u043f\u0435\u043a\u0430\u043c<br \/>  <a href=\"http:\/\/blog.evoserv.at\/index.php\/2012\/12\/hemispherical-screen-space-ambient-occlusion-ssao-for-deferred-renderers-using-openglglsl\/\">Hemispherical Screen-Space Ambient Occlusion<\/a> \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Hemispherical SSAO<br \/>  <a href=\"http:\/\/tf3dm.com\/3d-model\/stone-bridge-37857.html\">Stone Bridge 3d model<\/a> \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0441\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u0434\u0435\u043c\u043a\u0435<br \/>  <a href=\"http:\/\/john-chapman-graphics.blogspot.ru\/2013\/01\/ssao-tutorial.html\">john-chapman-graphics: SSAO Tutorial<\/a> \u2014 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0443\u0447\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Hemispherical SSAO<br \/>  <a href=\"http:\/\/www.gamerendering.com\/2009\/01\/14\/ssao\/\">SSAO | Game Rendering<\/a><br \/>  <a href=\"http:\/\/mynameismjp.wordpress.com\/2010\/03\/22\/attack-of-the-depth-buffer\/\">Attack of the depth buffer<\/a> \u2014 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f z-\u0431\u0443\u0444\u0435\u0440\u0430<br \/>  <a href=\"http:\/\/habrahabr.ru\/post\/131931\/\">\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0433\u0440<\/a><br \/>  <a href=\"http:\/\/mtnphil.wordpress.com\/2013\/06\/26\/know-your-ssao-artifacts\/\">Know your SSAO artifacts<\/a> \u2014 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b\/\u043a\u043e\u0441\u044f\u043a\u0438\/\u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 SSAO \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0445 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f    \t<\/p>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/204260\/\"> http:\/\/habrahabr.ru\/post\/204260\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/326\/955\/9ae\/3269559aee89dbc6575ee594bca6b330.png\"\/><br \/>  \u041e\u0434\u043d\u0430\u0436\u0434\u044b, \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0434\u0435\u043c\u043a\u0443 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c, \u0432\u043e\u0437\u043d\u0438\u043a \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Screen_Space_Ambient_Occlusion\">SSAO<\/a> \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u043e?<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 Galaxy Note 3, \u0446\u0435\u043b\u044c \u2014 \u0444\u043f\u0441 \u043d\u0435 \u043d\u0438\u0436\u0435 30, \u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u044b\u0448\u0435.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-204260","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/204260","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=204260"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/204260\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=204260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=204260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=204260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}