three.js: 在着色器中使用纹理 material 添加到对象加载器加载的对象

three.js: use texture in shader material added to object loaded by object loader

当我尝试在着色器中使用纹理时遇到问题 material 用于由对象加载器加载的搅拌器对象 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。这个着色器 material 与我在我的项目中使用的其他对象一起工作。这是我的着色器的初始化 material:

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

所以当我使用这个 material 而不是 MeshBasicMaterial 时,我没有错误,但对象只是全黑。我想知道在着色器 material 中使用由 THREE.OBJLoader 创建的对象的纹理的正确方法是什么。当我将此着色器应用于其他对象时,它的工作方式与应有的完全一样。提前感谢任何答案。

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

您的代码存在的问题是,当您分配 uniforms 变量时,您的纹理值将为空,因为 THREE.ImageUtils.loadTexture() 是异步的。使用 THREE.TextureLoader() 的正确方法记录在:http://threejs.org/docs/#Reference/Loaders/TextureLoader