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

рд╕реНрдЯреЗрдЬ рдПрдХ: рдбрд┐рд╕реНрдХ рдкрд░ рдЪрд┐рддреНрд░ рд╕рд╣реЗрдЬреЗрдВ
рдореИрдВ рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░, рдорд╛рдЙрд╕ / рдХреАрдмреЛрд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреА рдЧрдИ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд╕реНрд╡реАрд░ рд╣реЛрдЧреАред рддреЛ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдбрд┐рд╕реНрдХ рдкрд░ рдЪрд┐рддреНрд░ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ред
рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рдирд┐рд╣рд┐рдд рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рджреЗрддрд╛ рд╣реВрдБ:
#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 рдПрдл рдХреЗ рдлреНрд░реЗрдордмрдлрд╝рд░ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдпреЗ рд╕рд░рд▓ рддреАрди рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ (рдЖрд░, рдЬреА, рдмреА) рджреЗрддреЗ рд╣реИрдВред
рд╡реИрдХреНрдЯрд░ рдХрд╛ рд╡рд░реНрдЧ рдЬреНрдпрд╛рдорд┐рддрд┐ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореИрдВ рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ, рджреЛ рдФрд░ рддреАрди-рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд░рд▓ рд╣реЗрд░рдлреЗрд░ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдШрдЯрд╛рд╡, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдПрдХ рд╕реНрдХреЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛, рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж), рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд,
gbg рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд░ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ
рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ
рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдореИрдВ рддрд╕реНрд╡реАрд░ рдХреЛ
рдкреАрдкреАрдПрдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВ; рдпрд╣ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдмрдЪрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЕрднреА рднреА рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдПрд╕рдЯреАрдмреА ред рдпрд╣ рдПрдХ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ: рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ stb_image_write.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдпрд╣ jpg рдореЗрдВ рднреА png рдореЗрдВ рдмрдЪрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЗрд╕ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ) рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧ рдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ b) рдкрд░рд┐рдгрд╛рдо рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреЗрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

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

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ; Github рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП , рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреВрд╕рд░реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред
рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рд╣рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЪрд╛рд░ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ: рдПрдХ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╕рджрд┐рд╢ рдХреНрд╖реЗрддреНрд░ рдФрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрджрд┐рд╢:
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);
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдПрдХ рдкреЗрдВрд╕рд┐рд▓ рд▓реЗрдиреЗ рдФрд░ рдХрд╛рдЧрдЬ рдкрд░ рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдПрдХ рдЧреЛрд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд┐рд░рдг рдХреЗ рджреЛрдиреЛрдВ рдЪреМрд░рд╛рд╣реЗ, рдФрд░ рдХрд┐рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХреИрдорд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
- рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ
- рдЪрд┐рддреНрд░ рдКрдВрдЪрд╛рдИ
- рджреЗрдЦрдиреЗ рдХреЗ рдХреЛрдг, fov
- рдХреИрдорд░рд╛ рд╕реНрдерд╛рди, Vec3f (0,0,0)
- рдЯрдХрдЯрдХреА рдХреА рджрд┐рд╢рд╛, рд╢реВрдиреНрдп рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде, рд╢реВрдиреНрдп рд╕реЗ рдЕрдирдВрдд рдХреА рджрд┐рд╢рд╛ рдореЗрдВ
рд╕реНрдЯреЗрдЬ рддреАрди: рдЕрдзрд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ
рд╕рднреА рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣рдорд╛рд░реЗ рдкреАрдЫреЗ рд╣реИ, рдЕрдм рд╣рдорд╛рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдмрд╛рджрд▓ рд░рд╣рд┐рдд рд╣реИред рдЕрдЧрд░ рд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХреБрдЫ рдФрд░ рдХрд╛рдо рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдБ рдЖрдк рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ
рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рд╕реНрдЯреЗрдЬ рдЪрд╛рд░: рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛
рд╣рд░ рдХреЛрдИ рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░ рдкрд░ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рд╣реИред рд╢реЗрд╖ рд▓реЗрдЦ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдХреБрдЫ рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдЬреЛрдбрд╝реЗрдВ:
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; }
рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрди
рджреЗрдЦреЗрдВ , рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:

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

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

рд╕реНрдЯреЗрдЬ рдЫрд╣: рдЫрд╛рдпрд╛
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд╢ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЫрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ? рд╡рд┐рдХрд╛рд░! рдореБрдЭреЗ рдпрд╣ рдЪрд┐рддреНрд░ рдЪрд╛рд╣рд┐рдП:
рдХреЛрдб рдХреА
рдХреЗрд╡рд▓ рдЫрд╣ рд▓рд╛рдЗрдиреЗрдВ рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╕рдордп, рд╣рдо рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдмрд┐рдВрджреБ рд╕реНрд░реЛрдд рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╣реАрдВ рдХрд╛рдЯрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ: рдореИрдВ рдмрд┐рдВрджреБ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
Vec3f shadow_orig = light_dir*N < 0 ? point - N*1e-3 : point + N*1e-3;
рдХреНрдпреЛрдВ? рд╣рд╛рдВ, рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмрд┐рдВрджреБ рд╡рд╕реНрддреБ рдХреА рд╕рддрд╣ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдХреЛрдИ рднреА рдХрд┐рд░рдг рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЛ рдкрд╛рд░ рдХрд░ рдЬрд╛рдПрдЧреАред
рдЪрд░рдг рд╕рд╛рдд: рдкреНрд░рддрд┐рдмрд┐рдВрдм
рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
Vec3f reflect_dir = reflect(dir, N).normalize(); Vec3f reflect_orig = reflect_dir*N < 0 ? point - N*1e-3 : point + N*1e-3;
рдЦреБрдж рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЪреМрд░рд╛рд╣реЗ рдкрд░, рд╣рдо рдмрд╕ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдХрд┐рд░рдг рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (b рдХреА рдЧрдгрдирд╛ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдЖрдпрд╛!) рдФрд░ рдкреБрди: рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рд╕реНрдЯ_рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓реЗрдЧрд╛? рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХрд╛рдо рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЪрд╛рд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рд╣реИ:

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

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

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

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

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