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

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

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

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

OpenGL

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

文字コード

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

C++

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

Q&A

解決済

1回答

1202閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

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

OpenGL

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

文字コード

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

C++

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

0グッド

0クリップ

投稿2021/06/23 10:35

編集2021/06/23 10:39

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

cpp

1#include "Text.hpp" 2 3#include "glew/include/GL/glew.h" 4#include "glm/glm.hpp" 5#include "uchar.h" 6#include "Window.hpp" 7#include "FrameWork.hpp" 8#include <iostream> 9#include <vector> 10 11// ##################################### コンストラクタ ##################################### 12FrameWork::Text::Text(const char* font, int size, const char* str, ...) : FrameWork::Transform_2D() 13{ 14 fontSize = size; 15 16 if (font != NULL) 17 { 18 fontName = std::string(font); 19 } 20 else 21 { 22 fontName = "Font/SourceHanCodeJP.ttc"; 23 } 24 25 face = nullptr; //フェイスを初期化 26 ft = nullptr; //FreeTypeを初期化 27 28 fixationText = std::make_unique<std::vector<Character>>(0); //固定文字列 29 30 //シェーダー読み込み 31 shader = std::make_unique<FrameWork::Shader>(); 32 shader->Load("Shader/2D/BasicText_2D.vert", "Shader/2D/BasicText_2D.frag"); 33 34 //vao 35 glGenVertexArrays(1, &vao); 36 glBindVertexArray(vao); 37 38 //vbo 39 glGenBuffers(1, &vbo); 40 glBindBuffer(GL_ARRAY_BUFFER, vbo); 41 42 //頂点属性 43 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); 44 glEnableVertexAttribArray(shader->getAttribLocation("vertexPosition")); 45 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); 46 shader->setBindAttribLocation("vertexPosition"); 47 48 //初期化 49 if (FT_Init_FreeType(&ft) != 0) 50 { 51 std::cerr << "FreeType ライブラリを初期化出来ません。" << std::endl; 52 assert(0); 53 54 } 55 56 //フェイス作成 フォント 57 if (FT_New_Face(ft, fontName.c_str(), 0, &face) != 0) 58 { 59 std::cerr << "FreeType フォントを読み込めません。" << std::endl; 60 assert(0); 61 62 } 63 64 FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 65 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // disable byte-alignment restriction 66 67 //テクスチャを生成 68 if (str != NULL) 69 { 70 //マルチバイト文字をワイド文字変換 71 std::vector<wchar_t> wcharText(0); 72 std::vector<char> charText(0); 73 std::fill(wcharText.begin(), wcharText.end(), L'\0'); 74 std::fill(charText.begin(), charText.end(), '\0'); 75 va_list args = NULL; 76 va_start(args, str); 77 charText.clear(); 78 charText.resize(strlen(str) + 1); 79 vsprintf_s(charText.data(), charText.size(), str, args); 80 va_end(args); 81 82 wcharText = getWchar_t(charText); 83 *fixationText = getTexture(wcharText); //テクスチャを生成 84 } 85 86 glBindBuffer(GL_ARRAY_BUFFER, 0); 87 glBindVertexArray(0); 88} 89 90// ##################################### テクスチャを生成 ##################################### 91std::vector<FrameWork::Text::Character> FrameWork::Text::getTexture(std::vector<wchar_t> text) 92{ 93 std::vector<Character> character; //文字データを格納 94 95 //文字をロード 96 for (int i = 0; text[i] != L'\0'; i++) 97 { 98 //グリフをロード 99 FT_Load_Glyph(face, FT_Get_Char_Index(face, text[i]), FT_LOAD_RENDER); 100 Character ch = 101 { 102 0, 103 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 104 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 105 (unsigned int)face->glyph->advance.x, 106 text[i] 107 }; 108 109 110 glGenTextures(1, &ch.textureID); 111 glBindTexture(GL_TEXTURE_2D, ch.textureID); 112 glActiveTexture(GL_TEXTURE0); 113 114 glTexImage2D 115 ( 116 GL_TEXTURE_2D, 117 0, 118 GL_RED, 119 face->glyph->bitmap.width, 120 face->glyph->bitmap.rows, 121 0, 122 GL_RED, 123 GL_UNSIGNED_BYTE, 124 face->glyph->bitmap.buffer 125 ); 126 127 //テクスチャタイプを設定 128 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 129 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 130 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 131 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 132 133 //文字列のサイズを取得 134 // size.x += face->glyph->advance.x >> 6; 135// size.y = face->glyph->bitmap.rows; 136 137 //テクスチャを生成 138 character.push_back(ch); 139 } 140 141 return character; 142} 143 144// ##################################### 固定文字列を変更 ##################################### 145void FrameWork::Text::ReFormatString(const char* font, int size, const char* str, ...) 146{ 147 //フォントサイズ変更 148 if (fontSize != size) 149 { 150 151 FT_Set_Pixel_Sizes(face, 0, fontSize); //ピクセルサイズを指定 152 } 153 154 if ( (fontName != std::string(font)) && (font != NULL) ) 155 { 156     fontName = std::string(font); //フォント変更 157 std::cout << fontName << std::endl; 158 fontName = font; //フォント変更 159/////////////////////////////////////////////////////////////////////////////////////// 160 //フェイス作成 161 if (FT_New_Face(ft, fontName.c_str(), 0, &face) != 0) 162 { 163 std::cerr << "FreeType フォントを読み込めません。" << std::endl; 164 assert(0); 165 } 166/////////////////////////////////////////////////////////////////////////////////////// 167 } 168 169 if (str != NULL) 170 { 171 //マルチバイト文字をワイド文字変換 172 std::vector<wchar_t> newText(0); 173 std::vector<char> charText(0); 174 va_list args = NULL; 175 va_start(args, str); 176 charText.clear(); 177 charText.resize(strlen(str) + 1); 178 vsprintf_s(charText.data(), charText.size(), str, args); 179 va_end(args); 180 newText = getWchar_t(charText); 181 182 //新しい文字列の方が長い時 183 if (newText.size() > fixationText->size()) 184 { 185 int size = (int)newText.size() - (int)fixationText->size(); 186 187 for (int i = 0; i < fixationText->size(); i++) 188 { 189 if (fixationText->at(i).character != newText.at(i)) 190 { 191 std::vector<wchar_t> wc(0); 192 wc.push_back(newText.at(i)); 193 wc.push_back(L'\0'); 194 195 std::vector<Character> c = getTexture(wc); 196 fixationText->at(i) = c.front(); 197 } 198 } 199 200 std::vector<wchar_t> w(0); 201 for (int i = (int)fixationText->size(); i < (int)fixationText->size() + size; i++) 202 { 203 w.push_back(newText.at(i)); 204 } 205 206 std::vector<Character> c = getTexture(w); 207 208 for (int i = 0; i < c.size(); i++) 209 { 210 fixationText->push_back(c.at(i)); 211 } 212 } 213 else 214 { 215 int size = (int)fixationText->size() - (int)newText.size(); 216 217 fixationText->resize(newText.size() - 1); 218 for (int i = 0; i < newText.size() - 1; i++) 219 { 220 if ((fixationText->at(i).character != newText.at(i))) 221 { 222 std::vector<wchar_t> wc(0); 223 wc.push_back(newText.at(i)); 224 wc.push_back(L'\0'); 225 226 std::vector<Character> c = getTexture(wc); 227 fixationText->at(i) = c.at(0); 228 } 229 } 230 } 231 } 232} 233 234// ##################################### wchar_t型の文字列を取得 ##################################### 235std::vector<wchar_t> FrameWork::Text::getWchar_t(std::vector<char> charText) 236{ 237 std::vector<wchar_t> newText(0); 238 int i, j, f; 239 for (i = 0, j = 0; charText.at(j); i++, j += f) 240 { 241 wchar_t t; 242 f = (int)mbrtowc(&t, &charText.at(j), (size_t)MB_CUR_MAX, nullptr); 243 newText.push_back(t); 244 } 245 246 newText.push_back(L'\0'); 247 return newText; 248} 249 250 251// ##################################### デストラクタ ##################################### 252FrameWork::Text::~Text() 253{ 254 glBindVertexArray(0); 255 glBindBuffer(GL_ARRAY_BUFFER, 0); 256 glDeleteVertexArrays(1, &vao); 257 glDeleteBuffers(1, &vbo); 258 259 //グリフ解放 260 FT_Done_Face(face); 261 FT_Done_FreeType(ft); 262}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/24 02:50

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

回答1

0

ベストアンサー

FT_New_Face()face を作り直したあとに FT_Set_Pixel_Sizes() を呼んでいないからではないでしょうか。

(動作確認していません。当てずっぽうです。)


デバッグを人に丸投げするのではなくて、すくなくとも「コード上で何が起きているか」は自分で調べて、質問文に書きましょう。

  • 期待通りの数のテクスチャは作られているか?
  • 個々のテクスチャのサイズはおかしくないか?
  • FT_Load_Glyph() は失敗していないか?

などなど。

投稿2021/06/24 01:25

int32_t

総合スコア20884

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

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

退会済みユーザー

退会済みユーザー

2021/06/24 06:50 編集

> デバッグを人に丸投げするのではなくて、すくなくとも「コード上で何が起きているか」は自分で調べて、質問文に書きましょう。 この質問者には、昔からずっと指摘されてる事ですけどね。丸投げしてもこうやって回答付くから、余計味を占めて丸投げをやめないのではないかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問