рдирдВрдЧреЗ C ++ рдХреА 256 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд░реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ

рдирдВрдЧреЗ C ++ рдХреА 256 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд░реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ


рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдХреЗ рдореЗрд░реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдФрд░ рдЕрдзреНрдпрд╛рдп рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЫреЛрдЯреЗрдХрдмреВрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред


рд╡реЗрдм рдкрд░ рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд▓реЗрдЦ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рддреИрдпрд╛рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордЭрдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдкреНрд░рд╕рд┐рджреНрдз рдмрд╕рд┐рдирдиреЗрд╕ рдХрд╛рд░реНрдб рд░реЗ рдЯреНрд░реЗрд╕рд░ рдЪреБрдиреМрддреА рдХреЛ рд▓реАрдЬрд┐рдПред рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд░рдо рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдореИрдВ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдиреЛрдЯ: рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдФрд░ рди рд╣реА рд╕рд┐рд░реНрдл рд╣рд╛рде рдореЗрдВ рдЪрд╛рдп рдХреЗ рдХрдк рдХреЗ рд╕рд╛рде рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреАрдмреЛрд░реНрдб рд▓реЗрдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЗрдВрдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░рд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо рдмрджрд▓реЗрдВ!


рдЗрд╕рд▓рд┐рдП, рдЖрдЬ рдХрд╛ рд▓рдХреНрд╖реНрдп рдРрд╕реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реИ:



рдЪрд░рдг 1: рдбрд┐рд╕реНрдХ рдкрд░ рдПрдХ рдЫрд╡рд┐ рд▓рд┐рдЦреЗрдВ


рдореИрдВ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдкреНрд░рдмрдВрдзрдХреЛрдВ, рдорд╛рдЙрд╕ / рдХреАрдмреЛрд░реНрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рдорд╛рди рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреА рдЧрдИ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд╕реНрд╡реАрд░ рд╣реЛрдЧреАред рддреЛ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЪрд┐рддреНрд░ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рд╡рд╣ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рджреЗрдВ:


#include <limits> #include <cmath> #include <iostream> #include <fstream> #include <vector> #include "geometry.h" void render() { const int width = 1024; const int height = 768; std::vector<Vec3f> framebuffer(width*height); for (size_t j = 0; j<height; j++) { for (size_t i = 0; i<width; i++) { framebuffer[i+j*width] = Vec3f(j/float(height),i/float(width), 0); } } std::ofstream ofs; // save the framebuffer to file ofs.open("./out.ppm"); ofs << "P6\n" << width << " " << height << "\n255\n"; for (size_t i = 0; i < height*width; ++i) { for (size_t j = 0; j<3; j++) { ofs << (char)(255 * std::max(0.f, std::min(1.f, framebuffer[i][j]))); } } ofs.close(); } int main() { render(); return 0; } 

рдХреЗрд╡рд▓ рд░реЗрдВрдбрд░ () рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рд░реЗрдВрдбрд░ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреЛ рд╡реАрдИрдХреЗ 3 рдПрдл рдореВрд▓реНрдпреЛрдВ рдХреЗ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ рд╕рд░рд▓ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП (рдЖрд░, рдЬреА, рдмреА) рдорд╛рди рджреЗрддреЗ рд╣реИрдВред рд╡реИрдХреНрдЯрд░ рдХрд╛ рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдФрд░ рддреАрди рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдШрдЯрд╛рд╡, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдПрдХ рд╕реНрдХреЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛, рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж) рдХрд╛ рдПрдХ рддреБрдЪреНрдЫ рд╣реЗрд░рдлреЗрд░ рд╣реИред


рдореИрдВ рдЫрд╡рд┐ рдХреЛ рдкреАрдкреАрдПрдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВред рдпрд╣ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрд╢рд╛ рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдпрдмреНрд░реЗрд░реА, рдЬреИрд╕реЗ stb рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВред рдпрд╣ рдПрдХ рдорд╣рд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ: рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ stb_image_write.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


рдЪреЗрддрд╛рд╡рдиреА: рдореЗрд░рд╛ рдХреЛрдб рдмрдЧреНрд╕ рд╕реЗ рднрд░рд╛ рд╣реИ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдареАрдХ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдиреЗ рдХрдорд┐рдЯ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ ред


