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

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

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

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

Q&A

解決済

2回答

748閲覧

freetypeを使った文字描画で文字の四角い枠が表示される原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

0グッド

0クリップ

投稿2021/05/20 07:52

編集2021/05/20 07:59

提示画像ですがなぜ提示コードの////コメント部でしっかりと終端文字を設定しているのも関わらず四角い文字の枠組みが表示されるのでしょうか?原因がわかりません。その先の for (int i = 0; txt[i] != L'\0'; i++) 分でしっかりと最後まで、まで見ているはずなのですがどもう最後以上まで?見てるみたいなのですがその場合どうすればいいのでしょうか?

イメージ説明

cpp

1 2void FrameWork::Text::Draw(glm::vec2 pos, const char* text, float scale, glm::vec3 color) 3//void FrameWork::Text::Draw(glm::vec2 pos, std::string text,float scale, glm::vec3 color) 4{ 5 setEnable(); //シェーダーを有効にする 6 7 pos.y = windowContext->getSize().y - pos.y - charSize; 8 9 //テクスチャをアクティブ 10 glActiveTexture(GL_TEXTURE0); 11 glBindVertexArray(vao); 12 13 //Unform 14 setUniform3f("textColor", color); 15 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, 0.0f, windowContext->getSize().y)); 16 17 //char text[] = "テスト"; 18 //wchar_t txt[strlen(text)] = { L'\0' }; 19 wchar_t* txt = (wchar_t*)malloc(strlen(text)); 20 21 22 23 int i, j, f; 24 for (i = 0, j = 0; text[j]; i++, j += f) 25 { 26 f = mbrtowc(txt + i, &text[j], MB_CUR_MAX, nullptr); 27 } 28/////////////////////////////////// 29 txt[j] = L'\0'; 30////////////////////////////////// 31 32 for (int i = 0; txt[i] != L'\0'; i++) 33 { 34 //std::cout << txt[i] <<std::endl; 35 unsigned int texture = 0; 36 37 // load character glyph 38 FT_Load_Glyph(face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); 39 40 41 // now store character for later use 42 Character ch = { 43 texture, 44 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 45 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 46 (unsigned int)face->glyph->advance.x 47 48 }; 49 50 51 // generate texture 52 glGenTextures(1, &ch.textureID); 53 glBindTexture(GL_TEXTURE_2D, ch.textureID); 54 55 glTexImage2D( 56 GL_TEXTURE_2D, 57 0, 58 GL_RED, 59 face->glyph->bitmap.width, 60 face->glyph->bitmap.rows, 61 0, 62 GL_RED, 63 GL_UNSIGNED_BYTE, 64 face->glyph->bitmap.buffer 65 ); 66 // set texture options 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 69 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 70 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 71 // now store character for later use 72 73 74 75 float xpos = pos.x + ch.Bearing.x * scale; 76 float ypos = pos.y - (ch.Size.y - ch.Bearing.y) * scale; 77 78 float w = ch.Size.x * scale; 79 float h = ch.Size.y * scale; 80 // update VBO for each character 81 float vertices[6][4] = { 82 { xpos, ypos + h, 0.0f, 0.0f }, 83 { xpos, ypos, 0.0f, 1.0f }, 84 { xpos + w, ypos, 1.0f, 1.0f }, 85 86 { xpos, ypos + h, 0.0f, 0.0f }, 87 { xpos + w, ypos, 1.0f, 1.0f }, 88 { xpos + w, ypos + h, 1.0f, 0.0f } 89 }; 90 // render glyph texture over quad 91 // update content of VBO memory 92 glBindBuffer(GL_ARRAY_BUFFER, vbo); 93 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 94 glBindBuffer(GL_ARRAY_BUFFER, 0); 95 96 // render quad 97 glDrawArrays(GL_TRIANGLES, 0, 6); 98 99 100 101 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 102 pos.x += ((ch.Advance >> 6) * scale); // bitshift by 6 to get value in pixels (2^6 = 64) 103 } 104 105 106 107 free(txt); 108 txt = nullptr; 109 glBindVertexArray(0); 110 glBindTexture(GL_TEXTURE_2D, 0); 111 setDisable(); //シェーダーを無効にする 112} 113

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/20 08:43

> wchar_t* txt = (wchar_t*)malloc(strlen(text)); 正気ですか?
退会済みユーザー

退会済みユーザー

2021/05/20 08:54

なぜでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/20 09:04

「malloc()」や「strlen()」の動きを理解してますか? 「wchar_t」の大きさは理解してますか? 仮に「テスト」というシフトJISのマルチバイト文字列があったとして。 1. 上記「テスト」を対象とした「strlen()」の結果 2. 「wchar_t」のサイズ 3. 「テスト」をワイド文字列として格納する際、必要なサイズ 4. 「malloc()」で実際確保されているサイズ 上記を説明できますか? また、「テスト」ではなく「Test」の場合も合わせて説明していただければと思います。
guest

回答2

0

該当処理は間違えています。
前回の質問のベストアンサーにある通り直せば動くでしょう。

cpp

1 int i, j, f; 2 for (i = 0, j = 0; text[j]; i++, j += f) 3 { 4 f = mbrtowc(txt + i, &text[j], MB_CUR_MAX, nullptr); 5 } 6/////////////////////////////////// 7 txt[j] = L'\0'; 8 // ↑ 間違えている 9//////////////////////////////////

前回のベストアンサーであれば変換後文字数分の「i」を指定しており、
その場合は、変換後文字数の後にヌル文字により終端が行われることになります。

上記コードは、なぜか「j」となっており、変換前のバイト数をしていしております。
マルチバイト文字からの変換であれば、恐らく文字数とは一致してないでしょう。

デバッガで確認すればわかるものですが、変換後文字列の末尾とは異なる箇所に、
ヌル文字を代入しているため、範囲外を参照し、それが四角となって表示されているのでしょう。

投稿2021/05/20 08:54

編集2021/05/23 05:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/20 09:04 編集

質問ですが txt の配列のその時入力したときの長さに自動で調整させたいのですがどうすればいいのでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/20 09:21 編集

> 質問ですが txt の配列のその時入力したときの長さに自動で調整させたいのですがどうすればいいのでしょうか? 思いつかないのであれば、まだ実装できる実力はないと思うので、固定長バッファで対応するほうがいいと思います。
退会済みユーザー

退会済みユーザー

2021/05/20 12:30

何故ここを前回のベストアンサーの内容から変えたのでしょうか。 というかデバッグしてますか? 「最後以上まで?」じゃなくて、デバッガで見れば一発でしょうに。
guest

0

ベストアンサー

そもそもmbrtowc()を使うのならwchar_tの配列もforループ2回も不要です。

cpp

1 for (int j = 0; text[j]; j += f) 2 { 3 wchar_t unicode_char; 4 f = mbrtowc(&unicode_char, &text[j], MB_CUR_MAX, nullptr); 5 6 unsigned int texture = 0; 7 8 // load character glyph 9 FT_Load_Glyph(face, FT_Get_Char_Index(face, unicode_char), FT_LOAD_RENDER);

投稿2021/05/21 14:34

int32_t

総合スコア21695

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問