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

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

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

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

解決済

FreeTypeライブラリ faceを変更すると文字が表示されなくる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

1回答

0リアクション

0クリップ

691閲覧

投稿2021/06/23 10:35

編集2021/06/23 10:39

提示コードの // ### 固定文字列を変更 ### のコード部のコメント部//////の内部ですが新しいフォントを読み込んでfaceの値を変更してその後 getTexture(w);関数を読んで新しい文字データを読み込んいるのですがなぜ表示されなくなるのでしょうか?freeTypeライブラリを再初期化してたりしましたが治りません。faceの値を変更しただけで表示されなくなるという理由がまったくわからないのですがなぜなのでしょうか?

cpp

#include "Text.hpp" #include "glew/include/GL/glew.h" #include "glm/glm.hpp" #include "uchar.h" #include "Window.hpp" #include "FrameWork.hpp" #include <iostream> #include <vector> // ##################################### コンストラクタ ##################################### FrameWork::Text::Text(const char* font, int size, const char* str, ...) : FrameWork::Transform_2D() { fontSize = size; if (font != NULL) { fontName = std::string(font); } else { fontName = "Font/SourceHanCodeJP.ttc"; } face = nullptr; //フェイスを初期化 ft = nullptr; //FreeTypeを初期化 fixationText = std::make_unique<std::vector<Character>>(0); //固定文字列 //シェーダー読み込み shader = std::make_unique<FrameWork::Shader>(); shader->Load("Shader/2D/BasicText_2D.vert", "Shader/2D/BasicText_2D.frag"); //vao glGenVertexArrays(1, &vao); glBindVertexArray(vao); //vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); //頂点属性 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); glEnableVertexAttribArray(shader->getAttribLocation("vertexPosition")); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); shader->setBindAttribLocation("vertexPosition"); //初期化 if (FT_Init_FreeType(&ft) != 0) { std::cerr << "FreeType ライブラリを初期化出来ません。" << std::endl; assert(0); } //フェイス作成 フォント if (FT_New_Face(ft, fontName.c_str(), 0, &face) != 0) { std::cerr << "FreeType フォントを読み込めません。" << std::endl; assert(0); } FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // disable byte-alignment restriction //テクスチャを生成 if (str != NULL) { //マルチバイト文字をワイド文字変換 std::vector<wchar_t> wcharText(0); std::vector<char> charText(0); std::fill(wcharText.begin(), wcharText.end(), L'\0'); std::fill(charText.begin(), charText.end(), '\0'); va_list args = NULL; va_start(args, str); charText.clear(); charText.resize(strlen(str) + 1); vsprintf_s(charText.data(), charText.size(), str, args); va_end(args); wcharText = getWchar_t(charText); *fixationText = getTexture(wcharText); //テクスチャを生成 } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } // ##################################### テクスチャを生成 ##################################### std::vector<FrameWork::Text::Character> FrameWork::Text::getTexture(std::vector<wchar_t> text) { std::vector<Character> character; //文字データを格納 //文字をロード for (int i = 0; text[i] != L'\0'; i++) { //グリフをロード FT_Load_Glyph(face, FT_Get_Char_Index(face, text[i]), FT_LOAD_RENDER); Character ch = { 0, glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), (unsigned int)face->glyph->advance.x, text[i] }; glGenTextures(1, &ch.textureID); glBindTexture(GL_TEXTURE_2D, ch.textureID); glActiveTexture(GL_TEXTURE0); glTexImage2D ( GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width, face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer ); //テクスチャタイプを設定 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //文字列のサイズを取得 // size.x += face->glyph->advance.x >> 6; // size.y = face->glyph->bitmap.rows; //テクスチャを生成 character.push_back(ch); } return character; } // ##################################### 固定文字列を変更 ##################################### void FrameWork::Text::ReFormatString(const char* font, int size, const char* str, ...) { //フォントサイズ変更 if (fontSize != size) { FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 } if ( (fontName != std::string(font)) && (font != NULL) ) {     fontName = std::string(font); //フォント変更 std::cout << fontName << std::endl; fontName = font; //フォント変更 /////////////////////////////////////////////////////////////////////////////////////// //フェイス作成 if (FT_New_Face(ft, fontName.c_str(), 0, &face) != 0) { std::cerr << "FreeType フォントを読み込めません。" << std::endl; assert(0); } /////////////////////////////////////////////////////////////////////////////////////// } if (str != NULL) { //マルチバイト文字をワイド文字変換 std::vector<wchar_t> newText(0); std::vector<char> charText(0); va_list args = NULL; va_start(args, str); charText.clear(); charText.resize(strlen(str) + 1); vsprintf_s(charText.data(), charText.size(), str, args); va_end(args); newText = getWchar_t(charText); //新しい文字列の方が長い時 if (newText.size() > fixationText->size()) { int size = (int)newText.size() - (int)fixationText->size(); for (int i = 0; i < fixationText->size(); i++) { if (fixationText->at(i).character != newText.at(i)) { std::vector<wchar_t> wc(0); wc.push_back(newText.at(i)); wc.push_back(L'\0'); std::vector<Character> c = getTexture(wc); fixationText->at(i) = c.front(); } } std::vector<wchar_t> w(0); for (int i = (int)fixationText->size(); i < (int)fixationText->size() + size; i++) { w.push_back(newText.at(i)); } std::vector<Character> c = getTexture(w); for (int i = 0; i < c.size(); i++) { fixationText->push_back(c.at(i)); } } else { int size = (int)fixationText->size() - (int)newText.size(); fixationText->resize(newText.size() - 1); for (int i = 0; i < newText.size() - 1; i++) { if ((fixationText->at(i).character != newText.at(i))) { std::vector<wchar_t> wc(0); wc.push_back(newText.at(i)); wc.push_back(L'\0'); std::vector<Character> c = getTexture(wc); fixationText->at(i) = c.at(0); } } } } } // ##################################### wchar_t型の文字列を取得 ##################################### std::vector<wchar_t> FrameWork::Text::getWchar_t(std::vector<char> charText) { std::vector<wchar_t> newText(0); int i, j, f; for (i = 0, j = 0; charText.at(j); i++, j += f) { wchar_t t; f = (int)mbrtowc(&t, &charText.at(j), (size_t)MB_CUR_MAX, nullptr); newText.push_back(t); } newText.push_back(L'\0'); return newText; } // ##################################### デストラクタ ##################################### FrameWork::Text::~Text() { glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); //グリフ解放 FT_Done_Face(face); FT_Done_FreeType(ft); }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

退会済みユーザー

退会済みユーザー

2021/06/24 02:50

ブレークポイントやステップ実行はわかりますか?

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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