рддреЛ, рдЗрд╕ рдХрджрдо рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ) рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ + рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рдмреА) рдбрд┐рд╕реНрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдПрдВред рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 2, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдХ: рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдг


рдпрд╣ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдХрдард┐рди рдХрджрдо рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА рдпрд╛ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд┐рдирд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╣рдорд╛рд░рд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЫрд╡рд┐


рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдкреНрд░рддрд┐ рдЪрд░рдг рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ; рдЧрд┐рдердм рдиреЗ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП , рджреВрд╕рд░реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╕реЗ рдХреНрдпрд╛ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ред


рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдЧреЛрд▓реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЪрд╛рд░ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ: рддреНрд░рд┐рднреБрдЬ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рдФрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрджрд┐рд╢:


 struct Sphere { Vec3f center; float radius; Sphere(const Vec3f &c, const float &r) : center(c), radius(r) {} bool ray_intersect(const Vec3f &orig, const Vec3f &dir, float &t0) const { Vec3f L = center - orig; float tca = L*dir; float d2 = L*L - tca*tca; if (d2 > radius*radius) return false; float thc = sqrtf(radius*radius - d2); t0 = tca - thc; float t1 = tca + thc; if (t0 < 0) t0 = t1; if (t0 < 0) return false; return true; } }; 

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рдЪреАрдЬ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рджреА рдЧрдИ рдХрд┐рд░рдг (dir рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЙрддреНрдкрддреНрддрд┐ рд╕реЗ рдЙрддреНрдкрдиреНрди) рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд░рддреА рд╣реИред рдХрд┐рд░рдг-рдХреНрд╖реЗрддреНрд░ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдореИрдВ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдФрд░ рдореЗрд░реЗ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред


рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ? рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдордиреЗ рдХреЗрд╡рд▓ рд░рдВрдЧреЛрдВ рдХреА рдПрдХ рдврд╛рд▓ рдХреЗ рд╕рд╛рде рддрд╕реНрд╡реАрд░ рднрд░реА:


  for (size_t j = 0; j<height; j++) { for (size_t i = 0; i<width; i++) { framebuffer[i+j*width] = Vec3f(j/float(height),i/float(width), 0); } } 

рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╣рдо рдореВрд▓ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдФрд░ рд╣рдорд╛рд░реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд░рдг рдЧреЛрд▓рдХ рдХреЗ рд╕рд╛рде рдорд┐рд▓рддреА рд╣реИ:



