Javascript three.js ObjectLoader不解析来自工作程序的对象
让我们从一个运行良好的用例开始 worker.js:Javascript three.js ObjectLoader不解析来自工作程序的对象,javascript,three.js,web-worker,Javascript,Three.js,Web Worker,让我们从一个运行良好的用例开始 worker.js: const newMaterial = new THREE.MeshStandardMaterial( { color: 0x606060 } ); dracoLoader.decodeDracoFile(drcMesh,function(bufferGeometry){ var geometry; geometry = new THREE.Mesh(bufferGeometry, newMaterial);
const newMaterial = new THREE.MeshStandardMaterial( { color: 0x606060 } );
dracoLoader.decodeDracoFile(drcMesh,function(bufferGeometry){
var geometry;
geometry = new THREE.Mesh(bufferGeometry, newMaterial);
var serializedGeometry = geometry.toJSON();
postMessage(serializedGeometry);
});
在HTML方面:
const consumer = new Worker('../workers/consumer.js', {
type: 'module'
});
consumer.onmessage = function(e) {
console.log('Message received from worker', e.data.type);
var jsonLoader = new THREE.ObjectLoader();
var geometry = jsonLoader.parse(e.data)
meshes.push(geometry)
}
在这个场景中,我可以在HTML端创建网格,但在下一个用例中,我遇到了一些问题。现在我将添加一个带有THREE.ImageBitmapLoader()的纹理你可能会问我为什么不使用THREE.TextureLoader()这是因为worker有几个限制,其中之一是:访问dom是被禁止的
// instantiate a loader
const textureLoader = new THREE.ImageBitmapLoader();
// load a image resource
textureLoader.load(
// resource URL
url,
// onLoad callback
function ( imageBitmap ) {
const texture = new THREE.CanvasTexture( imageBitmap );
const material = new THREE.MeshBasicMaterial( { map: texture } );
// var serializedMaterial = material.toJSON();
// postMessage(serializedMaterial)
dracoLoader.decodeDracoFile(drcMesh,function(bufferGeometry){
var geometry;
geometry = new THREE.Mesh(bufferGeometry, material);
var serializedGeometry = geometry.toJSON();
postMessage(serializedGeometry);
});
},
// onError callback
function ( err ) {
console.log( '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' );
}
);
但是现在,当我在浏览器(chrome)开发工具中检查网络选项卡时,我看到未定义错误(未找到)
我能够显示网格(无纹理),当我显示它时,我会发现另外两个错误:
WebGL: INVALID_VALUE: texImage2D: bad image data
[.WebGL-00000A9800214880] GL_INVALID_OPERATION: Texture format does not support mipmap generation.
如果我在HTML方面做了一些修改,比如:
var geometry = jsonLoader.parseObject(e.data);
快速刷新:在第一个用例中使用jsonLoader.parse
现在:未定义的错误消失了。但当我试图显示网格时,我什么都看不到
那么,如何从worker发送纹理网格以及如何在主线程上处理它呢?我猜几何体仍然需要访问ImageBitmap,您必须将其传输回主线程(使用postMessage的传输选项),尽管我不确定他们如何能够链接它。。。但不管怎样,你为什么这样做?Workers中唯一支持ImageBitmap的浏览器是基于chromium的浏览器和Firefox。基于铬的浏览器也支持OffscreenCanvas,为什么不直接把所有东西都放在那里,而把不幸的Safari和Firefox都放在主线程上呢?