THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材

Posted

技术标签:

【中文标题】THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材【英文标题】:THREE.js FBXLoader treats .png as if it is a .psd, and doesn't load the material 【发布时间】:2019-10-13 08:52:36 【问题描述】:

当使用 THREE.js FBXLoader 加载 .fbx 文件时,它会部分加载模型,而不会加载模型的 alpha 纹理部分。

我收到错误:

FBXLoader:不支持 PSD 纹理,为 pinebranchColor.psd 创建空的占位符纹理

尽管材料文件夹中没有 .psd 文件。从下面的截图可以看出,似乎认为在材质 alphaMap 中,纹理名称为pinebranchColor.psd

这是 FBX 模型被渲染的样子:

这就是它呈现的内容,就好像我加载了 GLTF 版本一样(注意:叶子的透明部分没有被拾取为透明)——这更接近它的外观,但并不完全。

根据sketchfab ,这就是模型的外观:

为什么你认为它说 alpha 材料是 .psd? 这可能是在 .fbx 文件本身中引用的吗?最初的问题是如何让叶子正确渲染的 alpha/透明度,而不是作为块颜色。也许我可以在 GLTF 版本的 THREE.js 材料中设置一个属性,这样就可以了?

这是我刚开始学习的第一个导入到 THREE.js 中的模型,所以请尽可能解释一下。

编辑: 在开发工具中,我找到了叶子的材质,并将透明设置为true。这行得通!在一定程度上。但是仍然存在一些渲染问题。所以我认为这是下降的路线。

【问题讨论】:

【参考方案1】:

我不确定为什么无法加载 FBX alpha 材质,但我通过使用 THREE.js scene.traverse 函数解决了 GLTF 版本的透明度问题,并将 material transparent 属性设置为true,用于场景中的所有叶子材质。

这解决了核心问题,但仍然存在如图所示的一些伪影,后面的叶子被涂黑了:

解决方案是在材质上也将alphaTest 设置为0.5,得到以下结果:

代码如下:

gltf.scene.traverse(child => 
  if (child.isMesh && child.name.includes('leaf')) 
    child.material.alphaTest = 0.5;
    child.material.transparent = true;
  
);

【讨论】:

以上是关于THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材的主要内容,如果未能解决你的问题,请参考以下文章

使用 FBXLoader 加载的相交对象——Three.js

FBXLoader CDN /用于Three.js的模块

Three.js 的 FBXLoader CDN/模块

Three.js - 使用 .FBX 模型时出现“未知格式”错误

Three.js FBX 二进制格式不支持

three.js 中的分层纹理