"рдзреБрдВрдзрд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рд╕реНрдкрд╖реНрдЯ рдЫрд╡рд┐ рд╕реЗ рдмрджрддрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред" - рдлреЛрдЯреЛрдЧреНрд░рд╛рдлрд░ рдПрдВрд╕рд▓ рдПрдбрдореНрд╕
рд▓реЗрдЦ рдХреЗ
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╡реНрд╣рд╛рдИрдЯ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдмрдирд╛рдпрд╛, рдЬреЛ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рддреЗрдЬ рдЫрд╛рдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рд┐рдЬрд╝рдиреЗрд╕ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ: рдлреИрд▓рд╛рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдЪрдордХрджрд╛рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдирд░рдо рдЫрд╛рдпрд╛ред
рд╣рдорд╛рд░реЗ
рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж
рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо 1986 рдореЗрдВ рдЬреЗрдореНрд╕ рдХреИрдЬрд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП
рдкреНрд░рддрд┐рдкрд╛рджрди рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рд░реЗрдВрдбрд░рд░ рдХреЛ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо
рдкрде рдЯреНрд░реИрд╕рд░ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╣рдо рдлрд┐рд░ рд╕реЗ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХреЗ рд▓рд┐рдП C # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреЛрдб рдХреЛ
Bitbucket рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ ред
рдпрд╣ рд▓реЗрдЦ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧрдгрд┐рддреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрддреНрд░ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рд╕реВрддреНрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд░реЗрдВрдбрд░рд░
рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореВрд▓ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВред
рдиреАрдЪреЗ рдХреА рдЫрд╡рд┐ рдПрдЪрдбреАрдЖрд░рдЖрдИ рд╣реЗрд╡рди рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ
рднрд┐рддреНрддрд┐рдЪрд┐рддреНрд░ рдЖрд╢реНрд░рдп рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЕрдиреНрдп рдЫрд╡рд┐рдпреЛрдВ рдХреЛ
Kiara 9 Dusk рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдореАрдХрд░рдг
рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдлреЛрдЯреЛрд▓реЗрд░рд┐рд╕реНрдЯрд┐рдХ рд░реЗрдВрдбрд░рд░ рдХрд╛ рдХрд╛рд░реНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдПрд▓ ( рдПрдХреНрд╕ , v e c o m m e g a o ) = L e ( x , v e c o m e g a o ) + i n t O m e g a f r ( x , v e c o m e g a i ) , vec omegao),(( vec omegai cdot vecn) ,L(x, vec omegai,d vec )рдУрдореЗрдЧрд╛i
рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд╕реНрдХреНрд░реАрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдореАрдХрд░рдг рд╣рдореЗрдВ рд░реЛрд╢рдиреА рдХреА рдорд╛рддреНрд░рд╛ рджреЗрддрд╛ рд╣реИ
L(x, vec omegao) рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ
x (рдмреАрдо рдХреА рдШрдЯрдирд╛ рдХрд╛ рдмрд┐рдВрджреБ) рджрд┐рд╢рд╛ рдореЗрдВ
vec omegao (рдЬрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдмреАрдо рдЧрд┐рд░рддреА рд╣реИ)ред рд╕рддрд╣ рд╣реА рдкреНрд░рдХрд╛рд╢ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
Le(x, vec omegao) рд╣рдорд╛рд░реА рджрд┐рд╢рд╛ рдореЗрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рддрд╣реЗрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреЗрд╡рд▓ рдмрд╛рд╣рд░ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрднрд┐рдиреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рд╣рд░ рд╕рдВрднрд╡ рджрд┐рд╢рд╛ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд╢ рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдУрдореЗрдЧрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ (рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╣рдо
рдКрдкрд░ рд╕реЗ рд╕рддрд╣ рдкрд░ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реА рд░реЛрд╢рдиреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ
рд╣реИрдВ , рдФрд░
рдЕрдВрджрд░ рд╕реЗ рдирд╣реАрдВ, рдЬреЛ рдкрд╛рд░рднрд╛рд╕реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред
рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╣реИ
fr рдХреЛ рдПрдХ рджреНрд╡рд┐рджрд┐рд╢ рдкрд░рд╛рд╡рд░реНрддрди рд╡рд┐рддрд░рдг рд╕рдорд╛рд░реЛрд╣ (BRDF) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдзрд╛рддреБ рдпрд╛ рдврд╛рдВрдХрддрд╛ рд╣реБрдЖ, рдЕрдВрдзреЗрд░реЗ рдпрд╛ рдЙрдЬреНрдЬреНрд╡рд▓, рдЪрдордХрджрд╛рд░ рдпрд╛ рдореИрдЯред BRDF рдкреНрд░рдХрд╛рд╢ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
vec omegai рдЬреЛ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ
vec omegao ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд▓рд╛рд▓, рд╣рд░реЗ рдФрд░ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рддреАрди-рдШрдЯрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
[0,1] ред
рджреВрд╕рд░рд╛ рднрд╛рдЧ -
( vec omegai cdot vecn) 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
рд╕реА рдУ рдПрд╕ рде реА рдЯ рд╛ рдЬрд╣рд╛рдБ
$ рде реА рдЯ рд╛ - рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд╢ рдФрд░ рд╕рддрд╣ рдХреЗ рдмреАрдЪ рдХрд╛ рдХреЛрдг рд╕рд╛рдорд╛рдиреНрдп
v e c n ред рд╕рддрд╣ рдкрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХрд╛рд╢ рдХреА рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рд░рдгреЛрдВ рдХреЗ рдПрдХ рд╕реНрддрдВрдн рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдЕрдм рд╕рдорддрд▓ рдХреЛрдг рдкрд░ рд╕рддрд╣ рдкрд░ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реА рдЙрд╕реА рдХрд┐рд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдкреНрд░рдХрд╛рд╢ рдПрдХ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдЧрд╣рд░рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╕рд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЦреБрдж рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХрд╛рд╢
рд╡реА рдИ рд╕реА рдУ рдПрдо рдИ рдЬреА рдПрдХ рдореИрдВ рдЙрд╕реА рд╕рдореАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛
рдПрдХреНрд╕ рдКрдкрд░реА рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рджрд┐рд╢рд╛рдУрдВ рд╕реЗ рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд╢ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ
рдПрдХреНрд╕ рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИ
рдПрдХреНрд╕ рдкреА рдЖрд░ рдЖрдИ рдПрдо рдИ рдЬрд┐рд╕ рдХреА рдЪрдордХ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдКрдкрд░реА рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рджрд┐рд╢рд╛рдУрдВ рд╕реЗ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реА рд░реЛрд╢рдиреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рд╕рднреА рдЧрдгрдирд╛ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЕрднрд┐рдиреНрди рд╕рдореАрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреЗ рдЧреЛрд▓рд╛рд░реНрдз рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ рд╕реАрдзреЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИред
1 рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛! рд╣рдо рдЕрдХреНрд╕рд░ рдХреЛрд╕рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреЛ рд╣рдореЗрд╢рд╛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐
\ vec {a} \ cdot \ vec {b} = \ | \ vec {a \ _ \ _ \ _ | \ vec {b} \ | \ cos (\ theta) , рдФрд░ рд╣рдо
рджрд┐рд╢рд╛рдУрдВ (рдпреВрдирд┐рдЯ рд╡реИрдХреНрдЯрд░) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрд╕рд╛рдЗрди рд╣реИред
рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ
рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рдПрдХреАрдХрд░рдг рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрдХреАрдХрд░рдг рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдиреЛрдВ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕рд╣реА рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╕рд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ - рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣рдо рдирдореВрдиреЗ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
FN рдЕрдиреБрдорд╛рдирд┐рдд frac1N sumNn=0 fracf(xn)p(xn)
рдЗрд╕рд▓рд┐рдП, рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ
рдЪ(xn) рдПрдХреАрдХрд░рдг рдбреЛрдореЗрди рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдиреЛрдВ рдХреЗ рдФрд╕рдд рд╕реЗ рд▓рдЧрднрдЧ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдХреЛ рдЙрд╕рдХреЗ рдЪрдпрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
p(xn) ред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЕрдзрд┐рдХ рдмрд╛рд░ рдЪреБрдиреЗ рдЧрдП рдирдореВрдиреЗ рдореЗрдВ рдХрдо рдЪреБрдиреЗ рдЧрдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рдЬрди рд╣реЛрдЧрд╛ред
рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рд╕рдорд╛рди рдирдореВрдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдЪрдпрдирд┐рдд рд╣реЛрдиреЗ рдХреА рд╕рдорд╛рди рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ), рдирдореВрдиреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд┐рд░рдВрддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ:
p( omega)= frac12 pi (рдХреНрдпреЛрдВрдХрд┐
2 pi рдПрдХ рдЧреЛрд▓рд╛рд░реНрдз рдХрд╛ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ)ред рдпрджрд┐ рд╣рдо рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
L (x, \, \ vec \ omega_ {o}) \ рдЕрдиреБрдорд╛рдирд┐рдд L_e (x, \, \ vec \ omega_ {o}) + \ frac {1} {N} \ sum_ / n = 0} ^ {N } {\ color {Green} {2 \ pi \, f_r (x, \, \ vec \ omega_ {i}, \, \ vec \ omega_ {o}) \ _, (\ vec \ nomega_ {i} \ cdot \ _ vec n)} \ _, рдПрд▓ (x, \, \ vec \ omega_ {i})}
рд╡рд┐рдХрд┐рд░рдг
Le(x, vec omegao) рдХреНрдпрд╛ рд╕рд┐рд░реНрдл рд╣рдорд╛рд░реЗ
Shade
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИред
frac1N рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ
AddShader
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдирд╛
L(x, vec omegai) рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд░рдг рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╕рдореАрдХрд░рдг рдХреЗ рд╣рд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЬреАрд╡рди рджреЗрдирд╛ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ
рдПрдХ рдпрд╛рддреНрд░рд╛ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ: рдирдореВрдиреЗ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛, рдирд┐рдпрддрд╛рддреНрдордХ рджреГрд╢реНрдп, рдФрд░ рд╢реЗрдбрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ред
рд╕рдВрдЪрдп
рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХрддрд╛ рдиреЗ рдореБрдЭреЗ
OnRenderImage
рдореЗрдВ
destination
рд░реВрдк рдореЗрдВ рдПрдЪрдбреАрдЖрд░ рдмрдирд╛рд╡рдЯ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛
destination
ред
R8G8B8A8_Typeless
рдкреНрд░рд╛рд░реВрдк рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдореВрдиреЗ рд╕рдВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХрддрд╛ рдмрд╣реБрдд рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП
private RenderTexture _converged
рдХреЛ C #
private RenderTexture _converged
ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдмрдлрд╝рд░ рд╣реЛрдЧрд╛, рд╕реНрдХреНрд░реАрди рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдоред рд╣рдо
InitRenderTexture
рдлрдВрдХреНрд╢рди рдореЗрдВ
_target
рддрд░рд╣ рд╣реА рдЯреЗрдХреНрд╕рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ / рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
Render
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдбрдмрд▓ рдмреНрд▓рд┐рдЯрд┐рдВрдЧ:
Graphics.Blit(_target, _converged, _addMaterial); Graphics.Blit(_converged, destination);
рдирд┐рдпрддрд╛рддреНрдордХ рджреГрд╢реНрдп
рдкреНрд░рднрд╛рд╡ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╕рдордп, рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЕрдм рддрдХ, рдкреНрд▓реЗ рдореЛрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд░рдВрдн рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рджреГрд╢реНрдп рдорд┐рд▓реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реА #
public int SphereSeed
рдФрд░
SetUpScene
рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдореЗрдВ
public int SphereSeed
рдЬреЛрдбрд╝реЗрдВ:
Random.InitState(SphereSeed);
рдЕрдм рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмреАрдЬ рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рднреА рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЬрдм рддрдХ рдЖрдкрдХреЛ рд╕рд╣реА рджреГрд╢реНрдп рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рддрдм рддрдХ
RayTracingMaster
/ рдЪрд╛рд▓реВ рдХрд░реЗрдВред
рдирдореВрдирд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рд╕реНрдлреЗрдпрд░ рд╕реАрдб 1223832719, рд╕реНрдлреЗрдпрд░ рд░реЗрдбрд┐рдпрд╕ [5, 30], рдХреНрд╖реЗрддреНрд░реЛрдВ рдореИрдХреНрд╕ 10000, рд╕реНрдлреЗрдпрд░ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рд░реЗрдбрд┐рдпрд╕ 100ред
рд╕реБрдбреМрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛
рд╕реНрдЯреЛрдЪрд╕реНрдЯрд┐рдХ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╢реЗрдбрд░ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд
рдХреИрдиреЛрдирд┐рдХрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рд╣реИ:
float2 _Pixel; float _Seed; float rand() { float result = frac(sin(_Seed / 100.0f * dot(_Pixel, float2(12.9898f, 78.233f))) * 43758.5453f); _Seed += 1.0f; return result; }
_Pixel
рд╕реАрдзреЗ
CSMain
рдХреЛ
_Pixel = id.xy
CSMain
рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд┐рднрд┐рдиреНрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред
_Seed
SetShaderParameters
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ C # рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
RayTracingShader.SetFloat("_Seed", Random.value);
рдпрд╣рд╛рдВ рдЙрддреНрдкрдиреНрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЕрд╕реНрдерд┐рд░ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рдФрд░ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗред
рдЧреЛрд▓рд╛рд░реНрдз рдХрд╛ рдирдореВрдирд╛
рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рд╣рдореЗрдВ рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рджрд┐рд╢рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрд░реА рд╕рд╛рдЗрдорди рдХреЗ
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкреВрд░реНрдг рджрд╛рдпрд░реЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдБ shader рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
float3 SampleHemisphere(float3 normal) { // float cosTheta = rand(); float sinTheta = sqrt(max(0.0f, 1.0f - cosTheta * cosTheta)); float phi = 2 * PI * rand(); float3 tangentSpaceDir = float3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); // return mul(tangentSpaceDir, GetTangentSpace(normal)); }
рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЬреЗрдб рдЕрдХреНрд╖ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рд▓рд┐рдП рджрд┐рд╢рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдВред рд╣рдо рдПрдХ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдФрд░ рджреНрд╡рд┐рдкрдж (рджреЛ рд╡реИрдХреНрдЯрд░ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ)ред рдкрд╣рд▓реЗ, рд╣рдо рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рдПрдХреНрд╕ рдЕрдХреНрд╖ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЬреЗрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ (рд▓рдЧрднрдЧ) рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рд╣рдо рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрд╕рд╛рдорд╛рдиреНрдпред
float3x3 GetTangentSpace(float3 normal) {
рд▓реИрдореНрдмрд░реНрдЯ рдмрд┐рдЦрд░рдирд╛
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рджрд┐рд╢рд╛рдПрдБ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ BRDF рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдлреИрд▓рд╛рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реИрдореНрдмрд░реНрдЯ рдмреАрдЖрд░рдбреАрдПрдл, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ:
fr(x, vec omegai, vec omegao)= frackd pi рдЬрд╣рд╛рдБ
kd - рдпрд╣ рдЕрд▓реНрдмреЗрдбреЛ рд╕рддрд╣ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕рдореАрдХрд░рдг рдореЗрдВ рдбрд╛рд▓реЗрдВ (рдореИрдВ рдЕрднреА рддрдХ рдПрдорд┐рд╕рд┐рдЯреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦреВрдВрдЧрд╛) рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
L (x, \, \ vec \ omega_ {o}) \ рд▓рдЧрднрдЧ \ frac {1} {N} \ sum_ {n = 0} ^ {N} {\ n рд░рдВрдЧ {BlueViolet} {2 k_d_ \ _ (\ _) vec \ omega_ {i} \ cdot \ vec n) \, L (x, \, \ vec \ omega_ {i})}
рдЖрдЗрдП рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ рдЕрднреА рд╢реЗрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВред
Shade
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдХреЛрдб рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
if (hit.distance < 1.#INF)
рдирд┐рд░реНрдорд╛рдг рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ:
// ray.origin = hit.position + hit.normal * 0.001f; ray.direction = SampleHemisphere(hit.normal); ray.energy *= 2 * hit.albedo * sdot(hit.normal, ray.direction); return 0.0f;
рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдмреАрдо рдХреА рдирдИ рджрд┐рд╢рд╛ рд╕рдЬрд╛рддреАрдп рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рдирдореВрдиреЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдмреАрдо рдХреА рдКрд░реНрдЬрд╛ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рдореАрдХрд░рдг рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧ рд╕реЗ рдЧреБрдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕рддрд╣ рдХрд┐рд╕реА рднреА рд░реЛрд╢рдиреА рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ (рдпрд╣ рдХреЗрд╡рд▓ рдЖрдХрд╛рд╢ рд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХрд╛рд╢ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ), рд╣рдо 0. рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐
AddShader
рдХреЗ рдирдореВрдиреЗ рдФрд╕рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
frac1N sum ред
CSMain
рдкрд╣рд▓реЗ рд╕реЗ рдЧреБрдгрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
L(x, vec omegai) (рдЕрдЧрд▓рд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдмреАрдо), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрд╛рдо рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред
sdot
рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдВрддрд░рд╛рд▓ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ
[0,1] :
float sdot(float3 x, float3 y, float f = 1.0f) { return saturate(dot(x, y) * f); }
рдЖрдЗрдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЕрдм рддрдХ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
CSMain
рдХреИрдорд░реЗ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХрд┐рд░рдгреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░
Shade
рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд╕рддрд╣ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рдмреАрдо (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмреАрдо рдХреА рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдФрд░ рдХреЛрд╕рд╛рдЗрди рдХреЗ рдмреАрдЖрд░рдбреАрдПрдл рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдЖрдХрд╛рд╢ рдХреЗ рд╕рд╛рде рдХрд┐рд░рдг рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░, рд╣рдо рдПрдЪрдбреАрдЖрд░рдЖрдИ (рд░реЛрд╢рдиреА рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реНрд░реЛрдд) рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд░реЛрд╢рдиреА рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд░рдг рдХреА рдКрд░реНрдЬрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА рд╕рднреА рдкрд┐рдЫрд▓реЗ рдЪреМрд░рд╛рд╣реЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо, рдХреИрдорд░реЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирдореВрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрднрд┐рд╕рд░рдг рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
frac1N ред
рдХрд╛рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪреВрдВрдХрд┐ рдзрд╛рддреБрдУрдВ рдореЗрдВ рд╡рд┐рд╕рд░рд┐рдд рдкреНрд░рддрд┐рдмрд┐рдВрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП рдЕрдм рдЙрдирдХреЗ рд▓рд┐рдП C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ
SetUpScene
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░реЗрдВ (рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рджреГрд╢реНрдп рдХреЗ
Random.value
рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ
Random.value
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ):
bool metal = Random.value < 0.0f;
рдкреНрд▓реЗ рдореЛрдб рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд╢реЛрд░ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рдХреИрд╕реЗ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
рдлреЛрдВрдЧ рдорд┐рд░рд░ рдЗрдореЗрдЬ
рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЧрдгрд┐рдд рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрд╢)ред рдЖрдЗрдП Phong рдХреЗ BRDF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрдкрдг рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪрд┐рддреНрд░ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░реЗрдВред рдлреЛрдВрдЧ рдХреЗ рдореВрд▓ рд╕реВрддреНрд░реАрдХрд░рдг рдореЗрдВ рдЗрд╕рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ (рд░рд┐рд╢реНрддреЛрдВ рдХреА рдХрдореА рдФрд░ рдКрд░реНрдЬрд╛ рд╕рдВрд░рдХреНрд╖рдг) рдереАрдВ, рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ
рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ ред рдмрдврд╝рд╛ рд╣реБрдЖ BRDF рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
vec omegar рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╣реИ, рдФрд░
рдЕрд▓реНрдлрд╛ рдПрдХ рдлреЛрдВрдЧ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рд╣реИ рдЬреЛ рдЦреБрд░рджрд░рд╛рдкрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:
fr(x, vec omegai, vec omegao)=ks frac рдЕрд▓реНрдлрд╛+22 pi ( vec omega)r cdot vec omegao) Alpha
рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рджреНрд╡рд┐-рдЖрдпрд╛рдореА
рдЧреНрд░рд╛рдл рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдм Phong рдХреЗ рд▓рд┐рдП BRDF рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
рдЕрд▓реНрдлрд╛=15 45 ┬░ рдХреЗ рдХреЛрдг рдкрд░ рдПрдХ рдмреАрдо рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдПред рдорд╛рди рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЕрд▓реНрдлрд╛ ред
рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕рдореАрдХрд░рдг рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:
L(x, vec omegao) рд▓рдЧрднрдЧ frac1N sumNn=0 colorbrownks ,( Alpha+)2)( vec omegar cdot vec omegao) Alpha( vec omegai cdot vecn ,L(x,\), vec omegai)
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рд▓реИрдореНрдмрд░реНрдЯ BRDF рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
L(x, vec omegao) рд▓рдЧрднрдЧ frac1N sumNn=0[ colorvilViolet2kn+ colorрднреВрд░рд╛ks ,( рдЕрд▓реНрдлрд╛+2)( vec omegar cdot vec omegao) Alpha] ,( vec nomegai cdot vecn)L(x, vec omegai)
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╡реЗ рд▓реИрдореНрдмрд░реНрдЯ рдмрд┐рдЦрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреЛрдб рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ, рд▓реЗрдХрд┐рди рд╕рдордХрдХреНрд╖ (рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд) рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛
omegao рдХреЗ рдмрдЬрд╛рдп
omegai )ред рдЕрдм рдореЗрдЯрд▓ рдордЯреЗрд░рд┐рдпрд▓ рдХреЛ рд╡рд╛рдкрд╕
SetUpScene
рдлрдВрдХреНрд╢рдиреНрд╕ рдореЗрдВ рдмрджрд▓
SetUpScene
рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ
рдЕрд▓реНрдлрд╛ , рдЖрдк рдПрдХ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдо рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрднрд┐рд╕рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╢реЛрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдбрд╝рддрд╛рд▓реА рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж рднреА, рдкрд░рд┐рдгрд╛рдо рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
рдЕрд▓реНрдлрд╛=15 рдФрд░
рдЕрд▓реНрдлрд╛=300 8192 рдирдореВрдиреЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖ? рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реБрдВрджрд░ рдЖрджрд░реНрд╢ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдереЗ (
рдЕрд▓реНрдлрд╛= infty )! .. рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо
рд╕рдЬрд╛рддреАрдп рдирдореВрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмреАрдЖрд░рдбреАрдПрдл рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рдЬрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрдЪреНрдЪ рдлреЛрдВрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдмреАрдЖрд░рдбреАрдПрдл рд╕рднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рджрд┐рд╢рд╛рдПрдВ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЕрдкрдиреЗ
рд╕рдЬрд╛рддреАрдп рдирдореВрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░,
рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рджрд┐рд╢рд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреАрдЖрд░рдбреАрдПрдл рдЕрдиреНрдп рд╕рднреА рдЫреЛрдЯреЗ рдирдореВрдиреЛрдВ рдХреА рднрд░рдкрд╛рдИ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдлреИрд▓рд╛рд╡ рд╣реИред рдХрдИ рд╕реНрдкреЗрдХреБрд▓рд░ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рдВрд╕ рд╡рд╛рд▓реЗ рд░рд╛рд╕реНрддреЗ рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реИрдВ рдФрд░ рдирддреАрдЬрд╛ рдЗрдореЗрдЬреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдмрдврд╝рд╛ рд╣реБрдЖ рдирдореВрдирд╛
рдЕрдкрдиреЗ рдкрде рдЕрдиреБрдЪрд░ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддрд┐рдорд╛рди рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХреАрдорддреА рдирдореВрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдорд╣рддреНрд╡рд╣реАрди рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдХрдо рдмреАрдЖрд░рдбреАрдПрдл рдФрд░ / рдпрд╛ рдХреЛрд╕рд╛рдЗрди рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ), рдЪрд▓реЛ
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирдореВрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ ред
рдкрд╣рд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдЖрджрд░реНрд╢ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЫрд╛рдпрд╛рдВрдХрди рддрд░реНрдХ рдХреЛ рдлреИрд▓рд╛рдирд╛ рдФрд░ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ (рдЕрдиреБрдкрд╛рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░)
kd рдФрд░
ks )ред рдлреИрд▓рд╛рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдЬрд╛рддреАрдп рдирдореВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХрдорд╛рддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджрд┐рд╢рд╛ рдореЗрдВ рдмреАрдо рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдХрдо рдирдореВрдиреЗ рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрд▓ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
energy
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдФрд╕рдд рд░рдВрдЧ рдЪреИрдирд▓:
float energy(float3 color) { return dot(color, 1.0f / 3.0f); }
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ Whited ray tracer рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЕрд╕рд▓реА рдлреИрд▓рд╛рдирд╛ рдЫрд╛рдпрд╛рдВрдХрди рдХреЗ рд╕рд╛рде (рдЬреЛ рдореБрд▓рд╛рдпрдо рдЫрд╛рдпрд╛, рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛, рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдлреИрд▓рд╛рддрд╛ рд╣реИ):
рдорд╣рддреНрд╡ рдХрд╛ рдирдореВрдирд╛
рдЖрдЗрдП рдореВрд▓ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕реВрддреНрд░ рдкрд░ рдПрдХ рдФрд░ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
FN рдЕрдиреБрдорд╛рдирд┐рдд frac1N sumNn=0 fracf(xn)p(xn)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдирдореВрдиреЗ рдХреЛ рдЪреБрдирдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ (рдирдореВрдирд╛) рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рддрдХ, рд╣рдордиреЗ рд╕рдЬрд╛рддреАрдп рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рдирдореВрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░рдВрддрд░ рдерд╛
p( omega)= frac12 pi ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛, рдпрд╣ рдЗрд╖реНрдЯрддрдо рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреЛрдВрдЧ рдмреАрдЖрд░рдбреАрдПрдл рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛ рдмрд╣реБрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрдбрд╝рд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд┐рд▓рд╛рди рдпреЛрдЧреНрдп рдлрд▓ рд╡рд┐рддрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
p(x)=f(x) ред рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:
FN рд▓рдЧрднрдЧ frac1N sumNn=01
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдирдореВрдирд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдХрдо рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред рдЗрди рдирдореВрдиреЛрдВ рдХрд╛ рдЪрдпрди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛрдЧреАред рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╡рд┐рдЪрд░рдг рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдЕрднрд┐рд╕рд░рдг рдХреЛ рдЧрддрд┐ рджреЗрдЧрд╛ред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрджрд░реНрд╢ рд╡рд┐рддрд░рдг рдХреЛ рдЦреЛрдЬрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ BRDF ├Ч cosine ├Ч рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд╢) рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВ (рдпрд╣ рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд╢ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ), рд▓реЗрдХрд┐рди BRDF ├Ч рдХреЛрд╕рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдиреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ BRDF рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдиреЛрдВ рдХреА рдорджрдж рдорд┐рд▓реЗрдЧреА рд╣рдореЗрдВред рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдорд╣рддреНрд╡ рджреНрд╡рд╛рд░рд╛ рдирдореВрдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрд╕рд╛рдЗрди рдирдореВрдирд╛
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рдЬрд╛рддреАрдп рд╡рд┐рддрд░рдг рдХреЛ рдХреЛрд╕рд╛рдЗрди рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рднреВрд▓ рди рдХрд░реЗрдВ, рдХреЛрдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╕рдЬрд╛рддреАрдп рдирдореВрдиреЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдирдХреЗ рдкреНрд░рднрд╛рд╡
рдХреЛ рдХрдо рдХрд░рдХреЗ, рд╣рдо рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ
рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдирдореВрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдереЙрдорд╕ рдкреЛрд▓реЗ рдХреЗ
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рд╣рдо
alpha
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдиреЗ
SampleHemisphere
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдлрд╝рдВрдХреНрд╢рди рдХреЛрд╕реАрдиреНрд╕ рдХреЗ рдЪрдпрди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ: 0 рдПрдХ рд╕рдорд╛рди рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП, 1 рдХреЛрд╕рд╛рдЗрди рдХреЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП, рдпрд╛ рдлреЛрдВрдЧ рдХреЗ рдЙрдЪреНрдЪ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪрддрд░ред рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
float3 SampleHemisphere(float3 normal, float alpha) {
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд░рд╛рдмрд░ рд╣реИ
p( omega)= frac рдЕрд▓реНрдлрд╛+12 pi( vec omega cdot vecn) рдЕрд▓реНрдлрд╛ ред рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреА рд╕реБрдВрджрд░рддрд╛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЖрдк рдЗрд╕реЗ рд╕рдордЭреЗрдВрдЧреЗред
рдорд╣рддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд▓реИрдореНрдмрд░реНрдЯ рдирдореВрдирд╛
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рдлреИрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд╕рдЬрд╛рддреАрдп рд╡рд┐рддрд░рдг рдореЗрдВ, рд▓реИрдореНрдмрд░реНрдЯ рдирд┐рд░рдВрддрд░ рдмреАрдЖрд░рдбреАрдПрдл рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдХреЙрд╢рди рдЬреЛрдбрд╝рдХрд░ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрд╕рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдирдореВрдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг (рдЬрд╣рд╛рдВ)
рдЕрд▓реНрдлрд╛=1 ) рдмрд░рд╛рдмрд░ рд╣реИ
frac( vec omegai cdot vecn) pi , рдЬреЛ рд╡рд┐рд╕рд░рд┐рдд рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рд╕реВрддреНрд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ:
L (x, \, \ vec \ omega_ {o}) \ рд▓рдЧрднрдЧ \ frac {1} {N} \ sum_ {n = 0} ^ {N} {\ n {{рдиреАрд▓рд╛ рд░рдВрдЧ} {k_d} \ _, L (x) ,, \ vec \ omega_ {i})}
рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдХрд░ рдЧрддрд┐ рджреЗрдЧрд╛ред рдЕрдм рдЪрд▓рд┐рдП рдЕрд╕рд▓реА рдореБрджреНрджреЗ рдкрд░ рдЖрддреЗ рд╣реИрдВред
Fongov рдорд╣рддреНрд╡ рд╕реЗ рдирдореВрдирд╛
рдлреЛрдВрдЧ рдмреАрдЖрд░рдбреАрдПрдл рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рди рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдХреЛрд╕рд╛рдЗрди рдХреЗ рдЙрддреНрдкрд╛рдж рд╣реИрдВ: рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдореАрдХрд░рдг рд╕реЗ рдорд╛рдирдХ рдХреЛрд╕рд╛рдЗрди (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рд╕рд░рд┐рдд рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ), BRDF рдЙрдЪрд┐рдд рдХреЛрд╕рд╛рдЗрди рд╕реЗ рдЧреБрдгрд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЖрдЦрд┐рд░реА рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдЖрдЗрдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ Phong рд╕рдореАрдХрд░рдг рдореЗрдВ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдбрд╛рд▓реЗрдВред
рд▓рд╛рдлреНрдпреВрди рдФрд░ рд╡рд┐рд▓реЗрдореНрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
: рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдлреЛрдВрдЧ рдкрд░рд╛рд╡рд░реНрддрди рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (1994) :
L (x, \, \ vec \ omega_ {o}) \ рд▓рдЧрднрдЧ \ frac {1} {N} \ sum_ {n = 0} ^ {N} {\ _ {рдмреНрд░рд╛рдЙрди} {k_s \ _ \ _ \ _ \ _ _ \ _ \ _ рдЕрд▓реНрдлрд╝рд╛ + 2} {\ рдЕрд▓реНрдлрд╝рд╛ + 1}}}, (\ vec \ omega_ {i} \ cdot \ vec n) \, L (x, \, \ vec \ omega_ (i})
рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рдлреЛрдВрдЧ рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдордЧреНрд░реА
рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рдЕрдкрдиреА рджреГрд╢реНрдп рдкреАрдврд╝реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЧреЛрд▓реЗ рдХреА рдЪрд┐рдХрдирд╛рдИ рдФрд░ рдЙрддреНрд╕рд░реНрдЬрди рдХреЗ рд▓рд┐рдП рдмрджрд▓рддреЗ рдореВрд▓реНрдп рдмрдирд╛рдПрдВ! C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ
struct Sphere
,
public float smoothness
рдФрд░
public Vector3 emission
ред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдХрдореНрдкреНрдпреВрдЯ рдмрдлрд╝рд░ (4 ├Ч рдлреНрд▓реЛрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛, рдпрд╛рдж рд░рдЦрдирд╛?) рдмрдирд╛рддреЗ рд╕рдордп рдХрджрдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд┐рдХрдирд╛рдИ рдФрд░
SetUpScene
рд▓рд┐рдП
SetUpScene
рдлрд╝рдВрдХреНрд╢рди рд╕рдореНрдорд┐рд▓рд┐рдд рдорд╛рди рдмрдирд╛рдПрдБред
рд╢реЗрдбрд░ рдореЗрдВ, рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ
struct Sphere
рдФрд░
struct RayHit
, рдФрд░ рдлрд┐рд░
CreateRayHit
рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ,
IntersectGroundPlane
(рд╣рд╛рд░реНрдбрдХреЛрдб, рдХреЛрдИ рднреА рдорд╛рди рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ) рдФрд░
IntersectSphere
(
Sphere
рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛) рджреЛрдиреЛрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВред
рдореИрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪрд┐рдХрдирд╛рдИ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдирдХ рдпреВрдирд┐рдЯреА рд╢реЗрдбрд░, рдЬреЛ рдХрд┐ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдлреЛрдВрдЧ рдПрдХреНрд╕рдкреЛрдиреЗрдВрдЯ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ рдЬрд┐рд╕реЗ
Shade
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
float SmoothnessToPhongAlpha(float s) { return pow(1000.0f, s * s); }
float alpha = SmoothnessToPhongAlpha(hit.smoothness);
Shade
рдореЗрдВ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдХрд░ рдЙрддреНрд╕рд░реНрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
return hit.emission;
рдкрд░рд┐рдгрд╛рдо
рдЧрд╣рд░реА рд╕рд╛рдВрд╕ рд▓реЗрдВред рдЖрд░рд╛рдо рдХрд░реЗрдВ рдФрд░ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЫрд╡рд┐ рдЗрддрдиреА рдЦреВрдмрд╕реВрд░рдд рддрд╕реНрд╡реАрд░ рдореЗрдВ рди рдмрджрд▓ рдЬрд╛рдП:
рдмрдзрд╛рдИ! рдЖрдк рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдерд╛рдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рд╣рдордиреЗ рдПрдХ рдкрде рдЕрдиреБрд░реЗрдЦрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдлреИрд▓рд╛рдирд╛ рдФрд░ рджрд░реНрдкрдг рдЫрд╛рдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рдорд╣рддреНрд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ, рддреБрд░рдВрдд рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рдорд┐рдирдЯреЛрдВ рдореЗрдВ, рдШрдВрдЯреЛрдВ рдпрд╛ рджрд┐рдиреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛред
рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдХрджрдо рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рднреА рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖред рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдордЭ рдХреЛ рдХрд╛рдлреА рдЧрд╣рд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рднреМрддрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо (рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП) рдирдореВрдиреЗ рдФрд░ рдЫрд╛рдпрд╛рдВрдХрди рдХреЗ рдЬрдВрдЧрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ рд╕рдЬреНрдЬрдиреЛрдВ рдореЛрд▓рд░ рдФрд░ рдЯреНрд░рдВрдмреЛрд░ рд╕реЗ рдорд┐рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреНрдпрддрд╛ рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рд╣рдореЗрдВ рдЙрдирд╕реЗ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреА рд╣реЛрдЧреАред
рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдбреЗрд╡рд┐рдб рдХреНрдпреВрд░реА рдереНрд░реА рдЖрдИрдб рдЧреЗрдореНрд╕, рд╡реЛрдХреНрд╕рд╡реИрдЧрди рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд▓реИрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╢реЛрдзрдХрд░реНрддрд╛ рдФрд░ рднрд╛рд░реА рдзрд╛рддреБ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВред