Assimp aiString пуста при компиляции для Linux

Я работаю над простым проектом OpenGL, и я новичок в C ++. Я медленно добавлял функции к очень простому примитивному «движку» 3D и работал над тем, чтобы он компилировался на кроссплатформенности.

У меня есть файл make, который я запускаю для OSX и Linux (Ubuntu), а для 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, по сравнению с 5 на OSX. Но я скептически отношусь к v4 и раньше не мог загружать текстуры. Может быть как я его компилирую?

Что мне следует предпринять, чтобы решить эту проблему? Я использую gcc на Ubuntu и clang на OSX.


person KTF    schedule 07.03.2020    source источник


Ответы (1)


Хорошо, поэтому, пытаясь проявить должную осмотрительность, я решил сначала исключить версию libassimp-dev, поскольку это единственное, что отличает его. Я скептически относился к этой проблеме, потому что как еще предыдущие версии libassimp-dev работали в Linux?

Ну, я не знаю, но в этом была проблема. Я избегал этого, потому что версия 5 на Ubuntu была недоступна для моей версии Linux: https://packages.ubuntu.com/search?keywords=libassimp-dev

С помощью друга я смог принудительно установить версию 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 upgrade сейчас, поскольку он попытается обновить все пакеты в вашей системе до этой новой версии Ubuntu, что может иметь непредвиденные последствия.

4.) Снова обновите реестр пакетов (чтобы удалить следы нового репозитория)

sudo apt-get update

Перекомпиляция моего проекта после этого сработала - строка правильно отображала путь к файлу материала, а приложение загружало текстуры и правильно применяло их к модели.

Благодарим Доминика Барнса за эти шаги и инструкции: https://stackoverflow.com/users/188702/dominic-barnes

person KTF    schedule 08.03.2020