提示コードの4つ目の提示コードのFT_New_Face();関数ですがなぜフォントが読み込ませんというエラーが出るのでしょうか?この関数はこの場合毎フレーム行うのですが最初のフレームや次のフレームでは発生せず。なぜか239フレーム目でエラーが出ます。これはなぜなのでしょうか?
std::cout<<""<<std::endl;デバッグしましたがFT_New_Face();関数が原因というのは掴めたのですが。それ以降どうすればいいかわかりません。この場合何が原因として考えられるのでしょうか?
追記: 以下のようにエラーコードを取得しました。結果 1 が返ってきました。リソース確報に失敗しましたというエラーです。
参考サイト: https://www.freetype.org/freetype2/docs/reference/ft2-error_code_values.html
cpp
1// ##################################### フォント指定 ##################################### 2void FrameWork::Text::setFontName(const char* fontName,FT_Face &face) 3{ 4 5 FT_Error error = FT_New_Face(ft, fontName, 0, &face); 6 std::cout << error << std::endl; 7 if (error != 0) 8 { 9 10 11 std::cerr << "FreeType フォントを読み込めません: "<< error << std::endl; 12 assert(0); 13 } 14 15} 16
cpp
1#include <iostream> 2#include "FrameWork.hpp" 3 4int main() 5{ 6 7 FrameWork::Init(glm::ivec2(48 * 26, 48 * 18), "Dungeon"); //初期化 8 std::shared_ptr<FrameWork::Window> window = FrameWork::getWindowContext(); //ウインドウコンテキストを 9 FrameWork::setVersion(4, 5); //バージョン設定 10 11 int a = 1; 12 13 FrameWork::Text text; 14 text.setString("Font/SourceHanCodeJP.ttc", 48, glm::vec4(255, 255, 255, 255), "aaa"); 15 text.setString("Font/SourceHanCodeJP.ttc", 48, glm::vec4(255, 255, 255, 255), "bbb {}",a); 16 17 while (*window) 18 { 19 window->FrameUpdate(glm::vec4(0.0f, 0.0f, 0.0f, 255.0f)); 20 21 text.DrawString(glm::vec2(100, 100), 0); 22 text.DrawString(glm::vec2(100, 100 + text.getTextSize(0).y), 1); 23 text.ResetString(0, "Font/PressStart2P.ttf", 48, glm::vec4(255, 255, 255, 255), "bbbb {}",a); 24 25 a++; 26 window->SwapBuffers(); //ダブルバッファリング 27 window->Wait(); //フレームレート制御 28 } 29 30 return 0; 31} 32
cpp
1 2 // ##################################### 固定長文字列 文字列 再設定 ##################################### 3 template <typename... Args> 4 void ResetString(unsigned int num ,const char* fontName, unsigned short pixelSize, const glm::vec4 color, const char* text, const Args& ... args) 5 { 6 if (text != NULL) 7 { 8 //マルチバイト文字をワイド文字変換 9 std::string str = std::format(text, args...); 10 11 //フォント、ピクセルサイズ、カラー どれかが違うとき 12 if ( (characterText->at(num).fontName != std::string(fontName)) || (characterText->at(num).pixelSize != pixelSize) || (characterText->at(num).color != color) ) 13 { 14 characterText->at(num).fontName = std::string(fontName); //フォント 15 characterText->at(num).pixelSize = pixelSize; //ピクセルサイズ 16 characterText->at(num).color = color; //カラー 17 18 setFontName(characterText->at(num).fontName.c_str(), characterText->at(num).face); //フォント設定 19 setPixelSize(characterText->at(num).pixelSize, characterText->at(num).face); //ピクセルサイズ設定 20 21 characterText->at(num).text = getTexture(getWchar_t(str.c_str()), characterText->at(num).fontName.c_str(), characterText->at(num).pixelSize, characterText->at(num).face); //テクスチャ生成 22 setTextSize(characterText->at(num).textSize, characterText->at(num).text); //文字列サイズを設定 23 } 24 else if (str != getString(characterText->at(num).text)) 25 { 26 std::cout << "あああ" << std::endl; 27 FixText(characterText->at(num),getWchar_t(str.c_str())); 28 std::cout << "いいい" << std::endl; 29 30 } 31 } 32 } 33
cpp
1 2// ##################################### 文字列修正 ##################################### 3void FrameWork::Text::FixText(CharacterString &character,const std::vector<wchar_t> newText) 4{ 5 6 //新しい文字列の方が長い時 7 if (newText.size() > character.text.size()) 8 { 9 10 int size = (int)newText.size() - (int)character.text.size(); 11 12 for (int i = 0; i < character.text.size(); i++) 13 { 14 if (character.text.at(i).character != newText.at(i)) 15 { 16 std::vector<wchar_t> wc(0); 17 wc.push_back(newText.at(i)); 18 wc.push_back(L'\0'); 19 std::vector<Character> c = getTexture(wc, character.fontName.c_str(), character.pixelSize, character.face); 20 character.text.at(i) = c.front(); 21 22 23 } 24 } 25 26 std::vector<wchar_t> w(0); 27 for (int i = (int)character.text.size(); i < (int)character.text.size() + size; i++) 28 { 29 w.push_back(newText.at(i)); 30 } 31 w.push_back(L'\0'); 32 33 34 std::cout << " ううう" << std::endl; 35 36 std::vector<Character> c = getTexture(w, character.fontName.c_str(), character.pixelSize, character.face); 37 38 std::cout << " えええ" << std::endl; 39 40 for (int i = 0; i < c.size(); i++) 41 { 42 character.text.push_back(c.at(i)); 43 } 44 45 46 } 47 else 48 { 49 int size = (int)character.text.size() - (int)newText.size(); 50 51 character.text.resize(newText.size() - 1); 52 for (int i = 0; i < newText.size() - 1; i++) 53 { 54 if ((character.text.at(i).character != newText.at(i))) 55 { 56 std::vector<wchar_t> wc(0); 57 wc.push_back(newText.at(i)); 58 wc.push_back(L'\0'); 59 60 std::vector<Character> c = getTexture(wc, character.fontName.c_str(), character.pixelSize, character.face); 61 character.text.at(i) = c.at(0); 62 } 63 } 64 } 65}
cpp
1// ##################################### フォント指定 ##################################### 2void FrameWork::Text::setFontName(const char* fontName,FT_Face &face) 3{ 4 if (FT_New_Face(ft, fontName, 0, &face) != 0) 5 { 6 std::cerr << "FreeType フォントを読み込めません。" << std::endl; 7 assert(0); 8 } 9} 10
cpp
1 2// ##################################### テクスチャを生成 ##################################### 3std::vector<FrameWork::Text::Character> FrameWork::Text::getTexture(const std::vector<wchar_t> &text,const char* fontName, const unsigned short &pixelSize,FT_Face &face) 4{ 5 std::vector<Character> character; //文字データを格納 6 std::cout << " おおお" << std::endl; 7 setFontName(fontName,face); //フォント名 8 std::cout << " かかか" << std::endl; 9 setPixelSize(pixelSize,face); //ピクセルサイズ 10 11 for (int i = 0; text[i] != L'\0'; i++) 12 { 13 //グリフをロード 14 FT_Load_Glyph(face, FT_Get_Char_Index(face, text[i]), FT_LOAD_RENDER); 15 Character ch = 16 { 17 0, 18 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 19 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 20 (unsigned int)face->glyph->advance.x, 21 text[i] 22 }; 23 24 glGenTextures(1, &ch.textureID); 25 glBindTexture(GL_TEXTURE_2D, ch.textureID); 26 glActiveTexture(GL_TEXTURE0); 27 28 glTexImage2D 29 ( 30 GL_TEXTURE_2D, 31 0, 32 GL_RED, 33 face->glyph->bitmap.width, 34 face->glyph->bitmap.rows, 35 0, 36 GL_RED, 37 GL_UNSIGNED_BYTE, 38 face->glyph->bitmap.buffer 39 ); 40 41 //テクスチャタイプを設定 42 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 43 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 44 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 46 47 character.push_back(ch); 48 } 49 50 return character; 51} 52
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。