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

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

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

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

C++

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

Q&A

0回答

1301閲覧

OpenGL + SDL_ttfでフォント描画ができない

YS789789YS

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/02/10 17:58

OpenGLでゲーム作成をしています。
SDL_ttfを使用して、フォント描画をしたいのですが、うまく描画できません。
文字データをSDL_Surfaceに読み込むまでは出来ていて、そこからOpenGLで使用可能なテクスチャ化する所が
出来ていないようです。
実行すると、以下のような描画結果になります。
イメージ説明
問題がある点が分かりましたらご教授いただけますでしょうか。

FontManage

1class FontManage { 2public: 3 FontManage() { 4 TTF_Init(); 5 font = TTF_OpenFont("umeboshi_.ttf", 8); 6 if (!font) { std::cout << "font Open失敗" << "\n"; } 7 glGenTextures(1, &m_tex); 8 } 9 10 ~FontManage() { 11 //** テクスチャ削除 12 glDeleteTextures(1, &m_tex); 13 //** フォント後始末 14 TTF_CloseFont(font); 15 TTF_Quit(); 16 } 17 18 GLuint tex() { 19 return m_tex; 20 } 21 22 //フォントを描画して、テクスチャ化して呼び元にテクスチャIDを返す 23 void render(const char* text) { 24 25 //** フォントデータ用意 26 SDL_Color font_color = { 255, 0, 255}; 27 SDL_Surface* surface = TTF_RenderText_Blended(font, "a", font_color); 28 if (!surface) {std::cout << "surface作成" << "\n";} 29 //SDL_LockSurface(surface); 30 31 //** テクスチャ化 32 //サーフェイスの大きさを一番近しい2のn乗に拡張 33 int w = powerOfTwo(surface->w); 34 int h = powerOfTwo(surface->h); 35 36 //新しいサーフェイスを生成 37 SDL_Surface* image = SDL_CreateRGBSurface( 38 0, 39 w, 40 h, 41 32, 42 // OpenGL RGBAのマスクをする 43 #if SDL_BYTEORDER==SDL_LIL_ENDIAN //こっちに入ってる 44 0x000000FF, 45 0x0000FF00, 46 0x00FF0000, 47 0xFF000000 48 #else 49 0xFF000000, 50 0x00FF0000, 51 0x0000FF00, 52 0x000000FF 53 #endif 54 55 ); 56 57 58 // テクスチャイメージにサーフェスをコピーする 59 if(SDL_BlitSurface(surface, 0, image, 0) != 0){ 60 std::cout << "surface copy 失敗" << "\n"; 61 } 62 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 63 glBindTexture(GL_TEXTURE_2D, m_tex); 64 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); 65 66 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 69 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 70 71 glBindTexture(GL_TEXTURE_2D, 0); 72 73 //** フォントデータ解放 74 SDL_FreeSurface(surface); 75 76 } 77 78private: 79 TTF_Font* font; 80 GLuint m_tex; 81 int powerOfTwo(int input) { 82 int value = 1; 83 84 while (value < input) { 85 value <<= 1; 86 } 87 88 return value; 89 } 90}; 91

環境
Visual Studio 2019
OpenGL 3.1 をターゲット
GLFW使用
SDL2

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

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

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

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

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

hoshi-takanori

2021/02/10 23:53

自分は surface から image にコピーせずに surface->pixels を直接 glTexImage2D に渡してます。今どきの OpenGL ならテクスチャサイズを 2 の n 乗にする必要もないと思うので…。
YS789789YS

2021/02/11 15:48

ご回答ありがとうございます。 surface->pixelsを直接渡しテクスチャサイズもsurface->w,hをそのまま使うので試してみましたが、今度は全面フォント色で塗りつぶされる結果となってしまいました。 もう少し色々試してみようと思います・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問