рд╡реЗрдм рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдЯреВрди рд╡рд╛рдЯрд░ рд╢реЗрдбрд░ рдмрдирд╛рдПрдВред рднрд╛рдЧ 3

рдЫрд╡рд┐

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

рдЕрдкрд╡рд░реНрддрди рдФрд░ рдкрд╢реНрдЪ-рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рднрд╛рд╡


рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдкрд╛рдиреА рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдЕрдкрд╡рд░реНрддрди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА рдХрд┐ 2 рдбреА рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрдВрдбрд┐рдд рд╢реИрдбрд░ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдХреГрддрд┐ рдХреИрд╕реЗ рдкреИрджрд╛ рдХреА рдЬрд╛рдПред рдпрд╣рд╛рдВ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХрд╛ рдХреМрди рд╕рд╛ рдХреНрд╖реЗрддреНрд░ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╡рд┐рд░реВрдкрдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдкреЛрд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


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

PlayCanvas рдореЗрдВ, рдЖрдк рдПрдХ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ Refraction.js рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ:

//---------------   ------------------------// pc.extend(pc, function () { //  -      var RefractionPostEffect = function (graphicsDevice, vs, fs, buffer) { var fragmentShader = "precision " + graphicsDevice.precision + " float;\n"; fragmentShader = fragmentShader + fs; //      this.shader = new pc.Shader(graphicsDevice, { attributes: { aPosition: pc.SEMANTIC_POSITION }, vshader: vs, fshader: fs }); this.buffer = buffer; }; //      pc.PostEffect RefractionPostEffect = pc.inherits(RefractionPostEffect, pc.PostEffect); RefractionPostEffect.prototype = pc.extend(RefractionPostEffect.prototype, { //      render, //    ,    , //       render: function (inputTarget, outputTarget, rect) { var device = this.device; var scope = device.scope; //       .  ,     scope.resolve("uColorBuffer").setValue(inputTarget.colorBuffer); //       .       . //          pc.drawFullscreenQuad(device, outputTarget, this.vertexBuffer, this.shader, rect); } }); return { RefractionPostEffect: RefractionPostEffect }; }()); //---------------  ------------------------// var Refraction = pc.createScript('refraction'); Refraction.attributes.add('vs', { type: 'asset', assetType: 'shader', title: 'Vertex Shader' }); Refraction.attributes.add('fs', { type: 'asset', assetType: 'shader', title: 'Fragment Shader' }); //  initialize       Refraction.prototype.initialize = function() { var effect = new pc.RefractionPostEffect(this.app.graphicsDevice, this.vs.resource, this.fs.resource); //     postEffects var queue = this.entity.camera.postEffects; queue.addEffect(effect); this.effect = effect; //       this.savedVS = this.vs.resource; this.savedFS = this.fs.resource; }; Refraction.prototype.update = function(){ if(this.savedFS != this.fs.resource || this.savedVS != this.vs.resource){ this.swap(this); } }; Refraction.prototype.swap = function(old){ this.entity.camera.postEffects.removeEffect(old.effect); this.initialize(); }; 

рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо RefractionPostEffect рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреИрдорд░реЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдлреНрд░реЗрдЧрдореЗрдВрдЯ рд╢реЗрдбреНрд╕ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде Refraction.frag рдмрдирд╛рдПрдВ:

 precision highp float; uniform sampler2D uColorBuffer; varying vec2 vUv0; void main() { vec4 color = texture2D(uColorBuffer, vUv0); gl_FragColor = color; } 

рдФрд░ Refract.vert рдПрдХ рдореВрд▓ рд╢реАрд░реНрд╖ shader рдХреЗ рд╕рд╛рде:

 attribute vec2 aPosition; varying vec2 vUv0; void main(void) { gl_Position = vec4(aPosition, 0.0, 1.0); vUv0 = (aPosition.xy + 1.0) * 0.5; } 

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

