Не загружается шрифт ImGui

Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Здравствуйте.
У меня появилась проблема, которую я уже долгое время не могу решить самостоятельно.
Не загружается ни один шрифт(даже дефолтный), и при вызове ImGui::NewFrame() срабатывает исключение
C++:
IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded() && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?");
После этого решил проверять загружен ли шрифт сразу после его инициализации:
C++:
ImFont* font = io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic());
IM_ASSERT(font != NULL);
IM_ASSERT(font->IsLoaded());
И, как я и думал, срабатывало исключение:
C++:
IM_ASSERT(font->IsLoaded());
Платформа решения - x64.
Используется DirectX 11 и игра GTA 5.
Метод Present перехватывается правильно, проблемы только со шрифтом.
Помогите, пожалуйста, кто знает в чем проблема. :disrelieved:
Буду очень благодарен!
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
вопрос, возможно глупый: а ОС у тебя на диске "C" записана?
Да, на диске С.
Проверял, путь к шрифту правильный.
Так же, хочу добавить, что такая проблема только с игрой GTA 5.
Тестировал хук DX11 и ImGui на демо приложении имгуи и гта 5, на демо приложении работает, а на гта 5 - нет, код, кроме адресов HWND, D3DDevice, D3DDeviceContext и SwapChain'a, одинаковый. Сам хук DX11 в GTA 5 работает.
Проект демо приложения тоже x64, как и гта 5.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Так же, провел еще пару тестов.
C++:
ImFont* font = io.Fonts->AddFontDefault();
IM_ASSERT(font != NULL);
IM_ASSERT(font->IsLoaded());
В этом коде так же срабатывает исключение:
C++:
IM_ASSERT(font->IsLoaded());
Это, скорее всего, значит, что проблема не в шрифте и не в его пути.
А еще я попробовал убрать имгуи и рисовать что нибудь без него, с помощью чистого DirectX, и все было хорошо:
Пробовал на удачу убрать проверку исключений IM_ASSERT в ImGui::NewFrame(), зная, что работать все равно не будет, я проверил, и игра просто крашилась.
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
ImGui какой версии используешь? С какими правами запускаются приложения? С кодировками строк все нормально?
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
в исключении спрашивается: вызывал ли ты GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ("Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?"?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Версия имгуи: 1.65 (последняя)
Не знаю с какими правами запускается GTA 5 через ее лаунчер.
Не знаю как проверить все ли нормально с кодировками строк, но, я почти уверен, что да, потому что я даже не использую UTF-8, и исключение сработает даже если имгуи не будет ничего рисовать(будет только Imgui_impl_init, ImGui::NewFrame(), ImGui::EndFrame(), ImGui::Render())
Стандартный шрифт ImGui, так же как и любой другой шрифт, не загружается.
Сейчас GetTexDataAsRGBA32() / GetTexDataAsAlpha8() я не вызывал, потому что вообще работать оно должно и без него.
Но, где то вчера-позавчера я вызывал и его, но тогда срабатывало другое исключение:
C++:
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
 
bruh
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
1,299
Реакции[?]
365
Поинты[?]
0
io.Fonts->AddFontDefault();
попробуй, если все будет норм знач это ты чото не так делаешь, и чекай как сделано там
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Так же, провел еще пару тестов.
C++:
ImFont* font = io.Fonts->AddFontDefault();
IM_ASSERT(font != NULL);
IM_ASSERT(font->IsLoaded());
В этом коде так же срабатывает исключение:
C++:
IM_ASSERT(font->IsLoaded());
Это, скорее всего, значит, что проблема не в шрифте и не в его пути.
А еще я попробовал убрать имгуи и рисовать что нибудь без него, с помощью чистого DirectX, и все было хорошо:
Пробовал на удачу убрать проверку исключений IM_ASSERT в ImGui::NewFrame(), зная, что работать все равно не будет, я проверил, и игра просто крашилась.
Стандартный шрифт точно так же не загружается, как и любой другой.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Стандартный шрифт точно так же не загружается, как и любой другой.
На сколько я помню, там еще что-то надо делать при установке стандартного шрифта
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
На сколько я помню, там еще что-то надо делать при установке стандартного шрифта
Вроде бы, ничего больше делать не нужно.
Если нужно - подскажи, пожалуйста, что, я не знаю.
Сейчас добавил в свой код:
C++:
unsigned char* pixels;
int width, height;
io->Fonts->GetTexDataAsAlpha8(&pixels, &width, &height);
Теперь font->IsLoaded() возвращает TRUE, но при вызове ImGui::NewFrame() в Present'e происходит краш.
 
Болтовня ничего не стоит. Покажите мне код.
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2017
Сообщения
319
Реакции[?]
122
Поинты[?]
0
Как вариант попробуй добавить шрифт в байтах и юзать его.
А вообще что то можешь на имгуи нарисовать без шрифта там блок , окно что либо?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Как вариант попробуй добавить шрифт в байтах и юзать его.
А вообще что то можешь на имгуи нарисовать без шрифта там блок , окно что либо?
Не мог бы ты подсказать как добавить шрифт в байтах? AddFontFromMemoryTTF?
Нет, нарисовать не могу ничего, краш/исключение происходит при вызове ImGui::NewFrame()
 
Начинающий
Статус
Оффлайн
Регистрация
30 Янв 2018
Сообщения
79
Реакции[?]
6
Поинты[?]
0
Извините за беспокойство, проблема решилась.
Так как я много чего менял в исходных файлах имгуи, от безысходности, что делать, решил скачать заного проект имгуи с оф. гитхаба разработчика, установил, код оставил в точности как был, запустил, и все заработало.
Еще раз приношу извинения, где то я ошибся и подзапарил вам мозги.
Очень неловко)
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Не мог бы ты подсказать как добавить шрифт в байтах? AddFontFromMemoryTTF?
перегоняешь файл шрифта в массив данных (https://yougame.biz/threads/43549/)

и один раз вызываешь:
Код:
   ImFontConfig config;
    config.MergeMode = true;
    static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
    this->AwesomeFont = io.Fonts->AddFontFromMemoryTTF((void*)AwesomeArry, sizeof(AwesomeArry), 20.0f, &config, icon_ranges);
ЗЫ: для простого шрифта два последних параметра вызывать не обязательно. в итоге получаем:

Код:
io.Fonts->AddFontFromMemoryTTF((void*)FontArry, sizeof(FontArry), fSizeFont);
Еще раз приношу извинения, где то я ошибся и подзапарил вам мозги.
Очень неловко)
на ошибках учатся. а если у тебя возникают ошибки - значит ты учишься))) а за это не стоит извиняться
 
Сверху Снизу