{"id":315163,"date":"2020-12-19T15:00:57","date_gmt":"2020-12-19T15:00:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315163"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315163","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Path Tracer \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0434\u043e\u0431\u0440\u043e\u043c GLSL"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041d\u0430 \u0432\u043e\u043b\u043d\u0435 \u0430\u0436\u0438\u043e\u0442\u0430\u0436\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043e\u0442 Nvidia \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 RTX, \u044f, \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044f \u0445\u0430\u0431\u0440 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u0441 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u0430\u043a \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0435\u0439, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430. &#171;\u0422\u0430\u043a \u0434\u0435\u043b\u043e \u043d\u0435 \u043f\u043e\u0439\u0434\u0435\u0442&#187; &#8212; \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f \u0438 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0434\u0430 \u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0431\u044b\u043b\u043e. \u0422\u0443\u0442 \u043a\u0430\u043a \u043a\u0441\u0442\u0430\u0442\u0438 API \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b: \u0437\u0430\u043f\u0438\u043b\u044e-\u043a\u0430 \u044f \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 path-tracer. \u0427\u0442\u043e \u0436\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e \u0432\u044b \u0434\u0443\u043c\u0430\u044e \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u043f\u0440\u0435\u0432\u044c\u044e \u043a \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rt\/y6\/mj\/rty6mj0gtamc9w9d9jl7cz99x5k.png\" width=\"1115\" height=\"1007\"><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0438<\/a> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BB%D1%83%D1%87%D0%B5%D0%B9\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043b\u0443\u0447\u0435\u0439<\/a> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u044b, \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0443\u0448\u043b\u043e \u0431\u044b \u043d\u0435\u0438\u043c\u043e\u0432\u0435\u0440\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0441\u0438\u043b\u0438\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043b\u0443\u0447\u0435\u0439, \u043f\u0440\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u0443\u0442\u0435\u0439 \u043c\u044b \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u0443\u0447\u0438 \u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 \u0441\u0446\u0435\u043d\u0443, \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441 \u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b &#171;\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0442\u044c&#187; \u0444\u043e\u0442\u043e\u043d\u0430, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430 \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f (\u0432\u0435\u0434\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u0430\u0437\u0430).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fn\/8p\/bx\/fn8pbxdjs9xhnzgxthkslofze3i.png\" alt=\"\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f\" title=\"\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f\" width=\"1129\" height=\"682\"><figcaption>\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f<\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430: \u0430 \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430? \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u043a\u0438, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0447\u0442\u043e \u043d\u0430\u0441 \u043e\u043a\u0440\u0443\u0436\u0430\u0435\u0442, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0445\u043e\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u0441\u0432\u0435\u0442\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u0444\u043e\u0442\u043e\u043d\u0430 &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u044b\u043c, \u0447\u0442\u043e \u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c. \u0422\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043b\u044e\u0431\u043e\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043b\u0443\u0447\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0432\u0441\u0435 \u0436\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0437\u0430 \u0445\u043e\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0431\u043e\u0440 \u0447\u0438\u0441\u043b\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0446\u0435\u043d\u044b &#8212; \u0434\u043b\u044f \u0433\u0440\u0443\u0431\u044b\u0445 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435\u0436\u0435\u043b\u0438 \u0434\u043b\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043b\u0438 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 (\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0434\u0432\u0443\u043c\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u0430\u043c\u0438 \u0432 \u043b\u0438\u0444\u0442\u0435 &#8212; \u0441\u0432\u0435\u0442 \u0432 \u043d\u0438\u0445 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f, \u0438 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043c\u0435\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mp\/wd\/7p\/mpwd7pnm-la5kd6b0hs-ytwn6w0.png\" alt=\"\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c\" title=\"\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c\" width=\"1280\" height=\"720\"><figcaption>\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c<\/figcaption><\/figure>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 &#8212; \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u0435, \u0438 \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043e\u043d\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442. \u0418 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D1%8C%D0%B1%D0%B5%D0%B4%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0430\u043b\u0431\u0435\u0434\u043e<\/a> (\u0434\u0438\u0444\u0444\u0443\u0437\u043d\u0430\u044f \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430), <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A8%D0%B5%D1%80%D0%BE%D1%85%D0%BE%D0%B2%D0%B0%D1%82%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c<\/a> (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e-\u0443\u0440\u043e\u0432\u043d\u0435) \u0438<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D1%82%D1%80%D0%B0%D0%B6%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\"> \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c<\/a> (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430). \u0418\u043d\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D1%80%D0%B5%D0%B4%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c<\/a> \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%BF%D1%80%D0%B5%D0%BB%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<p>\u042f \u0436\u0435 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0435\u0448\u0438\u043b \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c (reflectance) &#8212; \u043a\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u043e\u043b\u043d\u044b \u0441\u0432\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/p>\n<\/li>\n<li>\n<p>\u0428\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (roughness) &#8212; \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0438 \u0440\u0430\u0441\u0441\u0435\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 (emittance) &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u043b\u0438\u043d\u0430 \u0432\u043e\u043b\u043d\u044b \u0441\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (transparency\/opacity) &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0432\u043e\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0432\u0435\u0442\u0430 \u043a \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u043c\u0443<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0441\u0432\u0435\u0442\u0430, \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u044b\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043b\u0443\u0447\u0448\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430 GLSL<\/h2>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e (\u0438\u043b\u0438 \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e?) \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0443\u0442\u0435\u0439, \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043f\u0438\u043f\u0435\u0434\u044b \u0438 \u0441\u0444\u0435\u0440\u044b. \u0414\u043b\u044f \u043d\u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f c \u043b\u0443\u0447\u0435\u043c, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438, \u0434\u0430 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cornell_box\" rel=\"noopener noreferrer nofollow\">cornell-box<\/a>.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/76\/27\/do\/7627do35dyk3eruwr57i27uskj4.png\" alt=\"\u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 cornell box'a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430\" title=\"\u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 cornell box'a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430\" width=\"2000\" height=\"1500\"><figcaption>\u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 cornell box&#8217;a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/figcaption><\/figure>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u043c GLSL \u0448\u0435\u0439\u0434\u0435\u0440\u0435. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u0441\u0430\u043c\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u044f\u0437\u044b\u043a\u043e\u043c \u0421: \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0446\u0438\u043a\u043b\u044b, \u0438 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0447\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438 \u0434\u043b\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 &#8212; <code>vec2<\/code>, <code>vec3<\/code>, <code>mat3<\/code> \u0438 \u0442.\u0434.<\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a \u043a\u043e\u0434\u0443! \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430:<\/p>\n<pre><code>struct Material {     vec3 emmitance;     vec3 reflectance;     float roughness;     float opacity; };  struct Box {     Material material;     vec3 halfSize;     mat3 rotation;     vec3 position; };  struct Sphere {     Material material;     vec3 position;     float radius; };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u043b\u0443\u0447\u0435\u043c: \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u043b\u0443\u0447\u0430 \u0438 \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e:<\/p>\n<pre><code>bool IntersectRaySphere(vec3 origin, vec3 direction, Sphere sphere, out float fraction, out vec3 normal) {     vec3 L = origin - sphere.position;     float a = dot(direction, direction);     float b = 2.0 * dot(L, direction);     float c = dot(L, L) - sphere.radius * sphere.radius;     float D = b * b - 4 * a * c;      if (D &lt; 0.0) return false;      float r1 = (-b - sqrt(D)) \/ (2.0 * a);     float r2 = (-b + sqrt(D)) \/ (2.0 * a);      if (r1 &gt; 0.0)         fraction = r1;     else if (r2 &gt; 0.0)         fraction = r2;     else         return false;      normal = normalize(direction * fraction + L);      return true; }  bool IntersectRayBox(vec3 origin, vec3 direction, Box box, out float fraction, out vec3 normal) {     vec3 rd = box.rotation * direction;     vec3 ro = box.rotation * (origin - box.position);      vec3 m = vec3(1.0) \/ rd;      vec3 s = vec3((rd.x &lt; 0.0) ? 1.0 : -1.0,         (rd.y &lt; 0.0) ? 1.0 : -1.0,         (rd.z &lt; 0.0) ? 1.0 : -1.0);     vec3 t1 = m * (-ro + s * box.halfSize);     vec3 t2 = m * (-ro - s * box.halfSize);      float tN = max(max(t1.x, t1.y), t1.z);     float tF = min(min(t2.x, t2.y), t2.z);      if (tN &gt; tF || tF &lt; 0.0) return false;      mat3 txi = transpose(box.rotation);      if (t1.x &gt; t1.y &amp;&amp; t1.x &gt; t1.z)         normal = txi[0] * s.x;     else if (t1.y &gt; t1.z)         normal = txi[1] * s.y;     else         normal = txi[2] * s.z;      fraction = tN;      return true; }<\/code><\/pre>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0434 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0432\u044b\u0448\u0435, \u044f \u043d\u0430\u0433\u043b\u043e \u0432\u0437\u044f\u043b <a href=\"https:\/\/iquilezles.org\/www\/articles\/intersectors\/intersectors.htm\" rel=\"noopener noreferrer nofollow\">\u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430<\/a>.<\/p>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0431\u043b\u0430\u0433\u043e, GLSL \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u0421\u0446\u0435\u043d\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\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:<\/p>\n<pre><code>#define FAR_DISTANCE 1000000.0 #define SPHERE_COUNT 3 #define BOX_COUNT 8  Sphere spheres[SPHERE_COUNT]; Box boxes[BOX_COUNT];  bool CastRay(vec3 rayOrigin, vec3 rayDirection, out float fraction, out vec3 normal, out Material material) {     float minDistance = FAR_DISTANCE;      for (int i = 0; i &lt; SPHERE_COUNT; i++)     {         float D;         vec3 N;         if (IntersectRaySphere(rayOrigin, rayDirection, spheres[i], D, N) &amp;&amp; D &lt; minDistance)         {             minDistance = D;             normal = N;             material = spheres[i].material;         }     }      for (int i = 0; i &lt; BOX_COUNT; i++)     {         float D;         vec3 N;         if (IntersectRayBox(rayOrigin, rayDirection, boxes[i], D, N) &amp;&amp; D &lt; minDistance)         {             minDistance = D;             normal = N;             material = boxes[i].material;         }     }      fraction = minDistance;     return minDistance != FAR_DISTANCE; }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0448\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u0447\u043a\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430 \u0441 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u043f\u0440\u044f\u043c\u043e\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0438. \u041c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 <em>\u043d\u0435\u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f\u0445 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u0435.<\/p>\n<h2>\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0438<\/h2>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u0438 \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0442\u044c (\u0441\u043b\u0443\u0447\u0430\u0439 \u0441 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043a\u0430 \u043e\u043f\u0443\u0441\u0442\u0438\u043c). \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <strong>L&#8217; = E + f*L<\/strong>, \u0433\u0434\u0435 <strong>E<\/strong> &#8212; \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0432\u0435\u0442 (emittance), <strong>f<\/strong> &#8212; \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0432\u0435\u0442 (reflectance), <strong>L<\/strong> &#8212; \u0441\u0432\u0435\u0442, \u0443\u043f\u0430\u0432\u0448\u0438\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438 <strong>L&#8217;<\/strong> &#8212; \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442.<\/p>\n<p>\u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430:<\/p>\n<pre><code>\/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0430 #define MAX_DEPTH 8  vec3 TracePath(vec3 rayOrigin, vec3 rayDirection) {     vec3 L = vec3(0.0); \/\/ \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u0435\u0442\u0430     vec3 F = vec3(1.0); \/\/ \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f     for (int i = 0; i &lt; MAX_DEPTH; i++)     {         float fraction;         vec3 normal;         Material material;         bool hit = CastRay(rayOrigin, rayDirection, fraction, normal, material);         if (hit)         {             vec3 newRayOrigin = rayOrigin + fraction * rayDirection;             vec3 newRayDirection = ...             \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u043a\u0443\u0434\u0430 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043b\u0443\u0447              rayDirection = newRayDirection;             rayOrigin = newRayOrigin;              L += F * material.emmitance;             F *= material.reflectance;         }         else         {             \/\/ \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e - \u0441\u0432\u0435\u0442 \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442             F = vec3(0.0);         }     }     \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f     return L; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430\u0448 \u043a\u043e\u0434 \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c C++, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <strong>L <\/strong>\u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>CastRay<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e, GLSL \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u043b\u044e\u0431\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e. \u0421 \u043a\u0430\u0436\u0434\u044b\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0438\u043b\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0432\u0435\u0442, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0443. \u0412 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 emittance \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043b\u0443\u0447 \u043d\u0438 \u0441 \u0447\u0435\u043c \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u0434\u043e \u043d\u0430\u0441 \u043d\u0435 \u0434\u043e\u0448\u043b\u043e. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c &#171;\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0441\u0432\u0435\u0442&#187;, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u044d\u0442\u0438\u043c \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0441 \u043f\u0443\u0441\u0442\u043e\u0442\u043e\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0446\u0435\u043d\u044b.<\/p>\n<h2>\u041e\u0431 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0448\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043b\u0443\u0447 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430? \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c path-tracer&#8217;\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 \u0442\u043e\u0447\u043a\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e-\u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043c\u0438\u0440\u0443, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0433\u043b\u0430\u0434\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 (\u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043e\u0442\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u0430\u043b\u043b, \u0441\u0442\u0435\u043a\u043b\u043e, \u0432\u043e\u0434\u0430) \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0447\u0435\u0442\u043a\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043b\u0443\u0447\u0438, \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u0443\u0433\u043b\u043e\u043c, \u0431\u0443\u0434\u0443\u0442 \u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0434 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0443\u0433\u043b\u043e\u043c (\u0441\u043c. specular \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435), \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0434\u043b\u044f \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u044b\u0445, \u043d\u0435\u0440\u043e\u0432\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0435 (\u0441\u043c. diffuse \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435), \u0442\u0430\u043a \u043a\u0430\u043a \u043b\u0443\u0447\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0439 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f, \u0437\u0430\u0434\u0430\u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0430 \u043a\u0430\u043a <strong>D = normalize(a * R + (1 &#8212; a) * T)<\/strong>, \u0433\u0434\u0435 <strong>a<\/strong> &#8212; \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u0438\/\u0433\u043b\u0430\u0434\u043a\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, <strong>R<\/strong> &#8212; \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043b\u0443\u0447, <strong>T<\/strong> &#8212; \u043b\u0443\u0447, \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u043b\u0443\u0447\u0430\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 <strong>a = 1<\/strong> \u0432 \u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430, \u0430 \u043f\u0440\u0438 <strong>a = 0<\/strong>, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435. \u041f\u0440\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u0438, \u043b\u0435\u0436\u0430\u0449\u0435\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 0 \u0434\u043e 1, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0435\u0439, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0443\u0433\u043b\u0443 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e \u0434\u043b\u044f \u0433\u043b\u044f\u043d\u0446\u0435\u0432\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 (\u0441\u043c. glossy \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c7\/635\/db7\/1c7635db77290e23e1a71750ed891ad3\" alt=\"\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439\" title=\"\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439\" width=\"585\" height=\"166\"><figcaption>\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439<\/figcaption><\/figure>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e &#8212; \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u043d\u0430\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0443\u0447 \u0432 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043d\u0438\u043c \u043b\u0443\u0447, \u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u0432 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u0444\u0435\u0440\u044b \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0434\u0438\u0443\u0441\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u0443 \u0436\u0435 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0443, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>#define PI 3.1415926535  vec3 RandomSpherePoint(vec2 rand) {     float cosTheta = sqrt(1.0 - rand.x);     float sinTheta = sqrt(rand.x);     float phi = 2.0 * PI * rand.y;     return vec3(         cos(phi) * sinTheta,         sin(phi) * sinTheta,         cosTheta     ); }  vec3 RandomHemispherePoint(vec2 rand, vec3 n) {     vec3 v = RandomSpherePoint(rand);     return dot(v, n) &lt; 0.0 ? -v : v; }<\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043b\u0443\u0447 \u0445\u043e\u0442\u044c \u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0443\u0441\u0444\u0435\u0440\u0435 \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u044e, \u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0434 \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0443\u0433\u043b\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438: \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043c \u0442\u0440\u0435\u0442\u0438\u0439 \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, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0438\u0445 \u0432\u0441\u0435\u0445 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>vec3 hemisphereDistributedDirection = RandomHemispherePoint(Random2D(), normal);  vec3 randomVec = normalize(2.0 * Random3D() - 1.0);  vec3 tangent = cross(randomVec, normal); vec3 bitangent = cross(normal, tangent); mat3 transform = mat3(tangent, bitangent, normal);  vec3 newRayDirection = transform * hemisphereDistributedDirection;<\/code><\/pre>\n<p><em>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/em> \u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 <code>Random?D<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 0 \u0434\u043e 1. \u0412 GLSL \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0448\u0443\u043c \u0431\u0435\u0437 \u044f\u0432\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 (\u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0432\u0437\u044f\u0442\u0430 \u0441\u043e StackOverflow \u043f\u043e <a href=\"https:\/\/stackoverflow.com\/a\/4275343\/12495775\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443<\/a>):<\/p>\n<pre><code>float RandomNoise(vec2 co) {     return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); }<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u0430\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f (gl_FragCoord), \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0439\u0442\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0448\u0435\u0439\u0434\u0435\u0440, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0435\u043b\u043e \u0432\u043a\u0443\u0441\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ad\/6ec\/747\/7ad6ec747735a630e95b302c9da58d90\" alt=\"\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c\u044e\" title=\"\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c\u044e\" width=\"770\" height=\"250\"><figcaption>\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c\u044e<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439\u043a\u043e\u0434 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>TracePath<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>vec3 TracePath(vec3 rayOrigin, vec3 rayDirection) {     vec3 L = vec3(0.0);     vec3 F = vec3(1.0);     for (int i = 0; i &lt; MAX_DEPTH; i++)     {         float fraction;         vec3 normal;         Material material;         bool hit = CastRay(rayOrigin, rayDirection, fraction, normal, material);         if (hit)         {             vec3 newRayOrigin = rayOrigin + fraction * rayDirection;             vec3 hemisphereDistributedDirection = RandomHemispherePoint(Random2D(), normal);              randomVec = normalize(2.0 * Random3D() - 1.0);              vec3 tangent = cross(randomVec, normal);             vec3 bitangent = cross(normal, tangent);             mat3 transform = mat3(tangent, bitangent, normal);                          vec3 newRayDirection = transform * hemisphereDistributedDirection;                              vec3 idealReflection = reflect(rayDirection, normal);             newRayDirection = normalize(mix(newRayDirection, idealReflection, material.roughness));                          \/\/ \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0430             \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 0.8 \u0442\u0443\u0442 \u0432\u0437\u044f\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e             \/\/ \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0441\u044f \u0441 \u0442\u0435\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u043b\u0441\u044f             newRayOrigin += normal * 0.8;              rayDirection = newRayDirection;             rayOrigin = newRayOrigin;              L += F * material.emmitance;             F *= material.reflectance;         }         else         {             F = vec3(0.0);         }     }      return L; }<\/code><\/pre>\n<h2>\u041f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u044d\u0444\u0444\u0435\u043a\u0442, \u043a\u0430\u043a \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430. \u0412\u0441\u0435 \u0436\u0435 \u043f\u043e\u043c\u043d\u044f\u0442, \u043a\u0430\u043a \u0441\u043e\u043b\u043e\u043c\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f\u0441\u044f \u0432 \u0441\u0442\u0430\u043a\u0430\u043d\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u043e\u0439 \u0432 \u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u043e\u0434\u043e\u0439? \u042d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0432\u0435\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u0440\u0435\u0434\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u044e \u0432\u043e\u043b\u043d\u043e\u0432\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0412\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0432\u0435\u0442 \u043f\u0430\u0434\u0430\u0435\u043c \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c <strong>a<\/strong>, \u0442\u043e \u0443\u0433\u043e\u043b \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f <strong>b<\/strong> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 (\u0441\u043c. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%A1%D0%BD%D0%B5%D0%BB%D0%BB%D0%B8%D1%83%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043a\u043e\u043d \u0421\u043d\u0435\u043b\u043b\u0438\u0443\u0441\u0430<\/a>): <strong>b = arcsin(sin(a) * n1 \/ n2)<\/strong>, \u0433\u0434\u0435 <strong>n1<\/strong> &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0448\u0435\u043b \u043b\u0443\u0447, a <strong>n2<\/strong> &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u0443\u0447 \u0432\u043e\u0448\u0435\u043b. \u0418 \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043d\u0430\u0441, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043d\u0430\u0441 \u0441\u0440\u0435\u0434, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044e, \u0438\u043b\u0438, \u043d\u0430\u043a\u0440\u0430\u0439\u043d\u044f\u043a, \u0443\u0447\u0435\u0431\u043d\u0438\u043a \u043f\u043e \u0444\u0438\u0437\u0438\u043a\u0435.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/33\/ic\/9h\/33ic9h05kqxd-w99gwl5vbthgzg.png\" alt=\"\u0423\u0433\u043e\u043b \u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f\" title=\"\u0423\u0433\u043e\u043b \u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f\" width=\"2748\" height=\"731\"><figcaption>\u0423\u0433\u043e\u043b \u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: <strong>sin(a)<\/strong> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043b\u044f 1 \u0434\u043b\u044f \u043e\u0441\u0442\u0440\u044b\u0445 \u0443\u0433\u043b\u043e\u0432. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f <strong>n1 \/ n2<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043c 1. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <strong>sin(a) * n1 \/ n2<\/strong> \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>arcsin<\/strong>. \u0427\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0443\u0433\u043b\u043e\u043c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0448\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f, \u0445\u043e\u0442\u044f \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f?<\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043b\u0443\u0447 \u0441\u0432\u0435\u0442\u0430 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435 \u043f\u0440\u0435\u043b\u043e\u043c\u0438\u0442\u0441\u044f, \u0430 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f! \u0414\u0430\u043d\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u043d, \u0435\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430 \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0434\u0432\u0443\u0445 \u0441\u0440\u0435\u0434, \u043e\u043d \u043f\u043e \u0441\u0443\u0442\u0438 &#171;\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u043e\u0435&#187;, \u0438 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f. \u0418 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0434\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043b\u0443\u0447, \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0432\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u0442\u043e\u0433\u043e \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u043e\u0433\u043e, \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430. \u0414\u0430\u043d\u043d\u043e\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0444\u0438\u0437\u0438\u043a\u0435 \u043d\u043e\u0441\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B5_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/a>, \u0430 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0435\u0441\u044c \u0441\u0432\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0441\u0440\u0435\u0434, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u043f\u043e\u043b\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c.<\/em> \u0418 \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043f\u0443\u0442\u0435\u0439.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/92\/hf\/jd\/92hfjduuw5swd4rbo2f6e60tkfc.png\" alt=\"\u044d\u0444\u0444\u0435\u043a\u0442 \u0424\u0440\u0435\u043d\u0435\u043b\u044f\" title=\"\u044d\u0444\u0444\u0435\u043a\u0442 \u0424\u0440\u0435\u043d\u0435\u043b\u044f\" width=\"600\" height=\"270\"><figcaption>\u044d\u0444\u0444\u0435\u043a\u0442 \u0424\u0440\u0435\u043d\u0435\u043b\u044f<\/figcaption><\/figure>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0441\u0432\u0435\u0442\u0430 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0441\u043a\u0432\u043e\u0437\u044c \u043d\u0435\u0435? \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B_%D0%A4%D1%80%D0%B5%D0%BD%D0%B5%D0%BB%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0424\u0440\u0435\u043d\u0435\u043b\u044f<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u044d\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0442\u0440\u0430\u0434\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f. \u041d\u043e \u043d\u0435 \u0441\u043f\u0435\u0448\u0438\u0442\u0435 \u0443\u0436\u0430\u0441\u0430\u0442\u044c\u0441\u044f &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439 \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0435 \u0428\u043b\u0438\u043a\u0430 &#8212; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Schlick%27s_approximation\" rel=\"noopener noreferrer nofollow\">\u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0428\u043b\u0438\u043a\u0430<\/a>. \u041e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c\u043b\u0438\u043c\u044b\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 \u043d\u0430\u0448 \u043a\u043e\u0434:<\/p>\n<pre><code>float FresnelSchlick(float nIn, float nOut, vec3 direction, vec3 normal) {     float R0 = ((nOut - nIn) * (nOut - nIn)) \/ ((nOut + nIn) * (nOut + nIn));     float fresnel = R0 + (1.0 - R0) * pow((1.0 - abs(dot(direction, normal))), 5.0);     return fresnel; }<\/code><\/pre>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0432\u0435\u0441\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b: \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u043d\u044b\u0439 \u043b\u0443\u0447 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code>vec3 IdealRefract(vec3 direction, vec3 normal, float nIn, float nOut) {     \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430     \/\/ \u0435\u0441\u043b\u0438 \u0434\u0430 - \u0443\u0447\u0442\u0435\u043c \u044d\u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0435 \u0441\u0440\u0435\u0434 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430     bool fromOutside = dot(normal, direction) &lt; 0.0;     float ratio = fromOutside ? nOut \/ nIn : nIn \/ nOut;      vec3 refraction, reflection;     refraction = fromOutside ? refract(direction, normal, ratio) : -refract(-direction, normal, ratio);     reflection = reflect(direction, normal);      \/\/ \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f refract \u0432\u0435\u0440\u043d\u0435\u0442 \u043d\u0430\u043c 0.0     return refraction == vec3(0.0) ? reflection : refraction; }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0444\u0440\u0435\u043d\u0435\u043b\u044f, \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0448\u0430\u0442\u044c, \u043f\u0440\u0435\u043b\u043e\u043c\u0438\u0442\u0441\u044f \u043b\u0438 \u043b\u0443\u0447 \u0438\u043b\u0438 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u043a \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u043c\u0443. \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043d\u043e \u044f \u0432\u0437\u044f\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code>bool IsRefracted(float rand, vec3 direction, vec3 normal, float opacity, float nIn, float nOut) {     float fresnel = FresnelSchlick(nIn, nOut, direction, normal);     return opacity &gt; rand &amp;&amp; fresnel &lt; rand; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>TracePath<\/code> \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0430 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0430 \u0438 \u0448\u0435\u0440\u0435\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 &#8212; \u0435\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 \u0442\u0435\u043b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u043b:<\/p>\n<pre><code>#define N_IN 0.99 #define N_OUT 1.0  vec3 TracePath(vec3 rayOrigin, vec3 rayDirection) {     vec3 L = vec3(0.0);     vec3 F = vec3(1.0);     for (int i = 0; i &lt; MAX_DEPTH; i++)     {         float fraction;         vec3 normal;         Material material;         bool hit = CastRay(rayOrigin, rayDirection, fraction, normal, material);         if (hit)         {             vec3 newRayOrigin = rayOrigin + fraction * rayDirection;             vec3 hemisphereDistributedDirection = RandomHemispherePoint(Random2D(), normal);              randomVec = normalize(2.0 * Random3D() - 1.0);             vec3 tangent = cross(randomVec, normal);             vec3 bitangent = cross(normal, tangent);             mat3 transform = mat3(tangent, bitangent, normal);             vec3 newRayDirection = transform * hemisphereDistributedDirection;                              \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043f\u0440\u0435\u043b\u043e\u043c\u0438\u0442\u0441\u044f \u043b\u0438 \u043b\u0443\u0447. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f             bool refracted = IsRefracted(Random1D(), rayDirection, normal, material.opacity, N_IN, N_OUT);             if (refracted)             {                 vec3 idealRefraction = IdealRefract(rayDirection, normal, N_IN, N_OUT);                 newRayDirection = normalize(mix(-newRayDirection, idealRefraction, material.roughness));                 newRayOrigin += normal * (dot(newRayDirection, normal) &lt; 0.0 ? -0.8 : 0.8);             }             else             {                 vec3 idealReflection = reflect(rayDirection, normal);                 newRayDirection = normalize(mix(newRayDirection, idealReflection, material.roughness));                 newRayOrigin += normal * 0.8;             }              rayDirection = newRayDirection;             rayOrigin = newRayOrigin;              L += F * material.emmitance;             F *= material.reflectance;         }         else         {             F = vec3(0.0);         }     }     return L; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f <code>N_IN<\/code> \u0438 <code>N_OUT<\/code> \u044f \u0432\u0437\u044f\u043b \u0434\u0432\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u0445 \u0447\u0438\u0441\u043b\u0430doo. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0438\u0437 \u0441\u0442\u0435\u043a\u043b\u0430 (\u043a\u0430\u043a \u0448\u0430\u0440 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u041c\u043e\u0436\u0435\u0442\u0435 \u0441\u043c\u0435\u043b\u043e \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0433\u043e\u043b \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0435\u0439, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043a\u0432\u043e\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<h2>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043b\u0443\u0447\u0438!<\/h2>\n<p>\u0414\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043c\u0430\u043b\u044b\u043c: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0441\u0446\u0435\u043d\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u0443\u0447\u0438 \u043f\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u0437\u0433\u043b\u044f\u0434\u0430. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u0430\u043c\u0435\u0440\u044b: \u043e\u0442 \u043d\u0435\u0435 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: <code>direction<\/code> &#8212; \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <code>up<\/code> &#8212; \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 &#171;\u0432\u0432\u0435\u0440\u0445&#187; \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 (\u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e), \u0430 \u0442\u0430\u043a\u0436\u0435 <code>fov<\/code> &#8212; \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u043a\u0430\u043c\u0435\u0440\u044b. \u0422\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0447\u0438\u0441\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 &#8212; \u044d\u043a\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f (\u043e\u0442 0 \u0434\u043e 1 \u043f\u043e x \u0438 y) \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d. \u0412 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0432 \u043a\u043e\u0434\u0435 \u0442\u043e\u0436\u0435 \u043e\u0441\u043e\u0431\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443 &#8212; \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043c\u0438\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/436790\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<pre><code>vec3 GetRayDirection(vec2 texcoord, vec2 viewportSize, float fov, vec3 direction, vec3 up) {     vec2 texDiff = 0.5 * vec2(1.0 - 2.0 * texcoord.x, 2.0 * texcoord.y - 1.0);     vec2 angleDiff = texDiff * vec2(viewportSize.x \/ viewportSize.y, 1.0) * tan(fov * 0.5);      vec3 rayDirection = normalize(vec3(angleDiff, 1.0f));      vec3 right = normalize(cross(up, direction));     mat3 viewToWorld = mat3(         right,         up,         direction     );      return viewToWorld * rayDirection; }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u044b \u043d\u0438 \u043f\u0440\u0438\u0441\u043a\u043e\u0440\u0431\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u044f\u0432\u043b\u044f\u0442\u044c, \u043d\u043e \u0437\u0430\u043a\u043e\u043d\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u043b\u0443\u0447\u0438 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c, \u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u043c\u043f\u043b\u0430 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e. \u0418 \u0434\u0430\u0436\u0435 16 \u0441\u0435\u043c\u043f\u043b\u043e\u0432 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u043e \u043d\u0435 \u0440\u0430\u0441\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441: \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442 4 \u0434\u043e 16 \u043b\u0443\u0447\u0435\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440, \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0442\u0430\u0442\u044c \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u0435 (\u0445\u043e\u0442\u044c \u0438 \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044f \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u0433\u043b\u0430\u0437\u0430\u0445 \u0443\u0436\u0430\u0441\u043d\u044b\u0435 \u0448\u0443\u043c\u044b), \u0430 \u043f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043f\u0440\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c float&#8217;\u0430. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u044b \u043d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sq\/p1\/a1\/sqp1a1pfru94rsc24yvw3viuami.png\" alt=\"\u0440\u0435\u043d\u0434\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u0441\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435\" title=\"\u0440\u0435\u043d\u0434\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u0441\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435\" width=\"3146\" height=\"869\"><figcaption>\u0440\u0435\u043d\u0434\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u0441\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435<\/figcaption><\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0443\u0447\u0435\u0439 \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>TracePath<\/code>):<\/p>\n<pre><code>\/\/ ray_tracing_fragment.glsl  in vec2 TexCoord; out vec4 OutColor;  uniform vec2 uViewportSize; uniform float uFOV; uniform vec3 uDirection; uniform vec3 uUp; uniform float uSamples;  void main() {     \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u0446\u0435\u043d\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438     InitializeScene();      vec3 direction = GetRayDirection(TexCoord, uViewportSize, uFOV, uDirection, uUp);      vec3 totalColor = vec3(0.0);     for (int i = 0; i &lt; uSamples; i++)     {         vec3 sampleColor = TracePath(uPosition, direction);         totalColor += sampleColor;     }      vec3 outputColor = totalColor \/ float(uSamples);     OutColor = vec4(outputColor, 1.0); }<\/code><\/pre>\n<h2>\u0410\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c!<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0432\u0438\u0434\u0430 RGB (\u043f\u043e \u0431\u0430\u0439\u0442\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u043d\u0430\u043b) \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u041b\u0443\u0447\u0448\u0435 \u0432\u0437\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 RGB32F (\u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0443\u043f\u0440\u0435\u043c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u0438\u0437-\u0437\u0430 \u043f\u043e\u0442\u0435\u0440\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0445\u043e\u0434\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0448\u0435\u0439\u0434\u0435\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0448\u0443 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0434\u0440\u043e\u0432. \u0422\u0443\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e (\u0432 \u043a\u043e\u0434\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 tone-mapping&#8217;\u0430, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043a\u0440\u0438\u0432\u0443\u044e \u0420\u0435\u0439\u043d\u0433\u0430\u0440\u0434\u0430):<\/p>\n<pre><code>\/\/ post_process_fragment.glsl  in vec2 TexCoord; out vec4 OutColor;  uniform sampler2D uImage; uniform int uImageSamples;  void main() {     vec3 color = texture(uImage, TexCoord).rgb;     color \/= float(uImageSamples);     color = color \/ (color + vec3(1.0));     color = pow(color, vec3(1.0 \/ 2.2));     OutColor = vec4(color, 1.0); }<\/code><\/pre>\n<p>\u0418 \u043d\u0430 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u0441 GLSL \u043a\u043e\u0434\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u043e\u0439. \u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u0439 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 &#8212; \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 \u0432\u0430\u0441. \u041d\u0438\u0436\u0435 \u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 API \u043c\u043e\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0438 \u043f\u0438\u0441\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u044d\u0442\u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f. \u0414\u0443\u043c\u0430\u044e \u0432\u0430\u043c \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c API, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043b\u0438\u0447\u043d\u043e \u0432\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<pre><code>virtual void OnUpdate() override {     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443 \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u043d\u0434\u0435\u0440     auto viewport = Rendering::GetViewport();     auto output = viewport-&gt;GetRenderTexture();      \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b (\u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u0438 \u0442.\u0434.)     auto viewportSize = Rendering::GetViewportSize();     auto cameraPosition = MxObject::GetByComponent(*viewport).Transform.GetPosition();     auto cameraRotation = Vector2{ viewport-&gt;GetHorizontalAngle(), viewport-&gt;GetVerticalAngle() };     auto cameraDirection = viewport-&gt;GetDirection();     auto cameraUpVector = viewport-&gt;GetDirectionUp();     auto cameraFOV = viewport-&gt;GetCamera&lt;PerspectiveCamera&gt;().GetFOV();      \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u0430. \u041e\u0442 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u0430\u0434\u0440     bool accumulateImage = oldCameraPosition == cameraPosition &amp;&amp;                            oldCameraDirection == cameraDirection &amp;&amp;                            oldFOV == cameraFOV;      \/\/ \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0441\u043d\u0438\u0437\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043c\u043f\u043b\u043e\u0432 \u0440\u0430\u0434\u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432     int raySamples = accumulateImage ? 16 : 4;      \/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432\u0441\u0435 \u0443\u043d\u0438\u0444\u043e\u0440\u043c\u044b \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043b\u0443\u0447\u0435\u0439     this-&gt;rayTracingShader-&gt;SetUniformInt(\"uSamples\", raySamples);     this-&gt;rayTracingShader-&gt;SetUniformVec2(\"uViewportSize\", viewportSize);     this-&gt;rayTracingShader-&gt;SetUniformVec3(\"uPosition\", cameraPosition);     this-&gt;rayTracingShader-&gt;SetUniformVec3(\"uDirection\", cameraDirection);     this-&gt;rayTracingShader-&gt;SetUniformVec3(\"uUp\", cameraUpVector);     this-&gt;rayTracingShader-&gt;SetUniformFloat(\"uFOV\", Radians(cameraFOV));      \/\/ \u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0438\u043f \u0431\u043b\u0435\u043d\u0434\u0438\u043d\u0433\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043b\u0438 \u043c\u044b \u043a\u0430\u0434\u0440\u044b \u0432 \u043e\u0434\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443     \/\/ \u0442\u0430\u043a\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     if (accumulateImage)     {         Rendering::GetController().GetRenderEngine().UseBlending(BlendFactor::ONE, BlendFactor::ONE);         Rendering::GetController().RenderToTextureNoClear(this-&gt;accumulationTexture, this-&gt;rayTracingShader);         accumulationFrames++;     }     else     {         Rendering::GetController().GetRenderEngine().UseBlending(BlendFactor::ONE, BlendFactor::ZERO);         Rendering::GetController().RenderToTexture(this-&gt;accumulationTexture, this-&gt;rayTracingShader);         accumulationFrames = 1;     }      \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u0440\u0435\u043d\u0434\u0435\u0440-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043a\u0430\u043c\u0435\u0440\u044b     this-&gt;accumulationTexture-&gt;Bind(0);     this-&gt;postProcessShader-&gt;SetUniformInt(\"uImage\", this-&gt;accumulationTexture-&gt;GetBoundId());     this-&gt;postProcessShader-&gt;SetUniformInt(\"uImageSamples\", this-&gt;accumulationFrames);     Rendering::GetController().RenderToTexture(output, this-&gt;postProcessShader);      \/\/ \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b     this-&gt;oldCameraDirection = cameraDirection;     this-&gt;oldCameraPosition = cameraPosition;     this-&gt;oldFOV = cameraFOV; }<\/code><\/pre>\n<h2>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435! \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0425\u043e\u0442\u044c \u043c\u044b \u0438 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432 path-tracing&#8217;\u0435, \u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0435\u043d\u043e\u0439\u0437\u0438\u043d\u0433, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043d\u043e\u0441\u043d\u044b\u043c. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0438 \u0432\u044b \u043d\u0430\u0448\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435. \u042f \u0436\u0435 \u043f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e path-tracer&#8217;\u0430:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/an\/ck\/rc\/anckrc2kdrq_vu5c1urbhhn2750.png\" alt=\"\u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043e\u0442 \u0434\u0432\u0443\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0435\u0440\u043a\u0430\u043b\" title=\"\u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043e\u0442 \u0434\u0432\u0443\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0435\u0440\u043a\u0430\u043b\" width=\"1589\" height=\"893\"><figcaption>\u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u043e\u0442 \u0434\u0432\u0443\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0435\u0440\u043a\u0430\u043b<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xs\/ir\/k4\/xsirk4runmb_gpuigihe4riwsrw.png\" alt=\"\u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441\u043a\u0432\u043e\u0437\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0443\" title=\"\u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441\u043a\u0432\u043e\u0437\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0443\" width=\"1381\" height=\"1009\"><figcaption>\u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441\u043a\u0432\u043e\u0437\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0443<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mb\/6_\/59\/mb6_59xns8otlabfhzdkdhmbpse.png\" alt=\"\u043d\u0435\u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u043c\u044f\u0433\u043a\u0438\u0435 \u0442\u0435\u043d\u0438\" title=\"\u043d\u0435\u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u043c\u044f\u0433\u043a\u0438\u0435 \u0442\u0435\u043d\u0438\" width=\"1585\" height=\"853\"><figcaption>\u043d\u0435\u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u043c\u044f\u0433\u043a\u0438\u0435 \u0442\u0435\u043d\u0438<\/figcaption><\/figure>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h2>\n<ul>\n<li>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Path-Tracer&#8217;\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 GitHub: <a href=\"https:\/\/github.com\/MomoDeve\/PathTracer\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/MomoDeve\/PathTracer<\/a><\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e: <a href=\"https:\/\/github.com\/asc-community\/MxEngine\" rel=\"noopener noreferrer nofollow\">\u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a MxEngine<\/a><\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u0443\u0442\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442 <a class=\"mention\" href=\"\/users\/haqreu\">@haqreu<\/a> \u043d\u0430 \u0441\u043c\u0435\u0436\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u043e \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0435:  <a href=\"https:\/\/habr.com\/ru\/post\/436790\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/436790<\/a><\/p>\n<\/li>\n<li>\n<p>\u041e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435, importance-sampling&#8217;\u0435 \u0438 \u043c\u043d\u043e\u0433\u043e \u043e \u0447\u0435\u043c \u0435\u0449\u0435 \u043e\u0442 <a class=\"mention\" href=\"\/users\/mrshoor:\">@MrShoor:<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/326852\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/326852\/<\/a><\/p>\n<\/li>\n<\/ul>\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\/post\/533932\/\"> https:\/\/habr.com\/ru\/post\/533932\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041d\u0430 \u0432\u043e\u043b\u043d\u0435 \u0430\u0436\u0438\u043e\u0442\u0430\u0436\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043e\u0442 Nvidia \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 RTX, \u044f, \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044f \u0445\u0430\u0431\u0440 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u0441 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u0430\u043a \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0435\u0439, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430. &#171;\u0422\u0430\u043a \u0434\u0435\u043b\u043e \u043d\u0435 \u043f\u043e\u0439\u0434\u0435\u0442&#187; &#8212; \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f \u0438 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0434\u0430 \u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0431\u044b\u043b\u043e. \u0422\u0443\u0442 \u043a\u0430\u043a \u043a\u0441\u0442\u0430\u0442\u0438 API \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b: \u0437\u0430\u043f\u0438\u043b\u044e-\u043a\u0430 \u044f \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 path-tracer. \u0427\u0442\u043e \u0436\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e \u0432\u044b \u0434\u0443\u043c\u0430\u044e \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u043f\u0440\u0435\u0432\u044c\u044e \u043a \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0438<\/a> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BB%D1%83%D1%87%D0%B5%D0%B9\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043b\u0443\u0447\u0435\u0439<\/a> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u044b, \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0443\u0448\u043b\u043e \u0431\u044b \u043d\u0435\u0438\u043c\u043e\u0432\u0435\u0440\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0441\u0438\u043b\u0438\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043b\u0443\u0447\u0435\u0439, \u043f\u0440\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u0443\u0442\u0435\u0439 \u043c\u044b \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u0443\u0447\u0438 \u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 \u0441\u0446\u0435\u043d\u0443, \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441 \u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b &#171;\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0442\u044c&#187; \u0444\u043e\u0442\u043e\u043d\u0430, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430 \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f (\u0432\u0435\u0434\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u0430\u0437\u0430).<\/p>\n<figure class=\"\"><figcaption>\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f<\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430: \u0430 \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430? \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u043a\u0438, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0447\u0442\u043e \u043d\u0430\u0441 \u043e\u043a\u0440\u0443\u0436\u0430\u0435\u0442, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0445\u043e\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u0441\u0432\u0435\u0442\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u0444\u043e\u0442\u043e\u043d\u0430 &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u044b\u043c, \u0447\u0442\u043e \u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c. \u0422\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043b\u044e\u0431\u043e\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043b\u0443\u0447\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0432\u0441\u0435 \u0436\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0437\u0430 \u0445\u043e\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0431\u043e\u0440 \u0447\u0438\u0441\u043b\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0446\u0435\u043d\u044b &#8212; \u0434\u043b\u044f \u0433\u0440\u0443\u0431\u044b\u0445 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435\u0436\u0435\u043b\u0438 \u0434\u043b\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043b\u0438 \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 (\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0434\u0432\u0443\u043c\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u0430\u043c\u0438 \u0432 \u043b\u0438\u0444\u0442\u0435 &#8212; \u0441\u0432\u0435\u0442 \u0432 \u043d\u0438\u0445 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f, \u0438 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043c\u0435\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c).<\/p>\n<figure class=\"\"><figcaption>\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c<\/figcaption><\/figure>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 &#8212; \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u0435, \u0438 \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043e\u043d\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442. \u0418 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D1%8C%D0%B1%D0%B5%D0%B4%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0430\u043b\u0431\u0435\u0434\u043e<\/a> (\u0434\u0438\u0444\u0444\u0443\u0437\u043d\u0430\u044f \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430), <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A8%D0%B5%D1%80%D0%BE%D1%85%D0%BE%D0%B2%D0%B0%D1%82%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c<\/a> (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e-\u0443\u0440\u043e\u0432\u043d\u0435) \u0438<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D1%82%D1%80%D0%B0%D0%B6%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\"> \u043c\u0435\u0442\u0430\u043b\u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c<\/a> (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430). \u0418\u043d\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D1%80%D0%B5%D0%B4%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c<\/a> \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%BF%D1%80%D0%B5%D0%BB%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<p>\u042f \u0436\u0435 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0435\u0448\u0438\u043b \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c (reflectance) &#8212; \u043a\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u043e\u043b\u043d\u044b \u0441\u0432\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/p>\n<\/li>\n<li>\n<p>\u0428\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (roughness) &#8212; \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0438 \u0440\u0430\u0441\u0441\u0435\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 (emittance) &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u043b\u0438\u043d\u0430 \u0432\u043e\u043b\u043d\u044b \u0441\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (transparency\/opacity) &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0432\u043e\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0432\u0435\u0442\u0430 \u043a \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u043c\u0443<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0441\u0432\u0435\u0442\u0430, \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u044b\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043b\u0443\u0447\u0448\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430 GLSL<\/h2>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e (\u0438\u043b\u0438 \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e?) \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0443\u0442\u0435\u0439, \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043b\u0438\u0448\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043f\u0438\u043f\u0435\u0434\u044b \u0438 \u0441\u0444\u0435\u0440\u044b. \u0414\u043b\u044f \u043d\u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f c \u043b\u0443\u0447\u0435\u043c, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438, \u0434\u0430 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cornell_box\" rel=\"noopener noreferrer nofollow\">cornell-box<\/a>.<\/p>\n<figure class=\"\"><figcaption>\u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 cornell box&#8217;a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/figcaption><\/figure>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u043e\u043c GLSL \u0448\u0435\u0439\u0434\u0435\u0440\u0435. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u0441\u0430\u043c\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u044f\u0437\u044b\u043a\u043e\u043c \u0421: \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0446\u0438\u043a\u043b\u044b, \u0438 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0447\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438 \u0434\u043b\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 &#8212; <code>vec2<\/code>, <code>vec3<\/code>, <code>mat3<\/code> \u0438 \u0442.\u0434.<\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a \u043a\u043e\u0434\u0443! \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430:<\/p>\n<pre><code>struct Material {     vec3 emmitance;     vec3 reflectance;     float roughness;     float opacity; };  struct Box {     Material material;     vec3 halfSize;     mat3 rotation;     vec3 position; };  struct Sphere {     Material material;     vec3 position;     float radius; };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u043b\u0443\u0447\u0435\u043c: \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u043b\u0443\u0447\u0430 \u0438 \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e:<\/p>\n<pre><code>bool IntersectRaySphere(vec3 origin, vec3 direction, Sphere sphere, out float fraction, out vec3 normal) {     vec3 L = origin - sphere.position;     float a = dot(direction, direction);     float b = 2.0 * dot(L, direction);     float c = dot(L, L) - sphere.radius * sphere.radius;     float D = b * b - 4 * a * c;      if (D &lt; 0.0) return false;      float r1 = (-b - sqrt(D)) \/ (2.0 * a);     float r2 = (-b + sqrt(D)) \/ (2.0 * a);      if (r1 &gt; 0.0)         fraction = r1;     else if (r2 &gt; 0.0)         fraction = r2;     else         return false;      normal = normalize(direction * fraction + L);      return true; }  bool IntersectRayBox(vec3 origin, vec3 direction, Box box, out float fraction, out vec3 normal) {     vec3 rd = box.rotation * direction;     vec3 ro = box.rotation * (origin - box.position);      vec3 m = vec3(1.0) \/ rd;      vec3 s = vec3((rd.x &lt; 0.0) ? 1.0 : -1.0,         (rd.y &lt; 0.0) ? 1.0 : -1.0,         (rd.z &lt; 0.0) ? 1.0 : -1.0);     vec3 t1 = m * (-ro + s * box.halfSize);     vec3 t2 = m * (-ro - s * box.halfSize);      float tN = max(max(t1.x, t1.y), t1.z);     float tF = min(min(t2.x, t2.y), t2.z);      if (tN &gt; tF || tF &lt; 0.0) return false;      mat3 txi = transpose(box.rotation);      if (t1.x &gt; t1.y &amp;&amp; t1.x &gt; t1.z)         normal = txi[0] * s.x;     else if (t1.y &gt; t1.z)         normal = txi[1] * s.y;     else         normal = txi[2] * s.z;      fraction = tN;      return true; }<\/code><\/pre>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0434 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0432\u044b\u0448\u0435, \u044f \u043d\u0430\u0433\u043b\u043e \u0432\u0437\u044f\u043b <a href=\"https:\/\/iquilezles.org\/www\/articles\/intersectors\/intersectors.htm\" rel=\"noopener noreferrer nofollow\">\u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430<\/a>.<\/p>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0431\u043b\u0430\u0433\u043e, GLSL \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u0421\u0446\u0435\u043d\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\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:<\/p>\n<pre><code>#define FAR_DISTANCE 1000000.0 #define SPHERE_COUNT 3 #define BOX_COUNT 8  Sphere spheres[SPHERE_COUNT]; Box boxes[BOX_COUNT];  bool CastRay(vec3 rayOrigin, vec3 rayDirection, out float fraction, out vec3 normal, out Material material) {     float minDistance = FAR_DISTANCE;      for (int i = 0; i &lt; SPHERE_COUNT; i++)     {         float D;         vec3 N;         if (IntersectRaySphere(rayOrigin, rayDirection, spheres[i], D, N) &amp;&amp; D &lt; minDistance)         {             minDistance = D;             normal = N;             material = spheres[i].material;         }     }      for (int i = 0; i &lt; BOX_COUNT; i++)     {         float D;         vec3 N;         if (IntersectRayBox(rayOrigin, rayDirection, boxes[i], D, N) &amp;&amp; D &lt; minDistance)         {             minDistance = D;             normal = N;             material = boxes[i].material;         }     }      fraction = minDistance;     return minDistance != FAR_DISTANCE; }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0448\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u0447\u043a\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430 \u0441 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u043f\u0440\u044f\u043c\u043e\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0438. \u041c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 <em>\u043d\u0435\u043f\u0440\u044f\u043c\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a \u0441\u0432\u0435\u0442\u0430 \u043f\u0440\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f\u0445 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u0435.<\/p>\n<h2>\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0442\u0438<\/h2>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0432\u0435\u0442, \u0438 \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0442\u044c (\u0441\u043b\u0443\u0447\u0430\u0439 \u0441 \u043f\u0440\u0435\u043b\u043e\u043c\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043a\u0430 \u043e\u043f\u0443\u0441\u0442\u0438\u043c). \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430 \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <strong>L&#8217; = E + f*L<\/strong>, \u0433\u0434\u0435 <strong>E<\/strong> &#8212; \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0432\u0435\u0442 (emittance), <strong>f<\/strong> &#8212; \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0432\u0435\u0442 (reflectance), <strong>L<\/strong> &#8212; \u0441\u0432\u0435\u0442, \u0443\u043f\u0430\u0432\u0448\u0438\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438 <strong>L&#8217;<\/strong> &#8212; \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442.<\/p>\n<p>\u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430:<\/p>\n<pre><code>\/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0430 #define MAX_DEPTH 8  vec3 TracePath(vec3 rayOrigin, vec3 rayDirection) {     vec3 L = vec3(0.0); \/\/ \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u0435\u0442\u0430     vec3 F = vec3(1.0); \/\/ \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f     for (int i = 0; i &lt; MAX_DEPTH; i++)     {         float fraction;         vec3 normal;         Material material;         bool hit = CastRay(rayOrigin, rayDirection, fraction, normal, material);         if (hit)         {             vec3 newRayOrigin = rayOrigin + fraction * rayDirection;             vec3 newRayDirection = ...             \/\/ \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u043a\u0443\u0434\u0430 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043b\u0443\u0447              rayDirection = newRayDirection;             rayOrigin = newRayOrigin;              L += F * material.emmitance;             F *= material.reflectance;         }         else         {             \/\/ \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e - \u0441\u0432\u0435\u0442 \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442           <\/code><\/pre>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-315163","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315163","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=315163"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315163\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}