рдкреЗрд╢ рд╣реИ WebGL

рдкрд░рд┐рдЪрдп



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



рдХрд╛рдо рдХреА рдпреЛрдЬрдирд╛:

  1. рдХреИрдирд╡рд╛рд╕ рд╕реЗ WebGL рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  2. рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдЕрд░реНрдерд╛рддреН:

    • рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ;
    • рд╣рдореЗрдВ рд╢реАрд░реНрд╖ рдФрд░ рдЦрдВрдб рд╢реЗрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ;
    • рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ shader рдХреЛрдб;
    • рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ;
    • рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВред


  3. рд╣рдо рджреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдореЙрдбрд▓-рджреГрд╢реНрдп рдФрд░ рдкреНрд░рдХреНрд╖реЗрдкрдгред
  4. рд╣рдо рд╢реАрд░реНрд╖ рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЬрдЧрд╣ рджреЗрддреЗ рд╣реИрдВ, рднрд░рддреЗ рд╣реИрдВ, рд╕рдХреНрд░рд┐рдп рдХрд░рддреЗ рд╣реИрдВред
  5. рд╣рдо рдбреНрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред






1. рд╡реЗрдмрд▓реЙрдЧ рд╕рдВрджрд░реНрдн


рдПрдХ WebGL рд╕рдВрджрд░реНрдн рдХреИрдирд╡рд╛рд╕ DOM рддрддреНрд╡ рд╕реЗ getContext ("рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ-рд╡реЗрдмрд▓") рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЦрд░рдЧреЛрди рд╕рдореВрд╣ рд╡реЗрдмрд▓реЙрдЧ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (https://www.khronos.org/webgl/wiki/FAQ) рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ:



var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"]; gl = null; for (var ii = 0; ii < names.length; ++ii) { try { gl = canvas.getContext(names[ii]); } catch(e) {} if (gl) { break; } }
      
      







рдЬрдм рд╕рдВрджрд░реНрдн рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ gl рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдРрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдирд╛рдо OpenGL ES рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, WebGL рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди (COLOR_BUFFER_BIT) gl.clear (gl.COLOR_BUFFER_BIT) рд╣реЛрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╕рднреА WebGL рдлрд╝рдВрдХреНрд╢рдВрд╕ OpenGL ES 2.0 рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВред



2. рд╢реЗрдб


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



рд╡рд░реНрдЯреЗрдХреНрд╕ shader


  attribute vec3 aVertexPosition; attribute vec4 aVertexColor; uniform mat4 mvMatrix; uniform mat4 prMatrix; varying vec4 color; void main(void) { gl_Position = prMatrix * mvMatrix * vec4 ( aVertexPosition, 1.0 ); color = aVertexColor; }
      
      







рдШрд░реНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛


 #ifdef GL_ES precision highp float; #endif varying vec4 color; void main(void) { gl_FragColor = color; }
      
      







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



3. рдореЙрдбрд▓-рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕


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

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



рдореЙрдбрд▓-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gluLookAt рдлрд╝рдВрдХреНрд╢рди (CAMX, CAMY, CAMZ, tarX, tarY, tarZ, upX, upY, upZ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - OpenGL рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдЬреЛ рдХреИрдорд░рд╛ рд╕реНрдерд┐рддрд┐, рдХреИрдорд░рд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдХреИрдорд░рд╛ рдЕрдк-рд╡реЗрдХреНрдЯрд░ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП glTranslate, glRotate, glScale, рдЬреЛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ (рдХреИрдорд░рд╛) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдмрджрд▓рд╛рд╡, рд░реЛрдЯреЗрд╢рди, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП gluLookAt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдХреЗ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП glTranslate, glRotate, glScale рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рддрд░реАрдХрд╛ рдпрд╛ рджреВрд╕рд░рд╛, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореЙрдбрд▓-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреА рдЧрдгрдирд╛ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк sylvester.js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗред



рдЕрдм рдЬрдм рдЖрдкрдиреЗ рджреЛрдиреЛрдВ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдореЙрдбрд▓-рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╢реАрд░реНрд╖ рд╢реЗрдХрд░ рдореЗрдВ, рд╣рдо рдЪрд░ "mvMatrix" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЪрд░ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рд▓реЛрдХ = gl.getUniformLocation (shaderProgram, name) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдорд╛рдирдХ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╢реИрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЪрд░ рд╣реИ, рдЬреЛ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рддрд░реНрдХ "рдирд╛рдо" рдЙрд╕ рдЪрд░ рдХрд╛ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╛рдо = "mvatatrix"ред рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ, рддреЛ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЪрдЯрд╛рдИ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди gl.uniformMatrix4fv (loc, false, new Float32Array (mat.flatten ())) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкреНрд░рдЬрд╛рддрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм рднреА рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдВред



4. рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕


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



  /*   */ vPosBuffer = gl.createBuffer(); /*  */ gl.bindBuffer(gl.ARRAY_BUFFER, vPosBuffer); /*      */ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verticies), gl.DYNAMIC_DRAW); /* ,          3 floats   */ gl.vertexAttribPointer(vPosLoc, 3, gl.FLOAT, false, 0, 0); /*    */ gl.enableVertexAttribArray(vPosLoc);
      
      







