Assimp aiString пусто при компиляции для Linux - PullRequest
2 голосов
/ 07 марта 2020

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

У меня есть файл 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 и до этого не мог загружать текстуры. Может ли быть так, как я это компилирую?

Что я должен начать изучать, чтобы устранить это? Я использую G cc на Ubuntu и Clang на OSX.

1 Ответ

2 голосов
/ 08 марта 2020

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

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

С помощью друга я смог принудительно установить версию 5 временно добавив «focal» репозиторий пакетов, установите соответствующие пакеты из этого нового репозитория, а затем удалите этот репозиторий, чтобы 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

(I также возникла проблема, из-за которой мне приходилось запускать рекомендованную команду исправления установки или аналогичную после выполнения этой команды)

3.) После успешной установки удалите строки, добавленные в /etc/apt/sources.list

Убедитесь, что вы не запускаете sudo apt-get upgrade сейчас, так как он попытается обновить все пакеты в вашей системе до этой новой версии Ubuntu, что может иметь непредвиденные последствия s.

4.) Обновите реестр вашего пакета снова (чтобы удалить следы нового хранилища)

sudo apt-get update

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

Благодарим за эти шаги и инструкции для Domini c Barnes: { ссылка }

...