[
рдкрд╣рд▓рд╛ рдФрд░
рджреВрд╕рд░рд╛ рднрд╛рдЧред]
рдЖрдЬ рд╣рдо рдПрдХ рдмрдбрд╝реА рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рдПрдВрдЧреЗред рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдЕрдирдВрдд рд╡рд┐рдорд╛рди рд╕реЗ рджреВрд░ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдерд╛, рдФрд░ рддреНрд░рд┐рдХреЛрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдкреВрд░рд╛ рд╕рд╛рд░, рдПрдХ рддрддреНрд╡ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрднрд╛рд╕реА рджреБрдирд┐рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдЙрд╕реЗ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
рднрд╛рдЧ 2 рд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдЬ рд╣рдо рдЬреЛ рдХрд░реЗрдВрдЧреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреЛрдб
рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!
рддреНрд░рд┐рдХреЛрдг
рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗрд╡рд▓ рддреАрди рдЬреБрдбрд╝реЗ рд╣реБрдП
рдХреЛрдиреЗ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреЛрдиреЗ рдХреЗ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХрд╛ рдХреНрд░рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ - рддреНрд░рд┐рдХреЛрдг рдХреЗ рд╕рд╛рдордиреЗ рдпрд╛ рдкреАрдЫреЗ рдХреА рддрд░рдлред рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, "рд╕рд╛рдордиреЗ" рдХреЛ рд╡рд╛рдорд╛рд╡рд░реНрдд рдкрд╛рд░рдЧрдорди рдХреНрд░рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд░рдг рдПрдХ рддреНрд░рд┐рднреБрдЬ рдХреЛ рдХрд╛рдЯрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ред 1997 рдореЗрдВ рдПрдХ рддреНрд░рд┐рднреБрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд┐рд░рдг рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп (рд▓реЗрдХрд┐рди
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ ) рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ 1997 рдореЗрдВ рд╕рдЬреНрдЬрди
рдПрдорд╛рдирд┐рди-рдореЗрд▓рд░ рдФрд░ рдмреЗрди рдЯреНрд░реЗрдордмреЛрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рд▓реЗрдЦ "рдлрд╛рд╕реНрдЯ, рдорд┐рдирд┐рдордо рд╕реНрдЯреЛрд░реЗрдЬ рд░реЗ-рдЯреНрд░рд╛рдПрдВрдЧрд▓ рдЗрдВрдЯрд░рд╕реЗрдХреНрд╢рди" рдореЗрдВ
рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдХреЗ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ HLSL shader рдХреЛрдб рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
static const float EPSILON = 1e-8; bool IntersectTriangle_MT97(Ray ray, float3 vert0, float3 vert1, float3 vert2, inout float t, inout float u, inout float v) {
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреА рдХрд┐рд░рдг рдФрд░ рддреАрди рдХреЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддреНрд░рд┐рдХреЛрдг рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯреЗрдб рд╣реИред рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреАрди рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ:
t
рдмреАрдо рдХреЗ рд╕рд╛рде рдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБ рддрдХ рдХреА рджреВрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░
u
/
v
рддреНрд░рд┐рднреБрдЬ рдкрд░ рдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрди рдмрд╛рдпрд░рд╕реЗрдВрдЯреНрд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВ (рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛
w = 1 - u - v
) рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ barycentric рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ
Scratchapixel рдкрд░ рдЙрдирдХреА рдЙрддреНрдХреГрд╖реНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрдврд╝реЗрдВред
рдмрд╣реБрдд рдЕрдзрд┐рдХ рджреЗрд░реА рдХреЗ рдмрд┐рдирд╛, рдЪрд▓реЛ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЛ рдХреЛрдб рдореЗрдВ рджрд░реНрд╢рд╛рдП рдЧрдП рдХреЛрдиреЗ рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрд╕ рдХрд░реЗрдВ! рд╢реЗрдб рдореЗрдВ
Trace
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдЬреЛрдбрд╝реЗрдВ:
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдмреАрдо рдХреЗ рд╕рд╛рде рджреВрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╕реАрдзреЗ рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп, рдЬреЛ рд╕рд╣реА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХрд┐рд╕реА рднреА рджреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЧреЗрдо рдореЛрдб рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдЯреНрд░реЗрд╕ рддреНрд░рд┐рдХреЛрдг рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░реЗрдВ:
рд╡реНрдпрд╛рдпрд╛рдо: рджреВрд░реА рдХреЗ рдмрдЬрд╛рдп рдмреИрд░рд┐рдПрдЯреНрд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрдордХрджрд╛рд░ рддреНрд░рд┐рдХреЛрдг рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рддреНрд░рд┐рднреБрдЬ рдореЗрд╖
рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рдзрд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░рд┐рдХреЛрдг рд╕реЗ рдкреВрд░реЗ рдЬрд╛рд▓ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдореЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдЧрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ, рдореЗрд╖ рдХреЛ рдХрдИ рдмрдлрд╝рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг
рд╢реАрд░реНрд╖ рдФрд░
рд╕реВрдЪрдХрд╛рдВрдХ рдмрдлрд╝рд░ рд╣реИрдВред
рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд░ , рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ 3 рдбреА рд╡реИрдХреНрдЯрд░ рдХреА рдПрдХ рд╕реВрдЪреА
рд╣реИ (рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ, рдШреБрдорд╛рдиреЗ рдпрд╛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдкрд░ рдРрд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╡реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордХреНрдЦреА рдкрд░
рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕ рд╕реЗ
рд╡рд░реНрд▓реНрдб рд╕реНрдкреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ) ред
рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдлрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ
рдЗрдВрдбреЗрдХреНрд╕ рд╣реИрдВ рдЬреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рддреАрди рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдлрд░ [0, 1, 2, 0, 2, 3] рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рджреЛ рддреНрд░рд┐рдХреЛрдг рд╣реИрдВ: рдкрд╣рд▓реЗ рддреНрд░рд┐рдХреЛрдг рдореЗрдВ рд╢реАрд░реНрд╖ рдмрдлрд░ рдореЗрдВ рдкрд╣рд▓реЗ, рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдХреЛрдиреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рддреНрд░рд┐рдХреЛрдг рдореЗрдВ рдкрд╣рд▓реЗ, рддреАрд╕рд░реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЪреМрдерд╛ рд╢рд┐рдЦрд░ред рдЗрд╕рд▓рд┐рдП, рд╕реВрдЪрдХрд╛рдВрдХ рдмрдлрд░ рднреА рдкреВрд░реНрд╡реЛрдХреНрдд рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдСрд░реНрдбрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд╝рд░реНрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдлрд╝рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдореЗрдВ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрдо рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдлрд╝рд░
рдорд╛рдирджрдВрдб ,
рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдЬрд┐рд╕реЗ
рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ рдпрд╛ рдмрд╕
рдпреВрд╡реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╕рд╛рде рд╣реА
рд╢реАрд░реНрд╖ рд░рдВрдЧ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ
рд╣реИрдВ ред
GameObjects рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЧреЗрдо рдСрдмрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд░реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рднреЛрд▓рд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓
FindObjectOfType<MeshRenderer>()
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рддреЗрдЬрд╝ рдХрд░реЗрдВред рдЖрдЗрдП рдПрдХ рдирдпрд╛
RayTracingObject
рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ:
using UnityEngine; [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshFilter))] public class RayTracingObject : MonoBehaviour { private void OnEnable() { RayTracingMaster.RegisterObject(this); } private void OnDisable() { RayTracingMaster.UnregisterObject(this); } }
рдпрд╣ рдШрдЯрдХ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░
RayTracingMaster
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдкрдВрдЬреАрдХрд░рдг рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВред рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдореЗрдВ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:
private static bool _meshObjectsNeedRebuilding = false; private static List<RayTracingObject> _rayTracingObjects = new List<RayTracingObject>(); public static void RegisterObject(RayTracingObject obj) { _rayTracingObjects.Add(obj); _meshObjectsNeedRebuilding = true; } public static void UnregisterObject(RayTracingObject obj) { _rayTracingObjects.Remove(obj); _meshObjectsNeedRebuilding = true; }
рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ - рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдЖрддрд╛ рд╣реИ: рд╣рдо рдпреВрдирд┐рдЯреА рдореЗрд╢ (рдореИрдЯреНрд░рд┐рдХреНрд╕, рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд╝рд░реНрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ - рдЙрдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ?) рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реА рдЦреБрдж рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ GPU рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ shader рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред рдЖрдЗрдП рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдмрдлрд╝рд░реНрд╕ рдХреЛ C # рд╕рд╛рдЗрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
struct MeshObject { public Matrix4x4 localToWorldMatrix; public int indices_offset; public int indices_count; } private static List<MeshObject> _meshObjects = new List<MeshObject>(); private static List<Vector3> _vertices = new List<Vector3>(); private static List<int> _indices = new List<int>(); private ComputeBuffer _meshObjectBuffer; private ComputeBuffer _vertexBuffer; private ComputeBuffer _indexBuffer;
... рдФрд░ рдЕрдм рд╣рдо рднреА рдпрд╣реА рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрджрдд рд╣реИ?
struct MeshObject { float4x4 localToWorldMatrix; int indices_offset; int indices_count; }; StructuredBuffer<MeshObject> _MeshObjects; StructuredBuffer<float3> _Vertices; StructuredBuffer<int> _Indices;
рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рддреИрдпрд╛рд░ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╕рднреА рдореЗрд╖реЛрдВ рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖реЛрдВ рдХреЛ рдПрдХ рдмрдбрд╝реА
List<Vector3>
рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдбрд╝реА
List<int>
ред рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдмрдбрд╝реЗ рдмрдлрд░ рдореЗрдВ рд╕рд╣реА рд╢реАрд░реНрд╖ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд░рд╣реЗрдВред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 1000 рдХреЛрдиреЗ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдЕрдм рд╣рдо рдПрдХ рд╕рд░рд▓ рдЬрд╛рд▓ рдХреНрдпреВрдм рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рддреНрд░рд┐рдХреЛрдг рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ [0, 1, 2] рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдлрд░ рдореЗрдВ 1000 рдХреЛрдиреЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдШрди рдореЗрдВ рдХреЛрдиреЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╡реЗ [1000, 1001, 1002] рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣рд╛рдБ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
private void RebuildMeshObjectBuffers() { if (!_meshObjectsNeedRebuilding) { return; } _meshObjectsNeedRebuilding = false; _currentSample = 0;
рд╣рдо
RebuildMeshObjectBuffers
рдореЗрдВ
RebuildMeshObjectBuffers
рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░
OnDisable
рдореЗрдВ рдирдП рдмрдлрд╝рд░реНрд╕ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рдпрд╣рд╛рдБ рджреЛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ рдКрдкрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдмрдлрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ:
private static void CreateComputeBuffer<T>(ref ComputeBuffer buffer, List<T> data, int stride) where T : struct {
рдорд╣рд╛рди, рд╣рдордиреЗ рдмрдлрд╝рд░реНрд╕ рдмрдирд╛рдП рдФрд░ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реЗ рднрд░реЗ рд╣реИрдВ! рдЕрдм рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдЗрд╕ shader рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрди рдХреЛрдб
SetShaderParameters
рдЬреЛрдбрд╝реЗрдВ (рдФрд░ рдирдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЧреЛрд▓реЗ рдмрдлрд░ рдХреЗ рдХреЛрдб рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
SetComputeBuffer("_Spheres", _sphereBuffer); SetComputeBuffer("_MeshObjects", _meshObjectBuffer); SetComputeBuffer("_Vertices", _vertexBuffer); SetComputeBuffer("_Indices", _indexBuffer);
рддреЛ, рдХрд╛рдо рдЙрдмрд╛рдК рд╣реИ, рд▓реЗрдХрд┐рди рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЕрднреА рдХреНрдпрд╛ рдХрд┐рдпрд╛: рд╣рдордиреЗ рдореЗрд╖реЛрдВ (рдореИрдЯреНрд░рд┐рдХреНрд╕, рдХреЛрдиреЗ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд) рдХреЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрд╛, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ GPU рдкрд░ рднреЗрдЬ рджрд┐рдпрд╛, рдЬреЛ рдЕрдм рдЖрдЧреЗ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХрдм рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд╖ рдЕрдиреБрд░реЗрдЦрдг
рдЪрд▓реЛ рдЙрд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╢реЗрдбрд░ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддреНрд░рд┐рдХреЛрдг рдХрд╛ рдЯреНрд░реЗрд╕ рдХреЛрдб рд╣реИ, рдФрд░ рдореЗрд╖ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рддреНрд░рд┐рдХреЛрдг рд╣реИрдВред рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕ рд╕реЗ рд╡рд░реНрд▓реНрдб рд╕реНрдкреЗрд╕ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди
mul
рдлрдВрдХреНрд╢рди (рдорд▓реНрдЯреАрдкреНрд▓ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж, рд░реЛрдЯреЗрд╢рди рдФрд░ рд╕реНрдХреЗрд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 4 ├Ч 4 рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреБрдгрди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 4d рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд╣рд▓реЗ рддреАрди рдШрдЯрдХ (x, y, z) рдХреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЪреМрдереЗ рдШрдЯрдХ (рдбрдмреНрд▓реНрдпреВ) рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рджрд┐рд╢рд╛ рдереА, рддреЛ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕рднреА рдЕрдиреБрд╡рд╛рдж рдФрд░ рдкреИрдорд╛рдиреЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ 0 рд▓рд┐рдЦреЗрдВрдЧреЗред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреНрд░рд╛рдордХ рд╣реИ? рдлрд┐рд░
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЖрда рдмрд╛рд░ рдкрдврд╝реЗрдВред рдпрд╣рд╛рдБ shader рдХреЛрдб рд╣реИ:
void IntersectMeshObject(Ray ray, inout RayHit bestHit, MeshObject meshObject) { uint offset = meshObject.indices_offset; uint count = offset + meshObject.indices_count; for (uint i = offset; i < count; i += 3) { float3 v0 = (mul(meshObject.localToWorldMatrix, float4(_Vertices[_Indices[i]], 1))).xyz; float3 v1 = (mul(meshObject.localToWorldMatrix, float4(_Vertices[_Indices[i + 1]], 1))).xyz; float3 v2 = (mul(meshObject.localToWorldMatrix, float4(_Vertices[_Indices[i + 2]], 1))).xyz; float t, u, v; if (IntersectTriangle_MT97(ray, v0, v1, v2, t, u, v)) { if (t > 0 && t < bestHit.distance) { bestHit.distance = t; bestHit.position = ray.origin + t * ray.direction; bestHit.normal = normalize(cross(v1 - v0, v2 - v0)); bestHit.albedo = 0.0f; bestHit.specular = 0.65f; bestHit.smoothness = 0.99f; bestHit.emission = 0.0f; } } } }
рд╣рдо рдпрд╣ рд╕рдм рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрдиреЗ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХрджрдо рджреВрд░ рд╣реИрдВред рдЖрдЗрдП
Trace
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдкреБрдирд░реНрдЧрдарди рдХрд░реЗрдВ рдФрд░ рдореЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдирд┐рд╢рд╛рди рдЬреЛрдбрд╝реЗрдВ:
RayHit Trace(Ray ray) { RayHit bestHit = CreateRayHit(); uint count, stride, i;
рдкрд░рд┐рдгрд╛рдо
рд╡рд╣ рд╕рдм рд╣реИ! рдЖрдЗрдП рдХреБрдЫ рд╕рд░рд▓ рдореЗрд╖реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдПрдХрддрд╛ рдЖрджрд┐рдо рдареАрдХ рд╣реИрдВ), рдЙрдиреНрд╣реЗрдВ
RayTracingObject
рдШрдЯрдХ рджреЗрдВ рдФрд░ рдЬрд╛рджреВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЕрднреА рддрдХ рд╡рд┐рд╕реНрддреГрдд рдореЗрд╢ рдХрд╛
рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ (рдХрдИ рд╕реМ рддреНрд░рд┐рдХреЛрдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ)! рд╣рдорд╛рд░реЗ shader рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреА рдХрдореА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирдореВрдиреЗ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕реЗрдХрдВрдб рдпрд╛ рдорд┐рдирдЯ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд┐рд╕реНрдЯрдо GPU рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛, рдПрдХрддрд╛ рдЗрдВрдЬрди рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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