{"id":494114,"date":"2026-09-09T15:37:07","date_gmt":"2026-09-09T15:37:07","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=494114"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=494114","title":{"rendered":"\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0448\u044d\u0439\u0434\u0435\u0440\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 OSL"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u043d\u044f\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0440\u043e\u0432\u043d\u043e \u0447\u0435\u0442\u044b\u0440\u0435) \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u0440\u044f\u043c\u043e \u0432\u043e\u0442 \u0442\u0430\u043a, \u043f\u0438\u0448\u0435\u043c &#8212; \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0437\u043d\u0430\u0447\u0438\u0442. <\/p>\n<p>\u0418 \u0435\u0449\u0451, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0434\u0435\u043b\u0443, \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0439. \u0420\u0435\u0434\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043a\u043e\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0448\u044c. \u041d\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u0442\u0438\u0445 \u0432\u0430\u0448\u0438\u0445 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u043e\u0432 \u043d\u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u041d\u0438 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0443\u0440\u044b, \u043d\u0438 \u0434\u043b\u044f, \u043f\u0440\u043e\u0441\u0442\u0438-\u0433\u043e\u0441\u043f\u043e\u0434\u0438, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430\u0448\u0438 &#8212; \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0435. \u0410 \u043d\u0435 \u0431\u0435\u0437\u0434\u0443\u0448\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u0443, \u0443\u0436 \u043a\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c. \u0427\u0442\u043e-\u0442\u043e \u0443 \u043c\u0435\u043d\u044f AI-\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f&#8230;<\/p>\n<h2>0. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 OSL<\/h2>\n<p><strong>OSL<\/strong> &#8212; \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432, \u0430 \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u043b\u0443\u0447\u0435\u0439.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0431\u044b\u043b\u043e, \u0432 \u043a\u0430\u043a\u043e\u043c \u0442\u0430\u043c \u043c\u0435\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0430, \u0441\u043a\u0432\u043e\u0437\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447, \u0438 \u0438\u0449\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0441\u0446\u0435\u043d\u044b. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0446\u0432\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <strong>Lambert<\/strong>, \u0442\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u043b\u0443\u0447\u0438 \u043f\u043e \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435 \u044d\u0442\u043e \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e \u0437\u0430\u043a\u043e\u043d\u0443 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0438, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f, \u0441 \u043a\u0435\u043c \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0432\u0435\u0442 \u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439, \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0443 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u0441\u0451 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<\/p>\n<p>\u042d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043b\u0443\u0447\u0435\u0439. \u0422\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445) \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a \u0443\u0436 \u043f\u0440\u044f\u043c\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u043d\u0435 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0441\u0446\u0435\u043d\u0443, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435. \u041d\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u043e\u0439 &#8212; \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043b\u0443\u0447\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u043b\u0443\u0447\u0438 \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0442\u0443\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b, \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0410 \u0432\u043e\u0442 \u0432 \u044d\u0442\u043e \u0432\u043e\u0442 \u043c\u0435\u0441\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>closure<\/strong>. \u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u00ab\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u00bb, \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f\u043c\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044d\u0442\u043e \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c. \u0418 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u043d\u0435 \u0446\u0432\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 (\u043a\u0430\u043a \u0432 glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445), \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 closure. \u0410 \u0440\u0435\u043d\u0434\u0435\u0440 \u0443\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u043e\u043d \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u0437 \u0448\u044d\u0439\u0434\u0435\u0440\u0430, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, osl-\u0448\u044d\u0439\u0434\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0446\u0432\u0435\u0442, \u043d\u043e \u044d\u0442\u043e \u0442\u0430\u043a, \u0434\u043b\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 \u0448\u044d\u0439\u0434\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e \u043e\u043d \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442. \u0412\u043e\u043e\u0431\u0449\u0435, \u043a\u0430\u043a\u0438\u0435 closure \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f &#8212; \u044d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u0414\u0430, \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 (\u043d\u0443 \u0442\u0430\u043c <code>emission()<\/code>, <code>diffuse(N)<\/code> \u0438 \u043f\u0440\u043e\u0447\u0435\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f \u0440\u0435\u043d\u0434\u0435\u0440, \u043d\u043e \u0434\u0430\u0436\u0435 \u0438 \u043e\u043d\u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 closure, \u0438 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0438\u0445 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f\u0437\u044b\u043a osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 C: \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u0442\u043e\u0447\u043a\u0438-\u0441-\u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438, <code>for<\/code>-\u044b \u0438 <code>if<\/code>-\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. \u0418 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 \u0432\u0441\u044f\u043a\u0438\u0445 \u0448\u044d\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043a. \u041d\u0443, \u043c\u043e\u0436\u0435\u0442 \u043a\u0442\u043e \u0441\u043b\u044b\u0445\u0430\u043b, \u0447\u0442\u043e, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432  glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>if\/else<\/code>. \u042d\u0442\u043e, \u0434\u0435\u0441\u043a\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435, \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u043e\u043b\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u043e. \u0410 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e. \u0417\u0434\u043e\u0440\u043e\u0432\u043e.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041d\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0441\u043a\u0443\u0447\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b. \u0410 \u0441\u0440\u0430\u0437\u0443 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438 \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445. \u0410, \u043d\u0443 \u0434\u0430, \u0433\u0434\u0435 \u044d\u0442\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c. \u0412 <strong>Blender<\/strong>, \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0435 <strong>Cycles<\/strong>. \u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u044b (\u0442\u0438\u043f\u0430 <strong>Arnold<\/strong>, <strong>RenderMan<\/strong>) \u0442\u043e\u0436\u0435 \u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442, \u043d\u043e \u0433\u0434\u0435 \u044d\u0442\u043e\u0442 Arnold? \u0432 \u041a\u0430\u043b\u0438\u0444\u043e\u0440\u043d\u0438\u0438? \u0410 Blender \u0441 Cycles \u0432\u043e\u0442 &#8212; \u0437\u0434\u0435\u0441\u044c \u0440\u044f\u0434\u043e\u043c, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0425\u043e\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0448\u0443\u0442\u043a\u0438 &#8212; \u044d\u0442\u043e \u043c\u043e\u0432\u0435\u0442\u043e\u043d, \u043d\u043e \u0435\u0441\u043b\u0438 \u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u0442\u043e \u0440\u0435\u043d\u0434\u0435\u0440 Arnold \u043d\u0430\u0437\u0432\u0430\u043d \u0432 \u0447\u0435\u0441\u0442\u044c \u0410\u0440\u043d\u043e\u043b\u044c\u0434\u0430 \u0428\u0432\u0430\u0440\u0446\u043d\u0435\u0433\u0433\u0435\u0440\u0430. \u0418 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430.<\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u043c\u044b \u043e\u0442\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c. \u041d\u0443 \u0442\u0430\u043a \u0432\u043e\u0442, \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0432 Blender \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c Cycles. \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u0448\u044d\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e <strong>GLTF<\/strong><\/p>\n<\/li>\n<li>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442 <strong>Ambient Occlusion<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0428\u044d\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u043d\u043e\u0439 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0412\u043e\u0440\u043e\u043d\u043e\u0433\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e \u0445\u0432\u0430\u0442\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438. \u0425\u043e\u0442\u044f \u043d\u0435 \u0432\u0441\u0435. \u0412 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445. \u0414\u0430-\u0434\u0430, \u0430 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u043b\u044e\u0431\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043e\u0431\u044a\u0451\u043c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 (\u0442\u0438\u043f\u0430 \u0434\u044b\u043c\u0430 \u0438 \u043e\u0433\u043d\u044f). \u041a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u0435\u043c (\u0432\u0440\u043e\u0434\u0435 \u0442\u0438\u043f\u043e\u0432 \u0448\u0443\u043c\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u043a\u043e\u0441\u043d\u0451\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u0441\u043a\u043e\u043b\u044c\u0437\u044c. \u041d\u043e \u043f\u0440\u043e \u0432\u0441\u0451 \u044d\u0442\u043e, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437.<\/p>\n<h2>1. GLTF Standard Surface<\/h2>\n<p>\u0412 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u044d\u0439\u0434\u0435\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u0448\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>shader<\/code>, \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code>gltf_surface<\/code> \u0438 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 (\u0438 \u043e\u043d \u0436\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>output closure color BSDF = 0.0<\/code>. \u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445.<\/p>\n<pre><code class=\"cpp\">shader gltf_surface(    output closure color BSDF = 0.0) {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 gltf-\u0430\u0441\u0441\u0435\u0442\u043e\u0432. <a href=\"https:\/\/github.com\/KhronosGroup\/glTF-Sample-Assets\/tree\/main\/Models\/SciFiHelmet\" rel=\"noopener nofollow\">\u0412\u043e\u0442 \u044d\u0442\u0430<\/a> \u043c\u043e\u0434\u0435\u043b\u044c \u0444\u0443\u0442\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0448\u043b\u0435\u043c\u0430. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0442\u0430\u043f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0440\u0442 \u043d\u043e\u0434\u044b <strong>Script<\/strong> \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043a \u043f\u043e\u0440\u0442\u0443 <strong>Surface <\/strong>\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u0435\u043c\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e71\/738\/f1c\/e71738f1cf3dfe8b81fbe8312bc3ef1a.png\" width=\"1533\" height=\"823\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e71\/738\/f1c\/e71738f1cf3dfe8b81fbe8312bc3ef1a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e71\/738\/f1c\/e71738f1cf3dfe8b81fbe8312bc3ef1a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0435, \u043d\u0443 \u0442\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u042d\u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 <code>base_color<\/code>, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 <code>metallic <\/code>\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u0438 <code>roughness<\/code>.<\/p>\n<pre><code class=\"cpp\">shader gltf_surface(    color base_color = color(0.8),    float metallic = 0.0,    float roughness = 0.0,    output closure color BSDF = 0.0) {    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c \u0448\u044d\u0439\u0434\u0435\u0440. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 <code>metallic<\/code> \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0438 \u0446\u0432\u0435\u0442 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u043a<\/p>\n<pre><code class=\"cpp\">color m_color = mix(color(0.04), base_color, metallic);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0442\u0430\u043a<\/p>\n<pre><code class=\"cpp\">color d_color = base_color * (1.0 - metallic);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430. \u0410 \u0432\u043e\u0442 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0443\u0442\u044c \u0445\u0438\u0442\u0440\u0435\u0435. \u0414\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u043e\u043d \u043d\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0439. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0445\u043e\u0442\u044c \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c, \u0434\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0439 \u043c\u0438\u0440, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043b\u0438\u043a. \u0414\u0430\u0436\u0435 \u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0433\u043e \u043e\u043d \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u0439.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0443\u0442 &#8212; \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 closure <strong>diffuse<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e \u0432 \u0442\u043e\u0447\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440.<\/p>\n<pre><code class=\"cpp\">closure color diffuse_component = d_color * diffuse(N);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e closure <strong>microfacet<\/strong>. \u0415\u043c\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0438\u043f (<code>ggx<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435), \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c (\u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043e\u0441\u0435\u0439), \u0438  \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 0 &#8212; \u044d\u0442\u043e \u0444\u043b\u0430\u0433 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0436\u0438\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0430 \u043d\u0435 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0439 (\u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c 1).<\/p>\n<pre><code class=\"cpp\">closure color specular_component = m_color * microfacet(\"ggx\", N, roughness, roughness, 0);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 closure, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u044d\u0442\u0438 \u0434\u0432\u0430 closure.<\/p>\n<pre><code class=\"cpp\">BSDF = diffuse_component + specular_component;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/71e\/8cd\/b0d\/71e8cdb0d67110a138d0999d293dc753.png\" width=\"1516\" height=\"522\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/71e\/8cd\/b0d\/71e8cdb0d67110a138d0999d293dc753.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/71e\/8cd\/b0d\/71e8cdb0d67110a138d0999d293dc753.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c <code>metallic = 1<\/code>, \u0438 \u0434\u043b\u044f <code>roughness = 0<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0435\u0440\u043a\u0430\u043b\u043e, \u0430 \u0434\u043b\u044f <code>roughness = 0.05<\/code>, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a\u043e\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/027\/3a2\/834\/0273a283467c75c2969cddc9a0def175.png\" width=\"1165\" height=\"519\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/027\/3a2\/834\/0273a283467c75c2969cddc9a0def175.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/027\/3a2\/834\/0273a283467c75c2969cddc9a0def175.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<pre><code class=\"cpp\">shader gltf_surface(    color base_color = color(0.8),    float metallic = 0.0,    float roughness = 0.0,    output closure color BSDF = 0.0) {        color m_color = mix(color(0.04), base_color, metallic);    color d_color = base_color * (1.0 - metallic);        closure color diffuse_component = d_color * diffuse(N);    closure color specular_component = m_color * microfacet(\"ggx\", N, roughness, roughness, 0);        BSDF = diffuse_component + specular_component;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043a\u0443\u0447\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u0423\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u044d\u0439\u0434\u0435\u0440\u0430 (\u043a\u0440\u043e\u043c\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e <code>BSDF<\/code>), \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0440\u0438 \u043f\u0443\u0442\u0438 \u0434\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/p>\n<pre><code class=\"cpp\">string basecolor_path = \"SciFiHelmet_BaseColor.png\",string amr_path = \"SciFiHelmet_MetallicRoughness.png\",string normal_path = \"SciFiHelmet_Normal.png\",<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, <code>basecolor_path<\/code> &#8212; \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044c \u0434\u043e \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, <code>amr_path<\/code> &#8212; \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044c \u0434\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u0430\u0440\u0442\u044b <strong>ambient occlusion<\/strong>, <strong>metallic <\/strong>\u0438 <strong>roughness <\/strong>(\u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u0430\u043a\u043e\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <strong>gltf<\/strong>), \u043d\u0443 \u0438 <code>normal_path<\/code> &#8212; \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0422\u0443\u0442 \u044f \u0441\u043e\u0437\u043d\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0436\u0443\u043b\u044c\u043d\u0438\u0447\u0430\u043b. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e gltf-\u0430\u0441\u0441\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u0430 <strong>AO<\/strong> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 <strong>Metallic <\/strong>\u0438 <strong>Roughness<\/strong>. \u041d\u043e \u0443 \u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043f\u0443\u0441\u0442\u043e\u0439, \u0432\u043e\u0442 \u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0447\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u0443\u0442\u044f\u043c\u0438. \u0418, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044f \u0442\u0443\u0442 \u043f\u0438\u0448\u0443 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0443\u0442\u0438, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440. OSL \u0432 Blender \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438, \u043d\u043e \u0438\u0449\u0435\u0442 \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e exe-\u0444\u0430\u0439\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u0430\u0434\u043e \u044d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0441 <strong>blender.exe<\/strong>. \u0414\u043b\u044f \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u043e\u0440\u043e\u0447\u0435 \u0432\u0441\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c <strong>uv<\/strong>-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>getattribute<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0438\u043c\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u0441\u0442\u043e &#8212; \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<pre><code class=\"cpp\">point uv = point(0.0);getattribute(\"geom:uv\", uv);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 Blender \u0434\u0430\u043d\u043d\u044b\u0435 \u043e uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>geom:uv<\/code>. \u042d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0418 \u0437\u0434\u0435\u0441\u044c \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0443\u043a\u0430\u0432\u0441\u0442\u0432\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0442 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b &#8212; \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u0430\u043d\u043d\u044b\u0435 \u043e uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u043f\u0443\u0441\u0442\u044b\u043c\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Blender \u0448\u0438\u0431\u043a\u043e \u0443\u043c\u043d\u044b\u0439, \u0438 \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0448\u044d\u0439\u0434\u0435\u0440\u0443. \u0410 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u043d \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0438 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442. \u0418 uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0436\u0435. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435. \u041d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0434, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0443\u0436\u0435\u043d. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0448\u044d\u0439\u0434\u0435\u0440\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043d\u043e\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0422\u043e\u0433\u0434\u0430 Blender \u0443\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0445, \u0430 \u043c\u044b \u0438\u0445 \u0440\u0430\u0437 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u044b, \u0435\u0441\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043d\u043e\u0434\u0430\u043c\u0438 \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c. \u041d\u0443 \u0443\u0436 \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u044d\u0442\u0438 \u043d\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0448\u044d\u0439\u0434\u0438\u043d\u0433\u0430 (\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430) \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0448 \u0448\u044d\u0439\u0434\u0435\u0440 \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u0441 <strong>emissive<\/strong>-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u043c, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u043e\u043c\u0443 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u0441 (\u0430 \u043d\u0430\u0448\u0435\u043c\u0443, \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439), \u0438 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u0442\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u043e\u0434\u044b \u0432 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0440\u0442\u044b \u044d\u0442\u043e\u0433\u043e emissive-\u0448\u044d\u0439\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>texture<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0446\u0432\u0435\u0442 \u043f\u043e \u044d\u0442\u0438\u043c uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c.<\/p>\n<pre><code class=\"cpp\">color base_color = texture(basecolor_path, uv.x, uv.y);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0434\u0430\u0451\u043c \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"cpp\">float metallic = 0.0;float roughness = 0.0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc0\/086\/aa9\/bc0086aa9d30ea3a9cae62d4cbd2a555.png\" width=\"1519\" height=\"517\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bc0\/086\/aa9\/bc0086aa9d30ea3a9cae62d4cbd2a555.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc0\/086\/aa9\/bc0086aa9d30ea3a9cae62d4cbd2a555.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e \u0447\u0442\u043e \u043b\u0438? \u041f\u043b\u043e\u0445\u043e! \u0426\u0432\u0435\u0442\u0430 \u043d\u0435 \u0442\u0435. \u042d\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 <strong>sRGB<\/strong>, \u0430 \u043d\u0430\u0434\u043e \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0430\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u0412\u043e\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0431\u043b\u0451\u043a\u043b\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0430\u0434\u043e \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u0424\u043e\u0440\u043c\u0443\u043b\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u0445. \u041f\u0438\u0448\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b.<\/p>\n<pre><code class=\"cpp\">float srgb_to_linear(float value) {    if (value &lt; 0.04045) {        return (value &lt; 0.0) ? 0.0 : value * (1.0 \/ 12.92);    }    else {        return pow((value + 0.055) * (1.0 \/ 1.055), 2.4);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0451, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0446\u0432\u0435\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">color srgb_to_linear(color c) {    return color(srgb_to_linear(c.r),                 srgb_to_linear(c.g),                 srgb_to_linear(c.b));}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>base_color<\/code>.<\/p>\n<pre><code class=\"cpp\">base_color = srgb_to_linear(base_color);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04f\/c28\/a35\/04fc28a350d7e0298a882523195d0679.png\" width=\"1526\" height=\"519\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/04f\/c28\/a35\/04fc28a350d7e0298a882523195d0679.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04f\/c28\/a35\/04fc28a350d7e0298a882523195d0679.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e. \u0412\u0438\u0434\u043d\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0437\u043a\u0438\u0439 \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0440. \u042d\u0442\u043e \u0432\u043e\u0442 \u0438\u0437-\u0437\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 <code>0.04<\/code>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0434\u043b\u044f <code>AO+Metallic+Roughness<\/code>. \u0411\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0439 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e.<\/p>\n<pre><code class=\"cpp\">color amr_color = texture(amr_path, uv.x, uv.y);float ao = amr_color.r;float metallic = amr_color.g;float roughness = amr_color.b;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ed\/2ed\/e45\/0ed2ede4543e7e53c167a19483bafff5.png\" width=\"1523\" height=\"519\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0ed\/2ed\/e45\/0ed2ede4543e7e53c167a19483bafff5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ed\/2ed\/e45\/0ed2ede4543e7e53c167a19483bafff5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0415\u0449\u0451 \u043b\u0443\u0447\u0448\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c <strong>ambient occlusion<\/strong>. \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432\u044b\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u0448\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435.<\/p>\n<pre><code class=\"cpp\">closure color diffuse_component = d_color * ao * diffuse(N);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 &#8212; \u043a\u0430\u0440\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u044c <code>N<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0448\u044d\u0439\u0434\u0435\u0440\u0430. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438 \u0441\u0438\u043b\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u0443\u044e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u044d\u0442\u043e\u0439 \u0441\u0438\u043b\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, float strength) {    normal n_vector = N;        return n_vector;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0435\u0434\u044c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u044c <code>N<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c. \u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0432 \u043d\u0438\u0445 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443. \u0422\u043e\u0436\u0435 \u0431\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">point uv = point(0.0);getattribute(\"geom:uv\", uv);color normal_color = texture(normal_path, uv.x, uv.y);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u043c <strong>[-1; 1]<\/strong>, \u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0442\u0440\u0435\u0437\u043a\u0430 <strong>[0; 1]<\/strong>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u044d\u0442\u0438 \u0446\u0432\u0435\u0442\u0430 \u043f\u043e\u0434\u0436\u0430\u0442\u044b. \u041d\u0430\u0434\u043e \u0438\u0445 \u043f\u043e\u0434\u0440\u0430\u0437\u0436\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">color vector_color = 2.0 * (normal_color - color(0.5));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u0440\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u043a\u0430\u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0446\u0432\u0435\u0442\u0430). \u041d\u043e \u044d\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b &#8212; \u044d\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0432 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e \u0431\u0430\u0437\u0438\u0441\u0443 (\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043d\u043e\u0440\u043c\u0430\u043b\u044c). \u041d\u043e\u0440\u043c\u0430\u043b\u044c-\u0442\u043e \u043c\u044b \u0437\u043d\u0430\u0435\u043c (\u044d\u0442\u043e <code>N<\/code>). \u0412\u043e\u0442 \u043d\u0430\u0434\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043b\u0438\u0431\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043b\u0438\u0431\u043e \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u041a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u041d\u043e \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u0441\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 uv-\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0435. \u0412 Blender-\u0435 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435.  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>geom:tangent<\/code>.<\/p>\n<pre><code class=\"cpp\">vector tangent;getattribute(\"geom:tangent\", tangent);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043c \u0435\u0433\u043e \u0437\u043d\u0430\u043a \u0438\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>geom:tangent_sign<\/code>.<\/p>\n<pre><code class=\"cpp\">float tangent_sign;getattribute(\"geom:tangent_sign\", tangent_sign);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 <code>geom:tangent<\/code> \u0438 <code>geom:tangent_sign<\/code> \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0441 uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. Blender \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0442 \u043d\u0430 \u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0432\u0441\u0443\u043d\u0443\u0442\u044c \u043d\u043e\u0434\u0443 <strong>Normal Map<\/strong>, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443. \u0411\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u042f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e Blender \u0448\u0438\u0431\u043a\u043e \u0443\u043c\u043d\u044b\u0439?<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">vector bitangent = tangent_sign * cross(N, tangent);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<pre><code class=\"cpp\">  n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * N);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e.<\/p>\n<pre><code class=\"cpp\">n_vector = normalize(N + (n_vector - N) * max(strength, 0.0));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, float strength) {    normal n_vector = N;    point uv = point(0.0);    getattribute(\"geom:uv\", uv);        color normal_color = texture(normal_path, uv.x, uv.y);    color vector_color = 2.0 * (normal_color - color(0.5));        vector tangent;    float tangent_sign;    getattribute(\"geom:tangent\", tangent);    getattribute(\"geom:tangent_sign\", tangent_sign);    vector bitangent = tangent_sign * cross(N, tangent);        n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * N);    n_vector = normalize(N + (n_vector - N) * max(strength, 0.0));        return n_vector;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u0448\u044d\u0439\u0434\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c.<\/p>\n<pre><code class=\"cpp\">N = get_normal(normal_path, 1.0);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b9\/642\/1eb\/7b96421ebe0aaa87742c8a86bb61464a.png\" width=\"1520\" height=\"520\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7b9\/642\/1eb\/7b96421ebe0aaa87742c8a86bb61464a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b9\/642\/1eb\/7b96421ebe0aaa87742c8a86bb61464a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0448\u044d\u0439\u0434\u0435\u0440. \u042d\u0444\u0444\u0435\u043a\u0442 \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f. \u0412\u0441\u0435\u0433\u043e-\u0442\u043e \u0438 \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0434\u0432\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 closure: <code>emission()<\/code> \u0438 <code>transparent()<\/code>.<\/p>\n<h2>2. Ambient Occlusion<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 <strong>ambient occlusion<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043b\u0443\u0447\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>trace<\/code>. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 ao \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0418\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439, \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e. \u0415\u0441\u043b\u0438 \u043c\u0430\u043b\u043e &#8212; \u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u043c\u043d\u043e\u0433\u043e &#8212; \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0430.<\/p>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u044d\u0439\u0434\u0435\u0440.<\/p>\n<pre><code class=\"cpp\">shader ambient_occlusion(    int only_local = 0,    float bias = 0.01,    int samples = 16,    float max_distance = 1.0,    output float ao = 0.0) {   }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0442\u0440\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<ul>\n<li>\n<p><code>only_local<\/code> &#8212; \u044d\u0442\u043e \u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043d\u0430\u0434\u043e \u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 ao \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043b\u0438 \u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><code>bias<\/code> &#8212; \u043e\u0442\u0441\u0442\u0443\u043f \u043f\u0440\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447 \u043d\u0435 \u043d\u0430\u0442\u044b\u043a\u0430\u043b\u0441\u044f \u043d\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0432\u044b\u043f\u0443\u0449\u0435\u043d<\/p>\n<\/li>\n<li>\n<p><code>samples<\/code> &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u043a\u0438\u0434\u0430\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u044c ao \u0432 \u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p><code>max_distance<\/code> &#8212; \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0443\u0434\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0448\u043b\u0435\u043c\u0430. \u0418 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>get_normal<\/code>.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, float strength) {    normal n_vector = N;    point uv = point(0.0);    getattribute(\"geom:uv\", uv);        color normal_color = texture(normal_path, uv.x, uv.y);    color vector_color = 2.0 * (normal_color - color(0.5));        vector tangent;    float tangent_sign;    getattribute(\"geom:tangent\", tangent);    getattribute(\"geom:tangent_sign\", tangent_sign);    vector bitangent = tangent_sign * cross(N, tangent);        n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * N);    n_vector = normalize(N + (n_vector - N) * max(strength, 0.0));        return n_vector;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0448\u044d\u0439\u0434\u0435\u0440\u0435 \u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<pre><code class=\"cpp\">N = get_normal(\"SciFiHelmet_Normal.png\", 1.0);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441 \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043b\u044e\u0431\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u0438\u043b\u0438 \u0435\u0449\u0435 \u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u043e\u043c\u0443-\u0436\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u043e\u043a\u0443\u0441 \u0438\u0437 <a href=\"https:\/\/jcgt.org\/published\/0006\/01\/01\/\" rel=\"noopener nofollow\">\u0432\u043e\u0442 \u044d\u0442\u043e\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<pre><code class=\"cpp\">    float sign_z = select(-1, 1, N.z &gt;= 0.0);    float a = -1.0 \/ (sign_z + N.z);    vector bitangent = vector(a * N.x * N.y, sign_z + a * N.y * N.y, -N.y);    vector tangent = vector(1.0 + a * sign_z * N.x * N.x, sign_z * bitangent.x, -sign_z * N.x);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u0442\u0441\u044f \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 &#8212; \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435. \u041d\u043e \u043c\u044b (\u0442\u0435, \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e) \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 (<code>tangent<\/code>, <code>bitangent<\/code>, <code>N<\/code>) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0431\u0430\u0437\u0438\u0441\u043e\u043c \u0432 \u0442\u043e\u0447\u043a\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>hits <\/code>\u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u043b\u0443\u0447\u0435\u0439, \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">float hits = 0;for(int i = 0; i &lt; samples; i++) {    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0442\u0435\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0418\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0443\u0433\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043b\u0443\u0447 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d.<\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>hashnoise <\/code>\u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 <strong>[0; 1)<\/strong>. \u0423 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439, \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e, \u0442\u0430\u043a \u0438 \u0434\u0432\u0430, \u0442\u043e\u0447\u043a\u0443 \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0438 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c. \u0412 \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0432\u0443\u0445 &#8212; \u0442\u043e\u0447\u043a\u0443 \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u0412\u043e\u0442 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430. \u0414\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0440\u0451\u0445 \u0438\u043c\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442.<\/p>\n<pre><code class=\"cpp\">point random = hashnoise(P, float(i));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 <code>P<\/code>, \u043d\u043e \u0438 \u043e\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 <code>i<\/code> \u0446\u0438\u043a\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u0445.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0433\u043e\u043b <code>phi<\/code> \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<\/p>\n<pre><code class=\"cpp\">float phi = random.x * M_2PI;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0443\u0442 \u0436\u0435 \u0435\u0433\u043e \u0441\u0438\u043d\u0443\u0441 \u0438 \u043a\u043e\u0441\u0438\u043d\u0443\u0441. \u041b\u0438\u0448\u043d\u0438\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442.<\/p>\n<pre><code class=\"cpp\">float sin_phi, cos_phi;sincos(phi, sin_phi, cos_phi);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0433\u043b\u0430 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0440\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c, \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u043d\u0443\u0441.<\/p>\n<pre><code class=\"cpp\">float z = random.y;float sin_theta = sqrt(1.0 - z*z);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">float x = sin_theta * cos_phi;float y = sin_theta * sin_phi;vector direction = x * tangent + y * bitangent + z * N;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443, \u043a\u0442\u043e \u043f\u0440\u043e\u0433\u0443\u043b\u0438\u0432\u0430\u043b \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e? \u0422\u043e\u0447\u043d\u043e \u043d\u0435 \u043c\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u043c \u043b\u0443\u0447 \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 <code>P<\/code> \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 <code>direction<\/code>.<\/p>\n<pre><code class=\"cpp\">int hit = select(    trace(P, direction, \"mindist\", bias, \"maxdist\", max_distance, \"traceset\", \"\"),    trace(P, direction, \"mindist\", bias, \"maxdist\", max_distance, \"traceset\", \"__only_local__\"),    only_local);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0434\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>trace<\/code>. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0442\u043e\u0447\u043a\u0438, \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0431\u043e\u0440 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0438\u043c\u044f (\u043a\u043b\u044e\u0447) \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>mindist <\/code>&#8212; \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, <code>maxdist <\/code>&#8212; \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, <code>traceset <\/code>&#8212; \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u043b\u0443\u0447\u0430. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 OSL \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0432\u043e\u0438\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438. \u041d\u043e \u0432 Blender \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e, \u043a\u0440\u043e\u043c\u0435 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432: \u043b\u0438\u0431\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 &#8212; \u0442\u043e\u0433\u0434\u0430 \u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0446\u0435\u043d\u044b, \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u043e\u043a\u0430 <code>only_local<\/code> &#8212; \u0438 \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>select <\/code>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043b\u0438\u0431\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430 <code>only_local<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>hit <\/code>&#8212; 0, \u0435\u0441\u043b\u0438 \u043b\u0443\u0447 \u043d\u0438 \u0441 \u0447\u0435\u043c \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0451\u043a\u0441\u044f, \u0438 &#8212; 1, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0451\u043a\u0441\u044f.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">hits += hit;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435, \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0446\u0438\u043a\u043b\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 <strong>ao<\/strong>.<\/p>\n<pre><code class=\"cpp\">ao = 1.0 - hits \/ samples;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, float strength) {    normal n_vector = N;    point uv = point(0.0);    getattribute(\"geom:uv\", uv);        color normal_color = texture(normal_path, uv.x, uv.y);    color vector_color = 2.0 * (normal_color - color(0.5));        vector tangent;    float tangent_sign;    getattribute(\"geom:tangent\", tangent);    getattribute(\"geom:tangent_sign\", tangent_sign);    vector bitangent = tangent_sign * cross(N, tangent);        n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * N);    n_vector = normalize(N + (n_vector - N) * max(strength, 0.0));        return n_vector;}shader ambient_occlusion(    int only_local = 0,    float bias = 0.01,    int samples = 16,    float max_distance = 1.0,    output float ao = 0.0) {        N = get_normal(\"SciFiHelmet_Normal.png\", 1.0);    float sign_z = select(-1, 1, N.z &gt;= 0.0);    float a = -1.0 \/ (sign_z + N.z);    vector bitangent = vector(a * N.x * N.y, sign_z + a * N.y * N.y, -N.y);    vector tangent = vector(1.0 + a * sign_z * N.x * N.x, sign_z * bitangent.x, -sign_z * N.x);        float hits = 0;    for(int i = 0; i &lt; samples; i++) {        point random = hashnoise(P, float(i));        float phi = random.x * M_2PI;        float sin_phi, cos_phi;        sincos(phi, sin_phi, cos_phi);                float z = random.y;        float sin_theta = sqrt(1.0 - z*z);                float x = sin_theta * cos_phi;        float y = sin_theta * sin_phi;        vector direction = x * tangent + y * bitangent + z * N;                int hit = select(            trace(P, direction, \"mindist\", bias, \"maxdist\", max_distance, \"traceset\", \"\"),            trace(P, direction, \"mindist\", bias, \"maxdist\", max_distance, \"traceset\", \"__only_local__\"),            only_local);        hits += hit;    }        ao = 1.0 - hits \/ samples;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/693\/172\/51a\/69317251a7c98b43d3244094863fb089.png\" width=\"1520\" height=\"520\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/693\/172\/51a\/69317251a7c98b43d3244094863fb089.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/693\/172\/51a\/69317251a7c98b43d3244094863fb089.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>3. Line Art<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0448\u044d\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0438\u0441\u0443\u0435\u0442 \u0442\u043e\u043d\u043a\u0443\u044e \u043e\u0431\u0432\u043e\u0434\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430: \u0435\u0433\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0430\u0434\u044b \u0432\u044b\u0441\u043e\u0442 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0435 \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0422\u0430\u043a \u0434\u0435\u043b\u0430\u044e\u0442 \u0432 \u043c\u0443\u043b\u044c\u0442\u044f\u0448\u043d\u043e\u043c \u0448\u044d\u0439\u0434\u0438\u043d\u0433\u0435.<\/p>\n<p>\u0428\u044d\u0439\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u044c, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0438, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0440\u0435\u0437\u043a\u0443\u044e \u0441\u043c\u0435\u043d\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0442\u0430\u043a. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0432 \u043d\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u043b\u0443\u0447\u0435\u0439 \u0443\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 &#8212; \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u0430 \u0442\u043e\u0447\u043a\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0451 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f, \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u043a\u0440\u0430\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u0440\u0430\u0448\u0435\u043d\u0430 \u0447\u0451\u0440\u043d\u044b\u043c. \u0422\u0438\u043f\u0430 \u0447\u0430\u0441\u0442\u044c \u043b\u0438\u043d\u0438\u0438. \u0418\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0432 \u0442\u043e\u0447\u043a\u0435, \u043a\u0443\u0434\u0430 \u043f\u043e\u043f\u0430\u043b \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043b\u0443\u0447, \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0441\u0430\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 &#8212; \u0442\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u0440\u0430\u0448\u0435\u043d\u0430 \u0447\u0451\u0440\u043d\u044b\u043c. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0437\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u044b\u0432\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043b\u0443\u0447\u0435\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u043b\u0438 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043b\u0438\u043d\u0438\u044f \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439: \u0434\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 &#8212; \u043d\u0435 \u043b\u0438\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e &#8212; \u043b\u0438\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u044d\u0439\u0434\u0435\u0440.<\/p>\n<pre><code class=\"cpp\">shader line_art(    int samples = 8,    float size = 1.0,    float angle_threshold = 30.0,    float depth_threshold = 0.1,    float clip_threshold = 0.9,    output float value = 1.0) {        }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><code>samples<\/code> &#8212; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0438\u0434\u0430\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0447\u043a\u0438. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0442\u0435\u043c \u0442\u043e\u0447\u043d\u0435\u0435 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<\/li>\n<li>\n<p><code>size<\/code> &#8212; \u0432 \u043a\u0430\u043a\u043e\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u0438\u0434\u0430\u0442\u044c \u044d\u0442\u0438 \u043b\u0443\u0447\u0438. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0442\u0435\u043c \u0442\u043e\u043b\u0449\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>angle_threshold<\/code> &#8212; \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u044c \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p><code>depth_threshold<\/code> &#8212; \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u044c \u043a\u0440\u0430\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>clip_threshold<\/code> &#8212; \u043a\u0430\u043a\u0430\u044f \u0434\u043e\u043b\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043a\u0430 \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0447\u0430\u0441\u0442\u044c\u044e \u043b\u0438\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>value<\/code> &#8212; \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u0430\u0441\u043a\u0438: <strong>1.0<\/strong> &#8212; \u0447\u0438\u0441\u0442\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, <strong>0.0<\/strong> &#8212; \u043b\u0438\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0433\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0417\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e. \u041d\u0443, \u043d\u0443\u0436\u0435\u043d \u0431\u0430\u0437\u0438\u0441 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u044b (\u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u0430) \u0447\u0442\u043e\u0431\u044b \u0432 \u043d\u0451\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438, \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443, \u043d\u0443 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043b\u0443\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u043b\u0438 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442.<\/p>\n<pre><code class=\"cpp\">point camera_position = transform(\"camera\", \"world\", point(0.0, 0.0, 0.0));vector basis_right = normalize(transform(\"camera\", \"world\", vector(1.0, 0.0, 0.0)));vector basis_up = normalize(transform(\"camera\", \"world\", vector(0.0, 1.0, 0.0)));float to_point_distance = distance(P, camera_position);float sample_radius = size * to_point_distance * 0.01;float normal_threshold = cos(radians(angle_threshold));int surface_hits = 0;int crease_hits = 0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0442\u0443\u0442 \u0447\u0442\u043e, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u043a\u0443\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b. <code>camera_position<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u043d\u0434\u0435\u0440. \u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 OSL \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u0441\u0442\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>transform <\/code>\u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0430\u043a\u0438\u0435: <strong>common<\/strong>, <strong>object<\/strong>, <strong>world<\/strong>, <strong>camera<\/strong>, <strong>screen<\/strong>, <strong>NDC<\/strong>, <strong>raster<\/strong>. \u041f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 common, NDC \u0438 raster. Common &#8212; \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 (\u0432\u0440\u043e\u0434\u0435 <code>P<\/code>, <code>N<\/code>, <code>I<\/code>). \u042d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code class=\"cpp\">P = transform (\"common\", \"world\", P);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>NDC &#8212; \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442\u0430\u044f \u043d\u0430 \u0432\u0435\u0441\u044c \u043a\u0430\u0434\u0440 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u041b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <strong>(0, 0)<\/strong>, \u043d\u0438\u0436\u043d\u0438\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 &#8212; <strong>(1, 1)<\/strong>.<\/p>\n<p>raster &#8212; \u043f\u043e\u0445\u043e\u0436\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u0439 \u043e\u0434\u0438\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0448\u0430\u0433 <strong>1<\/strong>. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <strong>(0, 0)<\/strong>, \u0430 \u043d\u0438\u0436\u043d\u0438\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 &#8212; <strong>(width, height)<\/strong>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>camera_position<\/code>. \u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>camera <\/code>\u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>world<\/code>, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0435\u0451 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0422\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435, <code>basis_right<\/code> \u0438 <code>basis_up<\/code> \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0411\u0435\u0440\u0435\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>camera <\/code>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u0432\u0435\u0440\u0445, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c <code>to_point_distance<\/code> &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e \u0442\u043e\u0447\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u043e\u0439 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u0430 \u043a\u0440\u0430\u0451\u0432.<\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c <code>sample_radius<\/code> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b <code>to_point_distance<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 <code>normal_threshold<\/code> &#8212; \u044d\u0442\u043e \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0446\u0438\u043a\u043b.<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; samples; i++) {    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430. \u042d\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c<\/p>\n<pre><code class=\"cpp\">vector rnd = hashnoise(P, i);float r_surface = sample_radius * sqrt(rnd.x);float theta_surface = 2.0 * M_PI * rnd.y;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u0440\u044f\u0434\u043e\u043c \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">point sample_surface = P + basis_right * r_surface * cos(theta_surface) + basis_up * r_surface * sin(theta_surface);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f (\u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0430 <code>sample_surface <\/code>\u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439).<\/p>\n<pre><code class=\"cpp\">vector dir_surface = normalize(sample_surface - camera_position);float expected_distance = distance(camera_position, sample_surface);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">if (trace(camera_position, dir_surface, \"mindist\", 0.001, \"traceset\", \"__only_local__\")) {    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043b\u0443\u0447 \u0443\u0448\u0435\u043b \u0432 \u043f\u0443\u0441\u0442\u043e\u0442\u0443, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0443\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>surface_hits <\/code>\u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0430\u0448\u043b\u043e\u0441\u044c, \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0433\u0434\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441  \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>getmessage<\/code>. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0438\u0448\u0435\u043c <code>\"trace\"<\/code>, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0432\u0437\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>\u201chitdist\u201d<\/code> (\u044d\u0442\u043e \u043e\u043d \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f), \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043a\u0443\u0434\u0430 \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">float hit_distance = 0.0;getmessage(\"trace\", \"hitdist\", hit_distance);if (hit_distance &lt; expected_distance + depth_threshold) {    surface_hits++;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c <code>surface_hits <\/code>\u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u044d\u043c\u043f\u043b\u0430 \u043d\u0435 \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u043f\u043b\u044e\u0441 \u043d\u0435\u043a\u0438\u0439 \u0434\u043e\u043f\u0443\u0441\u043a. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0438\u0436\u0435, \u0434\u0430\u0436\u0435 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e, \u0438 \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u044d\u043c\u043f\u043b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0430\u043c\u0435\u0440\u0435, \u0442\u043e \u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0431\u043b\u0438\u0437\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0447\u0442\u043e \u043d\u044b\u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f, \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0432\u0435\u0434\u0435\u043d\u0430 \u043b\u0438\u043d\u0438\u0439. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u0430\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043b\u0438\u043d\u0438\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0443\u0430\u0437\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0448\u044d\u0439\u0434\u0435\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">int is_boundary = (float(surface_hits) \/ float(samples)) &lt; clip_threshold;value = is_boundary ? 0.0 : 1.0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3a7\/04d\/989\/3a704d9894ff4746ebdadc14a6ae73b4.png\" width=\"1570\" height=\"524\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3a7\/04d\/989\/3a704d9894ff4746ebdadc14a6ae73b4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3a7\/04d\/989\/3a704d9894ff4746ebdadc14a6ae73b4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442 \u0432\u0438\u0434\u043d\u043e. \u041f\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0447\u0435\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f, \u043d\u0430 \u043a\u0440\u0430\u044f\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0432\u0438\u0441\u0430\u044e\u0442 \u043d\u0430\u0434 \u0441\u043e\u0431\u043e\u0439 &#8212; \u0442\u043e\u0436\u0435 \u0432\u0438\u0434\u043d\u043e. \u041a\u0442\u043e-\u0442\u043e \u0441\u043a\u0430\u0436\u0435\u0442 &#8212; \u043d\u0443 \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0436\u0435! \u0418 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u0432. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u0430\u0434\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0434\u0438\u0443\u0441 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0441\u044d\u043c\u043f\u043b\u043e\u0432. \u0420\u0435\u043d\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u043b\u0433\u0438\u043c, \u043d\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a68\/01d\/fae\/a6801dfae935863db5ede7ab812ce434.png\" width=\"1574\" height=\"528\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a68\/01d\/fae\/a6801dfae935863db5ede7ab812ce434.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a68\/01d\/fae\/a6801dfae935863db5ede7ab812ce434.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u0443, \u0431\u043e\u043b\u0435\u0435-\u0438\u043b\u0438-\u043c\u0435\u043d\u0435\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u0441\u044d\u043c\u043f\u043b\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0434\u0438\u0443\u0441. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0431\u0440\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0434\u0438\u0443\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043b\u0438\u043d\u0438\u0439, \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0442\u043e\u043b\u0449\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445.<\/p>\n<pre><code class=\"cpp\">float r_crease = (sample_radius * 0.5) * sqrt(rnd.x);float theta_crease = 2.0 * M_PI * rnd.y;point sample_crease = P + basis_right * r_crease * cos(theta_crease) + basis_up * r_crease * sin(theta_crease);vector dir_crease = normalize(sample_crease - camera_position);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<pre><code class=\"cpp\">if (trace(camera_position, dir_crease, \"mindist\", 0.001, \"traceset\", \"__only_local__\")) {    vector sample_normal;    getmessage(\"trace\", \"N\", sample_normal);    if (dot(normalize(N), normalize(sample_normal)) &lt; normal_threshold) {        crease_hits++;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>getmessage <\/code>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0432 \u0442\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0435\u0441\u0442\u044c, \u0430 \u043e\u043d\u0430 \u0435\u0441\u0442\u044c, \u0432\u0435\u0434\u044c <code>trace <\/code>\u0432\u0435\u0440\u043d\u0443\u043b <strong>1<\/strong>), \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <code>normal_threshold<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u0443\u0433\u043e\u043b <code>angle_threshold<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u043e \u0437\u0430\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430.<\/p>\n<pre><code class=\"cpp\">int is_crease = ((float(crease_hits)  \/ float(samples)) &gt;= (1.0 - clip_threshold));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435<\/p>\n<pre><code class=\"cpp\">value = (is_boundary || is_crease) ? 0.0 : 1.0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eef\/0b7\/21c\/eef0b721c91f2121c299d504075d488e.png\" width=\"1574\" height=\"498\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eef\/0b7\/21c\/eef0b721c91f2121c299d504075d488e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eef\/0b7\/21c\/eef0b721c91f2121c299d504075d488e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0447\u0451\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0430 \u043e\u0442 \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u043e \u043b\u044e\u0431\u044b\u043c uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c. \u041d\u0430\u043c \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u0447\u043a\u0435, \u0433\u0434\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440, \u043d\u043e \u0438 \u0432 \u0442\u043e\u0447\u043a\u0430\u0445 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043c \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043f\u043e\u0434 \u043e\u0431\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, normal input_n, point uv, vector tangent, float tangent_sign) {    normal n_vector = input_n;        color normal_color = texture(normal_path, uv.x, uv.y);    color vector_color = 2.0 * (normal_color - color(0.5));    vector bitangent = tangent_sign * cross(input_n, tangent);        n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * input_n);        return n_vector;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u0432\u0441\u0451 \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u043e \u0434\u043e \u043d\u0430\u0441.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u041f\u0435\u0440\u0432\u043e\u0435 &#8212; \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u043a\u043b\u043e\u043c \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<pre><code class=\"cpp\">point uv;vector tangent;float tangent_sign;getattribute(\"geom:uv\", uv);getattribute(\"geom:tangent\", tangent);getattribute(\"geom:tangent_sign\", tangent_sign);N = get_normal(\"SciFiHelmet_Normal.png\", N, uv, tangent, tangent_sign);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 \u0442\u043e\u0447\u043a\u0435 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">normal sample_normal;point sample_uv;vector sample_tangent;float sample_tangent_sight;getmessage(\"trace\", \"N\", sample_normal);getmessage(\"trace\", \"geom:uv\", sample_uv);getmessage(\"trace\", \"geom:tangent\", sample_tangent);getmessage(\"trace\", \"geom:tangent_sign\", sample_tangent_sight);sample_normal = get_normal(\"SciFiHelmet_Normal.png\", sample_normal, sample_uv, sample_tangent, sample_tangent_sight);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/534\/484\/736\/5344847361f704325908a76ab08ab6da.png\" width=\"1578\" height=\"526\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/534\/484\/736\/5344847361f704325908a76ab08ab6da.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/534\/484\/736\/5344847361f704325908a76ab08ab6da.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eeb\/403\/b2b\/eeb403b2b3463c2c6ff0dbe7769561a0.png\" width=\"1572\" height=\"532\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eeb\/403\/b2b\/eeb403b2b3463c2c6ff0dbe7769561a0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eeb\/403\/b2b\/eeb403b2b3463c2c6ff0dbe7769561a0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0448\u044d\u0439\u0434\u0435\u0440.<\/p>\n<pre><code class=\"cpp\">normal get_normal(string normal_path, normal input_n, point uv, vector tangent, float tangent_sign) {    normal n_vector = input_n;        color normal_color = texture(normal_path, uv.x, uv.y);    color vector_color = 2.0 * (normal_color - color(0.5));    vector bitangent = tangent_sign * cross(input_n, tangent);        n_vector = normalize(vector_color[0] * tangent + vector_color[1] * bitangent + vector_color[2] * input_n);        return n_vector;}shader line_art(    int samples = 8,    float size = 1.0,    float angle_threshold = 30.0,    float depth_threshold = 0.1,    float clip_threshold = 0.9,    output float value = 1.0) {        point camera_position = transform(\"camera\", \"world\", point(0.0, 0.0, 0.0));    vector basis_right = normalize(transform(\"camera\", \"world\", vector(1.0, 0.0, 0.0)));    vector basis_up = normalize(transform(\"camera\", \"world\", vector(0.0, 1.0, 0.0)));    float to_point_distance = distance(P, camera_position);    float sample_radius = size * to_point_distance * 0.01;    float normal_threshold = cos(radians(angle_threshold));        point uv;    vector tangent;    float tangent_sign;    getattribute(\"geom:uv\", uv);    getattribute(\"geom:tangent\", tangent);    getattribute(\"geom:tangent_sign\", tangent_sign);    N = get_normal(\"SciFiHelmet_Normal.png\", N, uv, tangent, tangent_sign);    int surface_hits = 0;    int crease_hits = 0;        for (int i = 0; i &lt; samples; i++) {        vector rnd = hashnoise(P, i);        float r_surface = sample_radius * sqrt(rnd.x);        float theta_surface = 2.0 * M_PI * rnd.y;                point sample_surface = P + basis_right * r_surface * cos(theta_surface) + basis_up * r_surface * sin(theta_surface);        vector dir_surface = normalize(sample_surface - camera_position);        float expected_distance = distance(camera_position, sample_surface);                if (trace(camera_position, dir_surface, \"mindist\", 0.001, \"traceset\", \"__only_local__\")) {            float hit_distance = 0.0;            getmessage(\"trace\", \"hitdist\", hit_distance);            if (hit_distance &lt; expected_distance + depth_threshold) {                surface_hits++;            }        }                float r_crease = (sample_radius * 0.5) * sqrt(rnd.x);        float theta_crease = 2.0 * M_PI * rnd.y;        point sample_crease = P + basis_right * r_crease * cos(theta_crease) + basis_up * r_crease * sin(theta_crease);        vector dir_crease = normalize(sample_crease - camera_position);        if (trace(camera_position, dir_crease, \"mindist\", 0.001, \"traceset\", \"__only_local__\")) {            normal sample_normal;            point sample_uv;            vector sample_tangent;            float sample_tangent_sight;            getmessage(\"trace\", \"N\", sample_normal);            getmessage(\"trace\", \"geom:uv\", sample_uv);            getmessage(\"trace\", \"geom:tangent\", sample_tangent);            getmessage(\"trace\", \"geom:tangent_sign\", sample_tangent_sight);            sample_normal = get_normal(\"SciFiHelmet_Normal.png\", sample_normal, sample_uv, sample_tangent, sample_tangent_sight);            if (dot(normalize(N), normalize(sample_normal)) &lt; normal_threshold) {                crease_hits++;            }        }    }        int is_boundary = (float(surface_hits) \/ float(samples)) &lt; clip_threshold;    int is_crease = ((float(crease_hits)  \/ float(samples)) &gt;= (1.0 - clip_threshold));    value = (is_boundary || is_crease) ? 0.0 : 1.0;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>4. Voronoi diagram<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0448\u044d\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0412\u043e\u0440\u043e\u043d\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#8212; \u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D0%BE%D0%B3%D0%BE\" rel=\"noopener nofollow\">\u0432\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0430<\/a>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u043d\u043e \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435.<\/p>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435, \u043a\u0440\u043e\u043c\u0435 \u0448\u0443\u0442\u043e\u043a, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0435\u0439\u0434\u0435\u0440.<\/p>\n<pre><code class=\"cpp\">shader voronoi(    float size = 1.0,    float jitter = 1.0,        output float value = 0.0) {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<ul>\n<li>\n<p><code>size<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431<\/p>\n<\/li>\n<li>\n<p><code>jitter<\/code> &#8212; \u0437\u0430 \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u0438\u0434\u0435\u044e \u0448\u044d\u0439\u0434\u0435\u0440\u0430. \u0420\u0430\u0437\u043e\u0431\u044c\u0451\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0430 \u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 <strong>1<\/strong>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440, \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0430, \u0438 \u0435\u0449\u0451 \u043d\u0430 <strong>26<\/strong> \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0441 \u043d\u0435\u0439. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u044f\u0447\u0435\u0435\u043a \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 &#8212; \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0435\u0451, \u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0446\u0435\u043d\u0442\u0440). \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0434\u0432\u0430 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u044d\u0442\u0438\u0445 \u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 <strong>27<\/strong> \u044f\u0447\u0435\u0435\u043a. \u0422\u043e\u0433\u0434\u0430 \u043b\u0438\u043d\u0438\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b &#8212; \u044d\u0442\u043e \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. \u0412\u043e\u0442 \u0438\u0445 \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431<\/p>\n<pre><code class=\"cpp\">point p_scale = P \/ max(0.000001, size);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u043f\u043e\u043f\u0430\u043b\u0430 \u044d\u0442\u0430 \u043f\u0440\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/p>\n<pre><code class=\"cpp\">point p_index = floor(p_scale);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>p_index<\/code> \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0438\u0436\u043d\u044f\u044f \u0443\u0433\u043b\u043e\u0432\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0443 <code>p_scale<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u0434\u0430\u0451\u043c \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">float f1 = 5.0;float f2 = 5.0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u044b \u0432\u043e\u0442 \u044d\u0442\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <strong>5.0<\/strong>, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043c\u0435\u043d\u044c\u0448\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u043f\u043e \u0432\u0441\u0435\u043c <strong>27<\/strong>-\u043c\u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c.<\/p>\n<pre><code class=\"cpp\">for (int i = -1; i &lt;= 1; i++) {    for (int j = -1; j &lt;= 1; j++) {        for (int k = -1; k &lt;= 1; k++) {        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0433\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">point cell_index = p_index + vector(i, j, k);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0448\u0443\u043c\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 OSL, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043a\u0430\u043a 3d-\u0432\u0435\u043a\u0442\u043e\u0440) \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">vector cell_offset = noise(\"cell\", cell_index);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0434\u0430, \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0428\u0443\u043c \u0442\u0438\u043f\u0430 <code>cell<\/code> \u0434\u043b\u044f \u043f\u043e\u0434\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 <strong>1<\/strong>. \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438, \u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u043d\u0435\u0451 \u043e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">point cell_position = cell_index + jitter * cell_offset;float distance = distance(cell_position, p_scale);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u044d\u0442\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445<\/p>\n<pre><code class=\"cpp\">if (distance &lt; f1) {    f2 = f1;    f1 = distance;} else if (distance &lt; f2) {    f2 = distance;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0448\u044d\u0439\u0434\u0435\u0440\u0430\u043c, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u043c\u043e\u0440\u0449\u0430\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 &#8212; \u043d\u0443 \u0440\u0430\u0437\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 <code>if\/else<\/code> \u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u0430\u0434\u043e \u0432\u0435\u0434\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435, \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e.<\/p>\n<pre><code class=\"cpp\">float new_f1 = step(distance, f1);float new_f2 = mix(step(distance, f2), 0.0, new_f1);f2 = mix(f2, f1, new_f1);f1 = mix(f1, distance, new_f1);f2 = mix(f2, distance, new_f2);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0442, \u043d\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e, \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0438 \u0442\u043e\u0442, \u0447\u0442\u043e \u0434\u043e \u043d\u0435\u0433\u043e, \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u043c\u044b\u0441\u043b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>step(a, b)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <strong>1<\/strong>, \u0435\u0441\u043b\u0438 <code>a &lt;= b<\/code>, \u0438 <strong>0<\/strong> &#8212; \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u0410 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>mix (a, b, c)<\/code> \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 <code>a<\/code> \u0438 <code>b<\/code> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>c<\/code>. \u041d\u0443 \u0432\u043e\u0442, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u0434\u0435\u0442\u044c, \u0432\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0438 \u0432\u043e\u043b\u043e\u0441\u044b \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u0435 \u0440\u0432\u0430\u0442\u044c \u043e\u0442 \u0434\u043e\u0441\u0430\u0434\u044b, \u0447\u0442\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0443\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c. \u0413\u043e\u0432\u043e\u0440\u044e \u0436\u0435, \u043d\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0435\u0446, \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0446\u0438\u043a\u043b\u043e\u0432, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">value = 1.0 - smoothstep(0.0, 0.01, f2 - f1);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eef\/88d\/f2c\/eef88df2c500cab68424752b192a90ab.png\" width=\"1566\" height=\"522\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eef\/88d\/f2c\/eef88df2c500cab68424752b192a90ab.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eef\/88d\/f2c\/eef88df2c500cab68424752b192a90ab.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u043e\u043b\u0449\u0438\u043d\u0443 \u0438 \u043c\u044f\u0433\u043a\u043e\u0441\u0442\u044c \u043b\u0438\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>smoothstep<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0432\u0435\u043d <strong>0.01<\/strong>.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0448\u044d\u0439\u0434\u0435\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">shader voronoi(    float size = 1.0,    float jitter = 1.0,        output float value = 0.0) {        point p_scale = P \/ max(0.000001, size);    point p_index = floor(p_scale);    float f1 = 5.0;    float f2 = 5.0;    for( int i = -1; i &lt;= 1; i++ ) {        for( int j = -1; j &lt;= 1; j++ ) {            for( int k = -1; k &lt;= 1; k++ ) {                point cell_index = p_index + vector(i, j, k);                vector cell_offset = noise(\"cell\", cell_index);                point cell_position = cell_index + jitter * cell_offset;                float distance = distance(cell_position, p_scale);                if (distance &lt; f1) {                    f2 = f1;                    f1 = distance;                 }                 else if (distance &lt; f2) {                    f2 = distance;                }            }        }    }        value = 1.0 - smoothstep(0.0, 0.01, f2 - f1);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1080470\/\">https:\/\/habr.com\/ru\/articles\/1080470\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u043d\u044f\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0440\u043e\u0432\u043d\u043e \u0447\u0435\u0442\u044b\u0440\u0435) \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u0440\u044f\u043c\u043e \u0432\u043e\u0442 \u0442\u0430\u043a, \u043f\u0438\u0448\u0435\u043c &#8212; \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0437\u043d\u0430\u0447\u0438\u0442. \u0418 \u0435\u0449\u0451, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0434\u0435\u043b\u0443, \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0439. \u0420\u0435\u0434\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043a\u043e\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0448\u044c. \u041d\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u0442\u0438\u0445 \u0432\u0430\u0448\u0438\u0445 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u043e\u0432 \u043d\u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u041d\u0438 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0443\u0440\u044b, \u043d\u0438 \u0434\u043b\u044f, \u043f\u0440\u043e\u0441\u0442\u0438-\u0433\u043e\u0441\u043f\u043e\u0434\u0438, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430\u0448\u0438 &#8212; \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0435. \u0410 \u043d\u0435 \u0431\u0435\u0437\u0434\u0443\u0448\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u0443, \u0443\u0436 \u043a\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c. \u0427\u0442\u043e-\u0442\u043e \u0443 \u043c\u0435\u043d\u044f AI-\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f&#8230;0. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 OSLOSL &#8212; \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432. \u041d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432, \u0430 \u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u043b\u0443\u0447\u0435\u0439.\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0431\u044b\u043b\u043e, \u0432 \u043a\u0430\u043a\u043e\u043c \u0442\u0430\u043c \u043c\u0435\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0430, \u0441\u043a\u0432\u043e\u0437\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447, \u0438 \u0438\u0449\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0441\u0446\u0435\u043d\u044b. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0446\u0432\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u0410 \u0432\u043e\u0442 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Lambert, \u0442\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u043b\u0443\u0447\u0438 \u043f\u043e \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435 \u044d\u0442\u043e \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e \u0437\u0430\u043a\u043e\u043d\u0443 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0438, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f, \u0441 \u043a\u0435\u043c \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0432\u0435\u0442 \u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439, \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0443 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u0441\u0451 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.\u042d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043b\u0443\u0447\u0435\u0439. \u0422\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445) \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a \u0443\u0436 \u043f\u0440\u044f\u043c\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u043d\u0435 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0441\u0446\u0435\u043d\u0443, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435. \u041d\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u043e\u0439 &#8212; \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043b\u0443\u0447\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u043b\u0443\u0447\u0438 \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0412 \u043a\u0430\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0442\u0443\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b, \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0410 \u0432\u043e\u0442 \u0432 \u044d\u0442\u043e \u0432\u043e\u0442 \u043c\u0435\u0441\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f closure. \u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u00ab\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u00bb, \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f\u043c\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044d\u0442\u043e \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c. \u0418 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u043d\u0435 \u0446\u0432\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 (\u043a\u0430\u043a \u0432 glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445), \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 closure. \u0410 \u0440\u0435\u043d\u0434\u0435\u0440 \u0443\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u043e\u043d \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u0437 \u0448\u044d\u0439\u0434\u0435\u0440\u0430, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, osl-\u0448\u044d\u0439\u0434\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0446\u0432\u0435\u0442, \u043d\u043e \u044d\u0442\u043e \u0442\u0430\u043a, \u0434\u043b\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439.\u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e \u0440\u0435\u043d\u0434\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 \u0448\u044d\u0439\u0434\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e \u043e\u043d \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442. \u0412\u043e\u043e\u0431\u0449\u0435, \u043a\u0430\u043a\u0438\u0435 closure \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f &#8212; \u044d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u0414\u0430, \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 (\u043d\u0443 \u0442\u0430\u043c emission(), diffuse(N) \u0438 \u043f\u0440\u043e\u0447\u0435\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f \u0440\u0435\u043d\u0434\u0435\u0440, \u043d\u043e \u0434\u0430\u0436\u0435 \u0438 \u043e\u043d\u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 closure, \u0438 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0438\u0445 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e.\u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f\u0437\u044b\u043a osl-\u0448\u044d\u0439\u0434\u0435\u0440\u043e\u0432 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 C: \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u0442\u043e\u0447\u043a\u0438-\u0441-\u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438, for-\u044b \u0438 if-\u044b. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. \u0418 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 \u0432\u0441\u044f\u043a\u0438\u0445 \u0448\u044d\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043a. \u041d\u0443, \u043c\u043e\u0436\u0435\u0442 \u043a\u0442\u043e \u0441\u043b\u044b\u0445\u0430\u043b, \u0447\u0442\u043e, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432  glsl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c if\/else. \u042d\u0442\u043e, \u0434\u0435\u0441\u043a\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435, \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u043e\u043b\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u043e. \u0410 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e. \u0417\u0434\u043e\u0440\u043e\u0432\u043e.\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041d\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0441\u043a\u0443\u0447\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b. \u0410 \u0441\u0440\u0430\u0437\u0443 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438 \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445. \u0410, \u043d\u0443 \u0434\u0430, \u0433\u0434\u0435 \u044d\u0442\u0438 \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c. \u0412 Blender, \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0435 Cycles. \u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u044b (\u0442\u0438\u043f\u0430 Arnold, RenderMan) \u0442\u043e\u0436\u0435 \u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442, \u043d\u043e \u0433\u0434\u0435 \u044d\u0442\u043e\u0442 Arnold? \u0432 \u041a\u0430\u043b\u0438\u0444\u043e\u0440\u043d\u0438\u0438? \u0410 Blender \u0441 Cycles \u0432\u043e\u0442 &#8212; \u0437\u0434\u0435\u0441\u044c \u0440\u044f\u0434\u043e\u043c, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0425\u043e\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0448\u0443\u0442\u043a\u0438 &#8212; \u044d\u0442\u043e \u043c\u043e\u0432\u0435\u0442\u043e\u043d, \u043d\u043e \u0435\u0441\u043b\u0438 \u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u0442\u043e \u0440\u0435\u043d\u0434\u0435\u0440 Arnold \u043d\u0430\u0437\u0432\u0430\u043d \u0432 \u0447\u0435\u0441\u0442\u044c \u0410\u0440\u043d\u043e\u043b\u044c\u0434\u0430 \u0428\u0432\u0430\u0440\u0446\u043d\u0435\u0433\u0433\u0435\u0440\u0430. \u0418 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430.\u041d\u043e \u044d\u0442\u043e \u043c\u044b \u043e\u0442\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c. \u041d\u0443 \u0442\u0430\u043a \u0432\u043e\u0442, \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c osl-\u0448\u044d\u0439\u0434\u0435\u0440\u044b \u0432 Blender \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c Cycles. \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u043a\u0438:\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u0448\u044d\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e GLTF\u042d\u0444\u0444\u0435\u043a\u0442 Ambient Occlusion\u0428\u044d\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u043d\u043e\u0439 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0412\u043e\u0440\u043e\u043d\u043e\u0433\u043e\u042f \u0434\u0443\u043c\u0430\u044e \u0445\u0432\u0430\u0442\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438. \u0425\u043e\u0442\u044f \u043d\u0435 \u0432\u0441\u0435. \u0412 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445. \u0414\u0430-\u0434\u0430, \u0430 osl-\u0448\u044d\u0439\u0434\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u043b\u044e\u0431\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0448\u044d\u0439\u0434\u0435\u0440\u044b \u043e\u0431\u044a\u0451\u043c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 (\u0442\u0438\u043f\u0430 \u0434\u044b\u043c\u0430 \u0438 \u043e\u0433\u043d\u044f). \u041a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u0435\u043c (\u0432\u0440\u043e\u0434\u0435 \u0442\u0438\u043f\u043e\u0432 \u0448\u0443\u043c\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u043a\u043e\u0441\u043d\u0451\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u0441\u043a\u043e\u043b\u044c\u0437\u044c. \u041d\u043e \u043f\u0440\u043e \u0432\u0441\u0451 \u044d\u0442\u043e, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437.1. GLTF Standard Surface\u0412 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u044d\u0439\u0434\u0435\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u0448\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e shader, \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 gltf_surface \u0438 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 (\u0438 \u043e\u043d \u0436\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 output closure color BSDF = 0.0. \u0418 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445.shader gltf_surface(    output closure color BSDF = 0.0) {}\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 gltf-\u0430\u0441\u0441\u0435\u0442\u043e\u0432. \u0412\u043e\u0442 \u044d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0444\u0443\u0442\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0448\u043b\u0435\u043c\u0430. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0442\u0430\u043f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0440\u0442 \u043d\u043e\u0434\u044b Script \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043a \u043f\u043e\u0440\u0442\u0443 Surface \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u0435\u043c\u0430.\u0412\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0435, \u043d\u0443 \u0442\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0448\u044d\u0439\u0434\u0435\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u042d\u0442\u043e \u0446\u0432\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 base_color, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 metallic \u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u0438 roughness.shader gltf_surface(    color base_color = color(0.8),    float metallic = 0.0,    float roughness = 0.0,    output closure color BSDF = 0.0) {    }\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c \u0448\u044d\u0439\u0434\u0435\u0440. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 metallic \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0438 \u0446\u0432\u0435\u0442 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u043acolor m_color = mix(color(0.04), base_color, metallic);\u0414\u043b\u044f \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0442\u0430\u043acolor d_color = base_color * (1.0 &#8212; metallic);\u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430. \u0410 \u0432\u043e\u0442 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0443\u0442\u044c \u0445\u0438\u0442\u0440\u0435\u0435. \u0414\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u043e\u043d \u043d\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0439. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0445\u043e\u0442\u044c \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c, \u0434\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0439 \u043c\u0438\u0440, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043b\u0438\u043a. \u0414\u0430\u0436\u0435 \u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0433\u043e \u043e\u043d \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u0439.\u0414\u0430\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0443\u0442 &#8212; \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 closure diffuse, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e \u0432 \u0442\u043e\u0447\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u044d\u0439\u0434\u0435\u0440.closure color diffuse_component = d_color * diffuse(N);\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e closure microfacet. \u0415\u043c\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0438\u043f (ggx \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435), \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c (\u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043e\u0441\u0435\u0439), \u0438  \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 0 &#8212; \u044d\u0442\u043e \u0444\u043b\u0430\u0433 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0436\u0438\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0430 \u043d\u0435 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0439 (\u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c 1).closure color specular_component = m_color * microfacet(&#171;ggx&#187;, N, roughness, roughness, 0);\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 closure, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u044d\u0442\u0438 \u0434\u0432\u0430 closure.BSDF = diffuse_component + specular_component;\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0414\u0435\u043b\u0430\u0435\u043c metallic = 1, \u0438 \u0434\u043b\u044f roughness = 0 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0435\u0440\u043a\u0430\u043b\u043e, \u0430 \u0434\u043b\u044f roughness = 0.05, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a\u043e\u0435.\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.shader gltf_surface(    color base_color = color(0.8),    float metallic = 0.0,    float roughness = 0.0,    output closure color BSDF = 0.0) {        color m_color = mix(color(0.04), base_color, metallic);    color d_color = base_color * (1.0 &#8212; metallic);        closure color diffuse_component = d_color * diffuse(N);    closure color specular_component = m_color * microfacet(&#171;ggx&#187;, N, roughness, roughness, 0);        BSDF = diffuse_component + specular_component;}\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043a\u0443\u0447\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u0423\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u044d\u0439\u0434\u0435\u0440\u0430 (\u043a\u0440\u043e\u043c\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e BSDF), \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0440\u0438 \u043f\u0443\u0442\u0438 \u0434\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440.string basecolor_path = &#171;SciFiHelmet_BaseColor.png&#187;,string amr_path = &#171;SciFiHelmet_MetallicRoughness.png&#187;,string normal_path = &#171;SciFiHelmet_Normal.png&#187;,\u0417\u0434\u0435\u0441\u044c, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, basecolor_path &#8212; \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044c \u0434\u043e \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, amr_path &#8212; \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044c \u0434\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u0430\u0440\u0442\u044b ambient occlusion, metallic \u0438 roughness (\u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u0430\u043a\u043e\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f gltf), \u043d\u0443 \u0438 normal_path &#8212; \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u0422\u0443\u0442 \u044f \u0441\u043e\u0437\u043d\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0436\u0443\u043b\u044c\u043d\u0438\u0447\u0430\u043b. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e gltf-\u0430\u0441\u0441\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u0430 AO \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 Metallic \u0438 Roughness. \u041d\u043e \u0443 \u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043f\u0443\u0441\u0442\u043e\u0439, \u0432\u043e\u0442 \u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0447\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u0443\u0442\u044f\u043c\u0438. \u0418, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044f \u0442\u0443\u0442 \u043f\u0438\u0448\u0443 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0443\u0442\u0438, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440. OSL \u0432 Blender \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438, \u043d\u043e \u0438\u0449\u0435\u0442 \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e exe-\u0444\u0430\u0439\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u0430\u0434\u043e \u044d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0441 blender.exe. \u0414\u043b\u044f \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u043e\u0440\u043e\u0447\u0435 \u0432\u0441\u0435 \u0431\u044b\u043b\u043e.\u0425\u043e\u0440\u043e\u0448\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b getattribute, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0438\u043c\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u0441\u0442\u043e &#8212; \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.point uv = point(0.0);getattribute(&#171;geom:uv&#187;, uv);\u0412 Blender \u0434\u0430\u043d\u043d\u044b\u0435 \u043e uv-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 geom:uv. \u042d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\u0418 \u0437\u0434\u0435\u0441\u044c \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0443\u043a\u0430\u0432\u0441\u0442\u0432\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-494114","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494114","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=494114"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494114\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=494114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=494114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=494114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}