рд╣рдо AGAL рдкрд░ рдПрдХ shader рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлреНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░ 11 рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рддреНрд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЬреАрдкреАрдпреВ рд╕рдорд░реНрдерди рд╣реИред рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЛрд▓реЗрд╣рд┐рд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рддрд░рдл рдХрд▓реНрдкрдирд╛ рдХреЛ рдкреВрд░рд╛ рдЦреЗрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░ рдЖрдзреБрдирд┐рдХ 3 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕

рд╡рд░реНрддрдорд╛рди AGAL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реИрдбрд░ рдореЙрдбрд▓ 2.0 рдлрд╕рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред 2005 рддрдХ рд╕реАрдорд┐рдд рдЖрдпрд░рди рдлреЗрд▓рд┐рд╕рд┐рд╕реНрдЯред рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ shader рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд╣реАрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдлреНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдмрд╛рд░ рдХреЛ рдПрд╕рдПрдо 3.0 рдореЗрдВ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдмрдирд╛рд╡рдЯреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╡рд░реНрдЯреЗрдХреНрд╕рд░ рд╢реЗрдбрд░ рд╕реЗ рд╕реАрдзреЗ рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдбреЛрдм рдиреАрддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЕрдЧрд▓реА рдкреАрдврд╝реА рддрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдХреЛрдИ рднреА AGAL рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ рд╣реИред рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪрд┐рдд рджреЗрдЦрднрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рдкрддреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ shader рдХреЛрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
opcode [dst], [src1], [src2] 
рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореБрдХреНрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ "рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ src1 рдФрд░ src2 рдХреЗ рд╕рд╛рде opcode рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рдорд╛рди рдХреЛ dst рдкрд░ рд▓реМрдЯрдирд╛"ред рдПрдХ shader рдореЗрдВ 256 рдирд┐рд░реНрджреЗрд╢ рддрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдирд╛рдо dst, src1, рдФрд░ src2: va, vc, fc, vt, ft, op, oc, v, fs рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рдЬрд┐рд╕реНрдЯрд░, fs рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдПрдХ рдЪрд╛рд░-рдЖрдпрд╛рдореА (xyzw рдпрд╛ rgba) рд╡реЗрдХреНрдЯрд░ рд╣реИред рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рд┐рдЬрд╝рд▓рд┐рдВрдЧ (рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо) рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:
 dp4 ft0.x, v0.xyzw, v0.yxww 

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЖрдЙрдЯрдкреБрдЯ рд░рдЬрд┐рд╕реНрдЯрд░

рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдХреЛ рдСрдк (рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐) рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╡рд┐рдВрдбреЛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдорд╛рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЯреБрдХрдбрд╝рд╛ рд╢реЗрдбрд░ - рдЗрди рдУрд╢рди (рдЖрдЙрдЯрдкреБрдЯ рдХрд▓рд░) рдЕрдВрддрд┐рдо рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХрд╛ рдореВрд▓реНрдпред рдЯреБрдХрдбрд╝рд╛ shader рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд▓реЛ рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдорд╛рдорд▓реЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛

рдПрдХ рд╢реАрд░реНрд╖ рдкрд░ 8 рд╡реЗрдХреНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреЛ рд╡реИрдбрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реЗрдбрд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдлрд░ рдХреА рд╕реНрдерд┐рддрд┐ Context3D.setVertexBufferAt рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛ рдбреЗрдЯрд╛ FLOAT_1, FLOAT_2, FLOAT_3, FLOAT_4 рдФрд░ BYTES_4 рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдирд╛рдо рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ BYTES_4 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдХреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред 255 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рддред

рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ

рдСрдк рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ v рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 8 рд╡реИрдХреНрдЯрд░ рддрдХ рдХреЗ рдЯреБрдХрдбрд╝реЗ shader рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрди рд╡реИрдХреНрдЯрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рдмрд╣реБрднреБрдЬ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рдХреНрд╖реЗрдкрдХреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 // vertex mov op, va0 //   -  mov v0, va1 //        // fragment mov oc, v0 //       



рдЪрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ

рд╢реАрд░реНрд╖ рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рд╢реЗрдб рдореЗрдВ, 8 рд░рдЬрд┐рд╕реНрдЯрд░ vt рдФрд░ ft рддрдХ рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреБрдХрдбрд╝рд╛ shader рдореЗрдВ, рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо (v0..v3 рд░рдЬрд┐рд╕реНрдЯрд░) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЪрд╛рд░ рд╡реИрдХреНрдЯрд░ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 add ft0, v0, v1 // ft0 = v0 + v1 add ft0, ft0, v2 // ft0 = ft0 + v2 add ft0, ft0, v3 // ft0 = ft0 + v3 

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

рд╢реЗрдбреНрд╕ ILP (рдирд┐рд░реНрджреЗрд╢-рд╕реНрддрд░ рд╕рдорд╛рдВрддрд░рд╡рд╛рдж) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЬреЛ рдХрд┐ рдирд╛рдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╢рд░реНрдд рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:
 add ft0, v0, v1 // ft0 = v0 + v1 add ft1, v2, v3 // ft1 = v2 + v3 add ft0, ft0, ft1 // ft0 = ft0 + ft1 

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

рдкрдВрдЬреАрдХрд░рдг рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ

рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЛрдб рдХреЗ рд╕реАрдзреЗ shader рдХреЛрдб рдореЗрдВ рднрдВрдбрд╛рд░рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ Context3D.drawTriangles рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реЗрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ vc (128 рд╡реИрдХреНрдЯрд░) рдФрд░ fc (28 рд╡реИрдХреНрдЯрд░) рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдХрдВрдХрд╛рд▓ рдПрдиреАрдореЗрд╢рди рдпрд╛ рдЕрдиреБрдХреНрд░рдордг рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛рджрд╛рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдорд╣рдВрдЧрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╢реЗрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рд░рдЬрд┐рд╕реНрдЯрд░-рдирдореВрдирд╛

рдЖрдк Context3D.setTextureAt рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде 8 рдЯреЗрдХреНрд╕реНрдЯ рддрдХ рдЕрдВрд╢ shader рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд fs рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯреЗрдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП рддреНрд░рд┐рднреБрдЬ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╢реАрд░реНрд╖ рдХреА рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╣рдо рдЗрди рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ:
 // vertex mov op, va0 //  mov v0, va1 //   -   // fragment tex oc, v0, fs0 <2d,linear> //    



рдСрдкрд░реЗрдЯрд░реЛрдВ

рдлрд┐рд▓рд╣рд╛рд▓ (рдЕрдХреНрдЯреВрдмрд░ 2011), AGAL рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
  mov dst = src1 neg dst = -src1 abs dst = abs(src1) add dst = src1 + src2 sub dst = src1 тАУ src2 mul dst = src1 * src2 div dst = src1 / src2 rcp dst = 1 / src1 min dst = min(src1, src2) max dst = max(src1, src2) sat dst = max(min(src1, 1), 0) frc dst = src1 тАУ floor(src1) sqt dst = src1^0.5 rsq dst = 1 / (src1^0.5) pow dst = src1^src2 log dst = log2(src1) exp dst = 2^src1 nrm dst = normalize(src1) sin dst = sine(src1) cos dst = cosine(src1) slt dst = (src1 < src2) ? 1 : 0 sge dst = (src1 >= src2) ? 1 : 0 dp3   dst = src1.x*src2.x + src1.y*src2.y + src1.z*src2.z dp4       dst = src1.x*src2.x + src1.y*src2.y + src1.z*src2.z + src1.w*src2.w crs   dst.x = src1.y * src2.z тАУ src1.z * src2.y dst.y = src1.z * src2.x тАУ src1.x * src2.z dst.z = src1.x * src2.y тАУ src1.y * src2.x m33     33 dst.x = dp3(src1, src2[0]) dst.y = dp3(src1, src2[1]) dst.z = dp3(src1, src2[2]) m34     34 dst.x = dp4(src1, src2[0]) dst.y = dp4(src1, src2[1]) dst.z = dp4(src1, src2[2]) m44     44 dst.x = dp4(src1, src2[0]) dst.y = dp4(src1, src2[1]) dst.z = dp4(src1, src2[2]) dst.w = dp4(src1, src2[3]) kil       ,   src1  ,     alpha-test,       . tex       dst     src1   src2    ,   , : tex ft0, v0, fs0 <2d,repeat,linear,miplinear>     :   2d, cube  nearest, linear  nomip, miplinear, mipnearest  clamp, repeat 

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

