{"id":405623,"date":"2024-06-29T18:26:44","date_gmt":"2024-06-29T18:26:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=405623"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T18:26:44","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=405623","title":{"rendered":"<span>\u041c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442 \u0434\u043b\u044f \u0433\u0435\u043e\u043b\u043e\u0433\u043e\u0432: 3D-\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u044f\u0447\u0435\u0435\u043a \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 (\u0447\u0430\u0441\u0442\u044c 1)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 <a href=\"https:\/\/habr.com\/ru\/company\/bashnipineft\/blog\/512052\/\">\u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c<\/a> \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0441\u0442\u0430 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u0434 \u0437\u0435\u043c\u043b\u0451\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0440\u043e\u0445\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u0440\u043e\u0434\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0441\u043e \u0441\u043a\u0432\u0430\u0436\u0438\u043d.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0433\u0435\u043e\u043b\u043e\u0433\u0438 \u0438 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u0442\u044c (\u043d\u0435)\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0432\u043e\u0438\u043c \u0437\u043d\u0430\u043d\u0438\u044f\u043c \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0439\u043c\u0451\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0430\u0441\u0430 \u2013 \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0439, \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u0410 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043d\u0430\u0448 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0430\u043c\u044b\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0432 \u043c\u0438\u0440\u0435*.<\/p>\n<p><em>* \u0441\u0440\u0435\u0434\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u0430\u043c.<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/691\/da3\/695\/691da3695c6ba94e317ccc4577dabe53.jpg\" width=\"1600\" height=\"1091\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/691\/da3\/695\/691da3695c6ba94e317ccc4577dabe53.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440: \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043e\u0431\u0438\u0435\u043c \u043f\u043e 3D-\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0443 \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 API. \u0412\u0441\u0451, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u2013 \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0438: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0442. \u043f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 (<a href=\"https:\/\/habr.com\/ru\/post\/472688\/\">\u0440\u0430\u0437<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/456932\/\">\u0434\u0432\u0430<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0441\u0432\u0435\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 OpenGL 4.5, \u043d\u043e \u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c OpenGL (ES) 2.0.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0432\u043e\u043a\u0441\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443, \u043a\u0430\u043a \u0432 \u041c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435.<\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0435\u0442\u043a\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 (\u0430\u043d\u0433\u043b. Corner-Point Grid\/Geometry), \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 30 \u043b\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0444\u0442\u0435 \u0434\u043b\u044f \u0433\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043d\u0430\u0440\u043e\u0434\u044c\u0435 \u0413\u0423\u0422 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439.<\/p>\n<p>\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u043e\u043c\u044b \u0432 \u043f\u043b\u0430\u0441\u0442\u0435 \u2013 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u043d\u0435\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u043e\u043a. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c, \u0443\u0433\u043b\u043e\u0432\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438, \u0447\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u0438 \u0436\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u2013 \u0447\u0442\u043e \u0438 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043f\u0440\u0430\u0432\u043e \u0431\u0435\u0437 \u0437\u0430\u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0441\u0442\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e\u043c\u043e\u0449\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c90\/47f\/f3a\/c9047ff3a413d9a55b13053932870e64.jpg\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u0423\u0422: \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u044b \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u0423\u0422: \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u044b \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438\" width=\"591\" height=\"747\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c90\/47f\/f3a\/c9047ff3a413d9a55b13053932870e64.jpg\" data-blurred=\"true\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u0423\u0422: \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u044b \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438<\/figcaption><\/figure>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u0435\u0442\u043a\u0438 \u0413\u0423\u0422 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442 \u2013 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0433\u043b\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/bashnipineft\/blog\/534992\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0438\u043b\u0438 \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Corner-point_grid\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u044b \u0436\u0435 \u043e\u0431\u0435\u0449\u0430\u043b\u0438, \u0447\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043c\u0441\u044f \u0437\u0430 \u0447\u0430\u0441), \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430, \u0430 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u043f\u043e \u0445\u043e\u0434\u0443.<\/p>\n<h3>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0443 \u0413\u0423\u0422<\/h3>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c, \u0432 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0438\u043a\u0438\u043d\u0433\u0430: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438\/\u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043c\u044b\u0448\u0438. \u042d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 100<sup>3<\/sup> ~ 1000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 10-30 \u0441\u0435\u043a;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0413\u0423\u0422 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0451\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0440\u0430\u0441\u043a\u0430 \u044f\u0447\u0435\u0435\u043a \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 wireframe-\u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a, \u0438\u043d\u0430\u0447\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c (\u0441\u043c. \u0440\u0438\u0441. 2);<\/p>\n<\/li>\n<li>\n<p>\u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432: \u043e\u0442 60 \u0434\u043e 20 FPS.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0451\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 PBR (Physically-Based Rendering). \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0441\u0442\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u044e\u0442; \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443\u044e \u0435\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/88d\/317\/635\/88d317635743d6953a764f6b27e1b065.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2: \u0413\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0447\u0435\u0435\u043a\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2: \u0413\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0447\u0435\u0435\u043a\" width=\"808\" height=\"604\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88d\/317\/635\/88d317635743d6953a764f6b27e1b065.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2: \u0413\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0447\u0435\u0435\u043a<\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0435\u0442\u043a\u0438 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 \u0441 \u0442\u0435\u043c \u0436\u0435 \u041c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438 1.16.4 (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438). \u041d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 11 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 222<sup>3<\/sup>. \u041d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 71 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 414<sup>3<\/sup>.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 \u0413\u0423\u0422 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 250<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438; \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 500<sup>3<\/sup> \u2013 1000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1000<sup>3<\/sup> \u2013 2000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043c\u043e\u0449\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445.<\/p>\n<h2>\u0423\u0442\u0438\u043b\u0438\u0442\u044b<\/h2>\n<p>\u0412\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043b\u043e\u0442\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 C (row-major). \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0437\u0430\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 <code>span3d<\/code> \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e, \u043a\u0430\u043a \u0438 <code>std::span<\/code> \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 std::mdspan (\u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 C++ \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435), \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/xtensor-stack\/xtensor\">xtensor<\/a>.<\/p>\n<pre><code class=\"cpp\">template&lt;typename T> struct span3d {      T* const data;     const uint32_t ni;     const uint32_t nj;     const uint32_t nk;      span3d(T* _data, uint32_t _ni, uint32_t _nj, uint32_t _nk)         : data(_data), ni(_ni), nj(_nj), nk(_nk) { }      T at(size_t x, size_t y, size_t z) const {         return data[x * nj * nk + y * nk + z];     }      T&amp; at(size_t x, size_t y, size_t z) {         return data[x * nj * nk + y * nk + z];     } }; <\/code><\/pre>\n<h2>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0413\u0423\u0422<\/h2>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>CornerPointGrid.<\/code><\/p>\n<pre><code class=\"cpp\">struct CornerPointGrid {     CornerPointGrid(uint32_t ni, uint32_t nj, uint32_t nk,                     const float* coord, const float *zcorn, const float* property, const uint8_t* mask);     ~CornerPointGrid();      void render(GLuint shader,                 const Palette&amp; palette,                 const mat4&amp; proj_view,                 const mat4&amp; model,                 vec3 light_direct,                 bool primitive_picking);  private:      \/\/ \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     span3d&lt;const float>   _coord;     span3d&lt;const float>   _zcorn;     span3d&lt;const float>   _property;     span3d&lt;const uint8_t> _mask;      \/\/ \u043c\u0430\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439     std::vector&lt;uint8_t>  _joined_mask_data;     span3d&lt;uint8_t>       _joined_mask; \/\/ \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 _joined_mask_data;      \/\/ \u043e\u0431\u044a\u0435\u043a\u0442\u044b OpenGL     GLuint _position_vbo;     GLuint _normal_vbo;     GLuint _cell_index_vbo;     GLuint _texcoord_vbo;     GLuint _property_vbo;      GLuint _indexbuffer;     GLuint _vao;      \/\/ \u0442\u0443\u0442 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b ... }; <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 <code>(ni, nj, nk)<\/code>\u0438 \u0432\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b: COORD, ZCORN, PROPERTY, MASK. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">CornerPointGrid::CornerPointGrid(uint32_t ni, uint32_t nj, uint32_t nk,                                  const float* coord, const float* zcorn, const float* property, const uint8_t* mask) :     _coord(coord,       ni+1, nj+1, 6),     _zcorn(zcorn,       ni*2, nj*2, nk*2),     _property(property, ni, nj, nk),     _mask(mask,         ni, nj, nk),     _joined_mask_data(ni*nj*nk, 0),     _joined_mask(_joined_mask_data.data(), ni, nj, nk) {      \/\/ \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0435\u043a     calc_joined_mask(_zcorn, _joined_mask);      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439     size_t quad_count = calc_number_of_quads(_mask, _joined_mask);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440\u044b     _create_vertex_index_buffers();      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0438\u0445 \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435\/\u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b     _gen_vertices_and_indices(quad_count);      \/\/ \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432 VAO     _setup_vao(); } <\/code><\/pre>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 COORD \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 <code>(ni+1, nj+1, 6).<\/code> \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 <code>(ni+1, nj+1)<\/code>\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432-\u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043b\u043b\u0430\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u044f\u0447\u0435\u0435\u043a \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u0445 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0413\u0423\u0422), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ZCORN. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u043a\u0438: <code>(ni*2, nj*2, nk*2).<\/code> \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0441\u0435\u043c\u044c \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0433\u043b\u0443\u0431\u0438\u043d \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 COORD, \u043d\u043e \u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e: \u0435\u0441\u043b\u0438 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0438\u0437 \u043f\u043e \u043f\u0438\u043b\u043b\u0430\u0440\u0443, \u0433\u043b\u0443\u0431\u0438\u043d\u044b\u00a0 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a \u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0434\u0440\u044f\u0434, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u0448 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445.<\/p>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 PROPERTY \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0438\u0441\u0442\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043d\u0435\u0444\u0442\u0435\u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043c\u044b \u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u0432 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0446\u0432\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u044b.<\/p>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 MASK \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0439\u043a\u0438. \u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u043e\u043d\u0430 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0435\u0451 \u043c\u044b \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u043c.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0431\u0430\u0439\u0442 \u043f\u043e\u0434 \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439.<\/p>\n<h2>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439<\/h2>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430 \u043d\u0435\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 \u044f\u0447\u0435\u0435\u043a \u0441\u0435\u0442\u043a\u0438, \u0438 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435, \u043a\u043e\u0438\u0445 \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043e\u0442\u0441\u0435\u0447\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0433\u0440\u0430\u043d\u0438 \u0432\u0441\u0435\u0445 \u044f\u0447\u0435\u0435\u043a.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0413\u0423\u0422 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0438, \u044f\u0447\u0435\u0439\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0441\u0442\u044b\u043a\u0443\u044e\u0442\u0441\u044f \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u043e\u043a. \u041d\u043e \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439 \u2013 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0437\u043d\u0430\u0442\u044c, \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u044f\u0447\u0435\u0439\u043a\u0430. \u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 \u0434\u0432\u0443\u0445 \u044f\u0447\u0435\u0435\u043a \u043d\u0435 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u043d\u0435\u0439 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438), \u0442\u043e \u044d\u0442\u0438 \u0433\u0440\u0430\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0431\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d, \u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u0430\u043a \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0435\u043a \u2013 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">enum JoinedMaskBits : uint8_t {     I_PREV = 1 &lt;&lt; 0, I_NEXT = 1 &lt;&lt; 1,     J_PREV = 1 &lt;&lt; 2, J_NEXT = 1 &lt;&lt; 3,     K_PREV = 1 &lt;&lt; 4, K_NEXT = 1 &lt;&lt; 5 };  static void calc_joined_mask(span3d&lt;const float> zcorn, span3d&lt;uint8_t> joined_mask) {     \/\/ \u0441 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0435\u0439, ~10 \u0441\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.     const float eps = 0.1f;      \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043c\u0430\u0441\u043a\u0438     for(uint32_t i = 0; i &lt; joined_mask.ni; ++i) {         for(uint32_t j = 0; j &lt; joined_mask.nj; ++j) {             for(uint32_t k = 0; k &lt; joined_mask.nk; ++k) {                 \/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 zcorn                 uint32_t iz = i * 2, jz = j * 2, kz = k * 2;                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044f\u0447\u0435\u0435\u043a (i,j,k) \u0438 (i+1,j,k) \u043f\u043e \u043e\u0441\u0438 I                 if (i + 1 &lt; joined_mask.ni) {                     float d = 0.0f;                     d += std::abs(zcorn.at(iz+1, jz,   kz  ) - zcorn.at(iz+2, jz,   kz  ));                     d += std::abs(zcorn.at(iz+1, jz+1, kz  ) - zcorn.at(iz+2, jz+1, kz  ));                     d += std::abs(zcorn.at(iz+1, jz,   kz+1) - zcorn.at(iz+2, jz,   kz+1));                     d += std::abs(zcorn.at(iz+1, jz+1, kz+1) - zcorn.at(iz+2, jz+1, kz+1));                      if (d &lt; eps) {                         \/\/ \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 - \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0431\u0438\u0442\u044b I_NEXT \u0438 I_PREV                         joined_mask.at(i,   j, k) |= I_NEXT;                         joined_mask.at(i+1, j, k) |= I_PREV;                     }                 }                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044f\u0447\u0435\u0435\u043a (i,j,k) \u0438 (i,j+1,k) \u043f\u043e \u043e\u0441\u0438 J                 if (j + 1 &lt; joined_mask.nj) {                     float d = 0.0f;                     d += std::abs(zcorn.at(iz,   jz+1, kz  ) - zcorn.at(iz,   jz+2, kz  ));                     d += std::abs(zcorn.at(iz+1, jz+1, kz  ) - zcorn.at(iz+1, jz+2, kz  ));                     d += std::abs(zcorn.at(iz,   jz+1, kz+1) - zcorn.at(iz,   jz+2, kz+1));                     d += std::abs(zcorn.at(iz+1, jz+1, kz+1) - zcorn.at(iz+1, jz+2, kz+1));                      if (d &lt; eps) {                         \/\/ \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 - \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0431\u0438\u0442\u044b J_NEXT \u0438 J_PREV                         joined_mask.at(i, j,   k) |= J_NEXT;                         joined_mask.at(i, j+1, k) |= J_PREV;                     }                 }                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044f\u0447\u0435\u0435\u043a (i,j,k) \u0438 (i,j,k+1) \u043f\u043e \u043e\u0441\u0438 K                 if (k + 1 &lt; joined_mask.nk) {                     float d = 0.0f;                     d += std::abs(zcorn.at(iz,   jz,   kz+1) - zcorn.at(iz,   jz,   kz+2));                     d += std::abs(zcorn.at(iz+1, jz,   kz+1) - zcorn.at(iz+1, jz,   kz+2));                     d += std::abs(zcorn.at(iz,   jz+1, kz+1) - zcorn.at(iz,   jz+1, kz+2));                     d += std::abs(zcorn.at(iz+1, jz+1, kz+1) - zcorn.at(iz+1, jz+1, kz+2));                      if (d &lt; eps) {                         \/\/ \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 - \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0431\u0438\u0442\u044b K_NEXT \u0438 K_PREV                         joined_mask.at(i, j, k)   |= K_NEXT;                         joined_mask.at(i, j, k+1) |= K_PREV;                     }                 }             } \/\/ for k         } \/\/ for j     } \/\/ for i } <\/code><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439 \u0434\u0432\u0443\u0445 \u044f\u0447\u0435\u0435\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u0440\u0430\u043d\u0438. \u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0435\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 (\u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c epsilon, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c), \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 1 \u0431\u0438\u0442\u044b \u044d\u0442\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439 \u0432 \u043c\u0430\u0441\u043a\u0435 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043d\u0443\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ZCORN, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u043e\u0440\u043c\u0430\u0442 \u0413\u0423\u0422 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439 \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u043f\u0438\u043b\u043b\u0430\u0440\u0430\u0445 \u2013 \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0433\u043b\u0443\u0431\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0441\u044f \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b X \u0438 Y. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443, \u043c\u0430\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e, \u0438 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0435\u0451 \u043d\u0430 \u0434\u0438\u0441\u043a \u2013 \u0447\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0439\u043c\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0440\u0430\u0441\u0447\u0451\u0442 \u043c\u0430\u0441\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<h2>\u0420\u0430\u0441\u0447\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u0434 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043d\u0435 \u0437\u043d\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 \u0433\u0440\u0430\u043d\u0435\u0439 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u0435\u043d \u2013 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0438\u0448\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>check_if_quad_culled(),<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430.<\/p>\n<pre><code class=\"cpp\">static size_t calc_number_of_quads(const span3d&lt;const uint8_t>&amp; mask,                                    const span3d&lt;uint8_t> joined_mask) {     size_t num_of_quads = 0;      for (uint32_t i = 0; i &lt; mask.ni; ++i)         for (uint32_t j = 0; j &lt; mask.nj; ++j)             for (uint32_t k = 0; k &lt; mask.nk; ++k)                  \/\/ \u0435\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430                 if (mask.at(i, j, k)){                      \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430                     for (uint32_t qi = 0; qi &lt; 6; ++qi){                          \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c                         if (!check_if_quad_culled(mask, joined_mask, i, j, k, qi))                             \/\/ \u0438 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a                             num_of_quads++;                     }                 }      return num_of_quads; }  \/\/ \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u0431\u0438\u0442, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439 static const std::array&lt;JoinedMaskBits, 6> cell_quads_joined_mask_bits = {     \/\/ \u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043f\u043e \u043e\u0441\u0438 x, y \u0438\u043b\u0438 z     JoinedMaskBits::J_PREV,     JoinedMaskBits::I_NEXT,     JoinedMaskBits::J_NEXT,     JoinedMaskBits::I_PREV,     JoinedMaskBits::K_PREV,     JoinedMaskBits::K_NEXT, };  \/\/ \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 static const std::array&lt;std::array&lt;int, 3>, 6> cell_quads_neighbors = {     \/\/ \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u0438\u0445 \u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c (i,j,k) \u044f\u0447\u0435\u0439\u043a\u0438 - \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438     std::array&lt;int, 3>{ 0, -1,  0},     std::array&lt;int, 3>{ 1,  0,  0},     std::array&lt;int, 3>{ 0,  1,  0},     std::array&lt;int, 3>{-1,  0,  0},     std::array&lt;int, 3>{ 0,  0, -1},     std::array&lt;int, 3>{ 0,  0,  1}, };   static bool check_if_quad_culled(const span3d&lt;const uint8_t>&amp; mask,                                  const span3d&lt;uint8_t>&amp; joined_mask,                                  uint32_t i, uint32_t j, uint32_t k, uint32_t qi) {      \/\/ \u0433\u0440\u0430\u043d\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u0430 \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439     if (!(joined_mask.at(i, j, k) &amp; cell_quads_joined_mask_bits[qi]))         return false;      \/\/ \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f     \/\/ (\u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0442.\u043a. \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 joined_mask == 0)     if (!mask.at(i + cell_quads_neighbors[qi][0],                  j + cell_quads_neighbors[qi][1],                  k + cell_quads_neighbors[qi][2]))         return false;      \/\/ \u043e\u0431\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0438, \u0437\u043d\u0430\u0447\u0438\u0442 \u0433\u0440\u0430\u043d\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u0447\u044c     return true; } <\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>check_if_quad_culled()<\/code>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u0430 \u043b\u0438 \u044d\u0442\u0430 \u0433\u0440\u0430\u043d\u044c \u0441 \u0433\u0440\u0430\u043d\u044c\u044e \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u2013 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 \u043c\u0430\u0441\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0418;<\/p>\n<\/li>\n<li>\n<p>\u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u2013 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0433\u0440\u0430\u043d\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0413\u0423\u0422, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439. \u042d\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0435\u0440\u0448\u0438\u043d<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c. C\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<pre><code class=\"cpp\">void CornerPointGrid::_create_vertex_index_buffers() {     \/\/ \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b     glCreateBuffers(1, &amp;_positions_vbo);     glCreateBuffers(1, &amp;_normals_vbo);     glCreateBuffers(1, &amp;_cell_indices_vbo);     glCreateBuffers(1, &amp;_texcoords_vbo);     glCreateBuffers(1, &amp;_values_vbo);      \/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440     glCreateBuffers(1, &amp;_indexbuffer); } <\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u044d\u0442\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u0430\u0445 \u2013 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0437\u0434\u0435\u0441\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 \u044f\u0447\u0435\u0439\u043a\u0438. \/\/         6-------7 \/\/        \/|     \/ | \/\/       4------5  |    k j \/\/       | 2----|--3    |\/ \/\/       |\/     | \/     0-i \/\/       0------1 static const std::array&lt;std::array&lt;uint32_t, 4>, 6> cell_quads = {     std::array&lt;uint32_t, 4>{0, 1, 5, 4},     std::array&lt;uint32_t, 4>{1, 3, 7, 5},     std::array&lt;uint32_t, 4>{3, 2, 6, 7},     std::array&lt;uint32_t, 4>{2, 0, 4, 6},     std::array&lt;uint32_t, 4>{3, 1, 0, 2},     std::array&lt;uint32_t, 4>{4, 5, 7, 6}, };  static vec3 calc_normal(vec3 v1, vec3 v2){     vec3 normal = cross(v1, v2);     return normalize(normal); }  \/\/ \u041a\u0430\u043a \u0434\u043b\u044f \u0433\u0440\u0430\u043d\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 static const std::array&lt;uint32_t, 6> quad_to_triangles = {     0, 1, 2, 0, 2, 3 };  void CornerPointGrid::_gen_vertices_and_indices(size_t quad_count) {      const size_t vertex_count = quad_count * 4;      std::vector&lt;float> a_position, a_index, a_property, a_normal, a_texcoord;      \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b 3 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (x, y \u0438 z)     a_position.reserve(3 * vertex_count);     \/\/ + \u0442\u0440\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430     a_index.reserve(3 * vertex_count);     \/\/ + \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044f\u0447\u0435\u0439\u043a\u0438     a_property.reserve(vertex_count);     \/\/ + \u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0438     a_normal.reserve(3 * vertex_count);     \/\/ + \u0434\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d)     a_texcoord.reserve(2 * vertex_count);          \/\/ \u2026 <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0430\u043d\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u0445. \u0423 \u0432\u0435\u0440\u0448\u0438\u043d \u0435\u0441\u0442\u044c 5 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0433\u0440\u0430\u043d\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u2013 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043f\u0438\u043a\u0438\u043d\u0433\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2013 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a;<\/p>\n<\/li>\n<li>\n<p>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">\/\/ \u2026      \/\/ \u0431\u0443\u0444\u0435\u0440, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044f\u0447\u0435\u0439\u043a\u0438     std::array&lt;vec3, 8> cell_vertices;      \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438     for (uint32_t i = 0; i &lt; _property.ni; ++i) {         for (uint32_t j = 0; j &lt; _property.nj; ++j) {             for (uint32_t k = 0; k &lt; _property.nk; ++k) {                  \/\/ \u0435\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u2014 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430                 if (_mask.at(i, j, k)){                      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c 8 \u0432\u0435\u0440\u0448\u0438\u043d, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044f\u0447\u0435\u0439\u043a\u0435                     get_cell_vertices(_coord, _zcorn, i, j, k, cell_vertices);                      \/\/ \u2026 <\/code><\/pre>\n<p>\u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043f\u0440\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u043e \u043c\u0430\u0441\u043a\u0435. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0441\u0435\u0445 \u0435\u0451 \u0432\u043e\u0441\u044c\u043c\u0438 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>get_cell_vertices()<\/code><\/p>\n<pre><code class=\"cpp\">\/\/         6-------7 \/\/        \/|     \/ | \/\/       4------5  |    k j \/\/       | 2----|--3    |\/ \/\/       |\/     | \/     0-i \/\/       0------1 \/\/ \u042d\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 8-\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \/\/ \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u043e \u043e\u0441\u044f\u043c x, y, z, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u044f\u0447\u0435\u0439\u043a\u0443. static const std::array&lt;uint32_t, 8> cell_vertices_offset_x = {     0, 1, 0, 1, 0, 1, 0, 1 }; static const std::array&lt;uint32_t, 8> cell_vertices_offset_y = {     0, 0, 1, 1, 0, 0, 1, 1 }; static const std::array&lt;uint32_t, 8> cell_vertices_offset_z = {     0, 0, 0, 0, 1, 1, 1, 1 };  \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 8 \u0432\u0435\u0440\u0448\u0438\u043d, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044f\u0447\u0435\u0439\u043a\u0435 (i, j, k). static void get_cell_vertices(const span3d&lt;const float>&amp; coord,                               const span3d&lt;const float>&amp; zcorn,                               uint32_t i, uint32_t j, uint32_t k,                               std::array&lt;vec3, 8>&amp; vertices) {     \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b     for (int vi = 0; vi &lt; 8; ++vi) {          \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0438\u043b\u043b\u0430\u0440\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044f\u0447\u0435\u0439\u043a\u0438         uint32_t pillar_index_i = i + cell_vertices_offset_x[vi];         uint32_t pillar_index_j = j + cell_vertices_offset_y[vi];          \/\/ p1 - \u043f\u0435\u0440\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0438\u043b\u043b\u0430\u0440\u0430         float p1_x = coord.at(pillar_index_i, pillar_index_j, 0);         float p1_y = coord.at(pillar_index_i, pillar_index_j, 1);         float p1_z = coord.at(pillar_index_i, pillar_index_j, 2);         \/\/ p2 - \u0432\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0438\u043b\u043b\u0430\u0440\u0430         float p2_x = coord.at(pillar_index_i, pillar_index_j, 3);         float p2_y = coord.at(pillar_index_i, pillar_index_j, 4);         float p2_z = coord.at(pillar_index_i, pillar_index_j, 5);          float z = zcorn.at(2 * i + cell_vertices_offset_x[vi],                            2 * j + cell_vertices_offset_y[vi],                            2 * k + cell_vertices_offset_z[vi]);          \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Z \u0434\u043b\u044f \u044f\u0447\u0435\u0439\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u0430 X \u0438 Y \u043d\u0435\u0442,         \/\/ \u0437\u0430\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e (x,y,z) \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043f\u0438\u043b\u043b\u0430\u0440\u0430 p1-p2         float t = (z - p1_z) \/ (p2_z - p1_z);         float x = p1_x + (p2_x - p1_x) * t;         float y = p1_y + (p2_y - p1_y) * t;          vertices[vi].x = x;         vertices[vi].y = y;         vertices[vi].z = z;     } } <\/code><\/pre>\n<p>\u0420\u0430\u0441\u0447\u0451\u0442 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u0440\u0448\u0438\u043d \u044f\u0447\u0435\u0435\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442: \u0437\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u0438\u043b\u043b\u0430\u0440\u0430, \u043d\u0430\u0445\u043e\u0434\u0438\u043c X \u0438 Y \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 Z, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ZCORN.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0435\u0440\u0448\u0438\u043d:<\/p>\n<pre><code class=\"cpp\">                    \/\/ \u2026                      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c 8 \u0432\u0435\u0440\u0448\u0438\u043d, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044f\u0447\u0435\u0439\u043a\u0435                     get_cell_vertices(_coord, _zcorn, i, j, k, cell_vertices);                      \/\/ \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0433\u0440\u0430\u043d\u0438                     for (int qi = 0; qi &lt; 6; ++qi) {                         \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u044c                         if (!check_if_quad_culled(_mask, _joined_mask, i, j, k, qi)){                              \/\/ 4 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u043d\u0438                             const std::array&lt;uint32_t, 4>&amp; quad = cell_quads[qi];                              \/\/ \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0433\u0440\u0430\u043d\u0438                             vec3 normal = calc_normal(                                         cell_vertices[quad[0]] - cell_vertices[quad[1]],                                         cell_vertices[quad[2]] - cell_vertices[quad[1]]);                              \/\/ \u2026 <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0432\u0438\u0434\u0438\u043c\u0430 \u043b\u0438 \u0433\u0440\u0430\u043d\u044c, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0435\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0435\u0440\u0448\u0438\u043d:<\/p>\n<pre><code class=\"cpp\"> \/\/ \u2026                              \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435                             for (int vii = 0; vii &lt; 4; ++vii){                                  \/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b                                 const vec3&amp; v = cell_vertices[quad[vii]];                                  \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b                                 a_position.insert(a_position.end(), {v.x, v.y, v.z});                                 a_index.insert(a_index.end(), {(float)i, (float)j, (float)k});                                 a_property.push_back(_property.at(i, j, k));                                 a_normal.insert(a_normal.end(), {normal.x, normal.y, normal.z});                                 vec2 texcoords = quad_vertices_texcoords[vii];                                 a_texcoord.insert(a_texcoord.end(), {texcoords.x, texcoords.y});                             } \u202f\/\/ for vii                         }                     } \/\/ for qi                 }             } \/\/ for k         } \/\/ for j     } \/\/ for i <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0435\u0451 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0443 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u044f\u0447\u0435\u0435\u043a, \/\/ \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u0438\u0437\u043a\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0435. \/\/ \u0422\u0443\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438, \/\/ \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u044b \/\/ (\u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u0442\u043e \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0430). static const std::array&lt;vec2, 4> quad_vertices_texcoords = {     vec2(1, 0),     vec2(0, 0),     vec2(0, 1),     vec2(0, 0), }; <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 VBO (Vertex Buffer Object):<\/p>\n<pre><code class=\"cpp\">    glNamedBufferStorage(_position_vbo,   a_position.size() * sizeof (float), a_position.data(), 0);     glNamedBufferStorage(_normal_vbo,     a_normal.size() * sizeof (float),   a_normal.data(),   0);     glNamedBufferStorage(_cell_index_vbo, a_index.size() * sizeof (float),    a_index.data(),    0);     glNamedBufferStorage(_texcoord_vbo,   a_texcoord.size() * sizeof (float), a_texcoord.data(), 0);     glNamedBufferStorage(_property_vbo,   a_property.size() * sizeof (float), a_property.data(), 0);<\/code><\/pre>\n<p>\u0418 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u043e \u0434\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0430\u043d\u0438:<\/p>\n<pre><code class=\"cpp\">    \/\/ \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0430\u043d\u044c \u0434\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430     size_t indices_count = quad_count * 6;     std::vector&lt;uint32_t> indices;     indices.reserve(indices_count);      for (size_t i = 0; i &lt; quad_count; ++i)         for (uint32_t j = 0; j &lt; 6; ++j)             \/\/ \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432             indices.push_back(static_cast&lt;uint32_t>(i * 4 + quad_to_triangles[j]));      glNamedBufferStorage(_indexbuffer, indices.size() * sizeof (uint32_t), indices.data(), 0);      \/\/ \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0447\u0438\u0441\u043b\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 glDrawElements()     _triangle_count = indices.size();  } \/\/ \u043a\u043e\u043d\u0435\u0446 \u043c\u0435\u0442\u043e\u0434\u0430 _gen_vertices_and_indices <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0435\u043b\u043e \u0437\u0430 \u043c\u0430\u043b\u044b\u043c: \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 VAO (Vertex Array Object) \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0413\u0423\u0422 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">void CornerPointGrid::_setup_vao() {     glCreateVertexArrays(1, &amp;_vao);     \/\/ \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432 VAO     glVertexArrayElementBuffer(_vao, _indexbuffer);      \/\/ \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 VAO:     \/\/ position     glVertexArrayVertexBuffer(_vao, 0, _position_vbo, 0, sizeof (float) * 3);     glVertexArrayAttribBinding(_vao, 0, 0);     glVertexArrayAttribFormat(_vao, 0, 3, GL_FLOAT, GL_FALSE, 0);     glEnableVertexArrayAttrib(_vao, 0);      \/\/ normal     glVertexArrayVertexBuffer(_vao, 1, _normal_vbo, 0, sizeof (float) * 3);     glVertexArrayAttribBinding(_vao, 1, 1);     glVertexArrayAttribFormat(_vao, 1, 3, GL_FLOAT, GL_FALSE, 0);     glEnableVertexArrayAttrib(_vao, 1);      \/\/ cell index     glVertexArrayVertexBuffer(_vao, 2, _cell_index_vbo, 0, sizeof (float) * 3);     glVertexArrayAttribBinding(_vao, 2, 2);     glVertexArrayAttribFormat(_vao, 2, 3, GL_FLOAT, GL_FALSE, 0);     glEnableVertexArrayAttrib(_vao, 2);      \/\/ texcoord     glVertexArrayVertexBuffer(_vao, 3, _texcoord_vbo, 0, sizeof (float) * 2);     glVertexArrayAttribBinding(_vao, 3, 3);     glVertexArrayAttribFormat(_vao, 3, 2, GL_FLOAT, GL_FALSE, 0);     glEnableVertexArrayAttrib(_vao, 3);      \/\/ property     glVertexArrayVertexBuffer(_vao, 4, _property_vbo, 0, sizeof (float));     glVertexArrayAttribBinding(_vao, 4, 4);     glVertexArrayAttribFormat(_vao, 4, 1, GL_FLOAT, GL_FALSE, 0);     glEnableVertexArrayAttrib(_vao, 4); }  struct Palette {     float min_value;     float max_value;     GLuint texture; };  void CornerPointGrid::render(GLuint shader,                             const Palette&amp; palette,                             const mat4&amp; proj_view,                             const mat4&amp; model,                             vec3 light_direct,                             bool primitive_picking) {     \/\/ \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440,     \/\/ \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0442\u0435\u0441\u0442 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0438\u043b backface culling     glUseProgram(shader);      \/\/ \u043c\u0430\u0442\u0440\u0438\u0446\u0430 MVP     mat4 mvp = proj_view * model;     glProgramUniformMatrix4fv(shader, glGetUniformLocation(shader, \"u_mvp\"), 1, GL_FALSE, &amp;mvp[0][0]);      \/\/ \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439     mat3 normal_mat = transpose(inverse(mat3{model}));     glProgramUniformMatrix3fv(shader, glGetUniformLocation(shader, \"u_normal_mat\"), 1, GL_FALSE, &amp;normal_mat[0][0]);      \/\/ \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u0438 \u0440\u0435\u0436\u0438\u043c \u043f\u0438\u043a\u0438\u043d\u0433\u0430     glProgramUniform3fv(shader, glGetUniformLocation(shader, \"u_light_direct\"), 1, &amp;light_direct[0]);     glProgramUniform1i(shader, glGetUniformLocation(shader, \"u_primitive_picking\"), primitive_picking);      \/\/ \u043f\u0430\u043b\u0438\u0442\u0440\u0430     glBindTextureUnit(0, palette.texture);     \/\/ \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u043e\u043f\u0446\u0438\u0438 GL_TEXTURE_WRAP_S == GL_CLAMP_TO_EDGE     \/\/ \u0438 GL_TEXTURE_{MIN,MAX}_FILTER == GL_LINEAR     glProgramUniform2f(shader, glGetUniformLocation(shader, \"u_value_range\"), palette.min_value, palette.max_value);      \/\/ \u0440\u0438\u0441\u0443\u0435\u043c     glBindVertexArray(_vao);     glDrawElements(GL_TRIANGLES, _triangle_count, GL_UNSIGNED_INT, nullptr);      \/\/ \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435     glBindVertexArray(0);     glBindTextureUnit(0, 0);     glUseProgram(0); } <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 OpenGL \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 Vertex Array Object. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 VAO \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440\u044b \u0438 \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0438\u0437 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 render() \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 \u0448\u0435\u0439\u0434\u0435\u0440 uniform-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430:<\/p>\n<ul>\n<li>\n<p>\u043c\u0430\u0442\u0440\u0438\u0446\u0443 MVP-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (Model-View-Projection);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0436\u0438\u043c \u043f\u0438\u043a\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432 \u044e\u043d\u0438\u0442 \u043f\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 0.<\/p>\n<p>\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0431\u0438\u043d\u0434\u0438\u0442\u044c VAO \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c glDrawElements() \u0441 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u043d\u0435\u0435 \u0447\u0438\u0441\u043b\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n<h3>\u0428\u0435\u0439\u0434\u0435\u0440\u044b<\/h3>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0447\u0430\u0441\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a\u043e\u0434 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">#version 440  \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f (\u0441\u043c. \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 _setup_vao) layout(location=0) in vec3 a_pos; \/\/ \u043d\u043e\u0440\u043c\u0430\u043b\u044c layout(location=1) in vec3 a_normal; \/\/ \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 layout(location=2) in vec3 a_ind; \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b layout(location=3) in vec2 a_texcoord; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0446\u0432\u0435\u0442 layout(location=4) in float a_property;  \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441 \u043f\u0430\u043b\u0438\u0442\u0440\u043e\u0439 layout(binding=0) uniform sampler1D palette_tex;  \/\/ \u043c\u0430\u0442\u0440\u0438\u0446\u044b MVP-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f layout(location=0) uniform mat4 u_mvp; \/\/ \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 layout(location=1) uniform mat3 u_normal_mat; \/\/ \u043a\u0430\u043a\u043e\u043c\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u0430\u043b\u0438\u0442\u0440\u044b layout(location=2) uniform vec2 u_value_range; \/\/ \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u043f\u0438\u043a\u0438\u043d\u0433 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438 layout(location=3) uniform bool u_primitive_picking; \/\/ \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430 layout(location=4) uniform vec3 u_light_direct;   layout(location=0) out INTERFACE {     \/\/ \u0446\u0432\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b     vec4 color;     \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a     vec2 texcoord; } vs_out;   void main() {      \/\/ MVP-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     gl_Position = u_mvp * vec4(a_pos, 1);      \/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440     vs_out.texcoord = a_texcoord;      \/\/ \u0435\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0438\u043a\u0438\u043d\u0433 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044f\u0447\u0435\u0435\u043a, \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0432\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438     if (u_primitive_picking) {         vs_out.color = vec4(a_ind.x, a_ind.y, a_ind.z, 1);         return;     }      \/\/ \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u043f\u0430\u043b\u0438\u0442\u0440\u044b     float normalized_value = (a_property - u_value_range.x) \/ (u_value_range.y - u_value_range.x);     \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0446\u0432\u0435\u0442 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b     vec4 cell_color = texture(palette_tex, normalized_value);      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u044c     vec3 normal = normalize(u_normal_mat * a_normal);      \/\/ \u043a\u043e\u0441\u0438\u043d\u0443\u0441 \u0443\u0433\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f     float NdotL = max(0, dot(normal, u_light_direct));     \/\/ \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0424\u043e\u043d\u0433\u0443     const float ka = 0.1, kd = 0.7;     vs_out.color = vec4((ka + NdotL * kd) * cell_color.rgb, cell_color.a);  } <\/code><\/pre>\n<p>\u0412 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c MVP-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440. \u041e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u2013 \u0442\u0430\u043a \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043f\u0438\u043a\u0438\u043d\u0433\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0413\u0423\u0422, \u043d\u043e \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0441 \u043d\u0435\u0439 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c, \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e 3D-\u0434\u0432\u0438\u0436\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044f\u0447\u0435\u0439\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0436\u0430\u043b \u0438\u043b\u0438 \u043d\u0430\u0432\u0451\u043b \u043c\u044b\u0448\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.<\/p>\n<p>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e, \u043f\u0438\u043a\u0438\u043d\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043b\u0443\u0447\u0430 \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u043d\u0430\u0436\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u043e \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442: \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u0441\u0435 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f BV\u041d (Bounding Volume Hierarchy<code>)\u00a0<\/code>\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0451\u043c: \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u0438\u043a\u0438\u043d\u0433\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u0432\u0441\u044e \u0413\u0423\u0422 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 1&#215;1 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c u_primitive_picking. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0432\u0435\u0442\u0430 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0438\u043a\u0438\u043d\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0432\u044c\u044e\u043f\u043e\u0440\u0442\u0430 \u0438 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u00a0\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">#version 440  \/\/ \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u043f\u0438\u043a\u0438\u043d\u0433 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438 layout(location=3) uniform bool u_primitive_picking;  layout(location = 0) in INTERFACE {     \/\/ \u0446\u0432\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b     vec4 color;     \/\/ \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a     vec2 texcoord; } fs_in;  layout(location=0) out vec4 FragColor;   \/\/ \u0446\u0432\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0447\u0435\u0435\u043a vec3 border_color(vec2 dist, vec3 color) {     \/\/ \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f dist (1 - \u0432\u0435\u0440\u0448\u0438\u043d\u0430, 0 - \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430)     \/\/ \u043f\u0440\u0438 \u0441\u0434\u0432\u0438\u0433\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 c\u0442\u043e\u0440\u043e\u043d\u0443 \u0433\u0440\u0430\u043d\u0438\u0446\u044b     vec2 delta = fwidth(dist);     \/\/ \u0432\u044b\u0441\u043e\u0442\u0430 \u0442\u0440\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u043a \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435     vec2 len = 1.0 \/ delta;      \/\/ \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044f - \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0443,     vec2 edge_factor = smoothstep(0.2, 0.8, len * dist);      \/\/ \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u0441 \u0441\u0435\u0442\u043a\u043e\u0439     return mix(color * 0.25, color, min(edge_factor.x, edge_factor.y)); }  void main() {     if (u_primitive_picking) {         \/\/ \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0438\u043a\u0438\u043d\u0433\u0430 \u0432 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0432\u0435\u0442\u0430         FragColor = fs_in.color;         return;     }      \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0435\u0442\u043a\u0443     vec3 res_color = border_color(fs_in.texcoord, fs_in.color.rgb);      FragColor = vec4(res_color, fs_in.color.a); } <\/code><\/pre>\n<p>\u0412\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u0441 \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 wireframe-\u0437\u0430\u043a\u0440\u0430\u0441\u043a\u0443 \u2013 \u0431\u043e\u043b\u0435\u0435 \u0442\u0451\u043c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u044f\u0447\u0435\u0435\u043a. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043a\u0430\u0434\u0440\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d46\/65c\/504\/d4665c504988cc2540bc00ac2979f2bf.jpg\" alt=\"\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430\" title=\"\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430\" width=\"1154\" height=\"1164\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d46\/65c\/504\/d4665c504988cc2540bc00ac2979f2bf.jpg\" data-blurred=\"true\"\/><figcaption>\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/figcaption><\/figure>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u043c \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u2013 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u044f\u0447\u0435\u0435\u043a \u043d\u0435 \u043f\u043e\u0442\u044f\u043d\u0435\u0442. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0413\u0423\u0422 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0432\u0438\u0436\u043a\u0430\u043c\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u043e\u0444\u0442\u0435. \u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430!<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430. \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0436\u0434\u0451\u043c \u0432\u0430\u0448\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/544054\/\"> https:\/\/habr.com\/ru\/articles\/544054\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 <a href=\"https:\/\/habr.com\/ru\/company\/bashnipineft\/blog\/512052\/\">\u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c<\/a> \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0441\u0442\u0430 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u0434 \u0437\u0435\u043c\u043b\u0451\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0440\u043e\u0445\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u0440\u043e\u0434\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0441\u043e \u0441\u043a\u0432\u0430\u0436\u0438\u043d.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0433\u0435\u043e\u043b\u043e\u0433\u0438 \u0438 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u0442\u044c (\u043d\u0435)\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0432\u043e\u0438\u043c \u0437\u043d\u0430\u043d\u0438\u044f\u043c \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0439\u043c\u0451\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0430\u0441\u0430 \u2013 \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0439, \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u0410 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043d\u0430\u0448 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0430\u043c\u044b\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0432 \u043c\u0438\u0440\u0435*.<\/p>\n<p><em>* \u0441\u0440\u0435\u0434\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u0430\u043c.<\/em><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440: \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043e\u0431\u0438\u0435\u043c \u043f\u043e 3D-\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0443 \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 API. \u0412\u0441\u0451, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u2013 \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0438: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0442. \u043f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 (<a href=\"https:\/\/habr.com\/ru\/post\/472688\/\">\u0440\u0430\u0437<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/456932\/\">\u0434\u0432\u0430<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0441\u0432\u0435\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 OpenGL 4.5, \u043d\u043e \u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c OpenGL (ES) 2.0.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0432\u043e\u043a\u0441\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443, \u043a\u0430\u043a \u0432 \u041c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435.<\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0435\u0442\u043a\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 (\u0430\u043d\u0433\u043b. Corner-Point Grid\/Geometry), \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 30 \u043b\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0444\u0442\u0435 \u0434\u043b\u044f \u0433\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043d\u0430\u0440\u043e\u0434\u044c\u0435 \u0413\u0423\u0422 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439.<\/p>\n<p>\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u043e\u043c\u044b \u0432 \u043f\u043b\u0430\u0441\u0442\u0435 \u2013 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u043d\u0435\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u043e\u043a. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c, \u0443\u0433\u043b\u043e\u0432\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438, \u0447\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u0438 \u0436\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u2013 \u0447\u0442\u043e \u0438 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043f\u0440\u0430\u0432\u043e \u0431\u0435\u0437 \u0437\u0430\u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0441\u0442\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e\u043c\u043e\u0449\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0413\u0423\u0422: \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u044b \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438<\/figcaption><\/figure>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u0435\u0442\u043a\u0438 \u0413\u0423\u0422 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442 \u2013 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0433\u043b\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/bashnipineft\/blog\/534992\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0438\u043b\u0438 \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Corner-point_grid\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u044b \u0436\u0435 \u043e\u0431\u0435\u0449\u0430\u043b\u0438, \u0447\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043c\u0441\u044f \u0437\u0430 \u0447\u0430\u0441), \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430, \u0430 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u043f\u043e \u0445\u043e\u0434\u0443.<\/p>\n<h3>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0443 \u0413\u0423\u0422<\/h3>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c, \u0432 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0438\u043a\u0438\u043d\u0433\u0430: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438\/\u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043c\u044b\u0448\u0438. \u042d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 100<sup>3<\/sup> ~ 1000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 10-30 \u0441\u0435\u043a;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0413\u0423\u0422 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0451\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0440\u0430\u0441\u043a\u0430 \u044f\u0447\u0435\u0435\u043a \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 wireframe-\u0433\u0440\u0430\u043d\u0438\u0446 \u044f\u0447\u0435\u0435\u043a, \u0438\u043d\u0430\u0447\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c (\u0441\u043c. \u0440\u0438\u0441. 2);<\/p>\n<\/li>\n<li>\n<p>\u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432: \u043e\u0442 60 \u0434\u043e 20 FPS.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0451\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 PBR (Physically-Based Rendering). \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0441\u0442\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u044e\u0442; \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443\u044e \u0435\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2: \u0413\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0447\u0435\u0435\u043a<\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0435\u0442\u043a\u0438 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 \u0441 \u0442\u0435\u043c \u0436\u0435 \u041c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438 1.16.4 (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438). \u041d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 11 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 222<sup>3<\/sup>. \u041d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 71 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 414<sup>3<\/sup>.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 \u0413\u0423\u0422 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 250<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438; \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 500<sup>3<\/sup> \u2013 1000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1000<sup>3<\/sup> \u2013 2000<sup>3<\/sup> \u044f\u0447\u0435\u0435\u043a \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043c\u043e\u0449\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445.<\/p>\n<h2>\u0423\u0442\u0438\u043b\u0438\u0442\u044b<\/h2>\n<p>\u0412\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043b\u043e\u0442\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 C (row-major). \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0437\u0430\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 <code>span3d<\/code> \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e, \u043a\u0430\u043a \u0438 <code>std::span<\/code> \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 std::mdspan (\u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 C++ \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435), \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/xtensor-stack\/xtensor\">xtensor<\/a>.<\/p>\n<pre><code class=\"cpp\">template&lt;typename T> struct span3d {      T* const data;     const uint32_t ni;     const uint32_t nj;     const uint32_t nk;      span3d(T* _data, uint32_t _ni, uint32_t _nj, uint32_t _nk)         : data(_data), ni(_ni), nj(_nj), nk(_nk) { }      T at(size_t x, size_t y, size_t z) const {         return data[x * nj * nk + y * nk + z];     }      T&amp; at(size_t x, size_t y, size_t z) {         return data[x * nj * nk + y * nk + z];     } }; <\/code><\/pre>\n<h2>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0413\u0423\u0422<\/h2>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>CornerPointGrid.<\/code><\/p>\n<pre><code class=\"cpp\">struct CornerPointGrid {     CornerPointGrid(uint32_t ni, uint32_t nj, uint32_t nk,                     const float* coord, const float *zcorn, const float* property, const uint8_t* mask);     ~CornerPointGrid();      void render(GLuint shader,                 const Palette&amp; palette,                 const mat4&amp; proj_view,                 const mat4&amp; model,                 vec3 light_direct,                 bool primitive_picking);  private:      \/\/ \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     span3d&lt;const float>   _coord;     span3d&lt;const float>   _zcorn;     span3d&lt;const float>   _property;     span3d&lt;const uint8_t> _mask;      \/\/ \u043c\u0430\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439     std::vector&lt;uint8_t>  _joined_mask_data;     span3d&lt;uint8_t>       _joined_mask; \/\/ \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 _joined_mask_data;      \/\/ \u043e\u0431\u044a\u0435\u043a\u0442\u044b OpenGL     GLuint _position_vbo;     GLuint _normal_vbo;     GLuint _cell_index_vbo;     GLuint _texcoord_vbo;     GLuint _property_vbo;      GLuint _indexbuffer;     GLuint _vao;      \/\/ \u0442\u0443\u0442 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b ... }; <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u0435\u0442\u043a\u0438 <code>(ni, nj, nk)<\/code>\u0438 \u0432\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b: COORD, ZCORN, PROPERTY, MASK. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">CornerPointGrid::CornerPointGrid(uint32_t ni, uint32_t nj, uint32_t nk,                                  const float* coord, const float* zcorn, const float* property, const uint8_t* mask) :     _coord(coord,       ni+1, nj+1, 6),     _zcorn(zcorn,       ni*2, nj*2, nk*2),     _property(property, ni, nj, nk),     _mask(mask,         ni, nj, nk),     _joined_mask_data(ni*nj*nk, 0),     _joined_mask(_joined_mask_data.data(), ni, nj, nk) {      \/\/ \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0435\u043a     calc_joined_mask(_zcorn, _joined_mask);      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439     size_t quad_count = calc_number_of_quads(_mask, _joined_mask);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440\u044b     _create_vertex_index_buffers();      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0438\u0445 \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435\/\u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b     _gen_vertices_and_indices(quad_count);      \/\/ \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432 VAO     _setup_vao(); } <\/code><\/pre>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 COORD \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 <code>(ni+1, nj+1, 6).<\/code> \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 <code>(ni+1, nj+1)<\/code>\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432-\u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043b\u043b\u0430\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0438\u043b\u043b\u0430\u0440\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u044f\u0447\u0435\u0435\u043a \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u0445 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d (\u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0413\u0423\u0422), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ZCORN. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u043a\u0438: <code>(ni*2, nj*2, nk*2).<\/code> \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0441\u0435\u043c\u044c \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0433\u043b\u0443\u0431\u0438\u043d \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 COORD, \u043d\u043e \u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e: \u0435\u0441\u043b\u0438 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0438\u0437 \u043f\u043e \u043f\u0438\u043b\u043b\u0430\u0440\u0443, \u0433\u043b\u0443\u0431\u0438\u043d\u044b\u00a0 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a \u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0434\u0440\u044f\u0434, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u0448 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445.<\/p>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 PROPERTY \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0438\u0441\u0442\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043d\u0435\u0444\u0442\u0435\u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043c\u044b \u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u0432 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0446\u0432\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u044b.<\/p>\n<p>\u041c\u0430\u0441\u0441\u0438\u0432 MASK \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0439\u043a\u0438. \u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u043e\u043d\u0430 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0435\u0451 \u043c\u044b \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u043c.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0431\u0430\u0439\u0442 \u043f\u043e\u0434 \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439.<\/p>\n<h2>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439<\/h2>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430 \u043d\u0435\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 \u044f\u0447\u0435\u0435\u043a \u0441\u0435\u0442\u043a\u0438, \u0438 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435, \u043a\u043e\u0438\u0445 \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043e\u0442\u0441\u0435\u0447\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0433\u0440\u0430\u043d\u0438 \u0432\u0441\u0435\u0445 \u044f\u0447\u0435\u0435\u043a.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0413\u0423\u0422 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u043a\u0438, \u044f\u0447\u0435\u0439\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0441\u0442\u044b\u043a\u0443\u044e\u0442\u0441\u044f \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u043e\u043a. \u041d\u043e \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439 \u2013 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0437\u043d\u0430\u0442\u044c, \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u044f\u0447\u0435\u0439\u043a\u0430. \u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 \u0434\u0432\u0443\u0445 \u044f\u0447\u0435\u0435\u043a \u043d\u0435 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u043d\u0435\u0439 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438), \u0442\u043e \u044d\u0442\u0438 \u0433\u0440\u0430\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0431\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d, \u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u0430\u043a \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0435\u0439. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044f\u0447\u0435\u0435\u043a \u2013 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">enum JoinedMaskBits : uint8_t {     I_PREV = 1 &lt;&lt; 0, I_NEXT = 1 &lt;&lt; 1,     J_PREV = 1 &lt;&lt; 2, J_NEXT = 1 &lt;&lt; 3,     K_PREV = 1 &lt;&lt; 4, K_NEXT = 1 &lt;&lt; 5 };  static void calc_joined_mask(span3d&lt;const float> zcorn, span3d&lt;uint8_t> joined_mask) {   <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-405623","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/405623","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=405623"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/405623\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=405623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=405623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=405623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}