{"id":300551,"date":"2020-03-22T21:00:24","date_gmt":"2020-03-22T21:00:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=300551"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=300551","title":{"rendered":"\u041f\u0430\u0440\u043b\u0435 \u0432\u0443 \u0431\u0430\u0433\u0435\u0442? \u0412\u044b\u0438\u0433\u0440\u0430\u0439\u0442\u0435 \u0442\u043e\u043f\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 NVidia RTX: 145 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/493494\/\">\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043f\u044f\u0442\u0438\u043c\u0438\u043d\u0443\u0442\u043a\u0443 \u0431\u0435\u0437 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u043e \u043d\u0435\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0432\u0438\u0440\u0443\u0441\u0430\u0445 \u043d\u0430 IT-\u0441\u0430\u0439\u0442\u0435! \u0410 \u0432\u0435\u0434\u044c \u0431\u0435\u0437 \u0448\u0443\u0442\u043e\u043a. \u0415\u0441\u043b\u0438 \u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u043f\u043e-\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438 \u0438\u043b\u0438 \u0436\u0438\u0432\u0451\u0442\u0435 \u0432\u043e \u0424\u0440\u0430\u043d\u0446\u0438\u0438, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u041d\u0418\u0418 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 <a href=\"https:\/\/jfig2020.sciencesconf.org\/resource\/page\/id\/1\" rel=\"nofollow\">jFIG2020<\/a> (\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0435 \u0434\u043d\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438). \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u0440\u043e \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445. \u041c\u043e\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u0435\u0442 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u0448\u0438\u0440\u043d\u0430\u0440\u043c\u0430\u0441\u0441\u044b!<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d <a href=\"https:\/\/www.shadertoy.com\/view\/wsXyD8\" rel=\"nofollow\">\u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0441\u0430\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0441?<\/p>\n<p>  <\/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\/WzTVTjFpQAE?rel=0&amp;showinfo=1&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><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u0437\u043d\u0430\u043b\u0438, \u0442\u043e \u044d\u0442\u043e \u0432\u043e\u043a\u0441\u0435\u043b\u044c-\u0430\u0440\u0442 \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Stanford_bunny\" rel=\"nofollow\">\u0441\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u043a\u0440\u043e\u043b\u0438\u043a\u0430<\/a>:<\/p>\n<p>  <img decoding=\"async\" width=\"320\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/020\/cfa\/bb0\/020cfabb02833802a8a81e59b4ed57c9.jpg\"><\/p>\n<p>\u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0430\u0440\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u0442\u043e\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/436790\/\">\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043b\u0443\u0447\u0435\u0439 \u0437\u0430 256 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0433\u043e\u043b\u043e\u0433\u043e C++<br \/>  <img decoding=\"async\" width=\"320\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9eb\/aa5\/c1a\/9ebaa5c1adc0425b2df1b454bd44c771.jpg\"><\/a>  <\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/437714\/\">\u043c\u0443\u043b\u044c\u0442\u044f\u0448\u043d\u044b\u0439 \u0432\u0437\u0440\u044b\u0432 \u0437\u0430 180 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0433\u043e\u043b\u043e\u0433\u043e C++<br \/>  <img decoding=\"async\" width=\"320\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/856\/9d9\/ea3\/8569d9ea3974e31dcd7b80182ca4586b.jpg\"><\/a>  <\/li>\n<\/ul>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"obschiy-princip\">\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f<\/h1>\n<p>  <\/p>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u044f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e\u0431 \u043e\u0431\u0449\u0438\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430 \u0433\u043e\u043b\u043e\u043c \u0446\u043f\u043f. \u041d\u0430 \u0441\u0435\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u043c \u0433\u0440\u0435\u0442\u044c \u043f\u043b\u0430\u043d\u0435\u0442\u0443 \u043d\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b! \u041a\u0441\u0442\u0430\u0442\u0438, \u044f \u043d\u0435 \u0448\u0443\u0447\u0443, \u044d\u0442\u043e \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0430 shadertoy, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d. \u041c\u044b \u0431\u0435\u0440\u0451\u043c \u043a\u0430\u043c\u0435\u0440\u0443, \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0435\u0442\u043a\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (\u043d\u0430\u0448 \u044d\u043a\u0440\u0430\u043d), \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u0443\u0447, \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0446\u0435\u043d\u043e\u0439, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0412\u043e\u0442 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/66d\/a0e\/be3\/66da0ebe356e82253f0492e6335f114e.svg\"><\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a <a href=\"https:\/\/github.com\/ssloy\/tinyraytracer\/blob\/769d9c952aa39037d331089c6e4fe14c8bb1a0bb\/tinyraytracer.cpp#L122\" rel=\"nofollow\">\u043a\u043e\u0434\u0430 \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430<\/a>: \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c \u0438 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0446\u0432\u0435\u0442. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>#pragma omp parallel for<\/code>! \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">    vec3 origin = [...];     #pragma omp parallel for     for (size_t j = 0; j&lt;height; j++) {         for (size_t i = 0; i&lt;width; i++) {             vec3 direction = [...];             framebuffer[i+j*width] = cast_ray(origin, direction);         }     }<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-pervyy-zalivaem-kartinku-gradientom\">\u042d\u0442\u0430\u043f \u043f\u0435\u0440\u0432\u044b\u0439: \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u043c<\/h1>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0435. \u041c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u043c\u0435\u0442\u044c \u0437\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u043c, \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412\u043e\u0442 \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b36\/f3b\/d9c\/b36f3bd9cd0d76b5a32143ccc38d468b.png\"><\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.shadertoy.com\/view\/3dXcDN\" rel=\"nofollow\">\u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a>. <\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">void mainImage( out vec4 fragColor, in vec2 fragCoord ) {     vec2 uv = fragCoord\/iResolution.xy;     vec3 col = vec3(uv.x, uv.y, 0.);     fragColor = vec4(col, 1.); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435\u0442 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u044d\u0442\u043e \u0437\u0430 \u043d\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>mainImage<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u043e\u043d\u0430 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044f <code>fragCoord<\/code> \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0446\u0432\u0435\u0442 <code>fragColor<\/code>. \u041f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u043d\u0441\u0442\u0440\u044b:<\/p>\n<p>  <\/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\/__G43hELHL0?rel=0&amp;showinfo=1&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>  <\/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\/z_xM_jD08OM?rel=0&amp;showinfo=1&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>  <\/p>\n<p>\u041d\u0430 \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b \u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0446\u0435\u043b\u044e\u0441\u044c, \u043c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043c (\u0437\u0434\u043e\u0440\u043e\u0432\u043e \u044f \u0432\u044b\u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f, \u0434\u0430? \u0442\u0438\u043f\u0430, \u044f \u0431\u044b \u043c\u043e\u0433, \u0434\u0430 \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0443\u0433!). \u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u2014 \u044d\u0442\u043e <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/Fragment_Shader\" rel=\"nofollow\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/a>. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u043c\u0443 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430. <\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-vtoroy-risuem-nazvanie-konferencii\">\u042d\u0442\u0430\u043f \u0432\u0442\u043e\u0440\u043e\u0439: \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438<\/h1>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438, \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9d4\/f16\/1f1\/9d4f161f1ebb9671cf911eece85018ab.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/WdXcDN\" rel=\"nofollow\">shadertoy<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u043b\u0435\u0432\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>bool jfig[32][18]<\/code>. \u0420\u0430\u0437\u043e\u0431\u044c\u0451\u043c \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043d\u0430 \u0441\u0435\u0442\u043a\u0443 32&#215;18 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u043e\u0432, \u0438 \u043e\u0441\u0432\u0435\u0442\u043b\u0438\u043c \u0442\u0435, \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code>true<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>jfig<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">void mainImage( out vec4 fragColor, in vec2 fragCoord ) {     vec2 uv = fragCoord\/iResolution.xy;     vec3 col = vec3(uv.x, uv.y, 0.);      vec2 coord = fragCoord\/iResolution.xy*vec2(32, 18);     if (jfig(uint(coord.x), uint(coord.y))) {         col += vec3(.5);     }      fragColor = vec4(col, 1.); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e 32*18 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u043b\u0435\u0432\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443, \u0442.\u043a. <code>bool<\/code> \u0432 \u044f\u0437\u044b\u043a\u0435 glsl \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u2026 32 \u0431\u0438\u0442\u0430! \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u0440\u0430\u043d\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u0431\u0438\u0442\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u0435 <code>jfig_bitfield<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>bool jfig(in uint x, in uint y)<\/code> \u0432\u044b\u043a\u043e\u0432\u044b\u0440\u0438\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0431\u0438\u0442 \u043f\u0443\u0442\u0451\u043c \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#define JFIGW 32u #define JFIGH 18u uint[] jfig_bitfield = uint[]( 0x0u,0x0u,0x0u,0xf97800u,0x90900u,0xc91800u,0x890900u,0xf90900u,0x180u,0x0u,0x30e30e0u,0x4904900u,0x49e49e0u,0x4824820u,0x31e31e0u,0x0u,0x0u,0x0u ); bool jfig(in uint x, in uint y) {     uint id = x + (JFIGH-1u-y)*JFIGW;     if (id&gt;=JFIGW*JFIGH) return false;     return 0u != (jfig_bitfield[id\/32u] &amp; (1u &lt;&lt; (id&amp;31u))); }<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-tretiy-samyy-vazhnyy-dobavlyaem-fon\">\u042d\u0442\u0430\u043f \u0442\u0440\u0435\u0442\u0438\u0439, \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439: \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u043d<\/h1>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/de3\/563\/212\/de35632126e8209c2d6ee5db5874f61c.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/3dfcDN\" rel=\"nofollow\">shadertoy<\/a>. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u044f \u043d\u0430\u0437\u0432\u0430\u043b \u0441\u0430\u043c\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0443. \u0412\u0435\u0434\u044c \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043b\u043e\u0441\u043a\u0430\u044f, \u0430 \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cube_mapping\" rel=\"nofollow\">\u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0448 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">struct Ray {     vec3 origin;     vec3 dir; };  vec3 cast_ray(in Ray ray) {     return texture(iChannel0, ray.dir).xyz; }  void mainImage( out vec4 fragColor, in vec2 fragCoord ) {     const float fov = 3.1416 \/ 4.;     vec2 uv = (fragCoord\/iResolution.xy*2. - 1.)*tan(fov\/2.);     uv.x *= iResolution.x\/iResolution.y;     vec3 orig = vec3(0., 0., 1.);     vec3 dir = normalize(vec3(uv, -1));      vec3 col = cast_ray(Ray(orig, dir));      fragColor = vec4(col, 1.); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>mainImage<\/code>. \u0427\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043a\u0430\u043c\u0435\u0440\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0434\u043e\u043b\u044c \u043e\u0441\u0438 -z. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439, \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043c\u0435\u0440\u0443 \u0441\u0432\u0435\u0440\u0445\u0443, \u043e\u0441\u044c y \u0442\u043e\u0440\u0447\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e00\/5c1\/b99\/e005c1b996cc7eb9978bc434f6773196.png\"><\/p>\n<p>  <\/p>\n<p>\u042d\u043a\u0440\u0430\u043d \u0443 \u043c\u0435\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c z=-1. \u0423\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430) \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u0430 \u044d\u0442\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0443 \u043c\u0435\u043d\u044f \u044d\u043a\u0440\u0430\u043d \u0448\u0438\u0440\u0438\u043d\u043e\u0439 16 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0443 \u0432 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445? \u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0440\u0430\u0441\u043d\u043e\u0439, \u0441\u0435\u0440\u043e\u0439 \u0438 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u043e\u0439 \u0441\u0435\u0440\u043e\u0439 \u043b\u0438\u043d\u0438\u044f\u043c\u0438. \u041b\u0435\u0433\u043a\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e <code>tan(fov\/2) = (screen width) * 0.5 \/ (screen - camera distance)<\/code>. \u041c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u0440\u0430 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, <code>(screen width) = 2 * tan (fov\/2)<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u0443\u0447 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 12\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0442\u043e \u0435\u0441\u0442\u044c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0438\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440. \u041a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u041a\u0430\u043a\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430? \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e 12+0.5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e 16 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 <code>2*tan(fov\/2)<\/code> \u043c\u0435\u0442\u0440\u0430\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043d\u0447\u0438\u043a \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 <code>(12+0.5)\/16 * 2*tan(fov\/2)<\/code> \u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u043a\u0440\u0430\u044f \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u0443 \u0438\u043b\u0438 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>(12+0.5) * 2\/16 * tan(fov\/2) - tan(fov\/2)<\/code> \u043e\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u043e\u0441\u044c\u044e -z. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u044f\u0442\u044c \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0443 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u0434\u0435 \u043a\u0430\u043c\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 (0,0,1), \u0430 \u044d\u043a\u0440\u0430\u043d \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 z=0, \u043d\u043e \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-chetvyortyy-puskaem-kameru-po-krugu\">\u042d\u0442\u0430\u043f \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0439: \u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u0443 \u043f\u043e \u043a\u0440\u0443\u0433\u0443<\/h1>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0436\u0434\u0435, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/WdfcDN\" rel=\"nofollow\">shadertoy<\/a>. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step4.gif\"><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u043d\u0430\u0448\u0430 \u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0442\u043e\u0447\u043a\u0435 (0,0,1) \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0430 \u0432\u0434\u043e\u043b\u044c \u043e\u0441\u0438 -z, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0435\u0437\u0434\u0438\u0442 \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0438 \u0435\u0451 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u0438\u043a\u043e\u0432\u0430\u043d \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0421\u0435\u043c\u044c \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u0430\u044e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">vec3 rotateCamera(in vec3 orig, in vec3 dir, in vec3 target) {     vec3 zAxis = normalize(orig - target);     vec3 xAxis = normalize(cross(vec3(0., 1., 0.), zAxis));     vec3 yAxis = normalize(cross(zAxis, xAxis));     mat4 transform = mat4(vec4(xAxis, 0.), vec4(yAxis, 0.), vec4(zAxis, 0.), vec4(orig, 1.));     return (transform * vec4(dir, 0.)).xyz; }  void mainImage( out vec4 fragColor, in vec2 fragCoord ) { [...]     vec3 orig = vec3(-sin(iTime\/4.), 0., cos(iTime\/4.));     vec3 dir = normalize(vec3(uv, -1));     dir = rotateCamera(orig, dir, vec3(0.)); [...] }<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-pyatyy-risuem-kvadratik\">\u042d\u0442\u0430\u043f \u043f\u044f\u0442\u044b\u0439: \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a<\/h1>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0440\u0435\u0431\u0440\u0430 \u043f\u043e\u043b\u043c\u0435\u0442\u0440\u0430, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 z=0:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step5.gif\"><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cast_ray()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">vec3 cast_ray(in Ray ray) {     if (abs(ray.dir.z)&gt;1e-5) {         float dist = (0. - ray.origin.z) \/ ray.dir.z;         if (dist &gt; 0.) {             vec3 point = ray.origin + ray.dir*dist;             if (point.x&gt;-.25 &amp;&amp; point.x&lt;.25 &amp;&amp; point.y&gt;-.25 &amp;&amp; point.y&lt;.25) {                       return vec3(0.2, 0.7, 0.8);             }           }     }    return texture(iChannel0, ray.dir).xyz; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/tsfyW4\" rel=\"nofollow\">shadertoy<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430 \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0436\u0438\u0432\u0451\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a (z=0). \u042f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e, \u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043d \u043b\u0438 \u043b\u0443\u0447 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <code>if (abs(ray.dir.z)&gt;1e-5)<\/code>. \u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <code>vec3 point = ray.origin + dist*ray.dir<\/code>, \u0433\u0434\u0435 dist \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043b\u0443\u0447\u0430 \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e? \u041d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 z \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f (z=0); \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0443\u0447\u0430 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>float dist = (0. - ray.origin.z) \/ ray.dir.z<\/code>. \u041d\u0443 \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u043d\u0438\u044f point \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b x \u0438 y \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u043f\u043e\u043b\u043c\u0435\u0442\u0440\u0430 \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0412\u0443\u0430\u043b\u044f!<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-shestoy-risuem-kub\">\u042d\u0442\u0430\u043f \u0448\u0435\u0441\u0442\u043e\u0439: \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0443\u0431<\/h1>\n<p>  <\/p>\n<p>\u041d\u0443 \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u0432\u0430\u0434\u0440\u0430\u0442, \u043d\u0430\u043c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0441\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u0443\u0431! \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/wsfyW4\" rel=\"nofollow\">shadertoy<\/a>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step6.gif\"><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0430 \u0441 \u043a\u0443\u0431\u043e\u043c, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e \u043e\u0441\u044f\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">struct Box {     vec3 center;     vec3 halfsize; };  bool box_ray_intersect(in Box box, in Ray ray, out vec3 point, out vec3 normal) {     for (int d=0; d&lt;3; d++) {         if (abs(ray.dir[d])&lt;1e-5) continue;          float side = (ray.dir[d] &gt; 0. ? -1.0 : 1.0);         float dist = (box.center[d] + side*box.halfsize[d] - ray.origin[d]) \/ ray.dir[d];         if (dist &lt; 0.) continue;         point = ray.origin + ray.dir*dist;         int i1 = (d+1)%3;         int i2 = (d+2)%3;         if (point[i1]&gt;box.center[i1]-box.halfsize[i1] &amp;&amp; point[i1]&lt;box.center[i1]+box.halfsize[i1] &amp;&amp;             point[i2]&gt;box.center[i2]-box.halfsize[i2] &amp;&amp; point[i2]&lt;box.center[i2]+box.halfsize[i2]) {             normal = vec3(0);             normal[d] = side;             return true;         }     }     return false; }<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-sedmoy-osveschenie\">\u042d\u0442\u0430\u043f \u0441\u0435\u0434\u044c\u043c\u043e\u0439: \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0438\u0444\u0444\u0443\u0437\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 (flat shading), \u043c\u044b \u0436\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0440\u0438\u0441\u0443\u0435\u043c \ud83d\ude42<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step7.gif\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/wdXcW4\" rel=\"nofollow\">shadertoy<\/a>. \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0448\u0435\u0439\u0434\u0438\u043d\u0433\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">struct Light {     vec3 position;     vec3 color; };  Light[] lights = Light[]( Light(vec3(-15,10,10), vec3(1,1,1)) );  vec3 cast_ray(in Ray ray) {     vec3 p, n;     if (box_ray_intersect(Box(vec3(0.), vec3(.25)), ray, p, n)) {         vec3 diffuse_light = vec3(0.);         for (int i=0; i&lt;lights.length(); i++) {             vec3 light_dir = normalize(lights[i].position - p);             diffuse_light  += lights[i].color * max(0., dot(light_dir, n));         }         return vec3(0.2, 0.7, 0.8)*(vec3(.7,.7,.7) + diffuse_light);     }     return texture(iChannel0, ray.dir).xyz; }<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"etap-vosmoy-risuem-krolika\">\u042d\u0442\u0430\u043f \u0432\u043e\u0441\u044c\u043c\u043e\u0439: \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u043e\u043b\u0438\u043a\u0430<\/h1>\n<p>  <\/p>\n<p>\u0420\u0430\u0437 \u0443\u0436 \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u0443\u0431, \u0442\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0443\u0434\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step8.gif\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/wsXcW4\" rel=\"nofollow\">shadertoy<\/a>. \u0420\u043e\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u043e\u043c (\u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439), \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u043a\u0440\u043e\u043b\u0438\u043a\u0430 \u043a\u0430\u043a \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0431\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#define BUNW 6 #define BUNH 6 #define BUND 4 #define BUNVOXSIZE 0.1 uint[] bunny_bitfield = uint[]( 0xc30d0418u, 0x37dff3e0u, 0x7df71e0cu, 0x004183c3u, 0x00000400u ); bool bunny(in int cubeID) {     if (cubeID&lt;0 || cubeID&gt;=BUNW*BUNH*BUND) return false;     return 0u != (bunny_bitfield[cubeID\/32] &amp; (1u &lt;&lt; (cubeID&amp;31))); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0442\u0438\u043f\u0430 0xc30d0418u, \u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \ud83d\ude42<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/882\/0d5\/cda\/8820d5cda0de64893f283f02e68bd5e3.jpg\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430 \u0438 \u0432\u043e\u043a\u0441\u0435\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u043b\u0438\u043a\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">bool bunny_ray_intersect(in Ray ray, out vec3 point, out vec3 normal) {     float bunny_dist = 1e10;     for (int i=0; i&lt;BUNW; i++) {         for (int j=0; j&lt;BUNH; j++) {             for (int k=0; k&lt;BUND; k++) {                 int cellID = i+j*BUNW+k*BUNW*BUNH;                 if (!bunny(cellID)) continue;                 Box box = Box(vec3(i-BUNW\/2,j-BUNH\/2,-k+BUND\/2)*BUNVOXSIZE+vec3(.5,.5,-.5)*BUNVOXSIZE, vec3(1.,1.,1.)*BUNVOXSIZE*.45);                 vec3 p, n;                 if (box_ray_intersect(box, ray, p, n) &amp;&amp; length(p-ray.origin) &lt; bunny_dist) {                     bunny_dist = length(p-ray.origin);                     point = p;                     normal = n;                 }             }         }     }     return bunny_dist &lt; 1e3; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>cast_ray()<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u044b\u0437\u043e\u0432 <code>box_ray_intersect()<\/code> \u043d\u0430 <code>bunny_ray_intersect()<\/code>. \u0412\u043e\u0442 \u0438 \u043a\u0440\u043e\u043b\u0438\u043a!<\/p>\n<p>  <\/p>\n<h1 id=\"etap-devyatyy-raskrashivaem-krolika\">\u042d\u0442\u0430\u043f \u0434\u0435\u0432\u044f\u0442\u044b\u0439: \u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u043e\u043b\u0438\u043a\u0430<\/h1>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0449\u044c \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u043a\u0443\u0431\u0438\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 <a href=\"https:\/\/www.shadertoy.com\/view\/wsXyD8\" rel=\"nofollow\">shadertoy<\/a>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/ssloy\/tinyraytracer\/shadertoy\/doc\/step9.gif\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0443\u0442 \u044f \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c, \u0438 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u0442\u044f\u043d\u0443\u043b \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 (\u043d\u043e\u043c\u0435\u0440 \u043a\u0443\u0431\u0438\u043a\u0430) \u0434\u0430\u0451\u0442 \u0446\u0432\u0435\u0442:<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/www.shadertoy.com\/view\/4lSBW3\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6eb\/1ce\/9bd\/6eb1ce9bda708df88d210cd9b04aa5f4.png\"><\/a><\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"vsyo-nash-sheyder-gotov\">\u0412\u0441\u0451, \u043d\u0430\u0448 \u0448\u0435\u0439\u0434\u0435\u0440 \u0433\u043e\u0442\u043e\u0432!<\/h1>\n<p>  <\/p>\n<p>Shadertoy.com \u043f\u043e\u043b\u043e\u043d \u043a\u0440\u0430\u0439\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043d\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b, \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u044b. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/ssloy\/tinykaboom\/wiki\" rel=\"nofollow\">\u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c<\/a> \u043c\u043e\u0439 \u043c\u0443\u043b\u044c\u0442\u044f\u0448\u043d\u044b\u0439 \u0432\u0437\u0440\u044b\u0432 (\u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e):<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/www.shadertoy.com\/view\/tdXyW4\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/45e\/f9a\/999\/45ef9a999494f226b7b04996a69c4796.png\"><\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u043f\u043e-\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438 \u0438\u043b\u0438 \u0436\u0438\u0432\u0451\u0442\u0435 \u0432\u043e \u0424\u0440\u0430\u043d\u0446\u0438\u0438, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u0437 (RTX Quadro) \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435 <a href=\"https:\/\/jfig2020.sciencesconf.org\/resource\/page\/id\/1\" rel=\"nofollow\">jFIG2020<\/a>. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u0438, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0432\u0430\u0448 \u0448\u0435\u0439\u0434\u0435\u0440, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u043d\u0435 \u0436\u0438\u0432\u0451\u0442\u0435 \u0432\u043e \u0424\u0440\u0430\u043d\u0446\u0438\u0438 \u0438 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u043f\u043e-\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438, \u0442\u043e \u0445\u043e\u0442\u044c \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0437 \u0432\u044b \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0434\u0432\u0438\u0436\u0443\u0445\u0435 \u043d\u0430 \u0432\u043d\u0435\u043a\u043e\u043d\u043a\u0443\u0440\u0441\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435, \u043d\u0430\u0448\u0443 \u043d\u0435\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0441\u0435\u043c\u0438\u0440\u043d\u0443\u044e \u0441\u043b\u0430\u0432\u0443 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043c \ud83d\ude42<\/p>\n<p>  <\/p>\n<p>\u0414\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u0444\u0438\u0433 \u043f\u0440\u0438\u0437\u044b, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u0446\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438!<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/493494\/\"> https:\/\/habr.com\/ru\/post\/493494\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/493494\/\">\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043f\u044f\u0442\u0438\u043c\u0438\u043d\u0443\u0442\u043a\u0443 \u0431\u0435\u0437 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u043e \u043d\u0435\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0432\u0438\u0440\u0443\u0441\u0430\u0445 \u043d\u0430 IT-\u0441\u0430\u0439\u0442\u0435! \u0410 \u0432\u0435\u0434\u044c \u0431\u0435\u0437 \u0448\u0443\u0442\u043e\u043a. \u0415\u0441\u043b\u0438 \u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u043f\u043e-\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438 \u0438\u043b\u0438 \u0436\u0438\u0432\u0451\u0442\u0435 \u0432\u043e \u0424\u0440\u0430\u043d\u0446\u0438\u0438, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u041d\u0418\u0418 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 <a href=\"https:\/\/jfig2020.sciencesconf.org\/resource\/page\/id\/1\" rel=\"nofollow\">jFIG2020<\/a> (\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0435 \u0434\u043d\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438). \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u0440\u043e \u0440\u0435\u0439\u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445. \u041c\u043e\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u0435\u0442 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u0448\u0438\u0440\u043d\u0430\u0440\u043c\u0430\u0441\u0441\u044b!<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d <a href=\"https:\/\/www.shadertoy.com\/view\/wsXyD8\" rel=\"nofollow\">\u044d\u0442\u043e\u0442 \u0448\u0435\u0439\u0434\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0441\u0430\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0441?<\/p>\n<p>  <\/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\/WzTVTjFpQAE?rel=0&amp;showinfo=1&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","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-300551","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300551","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=300551"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300551\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=300551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=300551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=300551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}