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

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

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

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

文字コード

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

C++

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

Q&A

解決済

1回答

1363閲覧

FreeTypeライブラリ 文字の高さを得る方法

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

文字コード

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

C++

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

0グッド

0クリップ

投稿2021/06/23 07:55

編集2021/06/24 06:38

提示子画像ですが文字の高さを取得して表示してみましたが少しずれています。これはなぜでしょうか?参考サイトの文字の図を参考にheightを取得して一番文字の大きい高さの文字の高さを取得しているのですが原因がわかりません。提示コードの下部の//######## コメント部です。

やりたいこと
表示文字列の中で一番高い文字の高さが欲しい height
提示サイトのlearnOpenGLのグリフマテリアルのheightの値を取得したのですがそれが白い点の部分です。
face->glyph->bitmap.rows。の値を取得なぜ高さを取得したににも関わらず少しずれるのでしょうか?

参考サイト: https://learnopengl.com/In-Practice/Text-Rendering
イメージ説明

cpp

1 2// ##################################### テクスチャを生成 ##################################### 3std::vector<FrameWork::Text::Character> FrameWork::Text::getTexture(std::vector<wchar_t> text,glm::ivec2 &size) 4{ 5 std::vector<Character> character; //文字データを格納 6 7 8 //文字をロード 9 for (int i = 0; text[i] != L'\0'; i++) 10 { 11 //グリフをロード 12 FT_Load_Glyph(face, FT_Get_Char_Index(face, text[i]), FT_LOAD_RENDER); 13 Character ch = 14 { 15 0, 16 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 17 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 18 (unsigned int)face->glyph->advance.x 19 }; 20 21 glGenTextures(1, &ch.textureID); 22 glBindTexture(GL_TEXTURE_2D, ch.textureID); 23 glActiveTexture(GL_TEXTURE0); 24 25 glTexImage2D 26 ( 27 GL_TEXTURE_2D, 28 0, 29 GL_RED, 30 face->glyph->bitmap.width, 31 face->glyph->bitmap.rows, 32 0, 33 GL_RED, 34 GL_UNSIGNED_BYTE, 35 face->glyph->bitmap.buffer 36 ); 37 38 //テクスチャタイプを設定 39 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 40 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 41 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 42 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 43 44 45 46 //文字列のサイズを取得 47 size.x += face->glyph->advance.x >> 6; 48 49 50 //############################################################################### 51 //std::cout << face->glyph->advance.y << std::endl; 52 std::cout << face->glyph->bitmap.rows << std::endl; 53 54 if (face->glyph->bitmap.rows >= size.y) 55 { 56 size.y = face->glyph->bitmap.rows; 57 } 58 //############################################################################### 59 60 61 62 //テクスチャを生成 63 character.push_back(ch); 64 } 65 66 67 return character; 68} 69

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/23 09:21

どれほどあなたの作ったフレームワークが優秀なのかわかりませんが、 もっと最小の実装から試したほうがいいですよ、問題の切り分けが難しくなるので。
ikadzuchi

2021/06/23 16:52

どんな結果になることを想定していて、実際にはどんな結果になりましたかw
int32_t

2021/06/24 01:35

「文字の高さ」という言葉で何を指していますか? そのフォントの全グリフに共通の ascent + descent? 特定のグリフの上限のピクセルから下限のピクセルの距離? CSS でいう line-height ? スクリーンショットではちゃんと文字が表示されていますが、これがどうなって欲しいのですか?
int32_t

2021/06/24 06:50 編集

> 参考サイトの文字の図を参考にheightを取得して一番文字の大きい高さの文字の高さを取得している これは face->glyph->bitmap.rows で合っていると思います。つまり、質問文の目的は達成されています。 「最大heightを求める」という目的自体が間違っているのでしょう。
退会済みユーザー

退会済みユーザー

2021/06/24 06:51

全てのheightを表示させましたがすべて16でしたしかししこしずれています。これはそもそもheightの値で文字の最大高さを取得できないということでしょか?
int32_t

2021/06/24 07:01

フォントの都合ですべてのグリフのrowsが同じになっていても問題はありません。高さ16を超えるグリフはないということでしょう。 「ずれる」というのが何に対してずれているのか説明してください。
退会済みユーザー

退会済みユーザー

2021/06/24 07:08

フォントの高さがずれていると思います。yの高さを文字の表示位置と同じにしてそからy + heightとしたのですが
退会済みユーザー

退会済みユーザー

2021/06/24 07:16

描画の処理が別に高さ合わせじゃないからじゃないですかね、提示されたコードの外ですけど
int32_t

2021/06/24 07:19 編集

では、欲しい値はグリフ高さの最大値ではなくて、描画するときの指定位置からグリフの底辺のオフセットですよね。
guest

回答1

0

ベストアンサー

widthの求め方は正しいのですが問題のheightの求め方ですが計算の仕方が間違ていました。以下のように
文字と前の文字を比較して大きい場合textSize.yに書き込むというやり方で実装出来ました。
ですがまた変数を0で初期化して文字列が変わるときに毎回この処理を関数化しておく必要があり自分はそれをしなかったため最初に設定した文字列のサイズを取得したためでした。

cpp

1 textSize = glm::ivec2(0,0); 2 for (std::vector<Character>::iterator itr = fixationText->begin(); itr != fixationText->end(); itr++) 3 { 4 textSize.x += itr->advance >> 6; //6ビットシフトで長さを得る 5 6 if (itr->size.y > textSize.y) 7 { 8 textSize.y = itr->size.y; 9 } 10 }

投稿2021/06/24 07:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問