Pixi.js: Pixi.js ์บ”๋ฒ„์Šค์™€ three.js ์บ”๋ฒ„์Šค ๊ฒฐํ•ฉ

์— ๋งŒ๋“  2015๋…„ 01์›” 21์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„!

์šฐ์„  Pixi.js์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค! 2D ์„ธ๊ณ„๋ฅผ์œ„ํ•œ three.js์˜ ์™„๋ฒฝํ•œ ๋Œ€์‘ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ์„ฑ์„ ๊ฐ–๊ณ  ์‹ถ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

  • Pixi.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด WebGL๋กœ ์ž‘์„ฑ๋œ 2D UI
  • ์ด 2D UI๋Š” Three.js๋กœ ์ž‘์„ฑ๋œ 3D ์„ธ๊ณ„์˜ ์›์ ์—์„œ ์บก์Šํ™”๋ฉ๋‹ˆ๋‹ค.
  • ์ด 3D ์„ธ๊ณ„๋Š” Three.js์—์„œ VR ์ž…์ฒด ์นด๋ฉ”๋ผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

Three.js ์บ”๋ฒ„์Šค ์•ˆ์— Pixi.js ์บ”๋ฒ„์Šค๋ฅผ ์บก์Šํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์‹œ๊ฐ„ ๋‚ด ์ค˜์„œ ๊ณ ๋งˆ์›Œ !

๊ฑด๋ฐฐ

์— ๋งˆ๋ˆ„์—˜

๐Ÿค” Question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” 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>

๋ชจ๋“  12 ๋Œ“๊ธ€

three.js๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ํ…์Šค์ฒ˜๋กœ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ pixi๋ฅผ ์˜คํ”„ ์Šคํฌ๋ฆฐ ์บ”๋ฒ„์Šค๋กœ ๋ Œ๋”๋งํ•˜์—ฌ three.js ์žฅ๋ฉด์—์„œ ํ…์Šค์ฒ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋”ฑ ๋งž๋‹ค! ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค!

2015 ๋…„ 1 ์›” 21 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 4:45, Chad Engler [email protected]
์ผ๋‹ค :

three.js๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ํ…์Šค์ฒ˜๋กœ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ pixi๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ
์˜คํ”„ ์Šคํฌ๋ฆฐ ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ three.js ์žฅ๋ฉด์—์„œ ํ…์Šค์ฒ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/GoodBoyDigital/pixi.js/issues/1366#issuecomment -70872648
.

Mat Groves

_ ๊ธฐ์ˆ  ํŒŒํŠธ๋„ˆ _

์ „ํ™” : 07708 114496 :: www.goodboydigital.com
1 ์ธต, Unit 9B, Queens Yard, White Post Lane, London, E9 5EN
goodboy ยฉ. ํŒ๊ถŒ ์†Œ์œ .

Wahou ... ๊ณ ๋งˆ์›Œ์š” ์—ฌ๋Ÿฌ๋ถ„! :)

์ด๊ฒƒ์ด ์ œ๊ฐ€ Fast Feedback์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹จ์ง€ ์ž‘์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3D ์„ธ๊ณ„ (Three.js) ์œ„์— ๋ Œ๋”๋ง ๋  2D UI ํŒจ๋„ (Pixi.js)์„ ๊ทธ๋ฆด ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ 2D UI ํŒจ๋„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถˆํˆฌ๋ช…๋„ ๊ณ„์ˆ˜๊ฐ€ 0-100 % ์ธ ํˆฌ๋ช…๋„
  • ๋ฐฐ๊ฒฝ์—์„œ 3D ์„ธ๊ณ„์˜ ํ๋ฆผ ํšจ๊ณผ

์บ”๋ฒ„์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜๋กœ ์ ์šฉํ•˜๋ฉด. ๋ฐฐ๊ฒฝ์˜ ํ๋ฆผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ• ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
transparency

