Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript three.js ObjectLoader不解析来自工作程序的对象_Javascript_Three.js_Web Worker - Fatal编程技术网

Javascript three.js ObjectLoader不解析来自工作程序的对象

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

让我们从一个运行良好的用例开始

worker.js:

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()
   // 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都放在主线程上呢?