рдХреЗрд╡рд▓ рд░рдВрдЧ рдХреЛ Refraction.frag рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд▓рд╛рд▓ рдШрдЯрдХ рдХреЛ 1.0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдЫрд╡рд┐ рдХреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЪрд┐рддреНрд░ рдХреЛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╡рд┐рд░реВрдкрдг shader


рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рд╡рд┐рд░реВрдкрдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдордп рдЪрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ Refraction.js рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ-рдЗрдлреЗрдХреНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдПрдВ:

 var RefractionPostEffect = function (graphicsDevice, vs, fs) { var fragmentShader = "precision " + graphicsDevice.precision + " float;\n"; fragmentShader = fragmentShader + fs; //       this.shader = new pc.Shader(graphicsDevice, { attributes: { aPosition: pc.SEMANTIC_POSITION }, vshader: vs, fshader: fs }); // >>>>>>>>>>>>>    this.time = 0; }; 

рдЕрдм рд░реЗрдВрдбрд░ рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЗрд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ shader рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

 RefractionPostEffect.prototype = pc.extend(RefractionPostEffect.prototype, { //      render, //      , //       render: function (inputTarget, outputTarget, rect) { var device = this.device; var scope = device.scope; //       .  ,     scope.resolve("uColorBuffer").setValue(inputTarget.colorBuffer); /// >>>>>>>>>>>>>>>>>>    uniform-  scope.resolve("uTime").setValue(this.time); this.time += 0.1; //       .       . //          pc.drawFullscreenQuad(device, outputTarget, this.vertexBuffer, this.shader, rect); } }); 

рдЕрдм рд╣рдо рдкрд╛рдиреА рдХреЗ рд╡рд┐рд░реВрдкрдг рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдПрдХ рд╣реА shader рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ shader рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 precision highp float; uniform sampler2D uColorBuffer; uniform float uTime; varying vec2 vUv0; void main() { vec2 pos = vUv0; float X = pos.x*15.+uTime*0.5; float Y = pos.y*15.+uTime*0.5; pos.y += cos(X+Y)*0.01*cos(Y); pos.x += sin(XY)*0.01*sin(Y); vec4 color = texture2D(uColorBuffer, pos); gl_FragColor = color; } 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рдРрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╣реИред


рдХрд╛рд░реНрдп 1: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рд░реВрдкрдг рдХреЗрд╡рд▓ рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдХреИрдорд░рд╛ рдорд╛рд╕реНрдХ


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


рдпрд╣ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдореБрдЦреМрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдмрдирд╛рд╡рдЯ рдХреЛ рдЕрдкрдиреЗ рдЕрдкрд╡рд░реНрддрди рд╢реИрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдВрдЧреЗ, рдЬреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рддреИрдпрд╛рд░ рдЫрд╡рд┐ рдореЗрдВ рд╡рд┐рдХреГрдд рдХрд░ рджреЗрдЧрд╛, рдЬрдм рдореБрдЦреМрдЯрд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдлреЗрдж рд╣реЛрдЧрд╛ред

рдЖрдЗрдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдкрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ Water.js рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 Water.attributes.add('isMask', {type:'boolean',title:"Is Mask?"}); 

рдлрд┐рд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдЗрд╕реЗ material.setParameter('isMask',this.isMask); рдХреЗ рд╕рд╛рде shader рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ material.setParameter('isMask',this.isMask); ред рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдЯрд░.рдлреНрд░реИрдЧ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╣реА рд╣реЛ рддреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╕рдлреЗрдж рд░рдВрдЧ рджреЗрдВред

 //    uniform uniform bool isMask; //      ,    //    true if(isMask){ color = vec4(1.0); } 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ "рдореБрдЦреМрдЯрд╛?" рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдФрд░ рдЦреЗрд▓ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ред рдпрд╣ рд╕рдлреЗрдж рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рд╣реИред

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

рдПрдХ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХреИрдорд░рд╛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ CameraMask.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдирдП рдХреИрдорд░реЗ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рд╣рдо рдЗрд╕ рдХреИрдорд░реЗ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ RenderTarget рдмрдирд╛рддреЗ рд╣реИрдВ:

 //  initialize       CameraMask.prototype.initialize = function() { //  512x512x24-      var colorBuffer = new pc.Texture(this.app.graphicsDevice, { width: 512, height: 512, format: pc.PIXELFORMAT_R8_G8_B8, autoMipmap: true }); colorBuffer.minFilter = pc.FILTER_LINEAR; colorBuffer.magFilter = pc.FILTER_LINEAR; var renderTarget = new pc.RenderTarget(this.app.graphicsDevice, colorBuffer, { depth: true }); this.entity.camera.renderTarget = renderTarget; }; 

рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрдорд░рд╛ рдЕрдм рд╕реНрдХреНрд░реАрди рдкрд░ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдо Refraction.js рдореЗрдВ рдЗрд╕рдХреЗ рд▓рдХреНрд╖реНрдп рд░реЗрдВрдбрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Refraction.prototype.initialize = function() { var cameraMask = this.app.root.findByName('CameraMask'); var maskBuffer = cameraMask.camera.renderTarget.colorBuffer; var effect = new pc.RefractionPostEffect(this.app.graphicsDevice, this.vs.resource, this.fs.resource, maskBuffer); // ... //     ,    }; 

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

 ////       var RefractionPostEffect = function (graphicsDevice, vs, fs, buffer) { var fragmentShader = "precision " + graphicsDevice.precision + " float;\n"; fragmentShader = fragmentShader + fs; //       this.shader = new pc.Shader(graphicsDevice, { attributes: { aPosition: pc.SEMANTIC_POSITION }, vshader: vs, fshader: fs }); this.time = 0; //// <<<<<<<<<<<<<    this.buffer = buffer; }; 

рдЕрдВрдд рдореЗрдВ, рд░реЗрдВрдбрд░ рдлрдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдмрдлрд░ рдХреЛ рдЕрдкрдиреЗ рд╢реЗрдбрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

 scope.resolve("uMaskBuffer").setValue(this.buffer); 

рдЕрдм, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдХрд╛рд░реНрдп 2: рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдкрд░ uMaskBuffer рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЗ рдХреИрдорд░реЗ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

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


рджреВрд╕рд░реЗ рдХреИрдорд░реЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдореВрд▓ рджреГрд╢реНрдп рдХреЗ рд╕рдорд╛рди рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЪрд▓реЛ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдЕрдкрдбреЗрдЯ рдореЗрдВ CameraMask.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕реНрдерд╛рди рдФрд░ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:

 CameraMask.prototype.update = function(dt) { var pos = this.CameraToFollow.getPosition(); var rot = this.CameraToFollow.getRotation(); this.entity.setPosition(pos.x,pos.y,pos.z); this.entity.setRotation(rot); }; 

рдЖрд░рдВрдн рдореЗрдВ, CameraToFollow рдкрд░рд┐рднрд╛рд╖рд┐рдд CameraToFollow :

 this.CameraToFollow = this.app.root.findByName('Camera'); 

рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдорд╛рд╕реНрдХ


рджреЛрдиреЛрдВ рдХреИрдорд░реЗ рдЕрдм рдПрдХ рд╣реА рдмрд╛рдд рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рд╕реНрдХ рдХреИрдорд░рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╛рдиреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗ, рдФрд░ рдЕрд╕рд▓реА рдХреИрдорд░рд╛ рдорд╛рд╕реНрдХ рдкрд╛рдиреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреИрдорд░реЗ рдХреЗ рдмрд┐рдЯ-рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЯрдХрд░рд╛рд╡ рдорд╛рд╕реНрдХ рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдмрд┐рдЯрд╡рд┐рдВрдб AND рдЙрд╕рдХреЗ рдорд╛рд╕реНрдХ рдФрд░ рдХреИрдорд░рд╛ рдорд╛рд╕реНрдХ рдХреЗ рдмреАрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо 1 рд╣реИ, рддреЛ рдЙрд╕реЗ рдХреНрд▓рд┐рдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд╛рдиреА рдореЗрдВ рдмрд┐рдЯ 2 рд╣реИ рдФрд░ рд╡рд╛рдЯрд░рдорд╛рд╕реНрдХ рдореЗрдВ 3 рдмрд┐рдЯ рд╣реИред 3 рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рдЕрд╕рд▓реА рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдорд╛рд╕реНрдХ рдХреИрдорд░рд╛ рдХреЗ рд▓рд┐рдП 2 рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдмрд┐рдЯреНрд╕ред "рдПрди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдмрд┐рдЯреНрд╕" рдХрд╣рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ:

 ~(1 << N) >>> 0 

рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред

рдХреИрдорд░рд╛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдорд╛рд╕реНрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо CameraMask.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдиреАрдЪреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  //   ,  2 this.entity.camera.camera.cullingMask &= ~(1 << 2) >>> 0; //   ,  3 this.CameraToFollow.camera.camera.cullingMask &= ~(1 << 3) >>> 0; //      ,   : // console.log((this.CameraToFollow.camera.camera.cullingMask >>> 0).toString(2)); 

рдЕрдм Water.js рдореЗрдВ рд╣рдо рдкрд╛рдиреА рдХреА рдЬрд╛рд▓реА рдХреЗ 2 рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдмрд┐рдЯ 3 рдкрд░ рдЗрд╕рдХрд╛ рдорд╛рд╕реНрдХ рд╕рдВрд╕реНрдХрд░рдг:

 //      initialize  Water.js //    var bit = this.isMask ? 3 : 2; meshInstance.mask = 0; meshInstance.mask |= (1 << bit); 

рдЕрдм рдПрдХ рдкреНрд░рдЬрд╛рддрд┐ рд╕рд╛рджреЗ рдкрд╛рдиреА рдХреЗ рд╕рд╛рде рд╣реЛрдЧреА, рдФрд░ рджреВрд╕рд░реА рдареЛрд╕ рд╕рдлреЗрдж рдкрд╛рдиреА рдХреЗ рд╕рд╛рдеред рдмрд╛рдИрдВ рдУрд░ рдХреА рдЫрд╡рд┐ рдореВрд▓ рдХреИрдорд░реЗ рд╕реЗ рджреГрд╢реНрдп рджрд┐рдЦрд╛рддреА рд╣реИ, рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рдореБрдЦреМрдЯрд╛ рдХреИрдорд░реЗ рд╕реЗ рджреГрд╢реНрдп рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред


рдореБрдЦреМрдЯрд╛ рдЖрд╡реЗрджрди


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

 //   ,      vec4 maskColor = texture2D(uMaskBuffer, pos); vec4 maskColor2 = texture2D(uMaskBuffer, vUv0); //     ? if(maskColor != vec4(1.0) || maskColor2 != vec4(1.0)){ //      pos = vUv0; } 

рдФрд░ рдЗрд╕рд╕реЗ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!

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

рдЪреМрд░рд╕рд╛рдИ


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рджреГрд╢реНрдп рдХреЗ рдХрд┐рдирд╛рд░реЗ рдереЛрдбрд╝реЗ рддреАрдЦреЗ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯ-рдЗрдлрд╝реЗрдХреНрдЯ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рд╕реНрдореВрдерд┐рдВрдЧ рдЦреЛ рджреАред

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

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ рд╡рд┐рдЪрд╛рд░


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

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

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

рд╢реЛрд░ рдХреА рд▓рд╣рд░реЗрдВ


рдХреЗрд╡рд▓ рдХреЛрд╕рд╛рдЗрди рдФрд░ рд╕реЗрдВрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рддрд░рдВрдЧреЛрдВ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓рд╣рд░реЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рдХрдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓рдЧреЗрдВред

рдЧрддрд┐рд╢реАрд▓ рдлреЛрдо рдирд┐рд╢рд╛рди


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

рд╕реНрд░реЛрдд рдХреЛрдб


рд╕рдорд╛рдкреНрдд PlayCanvas рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рддреАрди . js рдХреЗ рддрд╣рдд рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЛрд░реНрдЯ рднреА рд╣реИред

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


All Articles