مهلا! أحاول عرض مشهد three.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()
أي شيء آخر أنا في عداد المفقودين؟ بعض التحسين أجمل؟
على أي حال ، المشكلة الحقيقية هي عندما أقوم بتغيير حجم الشاشة ، لدي هذا الرمز يعمل في ثلاثة ملفات js:
renderer.setSize(window.innerWidth, window.innerHeight)
الذي يغير أبعاد المنطقة المعروضة لـ three.js ، وبالطبع فواصل pixi.js.
كيف أخبر pixi.js بتحديث أبعاد النسيج؟
pixi.js
: 5.0.0-rcthree.js
: 0.101.1تم نشر أمثلة threejs المحتملة عدة مرات في إصدارات v4 ، لكنني لم أجعلها لـ v5 حتى الآن.
بشكل أساسي ، يجب عليك إعادة تعيين كل من حالة pixi و threejs في كل مرة تقوم فيها بتغيير المكتبات.
لا يمكنني تقديم عروض توضيحية قديمة في الوقت الحالي ، ولكن يمكنك البحث عنها هنا وفي http://www.html5gamedevs.com/forum/15-pixijs/ . تمت أيضًا مناقشة مشاركة الملمس في مكان ما.
كل ما عليك فعله هو البحث ثم الانتقال إلى الإصدار 5 ، حظًا سعيدًا! يمكنني المساعدة في كلا الأمرين إذا فشلت في مكان ما.
حتى أنني قدمت عرضًا توضيحيًا حيث يتم فرز الكائنات ثنائية وثلاثية الأبعاد من خلال بعضها البعض ، لكن هذا الكائن لم أشاركه في الأماكن العامة.
هل هذا يحل مشاكلك؟ 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 شكرًا pixi الذي نشرته في العلاقات العامة ، لقد كان مفيدًا حقًا ، لقد حاولت تنفيذ الطريقة 2 في المثال التالي (أهتم أيضًا بشرح الفكرة السيئة باستخدام PIXI.Texture.from(threeApp.renderer.domElement)
؟ آسف لا أعرف الكثير من webgl المتقدم)
هذا هو المثال الذي تم تحويله إلى pixi v5
https://codepen.io/marco_fugaro/pen/wOGpwv؟editors=0010
بعض المشكلات التي وجدتها:
context
، في مثال v4 هناك:var renderer = new PIXI.WebGLRenderer(canvas.width, canvas.height, {
context: context, // shared context with threejs
أنا أفعل هذا في الإصدار الخامس
return new PIXI.Application({
context: context, // shared context with threejs
ولكن من الواضح أنه يتم تجاهله ، لا أعرف كيف يعمل العرض التوضيحي
تم قلب نسيج three.js على Y (أعرف ، webgl)
عند تغيير حجم النافذة ، يتم شد النسيج بطريقة معاكسة؟ ربما أفعل شيئًا خاطئًا
مرة أخرى ، شكرًا لك على النظر في هذا!
لقد أصلحت هذه المشكلات في مشروع آخر ، وسأقوم بعمل عرض توضيحي لهذا الرمز لاحقًا. هناك تصحيح لـ v4 يعكس طريقة استخدام pixi لـ renderTargets (v5 renderTextures).
ivanpopelyshev هل يمكنك إصلاح المثال الآن بعد أن خرج الإصدار 5؟ 🙏
تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه في حالة عدم حدوث أي نشاط آخر. شكرا لمساهماتكم.
الروبوت الذي لا معنى له لا
أي تحديث حتى الآن؟ يبدو أن codepen يعمل ولكنني لست متأكدًا مما إذا كان متطفلًا أم لا.
التعليق الأكثر فائدة
لقد أصلحت هذه المشكلات في مشروع آخر ، وسأقوم بعمل عرض توضيحي لهذا الرمز لاحقًا. هناك تصحيح لـ v4 يعكس طريقة استخدام pixi لـ renderTargets (v5 renderTextures).