{"id":299047,"date":"2020-02-21T09:00:20","date_gmt":"2020-02-21T09:00:20","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=299047"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-02-21T09:00:20","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=299047","title":{"rendered":"\u0420\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0430 3\u00bb: \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043d\u0435\u0431\u0430"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/489118\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8f2\/033\/d27\/8f2033d27bc9d8a498716c85be1be1c0.png\" alt=\"image\"><\/div>\n<p>  [\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430: <a href=\"https:\/\/habr.com\/ru\/post\/422573\/\">\u043f\u0435\u0440\u0432\u0430\u044f<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/437100\/\">\u0432\u0442\u043e\u0440\u0430\u044f<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/450332\/\">\u0442\u0440\u0435\u0442\u044c\u044f<\/a>.]<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 1. \u041f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u0445, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0438\u0440\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e. \u0417\u0430\u0434\u0443\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u2014 \u0431\u041e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u0431\u043e \u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 40-50% \u0432\u0441\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u041d\u0435\u0431\u043e \u2014 \u044d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442. \u041d\u0430 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u0437\u0432\u0451\u0437\u0434\u044b, \u0441\u043e\u043b\u043d\u0446\u0435, \u043b\u0443\u043d\u0430 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n<p>  \u0425\u043e\u0442\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438, \u043f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0451\u043c\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 raymarching-\u0430 (\u0441\u043c. <a href=\"http:\/\/advances.realtimerendering.com\/s2015\/index.html\" rel=\"nofollow\">\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>), \u043e\u0431\u043b\u0430\u043a\u0430 \u0432 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u0445. \u042f \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0438\u0445 \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u043b. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0437\u0430 \u043c\u043e\u0435\u0439 \u0441\u0435\u0440\u0438\u0435\u0439 \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 DLC \u00ab\u041a\u0440\u043e\u0432\u044c \u0438 \u0432\u0438\u043d\u043e\u00bb \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0439. \u0418, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0432 DLC \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u043b\u0430\u043a\u0430\u043c\u0438.<\/p>\n<p>  \u0412 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0451\u0432 \u043e\u0431\u043b\u0430\u043a\u043e\u0432. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0433\u043e\u0434\u044b \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cirrus_cloud\" rel=\"nofollow\">\u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Altocumulus_cloud\" rel=\"nofollow\">\u0432\u044b\u0441\u043e\u043a\u043e\u043a\u0443\u0447\u0435\u0432\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/a>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Stratus_cloud\" rel=\"nofollow\">\u0441\u043b\u043e\u0438\u0441\u0442\u044b\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432<\/a> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u0443\u0440\u0438). \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043e\u0432\u0441\u0435.<a name=\"habracut\"><\/a><\/p>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u043b\u044f \u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0434\u043b\u0438\u043d\u0443 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430.<\/p>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u0438\u0435 \u043e\u0431\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0432 Witcher 3. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435, \u0438 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 (\u0441\u043c. \u043d\u0438\u0436\u0435). \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0431\u043e \u2014 \u043d\u0430 \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043b\u044c\u0444\u044b \u0438\u0437 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/263\/aec\/b8a\/263aecb8afa21e2b79b0333bcde55011.jpg\"><\/div>\n<p>  \u0427\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043a\u043e\u0434\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u0447\u0442\u043e\u0431\u044b (1) \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433, (2) \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>  \u042f \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0441\u044f \u0432 \u043f\u0435\u0440\u0438\u0441\u0442\u044b\u043c \u043e\u0431\u043b\u0430\u043a\u0430\u043c \u0438\u0437 Witcher 3: Blood and Wine.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0434\u0440\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f81\/eb8\/a49\/f81eb8a49dc315ef04d72b582fba869b.png\"><\/div>\n<p>  <i>\u0414\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/885\/b27\/206\/885b2720624e7a455987bb6239d0e371.png\"><\/div>\n<p>  <i>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8f2\/033\/d27\/8f2033d27bc9d8a498716c85be1be1c0.png\"><\/div>\n<p>  <i>\u041f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/i><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430 \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435. \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043e\u043d \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b, \u0447\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0435\u0433\u043e \u044f\u0440\u043a\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/h3>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435. \u041c\u0435\u0448 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0443\u043f\u043e\u043b \u043d\u0435\u0431\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b4c\/774\/8de\/b4c7748de95ad07f2dddfc090e62e0d2.jpg\"><\/div>\n<p>  \u0412\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0-1], \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0448 \u043d\u0430 \u0442\u043e\u0447\u043a\u0435 (0,0,0), \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 worldViewProj \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 (\u043d\u0430\u043c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043c\u0435\u0448 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0434\u043e\u043b\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 XY (\u043e\u0441\u044c Z \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0432\u0435\u0440\u0445), \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0447\u0435\u043c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/341\/0ca\/95e\/3410ca95ea9f0b3ef1fafe62cb5dba13.jpg\"><\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043c\u0435\u0448 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445. \u0422\u0430\u043a\u0436\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u2014 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u0415\u0449\u0451 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430 (\u0435\u0433\u043e \u0446\u0432\u0435\u0442 \u0438 \u044f\u0440\u043a\u043e\u0441\u0442\u044c).<\/p>\n<h3>\u041f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/h3>\n<p>  \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\"> ps_5_0       dcl_globalFlags refactoringAllowed       dcl_constantbuffer cb0[10], immediateIndexed       dcl_constantbuffer cb1[9], immediateIndexed       dcl_constantbuffer cb12[238], immediateIndexed       dcl_constantbuffer cb4[13], immediateIndexed       dcl_sampler s0, mode_default       dcl_resource_texture2d (float,float,float,float) t0       dcl_resource_texture2d (float,float,float,float) t1       dcl_input_ps linear v0.xyzw       dcl_input_ps linear v1.xyzw       dcl_input_ps linear v2.w       dcl_input_ps linear v3.xyzw       dcl_input_ps linear v4.xyz       dcl_input_ps linear v5.xyz       dcl_output o0.xyzw       dcl_temps 4      0: mul r0.xyz, cb0[9].xyzx, l(1.000000, 1.000000, -1.000000, 0.000000)      1: dp3 r0.w, r0.xyzx, r0.xyzx      2: rsq r0.w, r0.w      3: mul r0.xyz, r0.wwww, r0.xyzx      4: mul r1.xy, cb0[0].xxxx, cb4[5].xyxx      5: mad r1.xy, v1.xyxx, cb4[4].xyxx, r1.xyxx      6: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0      7: add r1.xyz, r1.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)      8: add r1.xyz, r1.xyzx, r1.xyzx      9: dp3 r0.w, r1.xyzx, r1.xyzx     10: rsq r0.w, r0.w     11: mul r1.xyz, r0.wwww, r1.xyzx     12: mul r2.xyz, r1.yyyy, v3.xyzx     13: mad r2.xyz, v5.xyzx, r1.xxxx, r2.xyzx     14: mov r3.xy, v1.zwzz     15: mov r3.z, v3.w     16: mad r1.xyz, r3.xyzx, r1.zzzz, r2.xyzx     17: dp3_sat r0.x, r0.xyzx, r1.xyzx     18: add r0.y, -cb4[2].x, cb4[3].x     19: mad r0.x, r0.x, r0.y, cb4[2].x     20: dp2 r0.y, -cb0[9].xyxx, -cb0[9].xyxx     21: rsq r0.y, r0.y     22: mul r0.yz, r0.yyyy, -cb0[9].xxyx     23: add r1.xyz, -v4.xyzx, cb1[8].xyzx     24: dp3 r0.w, r1.xyzx, r1.xyzx     25: rsq r1.z, r0.w     26: sqrt r0.w, r0.w     27: add r0.w, r0.w, -cb4[7].x     28: mul r1.xy, r1.zzzz, r1.xyxx     29: dp2_sat r0.y, r0.yzyy, r1.xyxx     30: add r0.y, r0.y, r0.y     31: min r0.y, r0.y, l(1.000000)     32: add r0.z, -cb4[0].x, cb4[1].x     33: mad r0.z, r0.y, r0.z, cb4[0].x     34: mul r0.x, r0.x, r0.z     35: log r0.x, r0.x     36: mul r0.x, r0.x, l(2.200000)     37: exp r0.x, r0.x     38: add r1.xyz, cb12[236].xyzx, -cb12[237].xyzx     39: mad r1.xyz, r0.yyyy, r1.xyzx, cb12[237].xyzx     40: mul r2.xyz, r0.xxxx, r1.xyzx     41: mad r0.xyz, -r1.xyzx, r0.xxxx, v0.xyzx     42: mad r0.xyz, v0.wwww, r0.xyzx, r2.xyzx     43: add r1.x, -cb4[7].x, cb4[8].x     44: div_sat r0.w, r0.w, r1.x     45: mul r1.x, r1.w, cb4[9].x     46: mad r1.y, -cb4[9].x, r1.w, r1.w     47: mad r0.w, r0.w, r1.y, r1.x     48: mul r1.xy, cb0[0].xxxx, cb4[11].xyxx     49: mad r1.xy, v1.xyxx, cb4[10].xyxx, r1.xyxx     50: sample_indexable(texture2d)(float,float,float,float) r1.x, r1.xyxx, t1.xyzw, s0     51: mad r1.x, r1.x, cb4[12].x, -cb4[12].x     52: mad_sat r1.x, cb4[12].x, v2.w, r1.x     53: mul r0.w, r0.w, r1.x     54: mul_sat r0.w, r0.w, cb4[6].x     55: mul o0.xyz, r0.wwww, r0.xyzx     56: mov o0.w, r0.w     57: ret <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u0440\u0442\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 (\u043a\u0430\u043d\u0430\u043b\u044b <i>xyz<\/i>) \u0438 \u0444\u043e\u0440\u043c\u0443 \u043e\u0431\u043b\u0430\u043a\u0430 (\u043a\u0430\u043d\u0430\u043b <i>a<\/i>). \u0412\u0442\u043e\u0440\u0430\u044f \u2014 \u044d\u0442\u043e \u0448\u0443\u043c \u0434\u043b\u044f \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1f3\/c27\/a5e\/1f3c27a5eea1412d5fa1fa632861a342.jpg\"><\/div>\n<p>  <i>\u041a\u0430\u0440\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c CD Projekt Red<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/37b\/a53\/d41\/37ba53d412d20f476ddf71e81892b62a.jpg\"><\/div>\n<p>  <i>\u0424\u043e\u0440\u043c\u0430 \u043e\u0431\u043b\u0430\u043a\u0430, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c CD Projekt Red<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/05e\/1bb\/edd\/05e1bbedded7c16acefc1f67d5b3fd49.jpg\"><\/div>\n<p>  <i>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0448\u0443\u043c\u0430, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c CD Projekt Red<\/i><\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u2014 \u044d\u0442\u043e cb4. \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/942\/229\/4de\/9422294de7d9ead5e2bec154eb897c7a.jpg\"><\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 cbuffer-\u043e\u0432. \u041d\u0435 \u0432\u043e\u043b\u043d\u0443\u0439\u0442\u0435\u0441\u044c, \u0438\u0445 \u043c\u044b \u0442\u043e\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c.<\/p>\n<h4>\u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u043e\u0441\u0438 Z \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430<\/h4>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430, \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u043e\u0441\u0438 Z:<\/p>\n<pre><code class=\"cpp\">   0: mul r0.xyz, cb0[9].xyzx, l(1.000000, 1.000000, -1.000000, 0.000000)      1: dp3 r0.w, r0.xyzx, r0.xyzx      2: rsq r0.w, r0.w      3: mul r0.xyz, r0.wwww, r0.xyzx       float3 invertedSunlightDir = normalize(lightDir * float3(1, 1, -1) );<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u043e\u0441\u044c Z \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0432\u0435\u0440\u0445, \u0430 cb0[9] \u2014 \u044d\u0442\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430. \u042d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d <b>\u043d\u0430<\/b> \u0421\u043e\u043b\u043d\u0446\u0435 \u2014 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e! \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 NdotL, \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0432 \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0445\u043e\u0434 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u0421\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0431\u043b\u0430\u043a\u043e\u0432<\/h4>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 texcoords \u0434\u043b\u044f \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438 \u0435\u0433\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">   4: mul r1.xy, cb0[0].xxxx, cb4[5].xyxx       5: mad r1.xy, v1.xyxx, cb4[4].xyxx, r1.xyxx       6: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0       7: add r1.xyz, r1.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)       8: add r1.xyz, r1.xyzx, r1.xyzx       9: dp3 r0.w, r1.xyzx, r1.xyzx      10: rsq r0.w, r0.w               \/\/ Calc sampling coords      float2 cloudTextureUV = Texcoords * textureScale + elapsedTime * speedFactors;          \/\/ Sample texture and get data from it      float4 cloudTextureValue = texture0.Sample( sampler0, cloudTextureUV ).rgba;      float3 normalMap = cloudTextureValue.xyz;      float cloudShape = cloudTextureValue.a;          \/\/ Unpack normal and normalize it      float3 unpackedNormal = (normalMap - 0.5) * 2.0;      unpackedNormal = normalize(unpackedNormal);<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 (<i>cb[0].x<\/i>) \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0439 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u043b\u0430\u043a\u0430 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043f\u043e \u043d\u0435\u0431\u0443 (<i>cb4[5].xy<\/i>).<\/p>\n<p>  \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435, UV \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442\u044b \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043a\u0443\u043f\u043e\u043b\u0430 \u043d\u0435\u0431\u0430, \u0438 \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u044b \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 (<i>cb4[4].xy<\/i>).<\/p>\n<p>  \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"cpp\">samplingUV = Input.TextureUV * textureScale + time * speedMultiplier;<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 4 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 (\u043a\u0430\u043d\u0430\u043b\u044b rgb) \u0438 \u0444\u043e\u0440\u043c\u0430 \u043e\u0431\u043b\u0430\u043a\u0430 (\u043a\u0430\u043d\u0430\u043b a).<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0; 1] \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [-1; 1] \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<\/p>\n<pre><code class=\"cpp\">unpackedNormal = (packedNormal - 0.5) * 2.0;<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e:<\/p>\n<pre><code class=\"cpp\">unpackedNormal = packedNormal * 2.0 - 1.0;<\/code><\/pre>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<h4>\u041d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439<\/h4>\n<p>  \u0418\u043c\u0435\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0438, \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438 \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">  11: mul r1.xyz, r0.wwww, r1.xyzx     12: mul r2.xyz, r1.yyyy, v3.xyzx     13: mad r2.xyz, v5.xyzx, r1.xxxx, r2.xyzx     14: mov r3.xy, v1.zwzz     15: mov r3.z, v3.w     16: mad r1.xyz, r3.xyzx, r1.zzzz, r2.xyzx           \/\/ Perform bump mapping      float3 SkyTangent = Input.Tangent;      float3 SkyNormal = (float3( Input.Texcoords.zw, Input.param3.w ));      float3 SkyBitangent = Input.param3.xyz;               float3x3 TBN = float3x3(SkyTangent, SkyBitangent, SkyNormal);      float3 finalNormal = (float3)mul( unpackedNormal, (TBN) );<\/code><\/pre>\n<p>  <\/p>\n<h4>\u042f\u0440\u043a\u043e\u0441\u0442\u044c \u0437\u0430\u0441\u0432\u0435\u0442\u043e\u0432 (1)<\/h4>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 NdotL \u0438 \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u0437\u0430\u0441\u0432\u0435\u0442\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">  17: dp3_sat r0.x, r0.xyzx, r1.xyzx     18: add r0.y, -cb4[2].x, cb4[3].x     19: mad r0.x, r0.x, r0.y, cb4[2].x  <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f NdotL \u043d\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u043c \u043a\u0430\u0434\u0440\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/283\/f29\/1a1\/283f291a18105785a51af59dbbe8905a.png\"><\/div>\n<p>  \u042d\u0442\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 (\u0441 \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 minIntensity \u0438 maxIntensity. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u044b\u0435 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u043c \u0441\u0432\u0435\u0442\u043e\u043c, \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u044f\u0440\u043a\u0438\u043c\u0438.<\/p>\n<pre><code class=\"cpp\">   \/\/ Calculate cosine between normal and up-inv lightdir      float NdotL = saturate( dot(invertedSunlightDir, finalNormal) );          \/\/ Param 1, line 19, r0.x      float intensity1 = lerp( param1Min, param1Max, NdotL );<\/code><\/pre>\n<p>  <\/p>\n<h4>\u042f\u0440\u043a\u043e\u0441\u0442\u044c \u0437\u0430\u0441\u0432\u0435\u0442\u043e\u0432 (2)<\/h4>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442\u043e\u0440, \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0439 \u043d\u0430 \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e\u0432.<\/p>\n<p>  \u041e\u0431\u043b\u0430\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0435\u0431\u0430, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u043b\u043d\u0446\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 XY.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 min\/max, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0447\u0430\u0441\u0442\u0438 (1).<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u0430\u0442\u0435\u043c\u043d\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0442 \u0441\u043e\u043b\u043d\u0446\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <i>param2Min<\/i> \u0438 <i>param2Max<\/i> (<i>cb4[0].x<\/i> \u0438 <i>cb4[1].x<\/i>) \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.0f.<\/p>\n<pre><code class=\"cpp\">  20: dp2 r0.y, -cb0[9].xyxx, -cb0[9].xyxx     21: rsq r0.y, r0.y     22: mul r0.yz, r0.yyyy, -cb0[9].xxyx     23: add r1.xyz, -v4.xyzx, cb1[8].xyzx     24: dp3 r0.w, r1.xyzx, r1.xyzx     25: rsq r1.z, r0.w     26: sqrt r0.w, r0.w     27: add r0.w, r0.w, -cb4[7].x     28: mul r1.xy, r1.zzzz, r1.xyxx     29: dp2_sat r0.y, r0.yzyy, r1.xyxx     30: add r0.y, r0.y, r0.y     31: min r0.y, r0.y, l(1.000000)     32: add r0.z, -cb4[0].x, cb4[1].x     33: mad r0.z, r0.y, r0.z, cb4[0].x     34: mul r0.x, r0.x, r0.z     35: log r0.x, r0.x     36: mul r0.x, r0.x, l(2.200000)     37: exp r0.x, r0.x               \/\/ Calculate normalized -lightDir.xy (20-22)      float2 lightDirXY = normalize( -lightDir.xy );          \/\/ Calculate world to camera      float3 vWorldToCamera = ( CameraPos - WorldPos );      float worldToCamera_distance = length(vWorldToCamera);               \/\/ normalize vector      vWorldToCamera = normalize( vWorldToCamera );                   float LdotV = saturate( dot(lightDirXY, vWorldToCamera.xy) );      float highlightedSkySection = saturate( 2*LdotV );      float intensity2 = lerp( param2Min, param2Max, highlightedSkySection );          float finalIntensity = pow( intensity2 *intensity1, 2.2);<\/code><\/pre>\n<p>  \u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043e\u0431\u0435 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c 2.2.<\/p>\n<h4>\u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432<\/h4>\n<p>  \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0445 \u0446\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0440\u044f\u0434\u043e\u043c \u0441 \u0441\u043e\u043b\u043d\u0446\u0435\u043c \u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0435\u0431\u0430. \u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 <i>highlightedSkySection<\/i>.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <i>finalIntensity<\/i>.<\/p>\n<p>  \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u0443\u043c\u0430\u043d\u043e\u043c (\u0438\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043d \u0431\u044b\u043b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c).<\/p>\n<pre><code class=\"cpp\">  38: add r1.xyz, cb12[236].xyzx, -cb12[237].xyzx     39: mad r1.xyz, r0.yyyy, r1.xyzx, cb12[237].xyzx     40: mul r2.xyz, r0.xxxx, r1.xyzx     41: mad r0.xyz, -r1.xyzx, r0.xxxx, v0.xyzx     42: mad r0.xyz, v0.wwww, r0.xyzx, r2.xyzx         float3 cloudsColor = lerp( cloudsColorBack, cloudsColorFront, highlightedSunSection );     cloudsColor *= finalIntensity;     cloudsColor = lerp( cloudsColor, FogColor, FogAmount );<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0414\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430 \u0431\u044b\u043b\u0438 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435<\/h4>\n<p>  \u041d\u0430 \u043a\u0430\u0434\u0440\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e\u0442 \u0441\u043b\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0432\u0438\u0434\u0438\u043c \u0440\u044f\u0434\u043e\u043c \u0441 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c, \u0447\u0435\u043c \u043d\u0430\u0434 \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b\u0438 \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <i>worldToCamera<\/i>:<\/p>\n<pre><code class=\"cpp\">  23: add r1.xyz, -v4.xyzx, cb1[8].xyzx     24: dp3 r0.w, r1.xyzx, r1.xyzx     25: rsq r1.z, r0.w     26: sqrt r0.w, r0.w<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0439\u0434\u0451\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">  26: sqrt r0.w, r0.w     27: add r0.w, r0.w, -cb4[7].x     ...     43: add r1.x, -cb4[7].x, cb4[8].x     44: div_sat r0.w, r0.w, r1.x<\/code><\/pre>\n<p>  \u041e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0443\u0442 \u0443 \u043d\u0430\u0441?<\/p>\n<p>  cb[7].x \u0438 cb[8].x \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 2000.0 \u0438 7000.0.<\/p>\n<p>  \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>linstep<\/b>.<\/p>\n<p>  \u041e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: <i>min\/max<\/i> \u2014 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438 <i>v<\/i> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u0435\u0441\u043b\u0438 <i>v<\/i> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [<i>min<\/i>&#8212;<i>max<\/i>], \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0.0 \u2014 1.0]. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 <i>v<\/i> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0442\u043e linstep \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0.0 \u0438\u043b\u0438 1.0.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">linstep( 1000.0, 2000.0, 999.0) = 0.0 linstep( 1000.0, 2000.0, 1500.0) = 0.5 linstep( 1000.0, 2000.0, 2000.0) = 1.0<\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/desktop\/direct3dhlsl\/dx-graphics-hlsl-smoothstep\" rel=\"nofollow\">smoothstep<\/a> \u0438\u0437 HLSL, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0440\u043c\u0438\u0442\u043e\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Linstep \u043d\u0435\u0442 \u0432 HLSL, \u043d\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u0421\u0442\u043e\u0438\u0442 \u0438\u043c\u0435\u0442\u044c \u0435\u0451 \u0432 \u0441\u0432\u043e\u0451\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<pre><code class=\"cpp\"> \/\/ linstep:    \/\/    \/\/ Returns a linear interpolation between 0 and 1 if t is in the range [min, max]     \/\/ if &quot;v&quot; is &lt;= min, the output is 0    \/\/ if &quot;v&quot; i &gt;= max, the output is 1        float linstep( float min, float max, float v )    {      return saturate( (v - min) \/ (max - min) );    } <\/code><\/pre>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a Witcher 3: \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0433\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u0431\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u0438\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">  45: mul r1.x, r1.w, cb4[9].x     46: mad r1.y, -cb4[9].x, r1.w, r1.w     47: mad r0.w, r0.w, r1.y, r1.x          float distanceAttenuation = linstep( fadeDistanceStart, fadeDistanceEnd, worldToCamera_distance );           float fadedCloudShape = closeCloudsHidingFactor * cloudShape;      cloudShape = lerp( fadedCloudShape, cloudShape, distanceAttenuation );<\/code><\/pre>\n<p>  <i>cloudShape<\/i> \u2014 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b .a \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0430 <i>closeCloudsHidingFactor<\/i> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043d\u0430\u0434 \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430. \u0412\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0439 \u043a\u0430\u0434\u0440\u0430\u0445 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0432\u043d\u043e 0.0, \u0447\u0442\u043e \u0440\u0430\u0432\u043d\u043e\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044e \u043e\u0431\u043b\u0430\u043a\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 <i>distanceAttenuation<\/i> \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a 1.0 (\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e \u043a\u0443\u043f\u043e\u043b\u0430 \u043d\u0435\u0431\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f), \u043e\u0431\u043b\u0430\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438.<\/p>\n<h4>\u0421\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0448\u0443\u043c\u0430<\/h4>\n<p>  \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0448\u0443\u043c\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 <i>textureScale<\/i> \u0438 <i>speedMultiplier<\/i>.<\/p>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0434\u043b\u044f \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u044d\u043c\u043f\u043b\u0435\u0440 \u0441\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 <b>wrap<\/b>.<\/p>\n<pre><code class=\"cpp\">  48: mul r1.xy, cb0[0].xxxx, cb4[11].xyxx     49: mad r1.xy, v1.xyxx, cb4[10].xyxx, r1.xyxx     50: sample_indexable(texture2d)(float,float,float,float) r1.x, r1.xyxx, t1.xyzw, s0          \/\/ Calc sampling coords for noise      float2 noiseTextureUV = Texcoords * textureScaleNoise + elapsedTime * speedFactorsNoise;          \/\/ Sample texture and get data from it      float noiseTextureValue = texture1.Sample( sampler0, noiseTextureUV ).x;<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0435<\/h4>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 cloudShape.<\/p>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c param2.w (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u0435\u043d 1.0) \u0438 noiseMult (\u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 5.0, \u0432\u0437\u044f\u0442\u043e\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442).<\/p>\n<p>  \u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u2014 \u044d\u0442\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>generalCloudsVisibility<\/i>, \u0432\u043b\u0438\u044f\u044e\u0449\u0435\u0435 \u043d\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u043a\u043e\u0432.<\/p>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430. \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0446\u0432\u0435\u0442 <i>cloudsColor<\/i> \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0430\u043b\u044c\u0444\u0430-\u043a\u0430\u043d\u0430\u043b.<\/p>\n<pre><code class=\"cpp\">  51: mad r1.x, r1.x, cb4[12].x, -cb4[12].x   52: mad_sat r1.x, cb4[12].x, v2.w, r1.x   53: mul r0.w, r0.w, r1.x   54: mul_sat r0.w, r0.w, cb4[6].x   55: mul o0.xyz, r0.wwww, r0.xyzx   56: mov o0.w, r0.w   57: ret        \/\/ Sample noise texture and get data from it      float noiseTextureValue = texture1.Sample( sampler0, noiseTextureUV ).x;      noiseTextureValue = noiseTextureValue * noiseMult - noiseMult;            float noiseValue = saturate( noiseMult * Input.param2.w + noiseTextureValue);      noiseValue *= cloudShape;            float finalNoise = saturate( noiseValue * generalCloudsVisibility);          return float4( cloudsColor*finalNoise, finalNoise ); <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>  \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<p>  \u041c\u043e\u0436\u0435\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c. \u041f\u0435\u0440\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u2014 \u043c\u043e\u0439 \u0448\u0435\u0439\u0434\u0435\u0440, \u0432\u0442\u043e\u0440\u0430\u044f \u2014 \u0448\u0435\u0439\u0434\u0435\u0440 \u0438\u0433\u0440\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4cc\/331\/897\/4cc3318976e9c1c54178683a2fee44c0.jpg\"><\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0442\u043e \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u044b\u043b\u043e\u0436\u0435\u043d <a href=\"https:\/\/pastebin.com\/AjGjbF0N\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 2. \u0422\u0443\u043c\u0430\u043d<\/h2>\n<p>  \u0422\u0443\u043c\u0430\u043d \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/desktop\/direct3d9\/fog-formulas\" rel=\"nofollow\">\u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d<\/a> \u0438 \u043f\u043e\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u0441 \u044d\u0442\u0438\u043c, \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e). \u0416\u0438\u0437\u043d\u044c \u0432 \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u0442\u043a\u0440\u044b\u043b\u0430 \u043d\u0430\u043c \u0434\u0432\u0435\u0440\u0438 \u043a \u043d\u043e\u0432\u044b\u043c \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u043c, \u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u2014 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e\u0447\u043d\u044b\u043c \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c.<\/p>\n<p>  \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0442\u0443\u043c\u0430\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u043c. \u0432 <a href=\"https:\/\/bartwronski.files.wordpress.com\/2014\/08\/bwronski_volumetric_fog_siggraph2014.pdf\" rel=\"nofollow\">\u044d\u0442\u043e\u0439<\/a> \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0411\u0430\u0440\u0442\u0430 \u0412\u0440\u043e\u043d\u0441\u043a\u0438 ).<\/p>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u0430 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 2014 \u0433\u043e\u0434\u0443, \u0430 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a 3\u00bb \u0431\u044b\u043b \u0432\u044b\u043f\u0443\u0449\u0435\u043d \u0432 2015\/2016 \u0433\u043e\u0434\u0430\u0445, \u0442\u0443\u043c\u0430\u043d \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0433\u043e\u0434 \u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0443\u043c\u0430\u043d\u0435 Witcher 3 \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043f\u044f\u0442\u044c \u0440\u0430\u0437, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0442\u0435\u0440\u043f\u0435\u043b \u043d\u0435\u0443\u0434\u0430\u0447\u0443. \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u0430\u043a \u0432\u044b \u0441\u043a\u043e\u0440\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u0435\u043d, \u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u043d\u0430 HLSL \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0448\u0435\u0439\u0434\u0435\u0440 \u0442\u0443\u043c\u0430\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u0440\u0438\u0432\u043b\u0451\u043a \u043c\u043e\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0435\u0439 \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u0441 \u0442\u0443\u043c\u0430\u043d\u043e\u043c \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0430 3\u00bb \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u043c\u0451\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u042d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0435 \u0431\u044b\u043b \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0432 \u0438\u0433\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0435\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042f \u0445\u043e\u0447\u0443 \u044d\u0442\u0438\u043c \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043d\u0430 HLSL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0437\u0434\u0435\u0441\u044c \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0431\u044b\u043b\u0430, \u0437\u0430 \u0434\u0432\u0443\u043c\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0430\/\u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0435 \u043c\u043d\u043e\u0439. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<p>  \u0412\u043e\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u2014 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0438\u0433\u0440\u044b (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 2015 \u0433\u043e\u0434\u0430 \u0438 \u043e\u0431\u0435\u0438\u0445 DLC):<\/p>\n<pre><code class=\"cpp\"> ps_5_0       dcl_globalFlags refactoringAllowed       dcl_constantbuffer cb3[2], immediateIndexed       dcl_constantbuffer cb12[214], immediateIndexed       dcl_resource_texture2d (float,float,float,float) t0       dcl_resource_texture2d (float,float,float,float) t1       dcl_resource_texture2d (float,float,float,float) t2       dcl_input_ps_siv v0.xy, position       dcl_output o0.xyzw       dcl_temps 7      0: ftou r0.xy, v0.xyxx      1: mov r0.zw, l(0, 0, 0, 0)      2: ld_indexable(texture2d)(float,float,float,float) r1.x, r0.xyww, t0.xyzw      3: mad r1.y, r1.x, cb12[22].x, cb12[22].y      4: lt r1.y, r1.y, l(1.000000)      5: if_nz r1.y      6:  utof r1.yz, r0.xxyx      7:  mul r2.xyzw, r1.zzzz, cb12[211].xyzw      8:  mad r2.xyzw, cb12[210].xyzw, r1.yyyy, r2.xyzw      9:  mad r1.xyzw, cb12[212].xyzw, r1.xxxx, r2.xyzw     10:  add r1.xyzw, r1.xyzw, cb12[213].xyzw     11:  div r1.xyz, r1.xyzx, r1.wwww     12:  ld_indexable(texture2d)(float,float,float,float) r2.xyz, r0.xyww, t1.xyzw     13:  ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, t2.xyzw     14:  max r0.x, r0.x, cb3[1].x     15:  add r0.yzw, r1.xxyz, -cb12[0].xxyz     16:  dp3 r1.x, r0.yzwy, r0.yzwy     17:  sqrt r1.x, r1.x     18:  add r1.y, r1.x, -cb3[0].x     19:  add r1.zw, -cb3[0].xxxz, cb3[0].yyyw     20:  div_sat r1.y, r1.y, r1.z     21:  mad r1.y, r1.y, r1.w, cb3[0].z     22:  add r0.x, r0.x, l(-1.000000)     23:  mad r0.x, r1.y, r0.x, l(1.000000)     24:  div r0.yzw, r0.yyzw, r1.xxxx     25:  mad r1.y, r0.w, cb12[22].z, cb12[0].z     26:  add r1.x, r1.x, -cb12[22].z     27:  max r1.x, r1.x, l(0)     28:  min r1.x, r1.x, cb12[42].z     29:  mul r1.z, r0.w, r1.x     30:  mul r1.w, r1.x, cb12[43].x     31:  mul r1.zw, r1.zzzw, l(0.000000, 0.000000, 0.062500, 0.062500)     32:  dp3 r0.y, cb12[38].xyzx, r0.yzwy     33:  add r0.z, r0.y, cb12[42].x     34:  add r0.w, cb12[42].x, l(1.000000)     35:  div_sat r0.z, r0.z, r0.w     36:  add r0.w, -cb12[43].z, cb12[43].y     37:  mad r0.z, r0.z, r0.w, cb12[43].z     38:  mul r0.w, abs(r0.y), abs(r0.y)     39:  mad_sat r2.w, r1.x, l(0.002000), l(-0.300000)     40:  mul r0.w, r0.w, r2.w     41:  lt r0.y, l(0), r0.y     42:  movc r3.xyz, r0.yyyy, cb12[39].xyzx, cb12[41].xyzx     43:  add r3.xyz, r3.xyzx, -cb12[40].xyzx     44:  mad r3.xyz, r0.wwww, r3.xyzx, cb12[40].xyzx     45:  movc r4.xyz, r0.yyyy, cb12[45].xyzx, cb12[47].xyzx     46:  add r4.xyz, r4.xyzx, -cb12[46].xyzx     47:  mad r4.xyz, r0.wwww, r4.xyzx, cb12[46].xyzx     48:  ge r0.y, r1.x, cb12[48].y     49:  if_nz r0.y     50:   add r0.y, r1.y, cb12[42].y     51:   mul r0.w, r0.z, r0.y     52:   mul r1.y, r0.z, r1.z     53:   mad r5.xyzw, r1.yyyy, l(16.000000, 15.000000, 14.000000, 13.000000), r0.wwww     54:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)     55:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     56:   div_sat r5.xyzw, r1.wwww, r5.xyzw     57:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     58:   mul r1.z, r5.y, r5.x     59:   mul r1.z, r5.z, r1.z     60:   mul r1.z, r5.w, r1.z     61:   mad r5.xyzw, r1.yyyy, l(12.000000, 11.000000, 10.000000, 9.000000), r0.wwww     62:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)     63:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     64:   div_sat r5.xyzw, r1.wwww, r5.xyzw     65:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     66:   mul r1.z, r1.z, r5.x     67:   mul r1.z, r5.y, r1.z     68:   mul r1.z, r5.z, r1.z     69:   mul r1.z, r5.w, r1.z     70:   mad r5.xyzw, r1.yyyy, l(8.000000, 7.000000, 6.000000, 5.000000), r0.wwww     71:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)     72:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     73:   div_sat r5.xyzw, r1.wwww, r5.xyzw     74:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     75:   mul r1.z, r1.z, r5.x     76:   mul r1.z, r5.y, r1.z     77:   mul r1.z, r5.z, r1.z     78:   mul r1.z, r5.w, r1.z     79:   mad r5.xy, r1.yyyy, l(4.000000, 3.000000, 0.000000, 0.000000), r0.wwww     80:   max r5.xy, r5.xyxx, l(0, 0, 0, 0)     81:   add r5.xy, r5.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)     82:   div_sat r5.xy, r1.wwww, r5.xyxx     83:   add r5.xy, -r5.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)     84:   mul r1.z, r1.z, r5.x     85:   mul r1.z, r5.y, r1.z     86:   mad r0.w, r1.y, l(2.000000), r0.w     87:   max r0.w, r0.w, l(0)     88:   add r0.w, r0.w, l(1.000000)     89:   div_sat r0.w, r1.w, r0.w     90:   add r0.w, -r0.w, l(1.000000)     91:   mul r0.w, r0.w, r1.z     92:   mad r0.y, r0.y, r0.z, r1.y     93:   max r0.y, r0.y, l(0)     94:   add r0.y, r0.y, l(1.000000)     95:   div_sat r0.y, r1.w, r0.y     96:   add r0.y, -r0.y, l(1.000000)     97:   mad r0.y, -r0.w, r0.y, l(1.000000)     98:   add r0.z, r1.x, -cb12[48].y     99:   mul_sat r0.z, r0.z, cb12[48].z     100:  else     101:   mov r0.yz, l(0.000000, 1.000000, 0.000000, 0.000000)     102:  endif     103:  log r0.y, r0.y     104:  mul r0.w, r0.y, cb12[42].w     105:  exp r0.w, r0.w     106:  mul r0.y, r0.y, cb12[48].x     107:  exp r0.y, r0.y     108:  mul r0.yw, r0.yyyw, r0.zzzz     109:  mad_sat r1.xy, r0.wwww, cb12[189].xzxx, cb12[189].ywyy     110:  add r5.xyz, -r3.xyzx, cb12[188].xyzx     111:  mad r5.xyz, r1.xxxx, r5.xyzx, r3.xyzx     112:  add r0.z, cb12[188].w, l(-1.000000)     113:  mad r0.z, r1.y, r0.z, l(1.000000)     114:  mul_sat r5.w, r0.z, r0.w     115:  lt r0.z, l(0), cb12[192].x     116:  if_nz r0.z     117:   mad_sat r1.xy, r0.wwww, cb12[191].xzxx, cb12[191].ywyy     118:   add r6.xyz, -r3.xyzx, cb12[190].xyzx     119:   mad r3.xyz, r1.xxxx, r6.xyzx, r3.xyzx     120:   add r0.z, cb12[190].w, l(-1.000000)     121:   mad r0.z, r1.y, r0.z, l(1.000000)     122:   mul_sat r3.w, r0.z, r0.w     123:   add r1.xyzw, -r5.xyzw, r3.xyzw     124:   mad r5.xyzw, cb12[192].xxxx, r1.xyzw, r5.xyzw     125:  endif     126:  mul r0.z, r0.x, r5.w     127:  mul r0.x, r0.x, r0.y     128:  dp3 r0.y, l(0.333000, 0.555000, 0.222000, 0.000000), r2.xyzx     129:  mad r1.xyz, r0.yyyy, r4.xyzx, -r2.xyzx     130:  mad r0.xyw, r0.xxxx, r1.xyxz, r2.xyxz     131:  add r1.xyz, -r0.xywx, r5.xyzx     132:  mad r0.xyz, r0.zzzz, r1.xyzx, r0.xywx     133: else     134:  mov r0.xyz, l(0, 0, 0, 0)     135: endif     136: mov o0.xyz, r0.xyzx     137: mov o0.w, l(1.000000)     138: ret <\/code><\/pre>\n<p>  \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0439. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043a\u0430\u0442\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b \u0441 \u0442\u0443\u043c\u0430\u043d\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/375\/d59\/f51\/375d59f5199e791efd99c218a0ea6f53.jpg\"><\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d, Ambient Occlusion \u0438 \u0431\u0443\u0444\u0435\u0440 HDR-\u0446\u0432\u0435\u0442\u043e\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9ea\/24d\/ff0\/9ea24dff07dad409a78834272d553b29.jpg\"><\/div>\n<p>  <i>\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3e7\/c8f\/e3e\/3e7c8fe3ee0dc58e3007f9a1bad7f877.jpg\"><\/div>\n<p>  <i>\u0412\u0445\u043e\u0434\u044f\u0449\u0435\u0435 ambient occlusion<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/748\/51f\/f3c\/74851ff3ce8d38b77d9319329a334d4f.jpg\"><\/div>\n<p>  <i>\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 HDR-\u0446\u0432\u0435\u0442\u0430<\/i><\/p>\n<p>  \u2026 \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1ee\/2f8\/5ad\/1ee2f85adc2cc870769985308b6dcc48.jpg\"><\/div>\n<p>  <i>HDR-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d\u0430<\/i><\/p>\n<p>  \u0411\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043c\u0438\u0440\u0435. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 Witcher 3.<\/p>\n<p>  \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 ambient occlusion (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0437\u0430\u0442\u0435\u043c\u043d\u0438\u0442\u044c \u0442\u0443\u043c\u0430\u043d. \u041e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u0430\u044f \u0438\u0434\u0435\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f, \u043d\u043e \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0443\u043c\u0430\u043b \u043e\u0431 \u044d\u0442\u043e\u043c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041f\u043e\u0437\u0436\u0435 \u044f \u0432\u0435\u0440\u043d\u0443\u0441\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0430\u0441\u043f\u0435\u043a\u0442\u0443.<\/p>\n<p>  \u0428\u0435\u0439\u0434\u0435\u0440 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430 \u043d\u0435\u0431\u0435. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043d\u0435\u0431\u0435 (depth == 1.0), \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0451\u0440\u043d\u044b\u0439 \u0446\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0446\u0435\u043d\u0435 (depth &lt; 1.0), \u0442\u043e \u043c\u044b \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u043c\u0438\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d (\u0441\u0442\u0440\u043e\u043a\u0438 7-11) \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430.<\/p>\n<p>  \u041f\u0440\u043e\u0445\u043e\u0434 \u0442\u0443\u043c\u0430\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u0412 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043b\u0438 \u0432\u043e\u043b\u043e\u0441\u044b\/\u043b\u0438\u0446\u043e\/\u0433\u043b\u0430\u0437\u0430 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u0442\u0443\u043c\u0430\u043d\u0435 \u0432 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb: \u043e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u2014 \u00ab\u0446\u0432\u0435\u0442\u0430 \u0442\u0443\u043c\u0430\u043d\u0430\u00bb \u0438 \u00ab\u0446\u0432\u0435\u0442\u0430 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b\u00bb.<\/p>\n<pre><code class=\"cpp\"> struct FogResult    {       float4 paramsFog;     \/\/ RGB: color, A: influence       float4 paramsAerial;  \/\/ RGB: color, A: influence    };<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0446\u0432\u0435\u0442\u0430: \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438 \u0437\u0430\u0434\u043d\u0438\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u00abFogColorFront\u00bb, \u00abFogColorMiddle\u00bb, \u00abAerialColorBack\u00bb \u0438 \u0442.\u043f\u2026 \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0b2\/cd0\/55d\/0b2cd055d9f6876c57527b9934b3b6ad.png\"><\/div>\n<p>  <\/p>\n<pre><code class=\"cpp\">   \/\/ *** Inputs *** \/\/      float3 FogSunDir = cb12_v38.xyz;      float3 FogColorFront = cb12_v39.xyz;      float3 FogColorMiddle = cb12_v40.xyz;      float3 FogColorBack = cb12_v41.xyz;            float4 FogBaseParams = cb12_v42;      float4 FogDensityParamsScene = cb12_v43;      float4 FogDensityParamsSky = cb12_v44;            float3 AerialColorFront = cb12_v45.xyz;      float3 AerialColorMiddle = cb12_v46.xyz;      float3 AerialColorBack = cb12_v47.xyz;      float4 AerialParams = cb12_v48;<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0428\u0435\u0439\u0434\u0435\u0440 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u043c\u0438\u0440\u0435, \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b (cb12[0].xyz) \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0442\u0443\u043c\u0430\u043d\u0430\/\u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (cb12[38].xyz). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0438\u0434\u0430 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d\u0430.<\/p>\n<pre><code class=\"cpp\">   float3 frag_vec = fragPosWorldSpace.xyz - customCameraPos.xyz;      float frag_dist = length(frag_vec);            float3 frag_dir = frag_vec \/ frag_dist;          float dot_fragDirSunDir = dot(GlobalLightDirection.xyz, frag_dir);<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">   float3 curr_col_fog;      float3 curr_col_aerial;      {        float _dot = dot_fragDirSunDir;            float _dd = _dot;        {          const float _distOffset = -150;          const float _distRange = 500;          const float _mul = 1.0 \/ _distRange;          const float _bias = _distOffset * _mul;              _dd = abs(_dd);          _dd *= _dd;          _dd *= saturate( frag_dist * _mul + _bias );        }            curr_col_fog = lerp( FogColorMiddle.xyz, (_dot&gt;0.0f ? FogColorFront.xyz : FogColorBack.xyz), _dd );        curr_col_aerial = lerp( AerialColorMiddle.xyz, (_dot&gt;0.0f ? AerialColorFront.xyz : AerialColorBack.xyz), _dd );      }<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u0447\u0451\u0442\u043a\u043e \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0436\u0435 \u0432\u0437\u044f\u043b\u0438\u0441\u044c \u044d\u0442\u0438 0.002 \u0438 -0.300. \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 \u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u00ab\u043f\u0435\u0440\u0435\u0434\u043d\u0438\u043c\u00bb \u0438 \u00ab\u0437\u0430\u0434\u043d\u0438\u043c\u00bb \u0446\u0432\u0435\u0442\u0430\u043c\u0438. \u0423\u043c\u043d\u043e!<\/p>\n<p>  \u0412\u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430 (_dd).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d43\/f03\/ca0\/d43f03ca005d504abd5cd236007f34f4.png\"><\/div>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b\/\u0442\u0443\u043c\u0430\u043d\u0430 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0443 \u043d\u0430\u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0446\u0432\u0435\u0442\u0430 rgb. \u0412 \u043d\u0438\u0445 \u0432\u0445\u043e\u0434\u044f\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u044b. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c raymarching (16 \u0448\u0430\u0433\u043e\u0432, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0446\u0438\u043a\u043b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c) \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0442\u0443\u043c\u0430\u043d\u0430 \u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430:<\/p>\n<p>  \u0418\u043c\u0435\u044f \u0432\u0435\u043a\u0442\u043e\u0440 [\u043a\u0430\u043c\u0435\u0440\u0430 &#8212;&gt; \u043c\u0438\u0440], \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430 16 \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 raymarching-\u0430. \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0438\u0436\u0435, \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 .z (\u0432\u044b\u0441\u043e\u0442\u0430) (<i>curr_pos_z_step<\/i>).<\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0442\u0443\u043c\u0430\u043d\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c raymarching-\u043e\u043c, \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/iquilezles.org\/www\/articles\/fog\/fog.htm\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<pre><code class=\"cpp\">   float fog_amount = 1;      float fog_amount_scale = 0;      [branch]      if ( frag_dist &gt;= AerialParams.y )      {        float curr_pos_z_base = (customCameraPos.z + FogBaseParams.y) * density_factor;        float curr_pos_z_step = frag_step.z * density_factor;            [unroll]        for ( int i=16; i&gt;0; --i )        {          fog_amount *= 1 - saturate( density_sample_scale \/ (1 + max( 0.0, curr_pos_z_base + (i) * curr_pos_z_step ) ) );        }            fog_amount = 1 - fog_amount;        fog_amount_scale = saturate( (frag_dist - AerialParams.y) * AerialParams.z );      }          FogResult ret;          ret.paramsFog = float4 ( curr_col_fog, fog_amount_scale * pow( abs(fog_amount), final_exp_fog ) );      ret.paramsAerial = float4 ( curr_col_aerial, fog_amount_scale * pow( abs(fog_amount), final_exp_aerial ) );<\/code><\/pre>\n<p>  \u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u044b\u0441\u043e\u0442\u044b (\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b .z), \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u0432\u043e\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0442\u0443\u043c\u0430\u043d\u0430\/\u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b.<\/p>\n<p>  <i>final_exp_fog<\/i> and <i>final_exp_aerial<\/i> \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442; \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043c, \u043a\u0430\u043a \u0446\u0432\u0435\u0442\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u0438 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043c\u0438\u0440 \u0441 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u044b.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430<\/h4>\n<p>  \u0412 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c \u043c\u043d\u043e\u0439 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">  109:  mad_sat r1.xy, r0.wwww, cb12[189].xzxx, cb12[189].ywyy     110:  add r5.xyz, -r3.xyzx, cb12[188].xyzx     111:  mad r5.xyz, r1.xxxx, r5.xyzx, r3.xyzx     112:  add r0.z, l(-1.000000), cb12[188].w     113:  mad r0.z, r1.y, r0.z, l(1.000000)     114:  mul_sat r5.w, r0.w, r0.z     115:  lt r0.z, l(0.000000), cb12[192].x     116:  if_nz r0.z     117:   mad_sat r1.xy, r0.wwww, cb12[191].xzxx, cb12[191].ywyy     118:   add r6.xyz, -r3.xyzx, cb12[190].xyzx     119:   mad r3.xyz, r1.xxxx, r6.xyzx, r3.xyzx     120:   add r0.z, l(-1.000000), cb12[190].w     121:   mad r0.z, r1.y, r0.z, l(1.000000)     122:   mul_sat r3.w, r0.w, r0.z     123:   add r1.xyzw, -r5.xyzw, r3.xyzw     124:   mad r5.xyzw, cb12[192].xxxx, r1.xyzw, r5.xyzw     125:  endif<\/code><\/pre>\n<p>  \u0421\u0443\u0434\u044f \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043d\u044f\u0442\u044c, \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0438 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d\u0430:<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (cb12_v192.x \u0440\u0430\u0432\u043d\u043e 0.0), \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e ~0.22, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cc7\/2bd\/1b8\/cc72bd1b8cff0742cf4aad51a7e6ab3f.png\"><\/div>\n<p>  <\/p>\n<pre><code class=\"cpp\"> #ifdef OVERRIDE_FOG            \/\/ Override      float fog_influence = ret.paramsFog.w; \/\/ r0.w          float override1ColorScale = cb12_v189.x;      float override1ColorBias = cb12_v189.y;      float3 override1Color = cb12_v188.rgb;            float override1InfluenceScale = cb12_v189.z;      float override1InfluenceBias = cb12_v189.w;      float override1Influence = cb12_v188.w;            float override1ColorAmount = saturate(fog_influence * override1ColorScale + override1ColorBias);      float override1InfluenceAmount = saturate(fog_influence * override1InfluenceScale + override1InfluenceBias);               float4 paramsFogOverride;      paramsFogOverride.rgb = lerp(curr_col_fog, override1Color, override1ColorAmount ); \/\/ ***r5.xyz             float param1 = lerp(1.0, override1Influence, override1InfluenceAmount); \/\/ r0.x      paramsFogOverride.w = saturate(param1 * fog_influence ); \/\/ ** r5.w                const float extraFogOverride = cb12_v192.x;            [branch]       if (extraFogOverride &gt; 0.0)      {        float override2ColorScale = cb12_v191.x;        float override2ColorBias = cb12_v191.y;        float3 override2Color = cb12_v190.rgb;              float override2InfluenceScale = cb12_v191.z;        float override2InfluenceBias = cb12_v191.w;        float override2Influence = cb12_v190.w;                float override2ColorAmount = saturate(fog_influence * override2ColorScale + override2ColorBias);        float override2InfluenceAmount = saturate(fog_influence * override2InfluenceScale + override2InfluenceBias);                float4 paramsFogOverride2;        paramsFogOverride2.rgb = lerp(curr_col_fog, override2Color, override2ColorAmount); \/\/ r3.xyz                     float ov_param1 = lerp(1.0, override2Influence, override2InfluenceAmount); \/\/ r0.z        paramsFogOverride2.w = saturate(ov_param1 * fog_influence); \/\/ r3.w            paramsFogOverride = lerp(paramsFogOverride, paramsFogOverride2, extraFogOverride);          }      ret.paramsFog = paramsFogOverride;          #endif<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043d\u0430\u0448\u0430 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0446\u0435\u043d\u0430 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d\u0430 (\u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435), \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c (\u0432\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435) \u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c (\u0442\u0440\u0435\u0442\u044c\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3b9\/011\/3c8\/3b90113c8ad27f287cdb29a25a37470d.jpg\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/03a\/791\/d39\/03a791d39e2082b80e86ea8daa488a64.jpg\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/375\/d59\/f51\/375d59f5199e791efd99c218a0ea6f53.jpg\"><\/div>\n<p>  <\/p>\n<h4>\u0420\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ambient occlusion<\/h4>\n<p>  \u0412 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c \u043c\u043d\u043e\u0439 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c ambient occlusion. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 AO \u0438 \u043d\u0430 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3e7\/c8f\/e3e\/3e7c8fe3ee0dc58e3007f9a1bad7f877.jpg\"><\/div>\n<p>  <\/p>\n<pre><code class=\"cpp\">  13:  ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, t2.xyzw     14:  max r0.x, r0.x, cb3[1].x     15:  add r0.yzw, r1.xxyz, -cb12[0].xxyz     16:  dp3 r1.x, r0.yzwy, r0.yzwy     17:  sqrt r1.x, r1.x     18:  add r1.y, r1.x, -cb3[0].x     19:  add r1.zw, -cb3[0].xxxz, cb3[0].yyyw     20:  div_sat r1.y, r1.y, r1.z     21:  mad r1.y, r1.y, r1.w, cb3[0].z     22:  add r0.x, r0.x, l(-1.000000)     23:  mad r0.x, r1.y, r0.x, l(1.000000)<\/code><\/pre>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u0430 \u0441\u0446\u0435\u043d\u0430 \u2014 \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u043d\u0430 \u0434\u0430\u043b\u0451\u043a\u043e\u043c \u043e\u0441\u0442\u0440\u043e\u0432\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ambient occlusion:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/343\/c52\/af4\/343c52af44338628770912801bc3b32c.png\"><\/div>\n<p>  \u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 AO \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e max. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0435 cb3_v1.x \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u043e (0.96888), \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e AO \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u0430\u0431\u044b\u043c.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043c\u0438\u0440\u0435.<\/p>\n<p>  \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c \u0437\u0430 \u0441\u0435\u0431\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 HLSL, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<\/p>\n<pre><code class=\"cpp\"> float AdjustAmbientOcclusion(in float inputAO, in float worldToCameraDistance)    {      \/\/ *** Inputs *** \/\/      const float aoDistanceStart = cb3_v0.x;      const float aoDistanceEnd = cb3_v0.y;      const float aoStrengthStart = cb3_v0.z;      const float aoStrengthEnd = cb3_v0.w;             \/\/ * Adjust AO      float aoDistanceIntensity = linstep( aoDistanceStart, aoDistanceEnd, worldToCameraDistance );      float aoStrength = lerp(aoStrengthStart, aoStrengthEnd, aoDistanceIntensity);       float adjustedAO = lerp(1.0, inputAO, aoStrength);            return adjustedAO;     }<\/code><\/pre>\n<p>  \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0438 \u043c\u0438\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 linstep. \u041c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043e\u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432.<\/p>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u0430\/\u043a\u043e\u043d\u0446\u0430 AO. \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 linstep \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0441\u0438\u043b\u0443 AO (\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437 cbuffer), \u0430 \u0441\u0438\u043b\u0430 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 AO.<\/p>\n<p>  \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u043a\u043e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e 500.<\/p>\n<p>  linstep \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1.0;<br \/>  aoStrength \u0440\u0430\u0432\u043d\u043e aoStrengthEnd;<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443 AO, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 77% (\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0441\u0438\u043b\u0430) \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u0445\u043e\u0434\u044f\u0449\u0435\u0435 AO \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 max.<\/p>\n<h4>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435<\/h4>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0446\u0432\u0435\u0442 \u0438 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u0430 \u0442\u0443\u043c\u0430\u043d\u0430 \u0438 \u0446\u0432\u0435\u0442\u0430 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b, \u043c\u043e\u0436\u043d\u043e \u0438\u0445 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c.<\/p>\n<p>  \u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e AO:<\/p>\n<pre><code class=\"cpp\">   ...    FogResult fog = CalculateFog( worldPos, CameraPosition, fogStart, ao, false );             \/\/ Apply AO to influence      fog.paramsFog.w *= ao;      fog.paramsAerial.w *= ao;            \/\/ Mix fog with scene color      outColor = ApplyFog(fog, colorHDR);<\/code><\/pre>\n<p>  \u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u0442\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>ApplyFog<\/b>:<\/p>\n<pre><code class=\"cpp\"> float3 ApplyFog(FogResult fog, float3 color)    {      const float3 LuminanceFactors = float3(0.333f, 0.555f, 0.222f);          float3 aerialColor = dot(LuminanceFactors, color) * fog.paramsAerial.xyz;      color = lerp(color, aerialColor, fog.paramsAerial.w);      color = lerp(color, fog.paramsFog.xyz, fog.paramsFog.w);           return color.xyz;    }<\/code><\/pre>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u00ab\u0441\u0432\u0435\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u00bb \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6bd\/b00\/570\/6bdb005708a11953aeb8ce711a942f0d.jpg\"><\/div>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0435\u0451 \u043d\u0430 \u0446\u0432\u0435\u0442 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e7d\/f89\/f04\/e7df89f04524c4e547a91a645317a387.jpg\"><\/div>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c HDR-\u0446\u0432\u0435\u0442 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cae\/40a\/912\/cae40a9124b33e97aa38ac5b72b9a5ae.jpg\"><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c \u0442\u0443\u043c\u0430\u043d\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1ee\/2f8\/5ad\/1ee2f85adc2cc870769985308b6dcc48.jpg\"><\/div>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451!<\/p>\n<h4>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432<\/h4>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/012\/b08\/e69\/012b08e69615702c9267f24f167dfa98.jpg\"><\/div>\n<p>  <i>\u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b1b\/c3a\/f2c\/b1bc3af2c5d59db606570a54e861659b.jpg\"><\/div>\n<p>  <i>\u0426\u0432\u0435\u0442 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d10\/b17\/0ab\/d10b170ab255b3ff9b4d6fad60e1c1e3.jpg\"><\/div>\n<p>  <i>\u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d76\/9ae\/dde\/d769aedde1917ab6024e524d9c99625d.jpg\"><\/div>\n<p>  <i>\u0426\u0432\u0435\u0442 \u0442\u0443\u043c\u0430\u043d\u0430<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7ad\/b15\/0dd\/7adb150dddf4df73c8dc75e51aa9e138.jpg\"><\/div>\n<p>  <i>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u0431\u0435\u0437 \u0442\u0443\u043c\u0430\u043d\u0430<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f53\/fdc\/507\/f53fdc5076e000acb24a775ba7558e8a.jpg\"><\/div>\n<p>  <i>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0442\u0443\u043c\u0430\u043d\u043e\u043c \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ad1\/223\/e4a\/ad1223e4aabc3dc3f07a77125b54211f.jpg\"><\/div>\n<p>  <i>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0443\u043c\u0430\u043d<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/375\/d59\/f51\/375d59f5199e791efd99c218a0ea6f53.jpg\"><\/div>\n<p>  <i>\u0421\u043d\u043e\u0432\u0430 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u0441\u043e \u0432\u0441\u0435\u043c \u0442\u0443\u043c\u0430\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/i><\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u0442\u0435 \u043d\u0430 \u0448\u0435\u0439\u0434\u0435\u0440, \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/pastebin.com\/LrKSqUvi\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0421 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440 <b>\u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438<\/b> \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u043d\u044f \u0440\u0430\u0434\u0443\u0435\u0442.<\/p>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0443. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435\u00bb \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0434\u0430\u044e\u0449\u0435\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435, \u043e\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e. \u0414\u0443\u043c\u0430\u044e, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0442\u043e\u0447\u043d\u043e \u043a\u0430\u043a \u044d\u0442\u0430 \u0437\u0430\u043a\u0430\u0442\u043d\u0430\u044f \u0441\u0446\u0435\u043d\u0430.<\/p>\n<p>  \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043d\u0435\u0431\u0430 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0430 3\u00bb \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0443\u043c\u0430\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0446\u0432\u0435\u0442\u043e\u0432 \u0432\u043e\u0437\u043b\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u043d\u0435\u0431\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e \u2014 \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430\/\u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0435 \u043c\u043d\u043e\u0439. \u0412\u0441\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c CD PROJEKT RED. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0438\u0445, \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 3. \u041f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0432\u0451\u0437\u0434\u044b<\/h2>\n<p>  \u0412 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043d\u043e \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u0430\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u2014 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0432\u0451\u0437\u0434\u044b. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0438\u0445, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435\u0442 \u0432 DLC \u00ab\u041a\u0440\u043e\u0432\u044c \u0438 \u0432\u0438\u043d\u043e\u00bb.<\/p>\n<p>  \u0412 \u0432\u0438\u0434\u0435\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/IWtutrr6ilE?rel=0&amp;showinfo=1&amp;start=50&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442.<\/p>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0442\u0435\u043b\u043e \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u044f\u0440\u0447\u0435 \u0445\u0432\u043e\u0441\u0442\u0430. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043f\u043e\u0437\u0436\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f.<\/p>\n<p>  \u041d\u0430\u0448\u0430 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0430 \u0434\u043d\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043e\u043f\u0438\u0448\u0443 \u043e\u0431\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u0435\u043c\u0430\u0445, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u0443, \u0433\u0434\u0435 \u0442\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435.<br \/>  <cut><\/cut>  <\/p>\n<h3>1. \u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440<\/h3>\n<p>  \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>  \u041f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0432\u0451\u0437\u0434\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u0443\u043f\u043e\u043b\u0430 \u043d\u0435\u0431\u0430, \u043d\u0435\u0431\u0430 \u0438 \u043b\u0443\u043d\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1c5\/a71\/7db\/1c5a717dbd047aeaa183ce2a25e394d9.png\"><\/div>\n<p>  DrawIndexed(720) \u2014 \u043a\u0443\u043f\u043e\u043b \u043d\u0435\u0431\u0430,<br \/>  DrawIndexed(2160) \u2014 \u0441\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u043d\u0435\u0431\u0430\/\u043b\u0443\u043d\u044b,<br \/>  DrawIndexed(36) \u2014 \u043a \u0434\u0435\u043b\u0443 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043f\u0438\u043f\u0435\u0434 \u043e\u043a\u043a\u043b\u044e\u0437\u0438\u0438 \u0441\u043e\u043b\u043d\u0446\u0430 (?)<br \/>  DrawIndexed(12) \u2014 \u043f\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u0437\u0432\u0435\u0437\u0434\u0430<br \/>  DrawIndexedInstanced(1116, 1) \u2014 \u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/p>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <a href=\"https:\/\/astralcode.blogspot.com\/2019\/05\/reverse-engineering-rendering-of.html\" rel=\"nofollow\">\u043f\u0435\u0440\u0438\u0441\u0442\u044b\u043c \u043e\u0431\u043b\u0430\u043a\u0430\u043c<\/a>, \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u0437\u0432\u0435\u0437\u0434\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043f\u043e\u0434\u0440\u044f\u0434.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/baa\/27d\/e4c\/baa27de4ced017770e9c89a01e136abd.jpg\"><\/div>\n<p>  <i>\u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cc8\/78b\/cef\/cc878bcef6dcc4b58e85f3a62f90be31.jpg\"><\/div>\n<p>  <i>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/i><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0ee\/33f\/f6c\/0ee33ff6cef3d11ca7cd460f21dc2b3f.jpg\"><\/div>\n<p>  <i>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/i><\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/263\/aec\/b8a\/263aecb8afa21e2b79b0333bcde55011.jpg\"><\/div>\n<p>  <\/p>\n<h3>2. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f<\/h3>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u0437\u0432\u0435\u0437\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u043e\u043d\u043a\u0438\u043c \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c (quad) \u0441 texcoords: 4 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, 6 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 quad \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/82c\/fbf\/96b\/82cfbf96bbc652ea5ac32a5e568434a3.png\"><\/div>\n<p>  <i>\u041f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0439 quad \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/83c\/59e\/3f7\/83c59e3f7e685d6e7f2080e88ff5be25.png\"><br \/>  <i>\u0415\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0439 quad \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b. \u0412\u0438\u0434\u043d\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0439 \u0434\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/i><\/p>\n<p>  \u041f\u043e\u0441\u0442\u043e\u0439\u0442\u0435-\u043a\u0430, \u043d\u043e \u0442\u0430\u043c \u0432\u0435\u0434\u044c \u0435\u0441\u0442\u044c <i>DrawIndexed(12)<\/i>! \u0417\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0435 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0432\u0435\u0437\u0434\u044b?<\/p>\n<p>  \u0414\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d55\/b39\/bb2\/d55b39bb2d2ea5908f4576d6396455fa.png\"><\/div>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0437\u0432\u0451\u0437\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<pre><code class=\"cpp\"> vs_5_0       dcl_globalFlags refactoringAllowed       dcl_constantbuffer cb1[9], immediateIndexed       dcl_constantbuffer cb2[3], immediateIndexed       dcl_constantbuffer cb12[193], immediateIndexed       dcl_input v0.xyz       dcl_input v1.xyzw       dcl_input v2.xy       dcl_input v3.xy       dcl_input v4.xy       dcl_input v5.xyz       dcl_input v6.x       dcl_input v7.x       dcl_output o0.xyzw       dcl_output o1.xyzw       dcl_output o2.xy       dcl_output o3.xyzw       dcl_output_siv o4.xyzw, position       dcl_temps 5      0: mov r0.xyz, v0.xyzx      1: mov r0.w, l(1.000000)      2: dp4 r1.x, r0.xyzw, cb2[0].xyzw      3: dp4 r1.y, r0.xyzw, cb2[1].xyzw      4: dp4 r1.z, r0.xyzw, cb2[2].xyzw      5: add r0.x, v2.x, v2.y      6: add r0.y, -v2.y, v2.x      7: add r2.xyz, -r1.zxyz, cb1[8].zxyz      8: dp3 r0.z, r2.xyzx, r2.xyzx      9: rsq r0.z, r0.z     10: mul r2.xyz, r0.zzzz, r2.xyzx     11: dp3 r0.z, v5.xyzx, v5.xyzx     12: rsq r0.z, r0.z     13: mul r3.xyz, r0.zzzz, v5.xyzx     14: mul r4.xyz, r2.xyzx, r3.yzxy     15: mad r2.xyz, r2.zxyz, r3.zxyz, -r4.xyzx     16: dp3 r0.z, r2.xyzx, r2.xyzx     17: rsq r0.z, r0.z     18: mul r2.xyz, r0.zzzz, r2.xyzx     19: mad r0.z, v7.x, v6.x, l(1.000000)     20: mul r3.xyz, r0.zzzz, r3.xyzx     21: mul r3.xyz, r3.xyzx, v3.xxxx     22: mul r2.xyz, r2.xyzx, v3.yyyy     23: mad r0.xzw, r3.xxyz, r0.xxxx, r1.xxyz     24: mad r0.xyz, r2.xyzx, r0.yyyy, r0.xzwx     25: mov r0.w, l(1.000000)     26: dp4 o4.x, r0.xyzw, cb1[0].xyzw     27: dp4 o4.y, r0.xyzw, cb1[1].xyzw     28: dp4 o4.z, r0.xyzw, cb1[2].xyzw     29: dp4 o4.w, r0.xyzw, cb1[3].xyzw     30: add r0.xyz, r0.xyzx, -cb12[0].xyzx     31: dp3 r0.w, r0.xyzx, r0.xyzx     32: sqrt r0.w, r0.w     33: div r0.xyz, r0.xyzx, r0.wwww     34: add r0.w, r0.w, -cb12[22].z     35: max r0.w, r0.w, l(0)     36: min r0.w, r0.w, cb12[42].z     37: dp3 r0.x, cb12[38].xyzx, r0.xyzx     38: mul r0.y, abs(r0.x), abs(r0.x)     39: mad_sat r1.x, r0.w, l(0.002000), l(-0.300000)     40: mul r0.y, r0.y, r1.x     41: lt r1.x, l(0), r0.x     42: movc r1.yzw, r1.xxxx, cb12[39].xxyz, cb12[41].xxyz     43: add r1.yzw, r1.yyzw, -cb12[40].xxyz     44: mad r1.yzw, r0.yyyy, r1.yyzw, cb12[40].xxyz     45: movc r2.xyz, r1.xxxx, cb12[45].xyzx, cb12[47].xyzx     46: add r2.xyz, r2.xyzx, -cb12[46].xyzx     47: mad o0.xyz, r0.yyyy, r2.xyzx, cb12[46].xyzx     48: ge r0.y, r0.w, cb12[48].y     49: if_nz r0.y     50:  mad r0.y, r0.z, cb12[22].z, cb12[0].z     51:  mul r0.z, r0.w, r0.z     52:  mul r0.z, r0.z, l(0.062500)     53:  mul r1.x, r0.w, cb12[43].x     54:  mul r1.x, r1.x, l(0.062500)     55:  add r0.x, r0.x, cb12[42].x     56:  add r2.x, cb12[42].x, l(1.000000)     57:  div_sat r0.x, r0.x, r2.x     58:  add r2.x, -cb12[43].z, cb12[43].y     59:  mad r0.x, r0.x, r2.x, cb12[43].z     60:  add r0.y, r0.y, cb12[42].y     61:  mul r2.x, r0.x, r0.y     62:  mul r0.z, r0.x, r0.z     63:  mad r3.xyzw, r0.zzzz, l(16.000000, 15.000000, 14.000000, 13.000000), r2.xxxx     64:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)     65:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     66:  div_sat r3.xyzw, r1.xxxx, r3.xyzw     67:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     68:  mul r2.y, r3.y, r3.x     69:  mul r2.y, r3.z, r2.y     70:  mul r2.y, r3.w, r2.y     71:  mad r3.xyzw, r0.zzzz, l(12.000000, 11.000000, 10.000000, 9.000000), r2.xxxx     72:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)     73:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     74:  div_sat r3.xyzw, r1.xxxx, r3.xyzw     75:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     76:  mul r2.y, r2.y, r3.x     77:  mul r2.y, r3.y, r2.y     78:  mul r2.y, r3.z, r2.y     79:  mul r2.y, r3.w, r2.y     80:  mad r3.xyzw, r0.zzzz, l(8.000000, 7.000000, 6.000000, 5.000000), r2.xxxx     81:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)     82:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     83:  div_sat r3.xyzw, r1.xxxx, r3.xyzw     84:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)     85:  mul r2.y, r2.y, r3.x     86:  mul r2.y, r3.y, r2.y     87:  mul r2.y, r3.z, r2.y     88:  mul r2.y, r3.w, r2.y     89:  mad r2.zw, r0.zzzz, l(0.000000, 0.000000, 4.000000, 3.000000), r2.xxxx     90:  max r2.zw, r2.zzzw, l(0, 0, 0, 0)     91:  add r2.zw, r2.zzzw, l(0.000000, 0.000000, 1.000000, 1.000000)     92:  div_sat r2.zw, r1.xxxx, r2.zzzw     93:  add r2.zw, -r2.zzzw, l(0.000000, 0.000000, 1.000000, 1.000000)     94:  mul r2.y, r2.z, r2.y     95:  mul r2.y, r2.w, r2.y     96:  mad r2.x, r0.z, l(2.000000), r2.x     97:  max r2.x, r2.x, l(0)     98:  add r2.x, r2.x, l(1.000000)     99:  div_sat r2.x, r1.x, r2.x     100:  add r2.x, -r2.x, l(1.000000)     101:  mul r2.x, r2.x, r2.y     102:  mad r0.x, r0.y, r0.x, r0.z     103:  max r0.x, r0.x, l(0)     104:  add r0.x, r0.x, l(1.000000)     105:  div_sat r0.x, r1.x, r0.x     106:  add r0.x, -r0.x, l(1.000000)     107:  mad r0.x, -r2.x, r0.x, l(1.000000)     108:  add r0.y, r0.w, -cb12[48].y     109:  mul_sat r0.y, r0.y, cb12[48].z     110: else     111:  mov r0.xy, l(1.000000, 0.000000, 0.000000, 0.000000)     112: endif     113: log r0.x, r0.x     114: mul r0.z, r0.x, cb12[42].w     115: exp r0.z, r0.z     116: mul r0.z, r0.z, r0.y     117: mul r0.x, r0.x, cb12[48].x     118: exp r0.x, r0.x     119: mul o0.w, r0.x, r0.y     120: mad_sat r0.xy, r0.zzzz, cb12[189].xzxx, cb12[189].ywyy     121: add r2.xyz, -r1.yzwy, cb12[188].xyzx     122: mad r2.xyz, r0.xxxx, r2.xyzx, r1.yzwy     123: add r0.x, cb12[188].w, l(-1.000000)     124: mad r0.x, r0.y, r0.x, l(1.000000)     125: mul_sat r2.w, r0.x, r0.z     126: lt r0.x, l(0), cb12[192].x     127: if_nz r0.x     128:  mad_sat r0.xy, r0.zzzz, cb12[191].xzxx, cb12[191].ywyy     129:  add r3.xyz, -r1.yzwy, cb12[190].xyzx     130:  mad r1.xyz, r0.xxxx, r3.xyzx, r1.yzwy     131:  add r0.x, cb12[190].w, l(-1.000000)     132:  mad r0.x, r0.y, r0.x, l(1.000000)     133:  mul_sat r1.w, r0.x, r0.z     134:  add r0.xyzw, -r2.xyzw, r1.xyzw     135:  mad o1.xyzw, cb12[192].xxxx, r0.xyzw, r2.xyzw     136: else     137:  mov o1.xyzw, r2.xyzw     138: endif     139: mov o3.xyzw, v1.xyzw     140: mov o2.xy, v4.yxyy     141: ret<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430 (\u0441\u0442\u0440\u043e\u043a\u0438 30-138). \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043c\u0430\u043d\u0430 \u2014 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u0438\u0434\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u043b\u0435\u0442\u0430\u044e\u0442 \u043d\u0430\u0434 \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0413\u0435\u0440\u0430\u043b\u044c\u0442\u0430 \u0438 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044e\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430.<\/p>\n<p>  \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b (rgb = \u0446\u0432\u0435\u0442, a = \u0432\u043b\u0438\u044f\u043d\u0438\u0435) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 o0.xyzw, \u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0443\u043c\u0430\u043d\u0430 \u0432 o1.xyzw.<\/p>\n<p>  o2.xy (\u0441\u0442\u0440\u043e\u043a\u0430 140) \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e texcoords.<br \/>  o3.xyzw (\u0441\u0442\u0440\u043e\u043a\u0430 139) \u043a \u0434\u0435\u043b\u0443 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u0430\u0436\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043c\u0438\u0440\u0435. \u0412\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 <a href=\"http:\/\/ogldev.atspace.co.uk\/www\/tutorial27\/tutorial27.html\" rel=\"nofollow\">\u0431\u0438\u043b\u0431\u043e\u0440\u0434\u0438\u043d\u0433<\/a>. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u043b\u0431\u043e\u0440\u0434\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043d\u0438\u0445.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e Position (\u043f\u043e\u0437\u0438\u0446\u0438\u044f):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/99a\/470\/7d5\/99a4707d5f914222e7d55e2435f5692f.png\"><\/div>\n<p>  \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0437\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 2 quad-\u0430: 8 \u0432\u0435\u0440\u0448\u0438\u043d, 12 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n<p>  \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e quad-\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430? \u0412\u0441\u0451 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430 quad-\u0430.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435,, \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0435\u0441\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u043a \u043a\u0440\u0430\u044e quad-\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cde\/fdf\/7e0\/cdefdf7e0e5cfe91c4b9d20257b529b4.png\"><\/div>\n<p>  \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u0437\u0432\u0435\u0437\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 (400, 3) \u0435\u0434\u0438\u043d\u0438\u0446. (\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 XY, \u0432 Witcher 3 \u043e\u0441\u044c Z \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0432\u0435\u0440\u0445)<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/416\/06d\/71a\/41606d71a99d2f751f8b1d5a609b6c96.png\"><\/div>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043e\u0442 \u0426\u041f, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043a\u043e\u0434\u0443 \u0431\u0438\u043b\u0431\u043e\u0440\u0434\u0438\u043d\u0433\u0430. \u0418\u0434\u0435\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 quad-\u0430 \u0434\u043e \u043a\u0430\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">   7: add r2.xyz, -r1.zxyz, cb1[8].zxyz      8: dp3 r0.z, r2.xyzx, r2.xyzx      9: rsq r0.z, r0.z     10: mul r2.xyz, r0.zzzz, r2.xyzx<\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b.<\/p>\n<p>  \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0426\u041f, \u044d\u0442\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0430.<\/p>\n<pre><code class=\"cpp\">  11: dp3 r0.z, v5.xyzx, v5.xyzx     12: rsq r0.z, r0.z     13: mul r3.xyz, r0.zzzz, v5.xyzx<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0438\u043c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c.<\/p>\n<pre><code class=\"cpp\">  14: mul r4.xyz, r2.xyzx, r3.yzxy     15: mad r2.xyz, r2.zxyz, r3.zxyz, -r4.xyzx     16: dp3 r0.z, r2.xyzx, r2.xyzx     17: rsq r0.z, r0.z     18: mul r2.xyz, r0.zzzz, r2.xyzx<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b <i>\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439<\/i>(r3.xyz) \u0438 <i>\u0431\u0438\u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439<\/i> (r2.xyz).<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0432\u0435\u0434\u0451\u043c <i>Xsize<\/i> \u0438 <i>Ysize<\/i>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 TEXCOORD1, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 (-200, 1.50).<\/p>\n<p>  \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">  19: mad r0.z, v7.x, v6.x, l(1.000000)     20: mul r3.xyz, r0.zzzz, r3.xyzx     21: mul r3.xyz, r3.xyzx, v3.xxxx     22: mul r2.xyz, r2.xyzx, v3.yyyy     23: mad r0.xzw, r3.xxyz, r0.xxxx, r1.xxyz     24: mad r0.xyz, r2.xyzx, r0.yyyy, r0.xzwx     25: mov r0.w, l(1.000000) <\/code><\/pre>\n<p>  \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e r0.x, r0.y \u0438 r0.z \u0440\u0430\u0432\u043d\u044b 1.0, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <code>worldSpacePosition = quadCenter + tangent * Xsize + bitangent * Ysize<\/code><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u00ab\u0432\u0438\u0434-\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u00bb \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f SV_Position:<\/p>\n<pre><code class=\"cpp\">  26: dp4 o4.x, r0.xyzw, cb1[0].xyzw     27: dp4 o4.y, r0.xyzw, cb1[1].xyzw     28: dp4 o4.z, r0.xyzw, cb1[2].xyzw     29: dp4 o4.w, r0.xyzw, cb1[3].xyzw  <\/code><\/pre>\n<p>  <\/p>\n<h3>3. \u041f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/h3>\n<p>  \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440\u00bb, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>  <code>FinalColor = SrcColor * One + DestColor * (1.0 - SrcAlpha) =<br \/>  FinalColor = SrcColor + DestColor * (1.0 - SrcAlpha)<\/code><\/p>\n<p>  \u0433\u0434\u0435 <i>SrcColor<\/i>\u0438 <i>SrcAlpha<\/i> \u2014 \u044d\u0442\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b .rgb \u0438 .a \u0438\u0437 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u0430 <i>DestColor<\/i> \u0446\u0432\u0435\u0442 .rgb, \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 rendertarget.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u044d\u0442\u043e <i>SrcAlpha<\/i>. \u041c\u043d\u043e\u0433\u0438\u0435 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0438\u0433\u0440\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (opacity) \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <code>return float4( color * opacity, opacity )<\/code><\/p>\n<p>  \u0428\u0435\u0439\u0434\u0435\u0440 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0437\u0432\u0451\u0437\u0434 \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c. \u0421\u043b\u0435\u0434\u0443\u044f \u044d\u0442\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <i>opacity<\/i> \u0440\u0430\u0432\u043d\u043e 1.0, 0.1 \u0438 0.0.<\/p>\n<p>  <code>a) opacity = 1.0<\/p>\n<p>  FinalColor = color * opacity + DestColor * (1.0 - opacity) =<br \/>  FinalColor = color = SrcColor<\/code><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/934\/711\/31c\/93471131c99ec7b2249cff6edb698859.jpg\"><\/div>\n<p>  <code>b) opacity = 0.1<\/p>\n<p>  FinalColor = color * opacity + DestColor * (1.0 - opacity) =<br \/>  FinalColor = 0.1 * color + 0.9 * DestColor<\/code><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/269\/b24\/d90\/269b24d90592abb5065fba0f2a0aaf9f.jpg\"><\/div>\n<p>  <code>c) opacity = 0.0<\/p>\n<p>  FinalColor = color * opacity + DestColor * (1.0 - opacity) =<br \/>  FinalColor = DestColor<\/code><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/191\/75e\/b6e\/19175eb6e6757c04a0a063e75bad96f2.jpg\"><\/div>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u044d\u0442\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 <i>opacity(x)<\/i>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432\u0434\u043e\u043b\u044c \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0437\u0432\u0435\u0437\u0434\u044b (\u0435\u0451 \u00ab\u0442\u0435\u043b\u0435\u00bb) \u0438 \u043f\u043b\u0430\u0432\u043d\u043e \u0437\u0430\u0442\u0443\u0445\u0430\u0442\u044c \u0434\u043e 0.0 (\u043a \u0435\u0451 \u00ab\u0445\u0432\u043e\u0441\u0442\u0443\u00bb).<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430, \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e:<\/p>\n<pre><code class=\"cpp\"> ps_5_0       dcl_globalFlags refactoringAllowed       dcl_constantbuffer cb0[10], immediateIndexed       dcl_constantbuffer cb2[3], immediateIndexed       dcl_constantbuffer cb4[2], immediateIndexed       dcl_input_ps linear v0.xyzw       dcl_input_ps linear v1.xyzw       dcl_input_ps linear v2.y       dcl_input_ps linear v3.w       dcl_output o0.xyzw       dcl_temps 4      0: mov_sat r0.x, v2.y      1: ge r0.y, r0.x, l(0.052579)      2: ge r0.z, l(0.965679), r0.x      3: and r0.y, r0.z, r0.y      4: if_nz r0.y      5:  ge r0.y, l(0.878136), r0.x      6:  add r0.z, r0.x, l(-0.052579)      7:  mul r1.w, r0.z, l(1.211303)      8:  mov_sat r0.z, r1.w      9:  mad r0.w, r0.z, l(-2.000000), l(3.000000)     10:  mul r0.z, r0.z, r0.z     11:  mul r0.z, r0.z, r0.w     12:  mul r2.x, r0.z, l(0.084642)     13:  mov r1.yz, l(0.000000, 0.000000, 0.084642, 0.000000)     14:  movc r2.yzw, r0.yyyy, r1.yyzw, l(0.000000, 0.000000, 0.000000, 0.500000)     15:  not r0.z, r0.y     16:  if_z r0.y     17:   ge r0.y, l(0.924339), r0.x     18:   add r0.w, r0.x, l(-0.878136)     19:   mul r1.w, r0.w, l(21.643608)     20:   mov_sat r0.w, r1.w     21:   mad r3.x, r0.w, l(-2.000000), l(3.000000)     22:   mul r0.w, r0.w, r0.w     23:   mul r0.w, r0.w, r3.x     24:   mad r1.x, r0.w, l(0.889658), l(0.084642)     25:   mov r1.yz, l(0.000000, 0.084642, 0.974300, 0.000000)     26:   movc r2.xyzw, r0.yyyy, r1.xyzw, r2.xyzw     27:  else     28:   mov r2.y, l(0)     29:   mov r0.y, l(-1)     30:  endif     31:  not r0.w, r0.y     32:  and r0.z, r0.w, r0.z     33:  if_nz r0.z     34:   ge r0.y, r0.x, l(0.924339)     35:   add r0.x, r0.x, l(-0.924339)     36:   mul r1.w, r0.x, l(24.189651)     37:   mov_sat r0.x, r1.w     38:   mad r0.z, r0.x, l(-2.000000), l(3.000000)     39:   mul r0.x, r0.x, r0.x     40:   mul r0.x, r0.x, r0.z     41:   mad r1.x, r0.x, l(-0.974300), l(0.974300)     42:   mov r1.yz, l(0.000000, 0.974300, 0.000000, 0.000000)     43:   movc r2.xyzw, r0.yyyy, r1.xyzw, r2.xyzw     44:  endif     45: else     46:  mov r2.yzw, l(0.000000, 0.000000, 0.000000, 0.500000)     47:  mov r0.y, l(0)     48: endif     49: mov_sat r2.w, r2.w     50: mad r0.x, r2.w, l(-2.000000), l(3.000000)     51: mul r0.z, r2.w, r2.w     52: mul r0.x, r0.z, r0.x     53: add r0.z, -r2.y, r2.z     54: mad r0.x, r0.x, r0.z, r2.y     55: movc r0.x, r0.y, r2.x, r0.x     56: mad r0.y, cb4[1].x, -cb0[9].w, l(1.000000)     57: mul_sat r0.y, r0.y, v3.w     58: mul r0.x, r0.y, r0.x     59: mul r0.yzw, cb2[2].xxyz, cb4[0].xxxx     60: mul r0.x, r0.x, cb2[2].w     61: dp3 r1.x, l(0.333000, 0.555000, 0.222000, 0.000000), r0.yzwy     62: mad r1.xyz, r1.xxxx, v0.xyzx, -r0.yzwy     63: mad r0.yzw, v0.wwww, r1.xxyz, r0.yyzw     64: add r1.xyz, -r0.yzwy, v1.xyzx     65: mad r0.yzw, v1.wwww, r1.xxyz, r0.yyzw     66: mul o0.xyz, r0.xxxx, r0.yzwy     67: mov o0.w, r0.x     68: ret<\/code><\/pre>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d \u0438 \u043c\u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 1.211303, 21.643608 \u0438 24.189651?<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421 \u044d\u0442\u0438\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 texcoord \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 [0,1] (\u0441\u0442\u0440\u043e\u043a\u0430 0), \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a \u0432\u0441\u0435\u0439 \u0434\u043b\u0438\u043d\u0435 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u0438\u0434\u0430.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u0440\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\/\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a:<\/p>\n<pre><code class=\"cpp\">   \/\/ current status: no idea how these are generated      const float controlPoint0 = 0.052579;      const float controlPoint1 = 0.878136;      const float controlPoint2 = 0.924339;      const float controlPoint3 = 0.965679;<\/code><\/pre>\n<p>  \u041f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e, \u043a\u0430\u043a \u0438\u0445 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u043b\u0438\/\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0438.<\/p>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0438\u0437 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u0435\u0440\u0432\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [controlPoint0 \u2014 controlPoint3]. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0432\u043d\u0430 0.0.<\/p>\n<pre><code class=\"cpp\">   \/\/ Input for the opacity function    float y = saturate(Input.Texcoords.y);  \/\/ r0.x          \/\/ Value of opacity function.      \/\/ 0 - no change      \/\/ 1 - full color      float opacity = 0.0;            [branch]       if (y &gt;= controlPoint0 &amp;&amp; y &lt;= controlPoint3)      {         ...<\/code><\/pre>\n<p>  \u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <u>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430<\/u>, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">   6: add r0.z, r0.x, l(-0.052579)       7: mul r1.w, r0.z, l(1.211303)       8: mov_sat r0.z, r1.w       9: mad r0.w, r0.z, l(-2.000000), l(3.000000)      10: mul r0.z, r0.z, r0.z      11: mul r0.z, r0.z, r0.w      12: mul r2.x, r0.z, l(0.084642)<\/code><\/pre>\n<p>  \u0412 \u0441\u0442\u0440\u043e\u043a\u0435 9 \u0435\u0441\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b &#8216;-2.0&#8217; \u0438 &#8216;3.0&#8217;, \u0447\u0442\u043e \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043d\u0430\u043c \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/direct3dhlsl\/dx-graphics-hlsl-smoothstep\" rel=\"nofollow\">smoothstep<\/a>. \u0414\u0430, \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0434\u043e\u0433\u0430\u0434\u043a\u0430.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f smoothstep \u044f\u0437\u044b\u043a\u0430 HLSL \u0441 prototype:<i>ret smoothstep(min, max, x)<\/i> \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 <i>x<\/i> \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c [<i>min-max<\/i>]. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430, \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442 <i>min<\/i> \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437 r0.z \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 9), \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0442. \u0414\u043b\u044f <i>max<\/i> \u044d\u0442\u043e \u043f\u043e\u0434\u0437\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 &#8216;mul_sat&#8217;. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c &#8216;mov_sat&#8217;. \u042d\u0442\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e <i>min<\/i> \u0438 <i>max<\/i> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 smoothstep \u0440\u0430\u0432\u043d\u044b 0 \u0438 1.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e <i>x<\/i> \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 1]. \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. \u042d\u0442\u043e \u044f\u0432\u043d\u043e \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u0449\u0435\u0442, \u0433\u0434\u0435 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [segmentStart-segmentEnd].<\/p>\n<p>  \u041e\u0442\u0432\u0435\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f Linstep!<\/p>\n<pre><code class=\"cpp\"> float linstep(float min, float max, float v)    {      return ( (v-min) \/ (max-min) );    }<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442: [0.052579 &#8212;&nbsp;0.878136]. \u0412\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 6. \u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c -&gt; 1.0 \/ (0.878136 \u2014 0.052579) = 1.0 \/ 0.825557 = ~1.211303.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 smoothstep \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 1]. \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 12 \u2014 \u044d\u0442\u043e \u0432\u0435\u0441 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 [0.052579 \u2014 0.878136] \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0 \u2014 0.084642].<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044e HLSL, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\"> float getOpacityFunctionValue(float x, float cpLeft, float cpRight, float weight)    {      float val = smoothstep( 0, 1, linstep(cpLeft, cpRight, x) );      return val * weight;    }<\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0432\u0435\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">   const float weight0 = 0.084642;      const float weight1 = 0.889658;      const float weight2 = 0.974300; \/\/ note: weight0+weight1 = weight2<\/code><\/pre>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <i>opacity(x)<\/i> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">   float opacity = 0.0;     [branch]       if (y &gt;= controlPoint0 &amp;&amp; y &lt;= controlPoint3)      {        \/\/ Range of v: [0, weight0]        float v = getOpacityFunctionValue(y, controlPoint0, controlPoint1, weight0);        opacity = v;              [branch]        if ( y &gt;= controlPoint1 )        {          \/\/ Range of v: [0, weight1]          float v = getOpacityFunctionValue(y, controlPoint1, controlPoint2, weight1);          opacity = weight0 + v;              [branch]          if (y &gt;= controlPoint2)          {            \/\/ Range of v: [0, weight2]            float v = getOpacityFunctionValue(y, controlPoint2, controlPoint3, weight2);          opacity = weight2 - v;                  }        }      }<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0433\u0440\u0430\u0444\u0438\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u041b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0440\u0435\u0437\u043a\u043e\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0435\u043b\u0430 \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5da\/326\/1f0\/5da3261f0f88fa41ac963ca84fc79f99.png\"><\/div>\n<p>  <i>\u0413\u0440\u0430\u0444\u0438\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438<br \/>  \u0417\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438<br \/>  \u0421\u0438\u043d\u0438\u0439 \u043a\u0430\u043d\u0430\u043b \u2014 \u0432\u0435\u0441\u0430<\/i><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0442\u0440\u0438\u0445\u0438. \u0417\u0430\u0442\u0435\u043c \u0438\u0434\u0443\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f: \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0451\u0437\u0434, \u0446\u0432\u0435\u0442 \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0432\u0435\u0437\u0434\u044b \u0438 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u0443\u043c\u0430\u043d\u0430. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445 TW3, \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 1.0:<\/p>\n<pre><code class=\"cpp\">   \/\/ cb4_v1.x = 1.0      float starsOpacity = 1.0 - cb0_v9.w * cb4_v1.x;        opacity *= starsOpacity;       \/\/ Calculate color of a shooting star      \/\/ cb4_v0.x = 10.0    \/\/ cb2_v2.rgb = (1.0, 1.0, 1.0)    float3 color = cb2_v2.rgb * cb4_v0.x;          \/\/ cb2_v2.w = 1      opacity *= cb2_v2.w;          FogResult fr = { Input.FogParams, Input.AerialParams };      color = ApplyFog(fr, color);          return float4( color*opacity, opacity);    }<\/code><\/pre>\n<p>  <\/p>\n<h3>4. \u0418\u0442\u043e\u0433<\/h3>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  \u0412\u044b\u0448\u0435 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>opacity(x)<\/i>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 r2.x (\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0438 49). \u041e\u0434\u043d\u0430\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0449\u0451 \u0442\u0440\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435: minRange (r2.y), maxRange (r2.z) \u0438 value (r2.w). \u0412\u0441\u0435 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 <i>opacity(x)<\/i> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p>  <code>lerp( minRange, maxRange, smoothstep(0, 1, value) );<\/code><\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 55 \u2014 \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>x<\/i> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [controlPoint0 \u2014 controlPoint3], \u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f r2.x. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <i>x<\/i> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 r0.x, \u0442\u043e \u0435\u0441\u0442\u044c, \u043f\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e.<\/p>\n<p>  \u042f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [controlPoint0 \u2014 controlPoint3], \u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0432\u043d\u043e\u0439 \u043d\u0443\u043b\u044e.<\/p>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0418, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/489118\/\"> https:\/\/habr.com\/ru\/post\/489118\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/489118\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8f2\/033\/d27\/8f2033d27bc9d8a498716c85be1be1c0.png\" alt=\"image\"><\/div>\n<p>  [\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430: <a href=\"https:\/\/habr.com\/ru\/post\/422573\/\">\u043f\u0435\u0440\u0432\u0430\u044f<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/437100\/\">\u0432\u0442\u043e\u0440\u0430\u044f<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/450332\/\">\u0442\u0440\u0435\u0442\u044c\u044f<\/a>.]<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 1. \u041f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u0445, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u0438\u0440\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e. \u0417\u0430\u0434\u0443\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u2014 \u0431\u041e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u0431\u043e \u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 40-50% \u0432\u0441\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u041d\u0435\u0431\u043e \u2014 \u044d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442. \u041d\u0430 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u0437\u0432\u0451\u0437\u0434\u044b, \u0441\u043e\u043b\u043d\u0446\u0435, \u043b\u0443\u043d\u0430 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n<p>  \u0425\u043e\u0442\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438, \u043f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0451\u043c\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 raymarching-\u0430 (\u0441\u043c. <a href=\"http:\/\/advances.realtimerendering.com\/s2015\/index.html\" rel=\"nofollow\">\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>), \u043e\u0431\u043b\u0430\u043a\u0430 \u0432 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u0445. \u042f \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0438\u0445 \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u043b. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0437\u0430 \u043c\u043e\u0435\u0439 \u0441\u0435\u0440\u0438\u0435\u0439 \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 DLC \u00ab\u041a\u0440\u043e\u0432\u044c \u0438 \u0432\u0438\u043d\u043e\u00bb \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0439. \u0418, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0432 DLC \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u043b\u0430\u043a\u0430\u043c\u0438.<\/p>\n<p>  \u0412 \u00ab\u0412\u0435\u0434\u044c\u043c\u0430\u043a\u0435 3\u00bb \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0451\u0432 \u043e\u0431\u043b\u0430\u043a\u043e\u0432. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0433\u043e\u0434\u044b \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cirrus_cloud\" rel=\"nofollow\">\u043f\u0435\u0440\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Altocumulus_cloud\" rel=\"nofollow\">\u0432\u044b\u0441\u043e\u043a\u043e\u043a\u0443\u0447\u0435\u0432\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/a>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Stratus_cloud\" rel=\"nofollow\">\u0441\u043b\u043e\u0438\u0441\u0442\u044b\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432<\/a> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u0443\u0440\u0438). \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043e\u0432\u0441\u0435.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-299047","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299047","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=299047"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299047\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=299047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=299047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=299047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}