Pixi.js: pixi.js内にthree.jsをレンダリングしますか?

作成日 2019年02月06日  ·  11コメント  ·  ソース: pixijs/pixi.js

ねえ! pixi.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にテクスチャの寸法を更新するように指示するにはどうすればよいですか?

環境

  • pixi.jsバージョン:5.0.0-rc
  • three.jsバージョン:0.101.1
  • ブラウザとバージョン:Chrome 71
  • OSとバージョン:OSX
  • 実行例https
🤔 Question

最も参考になるコメント

これらの問題は別のプロジェクトで修正しました。後でそのコードのデモを作成します。 pixiがrenderTargets(v5 renderTextures)を使用する方法を逆にするv4のパッチがあります。

全てのコメント11件

その可能性のあるthreejsの例は、Issues for v4に数回投稿されましたが、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は3つのキャンバスの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.Texture.from(threeApp.renderer.domElement)悪い考えが何であったかを説明することにも注意してください?申し訳ありませんが、高度なwebglをあまり知りません)

これがpixiv5に変換された例です

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 評価

関連する問題

courtneyvigo picture courtneyvigo  ·  3コメント

SebastienFPRousseau picture SebastienFPRousseau  ·  3コメント

readygosports picture readygosports  ·  3コメント

samueller picture samueller  ·  3コメント

lunabunn picture lunabunn  ·  3コメント