在 Three.js 上用带有 NormalMap 的 MeshPhysicalMaterial 替换材质不起作用

问题描述 投票:0回答:1

我正在加载 GLTF 模型。然后,我需要用 MeshPhysicalMaterial (MPM) 替换某些网格体的材质。该 MPM 材质具有来自我之前加载的纹理的法线贴图。更换材质时,所有使用新材质的网格都是黑色的。如果我替换材质但不添加法线贴图,它就可以正常工作。

如果我在新对象上添加 MPM 材质,它也会按预期工作。我想我需要将某些内容标记为需要更新,但我不确定是什么。

我尝试过以下方法:

    material.vertexColors = parseInt(material.vertexColors); //Ensure number
    material.side = parseInt(material.side); //Ensure number
    material.needsUpdate = true;
    geometry.attributes.position.needsUpdate = true;
    geometry.attributes.normal.needsUpdate = true;
    if (geometry.attributes.color) {
      geometry.attributes.color.needsUpdate = true;
    }
    geometry.verticesNeedUpdate = true;
    geometry.elementsNeedUpdate = true;
    geometry.morphTargetsNeedUpdate = true;
    geometry.uvsNeedUpdate = true;
    geometry.normalsNeedUpdate = true;
    geometry.colorsNeedUpdate = true;
    geometry.tangentsNeedUpdate = true;

但似乎没有任何作用。任何想法将非常感激。

three.js
1个回答
0
投票

在 r.160 上,我无法显示加载的法线贴图,直到加载法线贴图后执行以下操作。

  1. 我将环绕纹理应用为贴图,因此我必须对加载的法线贴图使用相同的环绕设置,即
normalMap.wrapS = THREE.RepeatWrapping;
normalMap.wrapT = THREE.RepeatWrapping;
normalMap.repeat.set(0.2, 0.2);
material.normalMap = normalMap;
  1. 我还必须更改法线地图类型:
    material.normalMapType = THREE.ObjectSpaceNormalMap;

我不知道这是否适用于你的情况,但这对我有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.