рдпрджрд┐ рдЧреЛрд▓рд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдо color1 рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ color2 рдХреЗ рд╕рд╛рде:


 Vec3f cast_ray(const Vec3f &orig, const Vec3f &dir, const Sphere &sphere) { float sphere_dist = std::numeric_limits<float>::max(); if (!sphere.ray_intersect(orig, dir, sphere_dist)) { return Vec3f(0.2, 0.7, 0.8); // background color } return Vec3f(0.4, 0.4, 0.3); } void render(const Sphere &sphere) { я┐╝ [...] for (size_t j = 0; j<height; j++) { for (size_t i = 0; i<width; i++) { float x = (2*(i + 0.5)/(float)width - 1)*tan(fov/2.)*width/(float)height; float y = -(2*(j + 0.5)/(float)height - 1)*tan(fov/2.); Vec3f dir = Vec3f(x, y, -1).normalize(); framebuffer[i+j*width] = cast_ray(Vec3f(0,0,0), dir, sphere); } } я┐╝ [...] } 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдкреЗрдВрд╕рд┐рд▓ рд▓реЗрдиреЗ рдФрд░ рдХрд╛рдЧрдЬ рдкрд░ рд╕рднреА рдЧрдгрдирд╛рдУрдВ (рдХрд┐рд░рдг-рдХреНрд╖реЗрддреНрд░ рдЪреМрд░рд╛рд╣реЗ рдФрд░ рдХрд┐рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХреИрдорд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:


  • рдЪрд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ
  • рдЪрд┐рддреНрд░ рдКрдВрдЪрд╛рдИ
  • рджреГрд╢реНрдп рдХреЛрдг рдХрд╛ рдХреНрд╖реЗрддреНрд░
  • рдХреИрдорд░рд╛ рд╕реНрдерд╛рди, Vec3f (0.0.0)
  • рдорд╛рдЗрдирд╕ рдЗрдирдлрд┐рдирд┐рдЯреА рдХреА рджрд┐рд╢рд╛ рдореЗрдВ, z- рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде, рджрд┐рд╢рд╛ рджреЗрдЦреЗрдВ

рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдЗрдП рдХрд┐ рд╣рдо рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд░рдг рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджрд┐рд╢рд╛ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реВрддреНрд░ рд╣реИ:


  float x = (2*(i + 0.5)/(float)width - 1)*tan(fov/2.)*width/(float)height; float y = -(2*(j + 0.5)/(float)height - 1)*tan(fov/2.); 

рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ? рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ред рд╣рдорд╛рд░рд╛ рдХреИрдорд░рд╛ рдореВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ -z рджрд┐рд╢рд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рд╛рдорд╛рди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рджреЗрдВ, рдпрд╣ рдЫрд╡рд┐ рдКрдкрд░ рд╕реЗ рдХреИрдорд░рд╛ рджрд┐рдЦрд╛рддреА рд╣реИ, рд╡рд╛рдИ рдЕрдХреНрд╖ рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ:


рдЫрд╡рд┐


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдХреИрдорд░реЗ рдХреЛ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреГрд╢реНрдп рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдорд╛рди z = -1 рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рджреЗрдЦрдиреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ рдХреМрди рд╕рд╛ рдХреНрд╖реЗрддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╣рдорд╛рд░реА рдЫрд╡рд┐ рдореЗрдВ рд╕реНрдХреНрд░реАрди 16 рдкрд┐рдХреНрд╕реЗрд▓ рдЪреМрдбрд╝реА рд╣реИ; рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╢реНрд╡ рдХреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ: рд╣рдореЗрдВ рд▓рд╛рд▓, рдЧреНрд░реЗ рдФрд░ рдЧреНрд░реЗ рдзрд░рд╛рд╢рд╛рдпреА рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЧрдард┐рдд рддреНрд░рд┐рдХреЛрдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЯреИрди (рджреЗрдЦрдиреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ / 2) = (рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ) 0.5 / (рд╕реНрдХреНрд░реАрди-рдХреИрдорд░рд╛ рджреВрд░реА)ред рд╣рдордиреЗ рд╕реНрдХреНрд░реАрди рдХреЛ рдХреИрдорд░реЗ рд╕реЗ 1 рдХреА рджреВрд░реА рдкрд░ рд░рдЦрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ (рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ) = 2 рдЯреИрди (рджреЗрдЦрдиреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ / 2)ред


рдЕрдм рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЗ 12 рд╡реЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдиреАрд▓реЗ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рдиреАрд▓реЗ рд╡реЗрдХреНрдЯрд░ рдХреА рдиреЛрдХ рдХреА рджреВрд░реА рдХрд┐рддрдиреА рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ 12 + 0.5 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ 16 рдкрд┐рдХреНрд╕рд▓ 2 рдЯреИрди (fov / 2) рд╡рд┐рд╢реНрд╡ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реЗрдХреНрдЯрд░ рдХреА рдиреЛрдХ рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рд╕реЗ (12 + 0.5) / 16 2 рдЯреИрди (fov / 2) рд╡рд┐рд╢реНрд╡ рдЗрдХрд╛рдЗрдпреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдпрд╛ (12 + 0.5) 2/16 * tan (fov / 2) рдХреА рджреВрд░реА рдкрд░ - рд╕реНрдХреНрд░реАрди рдФрд░ -z рдЕрдХреНрд╖ рдХреЗ рдмреАрдЪ рдЪреМрд░рд╛рд╣реЗ рд╕реЗ рдЯреИрди (fov / 2)ред рдЕрднрд┐рдХрд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЖрдк рдХрд┐рд░рдг рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕реВрддреНрд░ рдкрд╛рдПрдВрдЧреЗред


рдЪрд░рдг 3: рдЕрдзрд┐рдХ рдЧреЛрд▓реЗ рдЬреЛрдбрд╝реЗрдВ


рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рд╣рдорд╛рд░рд╛ рд░рд╛рд╕реНрддрд╛ рд╕рд╛рдл рд╣реИред рдЕрдЧрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреИрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рджреЗрд░ рдирд╣реАрдВ рд▓рдЧреЗрдЧреАред рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ , рдФрд░ рдпрд╣ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 4: рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛


рдкреНрд░рдХрд╛рд╢ рдХреА рдХрдореА рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЫрд╡рд┐ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рдкрд░рд┐рдкреВрд░реНрдг рд╣реИред рд╢реЗрд╖ рд▓реЗрдЦ рдХреЗ рджреМрд░рд╛рди рд╣рдо рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдХреБрдЫ рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


 struct Light { Light(const Vec3f &p, const float &i) : position(p), intensity(i) {} Vec3f position; float intensity; }; 

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реИрд╢реНрд╡рд┐рдХ рд░реЛрд╢рдиреА рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдард┐рди рдХрд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдХрд┐рд╕реА рдХреА рддрд░рд╣, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рднреМрддрд┐рдХ, рд▓реЗрдХрд┐рди рдиреЗрддреНрд░рд╣реАрди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдЖрдВрдЦ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдВрдЧреЗред рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдпрд╣ рд╕рд░реНрджрд┐рдпреЛрдВ рдореЗрдВ рдардВрдбрд╛ рдФрд░ рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рдЧрд░реНрдо рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдкреГрдереНрд╡реА рдХреА рд╕рддрд╣ рдХрд╛ рддрд╛рдк рд╕реВрд░реНрдп рдХреА рдХрд┐рд░рдгреЛрдВ рдХреЗ рдШрдЯрдирд╛ рдХреЗ рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╕реВрд░рдЬ рдЬрд┐рддрдирд╛ рдКрдБрдЪрд╛ рд╣реЛрддрд╛ рд╣реИ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЗ рдКрдкрд░, рд╕рддрд╣ рдЙрддрдиреА рд╣реА рд╢рд╛рдирджрд╛рд░ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЗ рдКрдкрд░ рдЬрд┐рддрдирд╛ рдХрдо рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рд╣рд▓реНрдХрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╕реВрд░рдЬ рдХреНрд╖рд┐рддрд┐рдЬ рдкрд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдлреЛрдЯреЙрди рднреА рд╣рдо рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдЧреЛрд▓реЗ рд╡рд╛рдкрд╕: рд╣рдо рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рдХрд┐рд░рдг рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВ (рдлреЛрдЯреЙрди рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ!) рдкрд░ рдпрд╣ рдПрдХ рдЧреЛрд▓реЗ рдкрд░ рд░реБрдХрддрд╛ рд╣реИред рд╣рдо рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рд░реЛрд╢рдиреА рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЛ рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЛрдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХреЛрдг рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд╕рддрд╣ рдЙрддрдиреА рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрдЧреАред рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рджреЛ рд╡реИрдХреНрдЯрд░ рдП рдФрд░ рдмреА рдХреЗ рдмреАрдЪ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рд╡реИрдХреНрдЯрд░ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЗ рдХреЛрд╕рд╛рдЗрди: рдП * рдмреА = | рдП | | рдмреА | cos (рдЕрд▓реНрдлрд╛ (a, b))ред рдпрджрд┐ рд╣рдо рдпреВрдирд┐рдЯ рд▓рдВрдмрд╛рдИ рдХреЗ рд╡реИрдХреНрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рд╣рдореЗрдВ рд╕рддрд╣ рдХреА рд░реЛрд╢рдиреА рдХреА рддреАрд╡реНрд░рддрд╛ рджреЗрдЧрд╛ред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд╕реНрдЯ_рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рд░ рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд░рдВрдЧ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗ:


 Vec3f cast_ray(const Vec3f &orig, const Vec3f &dir, const Sphere &sphere) { [...] float diffuse_light_intensity = 0; for (size_t i=0; i<lights.size(); i++) { Vec3f light_dir = (lights[i].position - point).normalize(); diffuse_light_intensity += lights[i].intensity * std::max(0.f, light_dir*N); } return material.diffuse_color * diffuse_light_intensity; } 

рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рдВрд╢реЛрдзрди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ , рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 5: рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рд▓рд╛рдЗрдЯрд┐рдВрдЧ


рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдЪрд╛рд▓ рдореИрдЯ рд╕рддрд╣реЛрдВ рдХреА рд░реЛрд╢рдиреА рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рди рджреЗрддрд╛ рд╣реИ, рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЗрд╕реЗ рдлреИрд▓рд╛рдирд╛ рд░реЛрд╢рдиреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЪрдордХрджрд╛рд░ рд╕рддрд╣реЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:


рдЫрд╡рд┐


рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рддрдиреЗ рд╕рдВрд╢реЛрдзрди рдЖрд╡рд╢реНрдпрдХ рдереЗред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЪрдордХрджрд╛рд░ рд╕рддрд╣реЛрдВ рдкрд░ рд╣рд▓реНрдХрд╛ рдкреНрд░рдХрд╛рд╢, рджреГрд╢реНрдп рджрд┐рд╢рд╛ рдФрд░ рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рдХреЗ рдмреАрдЪ рдХрд╛ рдХреЛрдг рдХрдо рд╣реЛрддрд╛ рд╣реИ ред


рдореИрдЯ рдФрд░ рдЪрдордХрджрд╛рд░ рд╕рддрд╣реЛрдВ рдХреА рд░реЛрд╢рдиреА рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рд╡рдВрдЪрдирд╛ рдХреЛ рдлреЛрдВрдЧ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдХреА рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд╢ рдореЙрдбрд▓ рдХрд╛ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рд╡рд░реНрдгрди рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕реЗ рд╕рд╛рдЗрдб рд╕реЗ рдкрдврд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЬрд╛рджреВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд┐рддреНрд░ рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 6: рдЫрд╛рдпрд╛


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд╢ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЫрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рдареАрдХ рдирд╣реАрдВ рд╣реИ! рдореБрдЭреЗ рдпрд╣ рдЪрд┐рддреНрд░ рдЪрд╛рд╣рд┐рдП:


рдЫрд╡рд┐


рдХреЛрдб рдХреА рдЫрд╣ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╕рдордп, рд╣рдо рд╕рд┐рд░реНрдл рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдмрд┐рдВрджреБ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рдмреАрдЪ рдХрд╛ рдЦрдВрдб рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╣реАрдВ рдХрд╛рдЯрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЪреМрд░рд╛рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ: рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рдмрд┐рдВрджреБ рдХреЛ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реВрдВ:


 Vec3f shadow_orig = light_dir*N < 0 ? point - N*1e-3 : point + N*1e-3; 

рд╡рд╣ рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмрд┐рдВрджреБ рд╡рд╕реНрддреБ рдХреА рд╕рддрд╣ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╢реНрди рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдХреЛрдИ рднреА рдХрд┐рд░рдг рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд░ рдХрд░ рдЬрд╛рдПрдЧреАред


рдЪрд░рдг 7: рдкреНрд░рддрд┐рдмрд┐рдВрдм


рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд░реЗрдВрдбрд░ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рддреАрди рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  Vec3f reflect_dir = reflect(dir, N).normalize(); Vec3f reflect_orig = reflect_dir*N < 0 ? point - N*1e-3 : point + N*1e-3; // offset the original point to avoid occlusion by the object itself Vec3f reflect_color = cast_ray(reflect_orig, reflect_dir, spheres, lights, depth + 1); 

рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: рдЧреЛрд▓реЗ рдХреЛ рдХрд╛рдЯрддреЗ рд╕рдордп, рд╣рдо рд╕рд┐рд░реНрдл рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЬреЛ рд╣рдо рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ!) рдФрд░ рдкреБрди: рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рд╕реНрдЯ_рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ 4 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, 0 рд╕реЗ рднреВрдЦреЗ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛? рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ 4 рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 8: рдЕрдкрд╡рд░реНрддрди


рдпрджрд┐ рд╣рдо рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрд╡рд░реНрддрди рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВ ред рд╣рдореЗрдВ рд░реЗрдлреНрд░реЗрдХреНрдЯреЗрдб рд░реЗ ( рд╕реНрдиреЗрд▓ рдХреЗ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ), рдФрд░ рд╣рдорд╛рд░реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд╕реНрдЯ_рд░реЗ рдореЗрдВ рдХреЛрдб рдХреА рддреАрди рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рдХрдЯрддрдо рдЧреЗрдВрдж "рдХрд╛рдВрдЪ рд╕реЗ рдмрдирд╛ рд╣реИ", рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдФрд░ рдЕрдкрд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:


рдЫрд╡рд┐


рдЪрд░рдг 9: рдЧреЛрд▓реЗ рд╕реЗ рдкрд░реЗ


рдЗрд╕ рдХреНрд╖рдг рддрдХ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ nontrivial рдЧрдгрд┐рддреАрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдорд╛рди рдЬреЛрдбрд╝реЗрдВред рдмрд┐рд╕рд╛рдд рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд╕рдВрдж рд╣реИред рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:



рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдб рдореЗрдВ рдХреЛрдб рдХреА 256 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ !


рдЪрд░рдг 10: рд╣реЛрдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ


рд╣рдордиреЗ рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд┐рдпрд╛ рд╣реИ: рд╣рдордиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рдореИрдВ рдЖрдкрдХреЛ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢рд╛рдЦрд╛ рд╣реЛрдорд╡рд░реНрдХ_рд╕реНрд╕рд┐рдЧреНрдирдореЗрдВрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддреИрдпрд╛рд░реА рдХрд░ рд▓реА рдЧрдИ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рдХреЛрдб рдЯреЙрдк рдХреА рджрд╕ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ 1: рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдирдХреНрд╢рд╛


рдлрд┐рд▓рд╣рд╛рд▓, рдпрджрд┐ рдХрд┐рд░рдг рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдирд╣реАрдВ рдХрд╛рдЯрддреА рд╣реИ, рддреЛ рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдирд┐рд░рдВрддрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░рдВрдЧ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдХреНрдпреЛрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рд╕реНрдерд┐рд░ рд╣реИ? рдЪрд▓реЛ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдлреЛрдЯреЛ рд▓реЗрддреЗ рд╣реИрдВ (рдлрд╝рд╛рдЗрд▓ envmap.jpg ) рдФрд░ рдЗрд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ! рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ jpg рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП stb рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ред рдпрд╣ рд╣рдореЗрдВ рдРрд╕реА рдЫрд╡рд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП:


рдЫрд╡рд┐


рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ 2: рдХреНрд╡реИрдХ-рдХреНрд╡реИрдХ!


рд╣рдо рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЪреЗрдХрдмреЛрд░реНрдб рджреЗрдЦреЗрдВ)ред рддреЛ рдЪрд▓рд┐рдП рддреНрд░рд┐рдХреЛрдг рдореЗрд╢ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ! рдореИрдВрдиреЗ рдПрдХ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ .obj рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдПрдХ рдХрд┐рд░рдг-рддреНрд░рд┐рдХреЛрдг рдЪреМрд░рд╛рд╣рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдореЗрдВ рдмрддрдЦ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЫрд╡рд┐


рдирд┐рд╖реНрдХрд░реНрд╖


рдореЗрд░рд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк (рдФрд░ рдЖрд╕рд╛рди!) рд╣реИрдВред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдореИрдВ рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдФрд░ рдорд╛рдЗрдВрд╕рд╡реЗрдкрд░ рдЧреЗрдо рдХреЗ рдкреНрд░рддрд┐ рдЖрдХрд░реНрд╖рд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛рдлреА рддреБрд▓рдиреАрдп рд╣реЛред


рдХреБрдЫ рдШрдВрдЯреЗ рдФрд░ рдХреЛрдб рдХреА рджреЛ рд╕реМ рдкрдЪрд╛рд╕ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣рдореЗрдВ рдПрдХ рд░реЗрдХреНрдЯреНрд░рд╛рд╕реЗрд░ рджреЗрддреА рд╣реИрдВред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд░реИрд╕реНрдЯрд░рд╛рдЗрдЬрд░ рдХреА рдкрд╛рдВрдЪ рд╕реМ рд▓рд╛рдЗрдиреЗрдВ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ!

Source: https://habr.com/ru/post/hi477244/


All Articles