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

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

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

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

C++

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

Q&A

解決済

1回答

1156閲覧

freetypeライブラリ 特定の文字だけがロードされない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/10/07 08:15

編集2021/10/08 04:57

提示コードですがなぜ最初の一文字のHが出ないのでしょうか?原因がわかりません。 提示コードの////コメント内部のコードですがエラーは出て以内のですが提示コマンド画面のH が0になっていますこれはなぜでしょうか?

#確認したこと
printf()関数で各所のデータと文字を確認
テクスチャ生成の順序を確認
一番怪しいsetTexture()関数部ですが順序を替えたりしましたがこの順番が一番正しいです。
またprintf()もしっかりHの字が表示されます。

イメージ説明

printf出力

1$ ./GL 2 H 0 3 e 38870848 4 l 42455072 5 l 42455072 6 o 38870848 7 0 8 W 42455712 9 o 38870848 10 r 48085968 11 l 42455072 12 d 42455712 13 48122160 14
#include "../header/FrameWork.hpp" #include <iostream> #include "../header/FrameWork.hpp" #include "../header/Camera.hpp" int main() { FrameWork::Init(glm::ivec2(48 * 26, 48 * 18), glm::ivec2(4,0), "Dungeon"); // 初期化 FrameWork::Camera_2D::Init(); //カメラ初期化 FrameWork::Circle circle; FrameWork::Text text; text.setString(30,glm::vec4(255,0,0,255),"Hello World"); while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255)); //circle.Draw(glm::vec2(100,100),glm::vec4(0,255,0,255),100,100,20); text.DrawString(glm::vec2(100,100)); FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }
#include "../header/Text.hpp" #include <glm/gtc/matrix_transform.hpp> #include <glm/gtx/transform.hpp> #include <GL/glew.h> #include <glm/glm.hpp> #include <uchar.h> #include <iostream> #include <vector> #include <iostream> #include "../header/Window.hpp" #include "../header/Init.hpp" #include "../header/Shader.hpp" #include "../header/Render.hpp" #include "../header/Camera.hpp" #include "../header/Resource.hpp" // ##################################### コンストラクタ ##################################### FrameWork::Text::Text() : FrameWork::Render_2D() { //シェーダー読み込み shader->Input(FrameWork::LoadShader("Shader/2D/BasicText_2D.vert")->data(),FrameWork::LoadShader("Shader/2D/BasicText_2D.frag")->data()); vertex = FrameWork::Camera_2D::getVertexAttribute(); vertex->resize(6); text.clear(); //頂点 GLint attrib = shader->getAttribLocation("vertexPosition"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(VertexAttribute), vertex->data(), GL_DYNAMIC_DRAW); glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0); shader->setBindAttribLocation("vertexPosition"); //UV attrib = shader->getAttribLocation("vertexUV"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(VertexAttribute), vertex->data(), GL_DYNAMIC_DRAW); glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); shader->setBindAttribLocation("vertexUV"); } // ##################################### wchar_t型の文字列を取得 ##################################### std::vector<wchar_t> FrameWork::Text::getWchar_t(const char* str) { std::vector<wchar_t> newText(0); int i = 0, j = 0, f = 0; for (i = 0, j = 0; str[j] != '\0'; i++, j += f) { wchar_t t; f = (int)mbrtowc(&t, &str[j], (size_t)MB_CUR_MAX, nullptr); newText.push_back(t); } newText.push_back(L'\0'); for(std::vector<wchar_t>::const_iterator itr = newText.begin(); itr != newText.end(); itr++) { //printf("%c\n",*itr); } return newText; } // ##################################### 固定長文字列 描画 ##################################### void FrameWork::Text::DrawString(glm::vec2 pos) { RenderString(pos); } void FrameWork::Text::setString( const byte pixelSize, const glm::lowp_u8vec4 color, const char* args,...) { text.clear(); char buf[1024] = { '\0' }; va_list va; va_start(va,args); vsprintf(buf,args,va); va_end(va); std::vector<wchar_t> wc = getWchar_t(buf); //wchar_t型 取得 setTexture(wc,text,color,pixelSize); //テクスチャ 設定 } // ##################################### テクスチャ 設定 ##################################### void FrameWork::Text::setTexture(const std::vector<wchar_t>& wc, std::vector<Character>& text, const glm::lowp_u8vec4 color, const byte pixelSize) { text.clear(); FT_Face face = LoadFont("Font/PressStart2P.ttf"); for (std::vector<wchar_t>::const_iterator itr = wc.begin(); itr != wc.end(); itr++) { //////////////////////////////////////////////////////////////////////////////////////////////////////// printf("%c\n",*itr); //ここに文字が来ている。 if(FT_Load_Glyph(face, FT_Get_Char_Index(face, *itr), FT_LOAD_RENDER) != 0) { std::cout<< "Error: FT_Load_Glyph " <<std::endl; assert(0); } //////////////////////////////////////////////////////////////////////////////////////////////////////// if(FT_Set_Pixel_Sizes(face, 0, pixelSize) != 0) { std::cout<< "Error: FT_Set_Pixel_Sizes " <<std::endl; assert(0); } //printf("%c\n",*itr); //ここに文字が来ている。 /* printf("face->glyph->bitmap.width %ld\n",face->glyph->bitmap.width); printf("face->glyph->bitmap.rows %ld\n",face->glyph->bitmap.rows); printf("face->glyph->bitmap_left %ld\n",face->glyph->bitmap_left); printf("face->glyph->bitmap_top %ld\n",face->glyph->bitmap_top); printf("face->glyph->advance.x %ld\n",face->glyph->advance.x); printf("character %c\n",*itr); printf("pixelSize %ld\n",pixelSize); printf("\n\n\n"); */ /////////////////////////////////////////////////////////////////////////// printf(" %c %d\n",*itr,face->glyph->bitmap.buffer);// printf出力 //////////////////////////////////////////////////////////////////////////// Character ch = { 0, glm::lowp_u8vec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), glm::lowp_u8vec2(face->glyph->bitmap_left, face->glyph->bitmap_top), (unsigned short)face->glyph->advance.x, *itr, color, pixelSize }; glGenTextures(1, &ch.textureID); glBindTexture(GL_TEXTURE_2D, ch.textureID); 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); glActiveTexture(GL_TEXTURE0); text.push_back(ch); } } // ##################################### 文字列を描画 ##################################### void FrameWork::Text::RenderString(glm::vec2 pos) { if (text.size() > 0) { vertex->resize(6); //色をRGBにして位置を反転 int y = pos.y; for (std::vector<Character>::const_iterator itr = text.begin(); itr->character != L'\0'; itr++) { //printf("%c %d\n",itr->character,itr->textureID); //ここに来ている pos.y = FrameWork::windowContext->getSize().y - y - itr->pixelSize; #define SCALE 1.0f //文字の大きさ float xpos = pos.x + itr->bearing.x * SCALE; float ypos = pos.y - (itr->size.y - itr->bearing.y) * SCALE; float w = itr->size.x * SCALE; float h = itr->size.y * SCALE; vertex->at(0).position[0] = xpos; vertex->at(0).position[1] = ypos + h; vertex->at(0).uv[0] = 0.0f; vertex->at(0).uv[1] = 0.0f; vertex->at(1).position[0] = xpos; vertex->at(1).position[1] = ypos; vertex->at(1).uv[0] = 0.0f; vertex->at(1).uv[1] = 1.0f; vertex->at(2).position[0] = xpos + w; vertex->at(2).position[1] = ypos; vertex->at(2).uv[0] = 1.0f; vertex->at(2).uv[1] = 1.0f; vertex->at(3).position[0] = xpos; vertex->at(3).position[1] = ypos + h; vertex->at(3).uv[0] = 0.0f; vertex->at(3).uv[1] = 0.0f; vertex->at(4).position[0] = xpos + w; vertex->at(4).position[1] = ypos; vertex->at(4).uv[0] = 1.0f; vertex->at(4).uv[1] = 1.0f; vertex->at(5).position[0] = xpos + w; vertex->at(5).position[1] = ypos + h; vertex->at(5).uv[0] = 1.0f; vertex->at(5).uv[1] = 0.0f; shader->setEnable(); glBufferSubData(GL_ARRAY_BUFFER, 0, vertex->size() * sizeof(VertexAttribute), vertex->data()); shader->setUniform4f("uFragment", GetGlColor((glm::vec4)itr->color)); shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::windowContext->getSize().x, 0.0f, FrameWork::windowContext->getSize().y)); glBindTexture(GL_TEXTURE_2D, itr->textureID); glDrawArrays(GL_TRIANGLES, 0, vertex->size()); glBindTexture(GL_TEXTURE_2D, 0); shader->setDisable(); pos.x += ((itr->advance >> 6) * SCALE); //次のグリフに進める #undef SCALE } } } // ##################################### デストラクタ ##################################### FrameWork::Text::~Text() { }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/08 04:53