Three.js ์ธก์—์„œ ๋ธ”๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? pixi ๊ฐœ์ฒด๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ ์›ํ•˜๋Š”๋Œ€๋กœ ํ…์Šค์ฒ˜๋ฅผ 3D ์žฅ๋ฉด์— ํ˜ผํ•ฉํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

๋„์™€ ์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด์ œ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋ง ํ–ˆ์œผ๋‹ˆ ... ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€์žฅ ๋…ผ๋ฆฌ์  ์ธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค! :)

๊ฑด๋ฐฐ

์ด์žํ˜•

๋‚˜๋Š” 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>

์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ด์™€ ๊ฐ™์€ ์ผ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์—”์ง„ (pixi ๋ฐ ThreeJS)์ด ์ค‘๋ณต ํ˜ธ์ถœ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด GL ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋กœ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์žฌ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ThreeJS์˜ ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” 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)
    }

์ด๋ฅผ ํ†ตํ•ด ํ”„๋ ˆ์ž„ ๋ฒ„ํผ ์ „ํ™˜์—†์ด 3D ์žฅ๋ฉด ์œ„์— UI๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UI ์•„๋ž˜์—์„œ ํ๋ฆผ ํšจ๊ณผ๋ฅผ ์–ป๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • 3D ์žฅ๋ฉด์„ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋กœ ๋ Œ๋”๋ง
  • ๊ฐ€์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ฉ€ํ‹ฐ ํŒจ์Šค ๋ธ”๋Ÿฌ ์…ฐ์ด๋” (ํ•‘ํ FBO ๋“ฑ)๋กœ ๋ธ”๋Ÿฌ ์˜์—ญ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒ๋‹จ์— 2D UI๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ์ •ํ™•ํ•˜๊ณ  ๋ฌธ์„œํ™” ๋œ ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค Matt! :)

WebGL ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋จผ์ € Mix 2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ง์„ค ์˜€๋Š”๋ฐ, ํŠนํžˆ ํ•ดํ‚น ๋œ Three.js๊ฐ€ ๋‚ด๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์„ ์œ„ํ•ด pixi๋ฅผ ์ผ๋ถ€ ํ™•์žฅํ•˜์—ฌ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ์ €ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 2D ๊ฐœ๋ฐœ์ž์˜ ์ดˆ์  ์ธ ํ›Œ๋ฅญํ•œ ์˜ˆ๋Š” gl2d ํ˜ธ์ถœ์— pixi๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ €๋ฅผ ์„ค๋“ํ–ˆ์Šต๋‹ˆ๋‹ค.

Mix ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ Pixi๊ฐ€ WebGL๋กœ 2D ์š”์†Œ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋” ํšจ์œจ์ ์ธ ์„ ํƒ์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ

์ด์žํ˜•

Mix ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ Pixi๊ฐ€ WebGL๋กœ 2D ์š”์†Œ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋” ํšจ์œจ์ ์ธ ์„ ํƒ์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์•„๋งˆ๋„. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์„ฑ๋Šฅ์€ ๋ฌธ์ œ์ด๋ฉฐ (ํ•œ ๋ฒˆ์— 3000 ๊ฐœ์˜ ๋ฒ„ํŠผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ•„์š”ํ•œ๊ฐ€์š”?) ๊ฐ•๋ ฅํ•œ ํ…์ŠคํŠธ ๋ Œ๋”๋ง, ํ…์ŠคํŠธ ์ž…๋ ฅ ๋ฐ ์Šคํฌ๋กค ์ด๋ฒคํŠธ์™€ ๊ฐ™์€ ๊ฒƒ์€ WebGL์—์„œ ๋งค์šฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ UI์— DOM / CSS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebGL์„ ์„ ํƒํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : ํŠน์ • ํšจ๊ณผ, ๊นŠ์ด ํ…Œ์ŠคํŠธ ๋“ฑ) Pixi๋Š” ์•„๋งˆ๋„ 2D UI ์šฉ ThreeJS๋ณด๋‹ค ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋‹ต ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ซ์œผ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