рдкреНрд░рднрд╛рд╡

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

рдлреМрдЬреЛрдВ рдХреЛ рдШрд░ рджреЗрдирд╛

рдмрд╛рдж рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдЪрд╛рдпрджрд╛рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ "рд░рд┐рдХреНрдд" рд╣реЛрдЧрд╛ред рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдорд░реЗ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдирд┐рд░рдВрддрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХ 4x4 рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 4 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ vc0 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ v0..v3 рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдХреНрд╕рд░ рд╢реЗрдбрд░ (0.0, 0.5, 1.0, 2.0) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдПрдХ рдирд┐рд░рдВрддрд░ рд╡реЗрдХреНрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореВрд▓ shader рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
 // vertex m44 op, va0, vc0 //  viewProj  // fragment mov ft0, fc0.xxxz //   ft0    mov oc, ft0 //  ft0     



рдмрдирд╛рд╡рдЯ рдорд╛рдирдЪрд┐рддреНрд░рдг

рд▓рдЧрднрдЧ рдПрдХ рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдПрдХ рд╢реЗрдбрд░ рдореЗрдВ 8 рдмрдирд╛рд╡рдЯ рддрдХ рдУрд╡рд░рд▓реЗ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реАрдорд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИ рдЬрдм рдПрдЯрд▓рд╕ рдпрд╛ рдХреНрдпреВрдмрд┐рдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдВ рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ рдмрдирд╛рд╡рдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ-рдЗрдВрдЯрд░рдкреЛрд▓рд░, рдЬреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рд╕реЗ рдЕрдкрдирд╛рдП рдЧрдП рд╣реИрдВ:
 // vertex ... mov v0, va1 //       // fragment tex ft0, v0, fs0 <2d,repeat,linear,miplinear> 



рд▓реИрдореНрдмрд░реНрдЯ рд╢реЗрдбрд┐рдВрдЧ

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

рд╢реЗрдбрд░ рджреЛ рдирдП рдирд┐рд░рдВрддрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдЧрд╛: рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдореВрд▓реНрдп:
 // vertex ... mov v1, va2 // v1 = normal sub v2, vc4, va0 // v2 = lightPos - vertex (lightVec) // fragment ... nrm ft1.xyz, v1 // normal ft1 = normalize(lerp_normal) nrm ft2.xyz, v2 // lightVec ft2 = normalize(lerp_lightVec) dp3 ft5.x, ft1.xyz, ft2.xyz // ft5 = dot(normal, lightVec) max ft5.x, ft5.x, fc0.x // ft5 = max(ft5, 0.0) add ft5, fc1, ft5.x // ft5 = ambient + ft5 mul ft0, ft0, ft5 // color *= ft5 



рдлреЛрдВрдЧ рдЫрд╛рдпрд╛рдВрдХрди

рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рдЪрдордХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓реИрдореНрдмрд░реНрдЯ рдкреНрд░рдХрд╛рд╢ рдореЙрдбрд▓ рдореЗрдВ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рднрдбрд╝рдХрдиреЗ рдХреА рддреАрд╡реНрд░рддрд╛ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рд╕реНрд░реЛрдд рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЗ рдХреЛрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╢рдХреНрддрд┐-рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕рддрд╣ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░реЗрдХреНрд╖рдХ рдХреЗ рд╕рджрд┐рд╢ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджрд┐рд╢рд╛ рд╣реЛрддреА рд╣реИред
рдлреЛрдВрдЧ = рдкреЙрд╡ ( рдЕрдзрд┐рдХрддрдо (0, рдбреЙрдЯ (рд▓рд╛рдЗрдЯрд╡реЗрдХ, рд░рд┐рдлреНрд▓реЗрдХреНрдЯ-рд╡реНрдпреВрд╡реЗрдХ, рдиреЙрд░реНрдорд▓))), рд╕реНрдкреЗрдХреНрдпреБрд▓рд░рдкрд╛рд╡рд░) * рд╕реНрдкреЗрдХреНрдпреБрд▓рд░рд╡реЗрд▓
рд░рдВрдЧ = рд▓рдВрдмрд░ + рдлреЛрдВрдЧ
рдЬрд╣рд╛рдВ ViewVec рджрд░реНрд╢рдХреЛрдВ рдХреА рдЯрдХрдЯрдХреА рд╡реЗрдХреНрдЯрд░ рд╣реИ
SpecularPower - рднрдбрд╝рдХрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реА рдбрд┐рдЧреНрд░реА
SpecularLevel - рддреАрд╡реНрд░рддрд╛ рд╕реНрддрд░ рдпрд╛ рд░рдВрдЧ рднрдбрд╝рдХрдирд╛
рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд - рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди f (v, n) = 2 * n * рдбреЙрдЯ (n, v) - v

рдЬрдЯрд┐рд▓ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдФрд░ рдЧреНрд▓реЛрд╕ рдореИрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдЬреЛ рд░рдВрдЧ / рддреАрд╡реНрд░рддрд╛ (рд╕реНрдкреЗрд╕реБрд▓рд░ рд▓рд╛рдЗрд╡реЗрд▓), рд╕рд╛рде рд╣реА рдореЙрдбрд▓ рдХреЗ рдмрдирд╛рд╡рдЯ рд╕реНрдерд╛рди рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдЖрдХрд╛рд░ (рд╕реНрдкреЗрд╕реБрд▓рд░рдкрд╛рд╡рд░) рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдбрд┐рдЧреНрд░реА рдФрд░ рддреАрд╡реНрд░рддрд╛ рдХреЗ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╡реНрдпреВрдЕрд░ рд╢реЗрдХреНрд╕ рдХреЗ рдирдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ - ViewVec рдХреА рдмрд╛рдж рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреА рд╕реНрдерд┐рддрд┐:
 // vertex ... sub v3, va0, vc5 // v3 = vertex - viewPos (viewVec) // fragment ... nrm ft3.xyz, v3 // viewVec ft3 = normalize(lerp_viewVec) //    reflect(-viewVec, normal) dp3 ft4.x, ft1.xyz ft3.xyz // ft4 = dot(normal, viewVec) mul ft4, ft1.xyz, ft4.x // ft4 *= normal add ft4, ft4, ft4 // ft4 *= 2 sub ft4, ft3.xyz, ft4 // reflect ft4 = viewVec - ft4 // phong dp3 ft6.x, ft2.xyz, ft4.xyz // ft6 = dot(lightVec, reflect) max ft6.x, ft6.x, fc0.x // ft6 = max(ft6, 0.0) pow ft6.x, ft6.x, fc2.w // ft6 = pow(ft6, specularPower) mul ft6, ft6.x, fc2.xyz // ft6 *= specularLevel add ft0, ft0, ft6 // color += ft6 



рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░рдг

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рддрд╣ рд╕реНрдерд▓рд╛рдХреГрддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╡рд┐рдзрд┐ред рдЗрд╕ рддрд░рд╣ рдХреА рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреА рджрд┐рд╢рд╛ рдЖрдорддреМрд░ рдкрд░ рдЖрд░рдЬреАрдмреА рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реАрдорд╛ 0..1 (xyz * 0.5 + 0.5) рд╕реЗ рдХрдо рдХрд░рддреА рд╣реИред рдиреЙрд░реНрдорд▓ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕ (рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕), рдФрд░ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рди (рдЯреИрдВрдЧреЗрдВрдЯ рд╕реНрдкреЗрд╕) рдореЗрдВ рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рд▓реЗрдХрд░ рд╢рд┐рдЦрд░ рддрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЯреЗрдмрд┐рд▓рд┐рдВрдЧ рдФрд░ рдорд┐рд░рд░-рдЯреЗрдХреНрд╕рдЪрд░рд┐рдВрдЧ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЗрд╕ рд╡реИрдХреНрдЯрд░ Tangent рдФрд░ Binormal рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреАрдмреАрдПрди (рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛, рдЕрд╕рд╛рдорд╛рдиреНрдп, рд╕рд╛рдорд╛рдиреНрдп) рдЖрдзрд╛рд░ рдкрд░ viewVec рдФрд░ lightVec рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдмрдирд╛рд╡рдЯ рд╕реЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
 // vertex ... // transform lightVec sub vt1, vc4, va0 // vt1 = lightPos - vertex (lightVec) dp3 vt3.x, vt1, va4 dp3 vt3.y, vt1, va3 dp3 vt3.z, vt1, va2 mov v2, vt3.xyzx // v2 = lightVec // transform viewVec sub vt2, va0, vc5 // vt2 = vertex - viewPos (viewVec) dp3 vt4.x, vt2, va4 dp3 vt4.y, vt2, va3 dp3 vt4.z, vt2, va2 mov v3, vt4.xyzx // v3 = viewVec // fragment tex ft1, v0, fs1 <2d,repeat,linear,miplinear> // ft1 = normalMap(v0) // 0..1 to -1..1 add ft1, ft1, ft1 // ft1 *= 2 sub ft1, ft1, fc0.z // ft1 -= 1 nrm ft1.xyz, ft1 // normal ft1 = normalize(normal) ... 



рддреВрди рдЫрд╛рдпрд╛рдВрдХрди

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

 // fragment ... dp3 ft5.x, ft1.xyz, ft2.xyz // ft5 = dot(normal, lightVec) tex ft0, ft5.xx, fs3 <2d,nearest> // color = toonMap(ft5) 



рд╕реНрдлреАрдпрд░ рдореИрдкрд┐рдВрдЧ

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

рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡реЗрдХреНрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрд╕реА рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ:
uv = (xy / sqrt (x ^ 2 + y ^ 2 + (z + 1) ^ 2)) * 0.5 + 0.5
рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 0..1 рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛ рдФрд░ 0.5 рдХреА рд╢рд┐рдлреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкрд░рд╛рд╡рд░реНрддрдХ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдПрдбрд┐рдЯрд┐рд╡ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рдПрдХ рдлреИрд▓рд╛рдирд╛ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдлреНрд░реЗрд╕реЗрд▓ рдлреЙрд░реНрдореВрд▓рд╛ рдХреЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред рдЬрдЯрд┐рд▓ рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЙрдбрд▓ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
 // fragment ... add ft6, ft4, fc0.xxz // ft6 = reflect (x, y, z + 1) dp3 ft6.x, ft6, ft6 // ft6 = ft6^2 rsq ft6.x, ft6.x // ft6 = 1 / sqrt(ft6) mul ft6, ft4, ft6.x // ft6 = reflect / ft6 mul ft6, ft6, fc0.y // ft6 *= 0.5 add ft6, ft6, fc0.y // ft6 += 0.5 tex ft0, ft6, fs2 <2d,nearest> // color = reflect(ft6) 


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


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

рдлрд╝реНрд▓реИрд╢ рдЦреЗрд▓ - рдпрд╣ рдЖрд╕рд╛рди рд╣реИ! рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг ред

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


All Articles