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

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

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

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

文字コード

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

C++

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

Q&A

0回答

942閲覧

FreeType 文字がものすごく斜めに表示される原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

文字コード

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

C++

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

0グッド

0クリップ

投稿2021/06/18 10:14

提示コードですが提示画像ようにHello World を表示させるとすると表示文字が物凄く斜め?に表示される原因が知りたいです。コンストラクタ部のコメント部ですがマルチバイト文字をワイド文字に変換してそれを使ってグリフをロードしています。フォントはメイリオです。Draw();関数は普通に座標をと色を指定して表示しているだけです。 なぜ文字がおかしくなるのでしょうか?

freeTypeリファレンス
リファレンスB: https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_glyph
リファレンスA: https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_get_char_index

![イメージ説明

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 10// ##################################### コンストラクタ ##################################### 11FrameWork::Text::Text(int fontSize,const char *str,...) : FrameWork::Transform_2D() 12{ 13 charSize = fontSize; //文字フォンサイズを指定 14 setlocale(LC_CTYPE, ""); //ローカルを設定 15 16 //シェーダー読み込み 17 shader = std::make_unique<FrameWork::Shader>(); 18 shader->Load("Shader/2D/BasicText_2D.vert", "Shader/2D/BasicText_2D.frag"); 19 20 //vao 21 glGenVertexArrays(1, &vao); 22 glBindVertexArray(vao); 23 24 //vbo 25 glGenBuffers(1, &vbo); 26 glBindBuffer(GL_ARRAY_BUFFER, vbo); 27 28 //頂点属性 29 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); 30 glEnableVertexAttribArray(shader->getAttribLocation("vertexPosition")); 31 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); 32 33 //初期化 34 if (FT_Init_FreeType(&ft) != 0) 35 { 36 std::cerr << "FreeType ライブラリを初期化出来ません。"<<std::endl; 37 } 38 39 //フェイス作成 フォントはメイリオ 40 if (FT_New_Face(ft, "C:\Windows\Fonts\meiryo.ttc", 0, &face) != 0) 41 { 42 std::cerr << "フォントを読み込めません。" << std::endl; 43 } 44 45 FT_Set_Pixel_Sizes(face,0,charSize); //ピクセルサイズを指定 46 47 //マルチバイト文字をワイド文字変換 48 wchar_t txt[1000] = { L'\0' }; 49 char text[1000]; 50 va_list args; 51 va_start(args, str); 52 vsprintf_s(text, sizeof(text), str, args); 53 va_end(args); 54 int i, j, f; 55 for (i = 0, j = 0; text[j]; i++, j += f) 56 { 57 f = (int)mbrtowc(txt + i, &text[j], (size_t)MB_CUR_MAX, nullptr); 58 } 59///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 60 //文字をロード 61 for (int i = 0; txt[i] != L'\0'; i++) 62 { 63 //グリフをロード 64 FT_Load_Glyph(face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); 65 66 Character ch = 67 { 68 0, 69 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 70 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 71 (unsigned int)face->glyph->advance.x 72 73 }; 74 75 glGenTextures(1, &ch.textureID); 76 glBindTexture(GL_TEXTURE_2D, ch.textureID); 77 glActiveTexture(GL_TEXTURE0); 78 79 glTexImage2D 80 ( 81 GL_TEXTURE_2D, 82 0, 83 GL_RED, 84 face->glyph->bitmap.width, 85 face->glyph->bitmap.rows, 86 0, 87 GL_RED, 88 GL_UNSIGNED_BYTE, 89 face->glyph->bitmap.buffer 90 ); 91 92 character.push_back(ch); 93 } 94//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 95 //テクスチャタイプを設定 96 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 97 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 98 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 99 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 100 101 glBindBuffer(GL_ARRAY_BUFFER, 0); 102 glBindVertexArray(0); 103} 104 105// ##################################### 描画 ##################################### 106void FrameWork::Text::Draw(glm::vec2 pos,glm::vec3 color) 107{ 108 shader->setEnable(); //シェーダーを有効にする 109 glBindVertexArray(vao); 110 glBindBuffer(GL_ARRAY_BUFFER, vbo); 111 112 //色をRGBにして位置を反転 113 pos.y = FrameWork::getWindowContext()->getSize().y - pos.y - charSize; 114 115 //Unform 116 shader->setUniform3f("textColor", color); 117 shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::getWindowContext()->getSize().x, 0.0f, FrameWork::getWindowContext()->getSize().y)); 118 119 for (std::vector<Character>::iterator itr = character.begin(); itr != character.end(); itr++) 120 { 121#define SCALE 1.0f //文字の大きさ 122 123 float xpos = pos.x + itr->Bearing.x * SCALE; 124 float ypos = pos.y - (itr->Size.y - itr->Bearing.y) * SCALE; 125 126 float w = itr->Size.x * SCALE; 127 float h = itr->Size.y * SCALE; 128 129 float vertices[6][4] = 130 { 131 { xpos, ypos + h, 0.0f, 0.0f }, 132 { xpos, ypos, 0.0f, 1.0f }, 133 { xpos + w, ypos, 1.0f, 1.0f }, 134 135 { xpos, ypos + h, 0.0f, 0.0f }, 136 { xpos + w, ypos, 1.0f, 1.0f }, 137 { xpos + w, ypos + h, 1.0f, 0.0f } 138 }; 139 140 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 141 glDrawArrays(GL_TRIANGLES, 0, 6); 142 143 pos.x += ((itr->Advance >> 6) * SCALE); //次のグリフに進める 144#undef SCALE 145 } 146 147 148 glBindVertexArray(0); 149 glBindBuffer(GL_ARRAY_BUFFER, 0); 150 shader->setDisable(); //シェーダーを無効にする 151} 152 153// ##################################### デストラクタ ##################################### 154FrameWork::Text::~Text() 155{ 156 glBindVertexArray(0); 157 glBindBuffer(GL_ARRAY_BUFFER, 0); 158 glDeleteVertexArrays(1, &vao); 159 glDeleteBuffers(1, &vbo); 160 161 //グリフ解放 162 FT_Done_Face(face); 163 FT_Done_FreeType(ft); 164 165}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/19 16:28

以前、問題なかったですよね? 変更箇所はどこでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問