javascript - Three.js 凹凸贴图未更新

标签 javascript three.js bump-mapping

我有一个 .obj 模型,并在场景中加载了相应的 .mtl 文件。我在加载后对其应用 bumpMap:

        var mtlLoader = new THREE.MTLLoader();
        mtlLoader.setPath('/models/');
        mtlLoader.load('model.mtl', function (materials) {
            materials.preload();

            // Load obj file
            var objLoader = new THREE.OBJLoader();
            objLoader.setMaterials(materials);
            objLoader.setPath('/models/');
            objLoader.load('model.obj', function (group) {

                var geometry = group.children[0].geometry;
                geometry.center();

                model = new THREE.Mesh(geometry, otherMesh.material.clone());
                model.material.bumpMap = new THREE.ImageUtils.loadTexture('images/bump.png');
                model.name = "obj model";
                scene.add(model);

                render();
                callback();
            });
        });

这按预期工作。 map 纹理只是一个黑白 .png 图像。但是,如果我不只是在添加模型之前应用凹凸贴图,则不会应用它。例如,使用以下代码,bumpMap 不会应用于模型:

        var mtlLoader = new THREE.MTLLoader();
        mtlLoader.setPath('/models/');
        mtlLoader.load('model.mtl', function (materials) {
            materials.preload();

            // Load obj file
            var objLoader = new THREE.OBJLoader();
            objLoader.setMaterials(materials);
            objLoader.setPath('/models/');
            objLoader.load('model.obj', function (group) {

                var geometry = group.children[0].geometry;
                geometry.center();

                model = new THREE.Mesh(geometry, otherMesh.material.clone());
                setTimeout(function(){
                    model.material.bumpMap = new THREE.ImageUtils.loadTexture('images/bump.png');
                }, 0);

                model.name = "obj model";
                scene.add(model);

                render();
                callback();
            });
        });

只需添加超时,bumpMap 就不再应用。应用 bumpMap 后添加 model.bumpMap.needsUpdate = true; 不会改变任何内容。

最佳答案

在渲染 Material 至少一次后,添加之前不存在的纹理需要构建新的着色器程序。要强制执行此操作,您需要设置

mesh.material.needsUpdate = true;

请参阅 Three.js 文档 How to Update Things .

三.js r.85

关于javascript - Three.js 凹凸贴图未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742168/

相关文章:

javascript - 如何在智能手机中显示网站帮助上的悬停

javascript - 从 JSON 在 Jquery 中获取正确的浮点值

javascript - 在 ThreeJS 中检测标签

javascript - 帧率: relationship between FPS and MS (milliseconds needed to render a frame) in stats plugin

c++ - 法线贴图问题

javascript - 如何轻松地与父范围通信

javascript 变量返回奇怪的输出

android - 移动智能手机查看球形全景的不同部分?

javascript - three.js 中的置换贴图

c++ - 法线贴图和光照出错,无法正确显示