рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ !
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ Pixi.js рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИ, рдЖрдИ рд▓рд╡ рдЗрдЯ! 2D рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рддреАрди.js рдХрд╛ рд╕рд╣реА рдХрд╛рдЙрдВрдЯрд░ рднрд╛рдЧред
рдореИрдВ рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬрд╣рд╛рдБ рдореИрдВ рдпрд╣ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:
рдЖрдк рдереНрд░реА.рдЬреЗрдПрд╕ рдХреИрдирд╡рд╕ рдХреЗ рдЕрдВрджрд░ рдкрд┐рдХреНрд╕реА.рдЬреЗрдПрд╕ рдХреИрдирд╡рд╕ рдХреЛ рдХреИрд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░реЗрдВрдЧреЗ?
рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж !
рдЪрд┐рдпрд░реНрд╕
рдЗрдореИрдиреБрдПрд▓
рдпрджрд┐ рддреАрди .js рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд┐рдХреНрд╕реА рдХреЛ рдПрдХ рдСрдлрд╕реНрдХреНрд░реАрди рдХреИрдирд╡рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рддреАрди.рдЬреЗ рдХреЗ рджреГрд╢реНрдп рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдЯреАрдХ! рдареАрдХ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ!
рдмреБрдз рдкрд░, 21 рдЬрдирд╡рд░реА 2015 рдХреЛ рд╢рд╛рдо 4:45 рдмрдЬреЗ, рдЪрд╛рдб рдПрдВрдЧрд▓рд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
рдпрджрд┐ рддреАрди.js рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдкрд┐рдХреНрд╕реА рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдХ рдСрдлрд╕реНрдХреНрд░реАрди рдХреИрдирд╡рд╛рд╕ рдФрд░ рдЕрдкрдиреЗ рддреАрди рд╕реАрди рдХреЗ рджреГрд╢реНрдп рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/GoodBoyDigital/pixi.js/issues/1366#issuecomment -70872648
ред
рдореИрдЯ рдЧреНрд░реЛрд╡реНрд╕
_ рддрдХрдиреАрдХреА рднрд╛рдЧреАрджрд╛рд░_
рдЯреЗрд▓реАрдлреЛрди: 07708 114496 :: www.goodboydigital.com
рдлрд░реНрд╕реНрдЯ рдлреНрд▓реЛрд░, рдпреВрдирд┐рдЯ 9B, рдХреНрд╡реАрдВрд╕ рдпрд╛рд░реНрдб, рд╡реНрд╣рд╛рдЗрдЯ рдкреЛрд╕реНрдЯ рд▓реЗрди, рд▓рдВрджрди, E9 5EN
рдЧреБрдбрдмрд╛рдп ┬йред рд╕рд░реНрд╡рд╛рдзрд┐рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рддред
рд╡рд╛рд╣ ... рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ! :)
рдЗрд╕реЗ рд╣реА рдореИрдВ рдлрд╛рд╕реНрдЯ рдлреАрдбрдмреИрдХ рдХрд╣рддрд╛ рд╣реВрдВ!
рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред
рдореБрдЭреЗ 2D UI рдкреИрдирд▓ (Pixi.js) рдЦреАрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ Top of a 3D World (Three.js) рдкрд░ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреАред
рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЙрди 2D UI рдкреИрдирд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВред
рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдХреИрдирд╡рд╛рд╕ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рддрд░рдХреАрдмреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рдзреБрдВрдзрд▓рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛?
рдореИрдВрдиреЗ рдЗрд╕реЗ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд┐рддреНрд░ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рд╣реИред
рдереНрд░реА.рдЬреЗрдПрд╕ рдХреА рддрд░рдл рдзрдмреНрдмрд╛ рд╣реИ? рдмрд╕ рдкрд┐рдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ 3 рдбреА рд╕реАрди рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЛ рдмреНрд▓реЗрдВрдб рдХрд░реЗрдВред
рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж ! рдЕрдм рдЬрдм рдЖрдкрдиреЗ рдпрд╣ рдХрд╣рд╛ рд╣реИ ... рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдорд╛рд░реНрдЧ рд╣реИ! :)
рдЪрд┐рдпрд░реНрд╕
рдЗ
рдореИрдВ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ ai рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╕рд┐рд░реНрдл рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдХреЛрдИ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЫреВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
<body>
<script src="js/pixi.js"></script>
<script src="js/three.min.js"></script>
<script>
width = window.innerWidth;
height = window.innerHeight;
//-------------------------------------------------------------------------------------
// 3D Scene canvas
//-------------------------------------------------------------------------------------
var scene_3D = new THREE.Scene();
scene_3D.fog = new THREE.Fog( "#a1a1a1", 2000, 4000 );
var camera = new THREE.PerspectiveCamera( 75, width / height, 1, 10000 );
camera.position.set( 0, 0, 700);
camera.updateProjectionMatrix();
var canvas_3D = new THREE.WebGLRenderer( { antialias: true } );
canvas_3D.setSize( width, height );
canvas_3D.setClearColor( scene_3D.fog.color, 1 );
document.body.appendChild( canvas_3D.domElement );
var geometry = new THREE.BoxGeometry( 500, 500, 500 );
var material = new THREE.MeshNormalMaterial();
var cube = new THREE.Mesh( geometry, material );
cube.position.z = -500;
cube.rotation.z = -45;
scene_3D.add( cube );
//-------------------------------------------------------------------------------------
// 2D UI canvas
//-------------------------------------------------------------------------------------
var scene_UI = new PIXI.Stage( 0x66FF99 );
var canvas_UI = PIXI.autoDetectRenderer(width, height, {transparent:true});
canvas_UI.view.style.position = "absolute";
canvas_UI.view.style.top = "0px";
canvas_UI.view.style.left = "0px";
var graphics = new PIXI.Graphics();
graphics.beginFill( 0xe60630 );
graphics.moveTo( width/2-200, height/2+100 );
graphics.lineTo( width/2-200, height/2-100 );
graphics.lineTo( width/2+200, height/2-100 );
graphics.lineTo( width/2+200, height/2+100 );
graphics.endFill();
scene_UI.addChild( graphics );
//-------------------------------------------------------------------------------------
// Map 2D UI canvas on 3D Plane
//-------------------------------------------------------------------------------------
var texture_UI = new THREE.Texture( canvas_UI.view );
texture_UI.needsUpdate = true;
var material_UI = new THREE.MeshBasicMaterial( {map: texture_UI, side:THREE.DoubleSide } );
material_UI.transparent = true;
var mesh_UI = new THREE.Mesh( new THREE.PlaneGeometry(width, height), material_UI );
mesh_UI.position.set(0,0,0);
scene_3D.add( mesh_UI );
//-------------------------------------------------------------------------------------
// Render Animation
//-------------------------------------------------------------------------------------
function animate() {
requestAnimationFrame( animate );
canvas_UI.render( scene_UI );
cube.rotation.y += 0.01;
canvas_3D.render( scene_3D, camera );
}
animate();
</script>
</body>
рд╣рдо рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдЗрдВрдЬрди (рдкрд┐рдХреНрд╕реА рдФрд░ рдереНрд░реАрдЬреЗрдПрд╕) рдирд┐рд░рд░реНрдердХ рдХреЙрд▓ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрдПрд▓ рд░рд╛рдЬреНрдп рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд░реЗрдВрдбрд░рд░реНрд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдХреЗ рдЭрдВрдбреЗ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдереНрд░реА рдЬреЗрдПрд╕ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк renderer.resetGLState()
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
PIXI рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ WebGLRenderer рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреАред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЗрдирдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ
gl.disable(gl.DEPTH_TEST)
gl.enable(gl.BLEND)
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
gl.disable(gl.STENCIL_TEST)
gl.disable(gl.CULL_FACE)
gl.frontFace( gl.CCW )
gl.cullFace( gl.FRONT )
gl.colorMask(true, true, true, true)
gl.activeTexture(gl.TEXTURE0)
var shaderManager = session.shaderManager
shaderManager._currentId = undefined
for (var i=0; i<shaderManager.attribState.length; i++)
shaderManager.attribState[i] = false
shaderManager.setShader(shaderManager.currentShader)
var blend = session.blendModeManager.currentBlendMode
if (blend in PIXI.blendModesWebGL) {
session.blendModeManager.currentBlendMode = undefined
session.blendModeManager.setBlendMode(blend)
}
рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдлреНрд░реЗрдо рдмрдлрд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ 3 рдбреА рджреГрд╢реНрдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдпреВрдЖрдИ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдкрдиреЗ UI рдХреЗ рдиреАрдЪреЗ рдзреБрдВрдзрд▓рд╛ рд╣реЛ рдЬрд╛рдирд╛ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
рдЗрд╕ рдмрд╣реБрдд рд╕рдЯреАрдХ рдФрд░ рдкреНрд░рд▓реЗрдЦрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореИрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :)
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ WebGL рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реВрдБ рдпрд╣ рдмреЗрд╣рдж рдорджрджрдЧрд╛рд░ рд╣реИред
рдореИрдВ рдкрд╣рд▓реЗ рдорд┐рдХреНрд╕ 2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЭрд┐рдЭрдХ рд░рд╣рд╛ рдерд╛, рдЦрд╛рд╕рдХрд░ рдХрд┐ рдПрдХ рд╣реИрдХ рдХрд┐рдпрд╛ рд╣реБрдЖ рдереНрд░реАред рдЬреЗрдПрд╕ рдХреБрдЫ рдкрд┐рдХреНрд╕реА рдХреА рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдЙрддреНрдХреГрд╖реНрдЯ рдЫреВрдЯ, 2 рдбреА рдкрд░ рджреЗрд╡ рдХрд╛ рдмрд╣реБрдд рдлреЛрдХрд╕ рдмрд┐рдВрджреБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ gl2d рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкрд┐рдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдорд┐рдХреНрд╕ рдЕрдкреНрд░реЛрдЪ рдХреЛ рднреА рдЪреБрдирд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ PixGL рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ WebGL рдХреЗ рд╕рд╛рде 2D рддрддреНрд╡реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдЪрд┐рдпрд░реНрд╕
рдЗ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдорд┐рдХреНрд╕ рдЕрдкреНрд░реЛрдЪ рдХреЛ рднреА рдЪреБрдирд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ PixGL рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ WebGL рдХреЗ рд╕рд╛рде 2D рддрддреНрд╡реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рд╢рд╛рдпрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдореВрдЯ рд╣реИ (рдЖрдкрдХреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ 3000 рдмрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ?), рдФрд░ рдордЬрдмреВрдд рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ, рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╡реЗрдмрдЬреАрдПрд▓ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдорд╛рд░реНрдЧ UI рдХреЗ рд▓рд┐рдП DOM / CSS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ WebGL (рдпрд╛рдиреА рдХреБрдЫ рдкреНрд░рднрд╛рд╡реЛрдВ, рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЖрджрд┐ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдкрд┐рдХреНрд╕реА рд╢рд╛рдпрдж 2D рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдереНрд░реАрдЬреЗрдПрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди рд╣реЛрдЧреАред
рдпрд╣ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреГрдкрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ ai рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╕рд┐рд░реНрдл рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдХреЛрдИ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЫреВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред