Pixi.js: pixi.js λ‚΄μ—μ„œ three.jsλ₯Ό λ Œλ”λ§ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2019λ…„ 02μ›” 06일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: pixijs/pixi.js

μ•Ό! pixi.js λ‚΄μ—μ„œ three.js μž₯면을 λ Œλ”λ§ν•˜μ—¬ ν›„ 처리 λ°©μ‹μœΌλ‘œ 일뢀 ν•„ν„°λ₯Ό μ μš©ν•˜λ €κ³ ν•©λ‹ˆλ‹€. 더 효율적으둜 μˆ˜ν–‰ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μž‘μ—… 예제 κ°€ μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 λ‚΄κ°€ν•˜λŠ” 일이 μžˆμŠ΅λ‹ˆλ‹€. μ˜€ν”„ 슀크린 μΊ”λ²„μŠ€μ—μ„œ three.jsλ₯Ό μ΄ˆκΈ°ν™” ν•œ λ‹€μŒ λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

const threeTexture = PIXI.Texture.from(threeApp.renderer.domElement)
const threeSprite = new PIXI.Sprite(threeTexture)
// divide by pixelratio to make it the correct size, on retinas it's 2
threeSprite.scale.x /= window.devicePixelRatio
threeSprite.scale.y /= window.devicePixelRatio
pixiApp.stage.addChild(threeSprite)

그런 λ‹€μŒ λ Œλ”λ§ λ£¨ν”„μ—μ„œ

threeApp.draw()
threeSprite.texture.update() // tell pixi that threejs has changed
pixiApp.render()

λ‚΄κ°€ λ†“μΉœ λ‹€λ₯Έ 것이 μžˆμŠ΅λ‹ˆκΉŒ? 더 쒋은 μ΅œμ ν™”?

μ–΄μ¨Œλ“  μ‹€μ œ λ¬Έμ œλŠ” ν™”λ©΄ 크기λ₯Ό μ‘°μ •ν•  λ•Œμ΄ μ½”λ“œκ°€ three.jsμ—μ„œ μ‹€ν–‰λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

renderer.setSize(window.innerWidth, window.innerHeight)

기본적으둜 three.js의 λ Œλ”λ§ 된 μ˜μ—­μ˜ 크기λ₯Ό λ³€κ²½ν•˜κ³  λ¬Όλ‘  pixi.jsκ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€.

screenshot 2019-02-06 at 02 00 02

ν…μŠ€μ²˜ 크기λ₯Ό μ—…λ°μ΄νŠΈν•˜λ„λ‘ pixi.js에 μ–΄λ–»κ²Œ μ§€μ‹œν•©λ‹ˆκΉŒ?

ν™˜κ²½

πŸ€” Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ—μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό μˆ˜μ •ν–ˆμœΌλ©° λ‚˜μ€‘μ— ν•΄λ‹Ή μ½”λ“œμ˜ 데λͺ¨λ₯Ό λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€. pixiκ°€ renderTargets (v5 renderTextures)λ₯Ό μ‚¬μš©ν•˜λŠ” 방식을 λ°”κΎΈλŠ” v4 용 νŒ¨μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  11 λŒ“κΈ€

κ°€λŠ₯ν•˜λ©΄ threejs μ˜ˆμ œκ°€ v4 용 Issues에 μ—¬λŸ¬ 번 κ²Œμ‹œλ˜μ—ˆμ§€λ§Œ 아직 v5 용으둜 λ§Œλ“€μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
기본적으둜 라이브러리λ₯Ό λ³€κ²½ν•  λ•Œλ§ˆλ‹€ pixi 및 threejs μƒνƒœλ₯Ό λͺ¨λ‘ μž¬μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.

μ§€κΈˆμ€ 였래된 데λͺ¨λ₯Ό 제곡 ν•  수 μ—†μ§€λ§Œ 여기와 http://www.html5gamedevs.com/forum/15-pixijs/ μ—μ„œ 검색 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν…μŠ€μ²˜ κ³΅μœ λ„ μ–΄λ”˜κ°€μ—μ„œ λ…Όμ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

당신이해야 ν•  일은 κ²€μƒ‰ν•˜κ³  v5둜 μ΄μ‹ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€! μ–΄λ”˜κ°€μ—μ„œ μ‹€νŒ¨ν•˜λ©΄ 두 가지 λͺ¨λ‘λ₯Ό λ„μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

2D와 3D μ˜€λΈŒμ νŠΈκ°€ μ„œλ‘œ λΆ„λ₯˜λ˜λŠ” 데λͺ¨λ„ λ§Œλ“€μ—ˆμ§€ 만 곡개적으둜 κ³΅μœ ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

이것이 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆκΉŒ? https://github.com/pixijs/pixi.js/pull/5430 μˆ˜μ •μ€ 이미 5.0.0-rc2에 μžˆμŠ΅λ‹ˆλ‹€.

@ivanpopelyshev 응닡에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! 이 ν† λ‘  과이 μ½”λ“œ 슀 λ‹ˆνŽ«μ„ 더 μ •ν™•ν•˜κ²Œ μ–ΈκΈ‰ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

    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)
    }

κ·ΈλŸ¬λ‚˜ λ‚˜λŠ”μ΄ μ½”λ“œλ₯Ό 어디에 μ‚½μž…ν•΄μ•Όν•˜κ³  session λ³€μˆ˜κ°€ 무엇인지 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. gl이 μ„Έ μΊ”λ²„μŠ€μ˜ glcontext라고 μƒμƒν•©λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œ 어디에 λ‘μ–΄μ•Όν•©λ‹ˆκΉŒ?

https://codepen.io/marco_fugaro/pen/QYgJQY?editors=0010

(λ¬Έμ œλŠ” 창의 크기 μ‘°μ • μ—μ„œ λ°œμƒν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€)

μ˜ˆμ œμ— 5.0.0-rc.2 κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ³€κ²½ν•΄μ•Όν•©λ‹ˆκΉŒ?

이 μ˜ˆμ „μ˜ μ˜ˆλŠ” λͺ¨λ₯΄κ² μ§€λ§Œ λ§μ”€ν•˜μ‹  λ‚΄μš©μ€ λͺ¨λ‘ renderer.reset() ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

const threeTexture = PIXI.Texture.from(threeApp.renderer.domElement)

이것은 λ‚˜μœ μƒκ°μž…λ‹ˆλ‹€.

# 5430 λ΄€μ–΄?

@marcofugaro 이것에 λŒ€ν•œ λ‹€λ₯Έ 후속 μ‘°μΉ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

@ivanpopelyshev @bigtimebuddy κΈ°λ‹€λ¦¬κ²Œ ν•΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. λ“œλ””μ–΄ 또 λ‹€λ₯Έ 찌λ₯΄κΈ°λ₯Όν–ˆμŠ΅λ‹ˆλ‹€.

@ivanpopelyshev PR에 κ²Œμ‹œ ν•œ pixi 데λͺ¨μ˜ 이전 3 κ°œμ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 정말 μœ μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ μ˜ˆμ œμ—μ„œ 방법 2λ₯Ό κ΅¬ν˜„ν•˜λ €κ³ ν–ˆμŠ΅λ‹ˆλ‹€. PIXI.Texture.from(threeApp.renderer.domElement) ? κ³ κΈ‰ webgl을 많이 λͺ°λΌ μ£„μ†‘ν•©λ‹ˆλ‹€)

λ‹€μŒμ€ pixi v5둜 λ³€ν™˜ 된 μ˜ˆμž…λ‹ˆλ‹€.

https://codepen.io/marco_fugaro/pen/wOGpwv?editors=0010

λ‚΄κ°€ 찾은 λͺ‡ 가지 문제 :

  1. PIXI.Application은 더 이상 context 맀개 λ³€μˆ˜λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. v4 μ˜ˆμ œμ—λŠ” λ‹€μŒμ΄ μžˆμŠ΅λ‹ˆλ‹€.
var renderer = new PIXI.WebGLRenderer(canvas.width, canvas.height, {
  context: context, // shared context with threejs

λ‚˜λŠ” v5μ—μ„œ μ΄κ²ƒμ„ν•˜κ³ μžˆλ‹€

 return new PIXI.Application({
    context: context, // shared context with threejs

ν•˜μ§€λ§Œ λΆ„λͺ…νžˆ λ¬΄μ‹œλ©λ‹ˆλ‹€. 데λͺ¨κ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

  1. three.js ν…μŠ€μ²˜λŠ” Yμ—μ„œ λ’€μ§‘ν˜€ μžˆμŠ΅λ‹ˆλ‹€ (μ•Œμ•„μš”, webgl).

  2. μ°½ 크기λ₯Ό μ‘°μ •ν•  λ•Œ ν…μŠ€μ²˜κ°€ λ°˜λŒ€ λ°©ν–₯으둜 λŠ˜μ–΄λ‚©λ‹ˆλ‹€. μ•„λ§ˆ λ‚΄κ°€ λ­”κ°€ 잘λͺ»ν•˜κ³ μžˆμ„κ±°μ•Ό

λ‹€μ‹œ ν•œλ²ˆ 쑰사해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ—μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό μˆ˜μ •ν–ˆμœΌλ©° λ‚˜μ€‘μ— ν•΄λ‹Ή μ½”λ“œμ˜ 데λͺ¨λ₯Ό λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€. pixiκ°€ renderTargets (v5 renderTextures)λ₯Ό μ‚¬μš©ν•˜λŠ” 방식을 λ°”κΎΈλŠ” v4 용 νŒ¨μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

@ivanpopelyshev v5κ°€ λ‚˜μ™”μœΌλ‹ˆ 이제 예제λ₯Ό κ³ μΉ  수 μžˆμŠ΅λ‹ˆκΉŒ? πŸ™

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 이상 ν™œλ™μ΄ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

λΆ€μ‹€ λ΄‡μ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

μ§€κΈˆκΉŒμ§€ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μ½”λ“œ 펜이 μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ ν•΄ν‚Ήμ΄λ˜λŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