рдпрд╣рд╛рдВ рд▓рдВрдмрд╡рдд рд░реЗрдЦрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 6 рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ 3 рдЕрдВрдд рдХреА рдкрдВрдХреНрддрд┐ рдХреЗ x-, y-, z- рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ, рдХреНрд░рдорд╢рдГ, рдЕрдВрдд рдХреЗред vPosLoc shader рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ "aVertexPosition" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рд╕реВрдЪрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ gl.bindAttribLocation (shaderProgram, loc, shadersAttrib) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рдереЗ, рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдерд╛, рддреЛ рдЖрдкрдХреЛ "vPosLoc = getAttribLocation (shaderProgram," aVertexPosition ") рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред" рдЗрд╕реА рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рджреВрд╕рд░реЗ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИ, рдбреЗрдЯрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧрд╛ (рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреЗ рдмрдЬрд╛рдп рд░рдВрдЧреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА) рдФрд░ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ (vPosLoc рдХреЗ рдмрдЬрд╛рдп)ред



5. рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рд░рдВрдЧ рдмрдлрд╝рд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдпрд╛, рдЕрдзрд┐рдХ рдмрд╕, рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗрдЯ рдХрд░рдирд╛ рдорд╛рдирдХ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛



 gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT);
      
      







рдЕрдм рдЪрд▓реЛ рдбреНрд░рд╛

 gl.drawArrays(gl.LINES, drawArrayIndexStart, drawArrayLength);
      
      





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



 drawArrayLength = verticies.length / 3;
      
      







рдЕрдЧрд░ рд▓рд╛рдЗрдиреЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВ, рддреЛ рд╣рдо рдЪрд░рдг 4, 5 рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдордиреЗ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рджреА рд╣реИ, рддреЛ рдЪрд░рдг 3 рдФрд░ рдЪрд░рдг 5 рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВред



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



рд╕реАрдзреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░реНрдп рдЫрдд рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рд╡рд┐рднреЗрджрдХ рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 3 рдбреА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдмрдирд╛рддрд╛ рд╣реИред рд╡реЗрдмрд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ php рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдереНрд░реА-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рд╕реАрдзреА рд░реЗрдЦрд╛рдУрдВ рдХреА рдореИрдкрд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реВрдЪреА рд╕реЗ рдЖрдзреБрдирд┐рдХ рдЗрдВрдЬрди (http://ru.wikipedia.org/wiki/WebGL) рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛: рд╡реЗрдмрдЧреНрд▓реВ, GLGE, C3DL, рдХреЙрдкрд░рд▓рд┐рдЪ, рд╕реНрдкрд╛рдЗрдбрд░рдЧреНрд▓ рдФрд░ рд╕реАрдирдЬреЗрдПрд╕ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо WebGLU, C3DL рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдП рдЧрдП рдереЗред рджреВрд╕рд░реЛрдВ рдореЗрдВ, рдпрд╛ рддреЛ рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдордВрдЪ рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрднреБрдЬ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред



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



рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 4 рдмреАрдЯрд╛ 8, рдХреНрд░реЛрдо 8 рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдкрд░, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдиреЗ рдХреНрд░реЛрдо рд╕реЗ 1.5-2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдПрдлрдкреАрдПрд╕ рдореВрд▓реНрдп рджрд┐рдЦрд╛рдпрд╛ред рдЬрдм рдЖрдк Chrome рдХреЛ рдмреАрдЯрд╛ 9 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рдмрджрд▓реЗ рд╣реИрдВред рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдмреАрдЯрд╛ 8 рдХреЛ рдмреАрдЯрд╛ 9 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдлрдкреАрдПрд╕ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓реЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВ рдФрд░ рд╡реЗрдмрдЬреАрдПрд▓рдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╢реНрдп рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрд╛ред



рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ







рд╕рдВрджрд░реНрдн






All Articles