我正在开发一个简单的 OpenGL 项目,而且我是 C++ 新手。我一直在慢慢地向一个非常简单的原始 3D“引擎”添加功能,并努力确保它可以跨平台编译。
我有一个针对 OSX 和 Linux (Ubuntu) 运行的 make 文件,对于 Windows,我有一个经过修改的 Visual Studio 解决方案文件以使用项目的目录结构。
每次我进行更改时,我都会确保在每个平台上进行编译和测试,直到我使用 Assimp 添加对加载模型的支持之前,一切都很棒。更具体地说,加载模型很好,但加载纹理才是导致问题的原因,或者更确切地说,读取纹理文件名。
奇怪的是,这段代码实际上可以在我所针对的所有平台上正确运行和编译:Linux (Ubuntu)、OSX 和 Windows 10 - 除了在 Ubuntu 中(并且仅在 Ubuntu 中)aiString
来自 Assimp 的对象似乎没有返回纹理文件的名称。
这是我缩小范围的代码片段,它真正显示了我的问题:
aiString path;
mat->GetTexture(aiTextureType_DIFFUSE, 0, &path);
fprintf(stderr, "Loading texture '%s'...\n", path.data);
std::string full_path = _model_load_path + std::string(path.C_Str());
fprintf(stderr, "Full path: '%s'\n", full_path.c_str());
这是 OSX 和 Windows 10 上的输出:
Loading texture 'glass_dif.png'...
Full path: 'resources/meshes/nanosuit/glass_dif.png'
这是 Ubuntu 上的输出:
Loading texture ''...
Full path: 'resources/meshes/nanosuit/'
果然,纹理已在 OSX 和 Windows 10 中正确加载并应用到模型,但在 Ubuntu 中则不然。其他一切似乎都有效,包括加载模型(它仅显示为黑色,因为着色器无法对纹理颜色进行采样)。
我唯一能想到的是我安装的 libassimp-dev 版本,它是 4,而 OSX 上是 5。但我对 v4 持怀疑态度,之前所有版本都无法加载纹理。难道是我编译的方式不对?
我应该开始研究什么来解决这个问题?我在 Ubuntu 上使用 gcc,在 OSX 上使用 clang。
最佳答案
好吧,为了尽职调查,我决定首先排除 libassimp-dev
版本,因为这确实是唯一不同的地方。我怀疑这就是这个问题,因为以前版本的 libassimp-dev 是如何在 Linux 上工作的?
嗯,我不知道,但这就是问题所在。我避免这样做,因为 Ubuntu 上的版本 5 不适用于我的 Linux 版本:https://packages.ubuntu.com/search?keywords=libassimp-dev
在 friend 的帮助下,我能够通过临时添加“focal”软件包存储库来强制安装版本 5,从该新存储库安装相关软件包,然后删除该存储库,这样 Ubuntu 就不会升级其他所有软件包系统。
步骤:
1.) 将以下配置附加到 /etc/apt/sources.list
:
# FIXME: remove me after installing libassimp5 and libassimp-dev
deb http://mirrors.kernel.org/ubuntu focal main universe
2.) 更新包注册表并安装相关包(及其依赖项):
sudo apt-get update
sudo apt-get install libassimp-dev libassimp5
(我还遇到一个问题,运行此命令后我必须运行推荐的修复安装命令或类似命令)
3.) 安装成功后,删除添加到 /etc/apt/sources.list
请确保您现在不运行 sudo apt-get update
,因为它会尝试将系统上的所有软件包升级到新版本的 Ubuntu,这可能会产生不可预见的后果s。
4.) 再次更新您的包注册表(以删除新存储库的痕迹)
sudo apt-get update
工作后重新编译我的项目 - 字符串正确显示 Material 文件路径,应用程序加载纹理并将它们正确应用到模型。
这些步骤和说明归功于 Dominic Barnes:https://stackoverflow.com/users/188702/dominic-barnes
关于c++ - 针对 Linux 编译时 Assimp aiString 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60580853/