Assimp FBX 加载器和 PBR 纹理

Posted

技术标签:

【中文标题】Assimp FBX 加载器和 PBR 纹理【英文标题】:Assimp FBX loader and PBR textures 【发布时间】:2021-10-23 02:08:12 【问题描述】:

我想知道 assimp FBX 加载器是否支持 PBR 材质。

我目前将它与 glTF/glb 文件一起使用,它完美地加载了我的 PBR 纹理。 我正在通过“assimp/pbrmaterial.h”头文件加载 PBR 纹理,但该文件仅定义 glTF 宏。

在使用带有 assimp 的 FBX 文件格式时如何加载 PBR 纹理?

问候。

【问题讨论】:

【参考方案1】:

我不认为它可以。 glTF 2.0 使用单一纹理,其中包含:蓝色通道上的金属,绿色通道上的粗糙度。根据我自己使用 Blender v2.93.3(目前最新版本)进行的测试,如果您使用其着色器编辑器将单个纹理拆分为单独的 RGB 通道,则 FBX 将不会通过任何路径保存。即使您将 FBX 导入回 Blender,它也只会应用基本颜色和法线贴图,没有其他内容。所以我认为你也不能指望 Assimp (v5.0.1) 可以使用它......但这可能只是 Blender 中的一个错误,我不确定。因为看起来如果金属和粗糙度是单独的纹理,Blender 可以正确地将 FBX 导入回来。您无法导出(作为 FBX)使用多通道纹理的模型,这是一个很大的疏忽。几乎所有 PBR 工作流程都涉及将它们合并到单个纹理中,以减少纹理查找。

我不知道...看起来 glTF 2.0 是一种更好的格式。它带有一个 GPU 友好的二进制文件(与非常慢的 Wavefront OBJ 之类的东西相比),如果您在导出时选择“glTF 分离”格式,您甚至可以单独拥有纹理。就像我之前说的那样,您会自动获得具有金属和粗糙度的合并 PNG:

如果你真的想支持 FBX 文件(我知道我支持;这是一种流行的格式),你可以做的是让它正确识别并加载基色和法线贴图,但是你必须手动在渲染循环开始之前在某处加载“PBR”纹理,然后在绘制之前手动绑定纹理并将其作为统一发送到片段着色器。我对此进行了测试,它可以工作。

glActiveTexture(GL_TEXTURE2); // Texture unit 2
glBindTexture(GL_TEXTURE_2D, *pMyMetRoughTexture);
pShader->SetInt("uMaterial.MetallicRoughnessTexture", 2); // Tell the sampler2D from the fragment shader to use texture unit 2
pMyModel->Draw(pShader);

但是对于每个...单个...模型...自动加载 2/3 个纹理,剩下 1 个由您手动处理,这只是... bleh。如果这不是一个“正确”的答案,我很抱歉。我对缺乏 PBR 支持感到非常失望,因为在过去几年中,我认为所有 AAA 游戏都使用了如此普遍的东西。

【讨论】:

是的,glTF 是一种不错的文件格式,我希望我能继续使用它。我将它留给 FBX 的原因是因为我试图在我用 C++ 编写的小型游戏引擎中获得更好的纹理加载性能。我发现 glTF 正在对 PNG 或 JPG 中的每个纹理进行自动转换,由于解压缩阶段,从 RAM 加载到 VRAM 的速度很慢。因此,我搜索了“什么是游戏的最佳纹理格式”,并阅读了有关 DDS 格式的信息,我最终设法将其加载到我的游戏引擎中,但仅限于 FBX 文件,因为我不能为此使用 glb/glTF。 我同意你的观点,手动加载一个纹理可以是一个解决方案,我确实想过,但即使我知道它有效,我也不会尝试 :) 我也想过别的东西:在 Blender/Maya 中给你的对象一个 blinn 或 phong 材质,然后使用常规通道进行反照率和法线贴图,但是对于金属和粗糙度等纹理,你可以分别将它们放在透明度和发光颜色通道中。最后,在您的带有 assimp 的代码中,您检索透明度和自发光颜色纹理,并将它们发送到您的金属和粗糙度 OpenGL 纹理单元。 最后一个解决方案的坏处是您无法预览您的材质在 Blender 中的外观,因为一切都发生在您的游戏引擎中。无论如何,我停止寻找正确加载所有这些的方法,我会为我的游戏坚持使用好的旧 phong 材料,我真的想要那些 DDS 纹理,因为它确实在纹理加载时间上有所不同(比如 8 次比 PNG/JPG 更快)。并且仍然可以使用非 PBR 材料获得非常好看的模型,所以我想没关系:)谢谢!

以上是关于Assimp FBX 加载器和 PBR 纹理的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASSIMP 和 OpenGL 加载 3D 模型时纹理不正确

Assimp 模型有纹理但没有纹理坐标

Assimp不从层片文件中读取纹理坐标信息

某些加载的 FBX 文件的纹理映射失败

在 android 上渲染骨骼动画 FBX 3d 模型

更改材质后再次加载原始纹理(.mtl)