試したことや現状を追加しました。
guest

回答1

0

ベストアンサー

下記のコードですが

for (std::vector<wchar_t>::const_iterator itr = wc.begin(); itr != wc.end(); itr++) { if(FT_Load_Glyph(face, FT_Get_Char_Index(face, *itr), FT_LOAD_RENDER) != 0) { std::cout<< "Error: FT_Load_Glyph " <<std::endl; assert(0); } printf("%c\n",*itr); //ここに文字が来ている。 if(FT_Set_Pixel_Sizes(face, 0, pixelSize) != 0) { std::cout<< "Error: FT_Set_Pixel_Sizes " <<std::endl; assert(0); }

は順序が逆でして先にFT_Set_Pixel_Sizes()関数を実行してピクセルサイズを決めてから
グリフをロード(FT_Load_Glyph)するという処理を行うのです、
よって下記のコードが正解です。

for (std::vector<wchar_t>::const_iterator itr = wc.begin(); itr != wc.end(); itr++) { if(FT_Set_Pixel_Sizes(face, 0, pixelSize) != 0) { std::cout<< "Error: FT_Set_Pixel_Sizes " <<std::endl; assert(0); } if(FT_Load_Glyph(face, FT_Get_Char_Index(face, *itr), FT_LOAD_RENDER) != 0) { std::cout<< "Error: FT_Load_Glyph " <<std::endl; assert(0); } printf("%c\n",*itr); //ここに文字が来ている。

投稿2021/10/08 05:14

編集2021/10/09 04:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YT0014

2021/10/08 15:12

回答に示されたコードは、正しいコードなのか、2つ目のコードは何を意味しているのか、「順序が逆」だったのは何なのか、この回答では不明です。 第三者が見て、理解できるようにしてください。
YT0014

2021/10/09 05:08

質問文で「一番怪しいsetTexture()関数部ですが順序を替えたりしましたがこの順番が一番正しいです。」と記述されています。 回答で順番を入れ替えた部分のことだと解釈するのが自然ですが、質問時の根拠と回答時の根拠をご提示ください。 現状では、偶然動いただけ、の可能性が否定できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問