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:在着色器材质中使用纹理添加到对象加载程序加载的对象_Javascript_Three.js_Shader - Fatal编程技术网

Javascript three.js:在着色器材质中使用纹理添加到对象加载程序加载的对象

Javascript three.js:在着色器材质中使用纹理添加到对象加载程序加载的对象,javascript,three.js,shader,Javascript,Three.js,Shader,当我试图在由object loaderTHREE.OBJLoader加载的混合器对象中使用的着色器材质中使用纹理时,我遇到了一个问题 这个简单的代码工作正常,它加载纹理并将其应用于加载的对象 var manager = new THREE.LoadingManager(); var texture = new THREE.Texture(); var imageLoader = new THREE.ImageLoader(manager); var objLoad

当我试图在由object loader
THREE.OBJLoader
加载的混合器对象中使用的着色器材质中使用纹理时,我遇到了一个问题

这个简单的代码工作正常,它加载纹理并将其应用于加载的对象

    var manager = new THREE.LoadingManager();
    var texture = new THREE.Texture();
    var imageLoader = new THREE.ImageLoader(manager);
    var objLoader = new THREE.OBJLoader(manager);

    imageLoader.load("texture.png", function (image) {
       texture.image = image;
       texture.needsUpdate = true;
    });
    var material = new THREE.MeshBasicMaterial({ map: texture});
    objLoader.load("blenderObject.obj", function (object) {
       object.traverse(function (child) {
       if (child instanceof THREE.Mesh) {
          child.material = material;
       }    
    });                
    scene.add(object);
但是我想使用我的
ShaderMaterial
而不是
MeshBasicMaterial
。此着色器材质可以与我在项目中使用的其他对象配合使用。这是我的着色器材质的初始化:

        var uniforms = {
          texture: { type: "t", value: THREE.ImageUtils.loadTexture("texture.png") },                 
        }

        var shader = THREE.ShaderLib["shader"];

        var material = new THREE.ShaderMaterial({
            uniforms: uniforms,
            vertexShader: shader.vertexShader,
            fragmentShader: shader.fragmentShader,
            depthTest: true,    
        });

所以,当我使用这种材质而不是
MeshBasicMaterial
时,我没有任何错误,但对象是全黑的。我想知道在着色器材质中使用由
THREE.OBJLoader
创建的对象的纹理的正确方法是什么。当我将此着色器应用于其他对象时,它的工作原理与它应该的完全相同。任何答案请提前点击Thx。

所有纹理都是平等创建的。创建对象的方式没有区别


代码的问题是,当您指定
uniforms
变量时,您的纹理值将为null,因为
THREE.ImageUtils.loadTexture()
是异步的。使用
THREE.TextureLoader()
的正确方法记录在:

您好,谢谢您的回答,加载纹理的方式很好,至少在我使用的对象上是这样,但是
THREE.TextureLoader()
是更好的方法,因为现在我完全可以肯定一切都会正常工作。我的问题中的问题似乎是由我的着色器造成的,我将其设计为一个顶点等于一个纹理,这就是为什么它不能正确加载整个对象的纹理。