質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2198閲覧

[ FreeType ] FT_New_Face();関数が失敗する理由が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/25 11:15

編集2021/06/25 12:38

提示コードの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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

デバッグを丸投げしないで、まずは自分で調べられることは調べましょう。

  • FT_New_Face() が返したエラーコードを確認してみる
  • 何かリソースを確保して開放し忘れていないか確認する

投稿2021/06/25 12:02

int32_t

総合スコア20982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問