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

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

ただいまの
回答率

87.49%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 361

score 0

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

class FontManage {
public:
    FontManage() {
        TTF_Init();
        font = TTF_OpenFont("umeboshi_.ttf", 8);
        if (!font) { std::cout << "font Open失敗" << "\n"; }
        glGenTextures(1, &m_tex);
    }

    ~FontManage() {
        //** テクスチャ削除
        glDeleteTextures(1, &m_tex);
        //** フォント後始末
        TTF_CloseFont(font);
        TTF_Quit();
    }

    GLuint tex() {
        return m_tex;
    }

    //フォントを描画して、テクスチャ化して呼び元にテクスチャIDを返す
    void render(const char*    text) {

        //** フォントデータ用意
        SDL_Color font_color = { 255, 0, 255};
        SDL_Surface* surface = TTF_RenderText_Blended(font, "a", font_color);
        if (!surface) {std::cout << "surface作成" << "\n";}
        //SDL_LockSurface(surface);

        //** テクスチャ化
        //サーフェイスの大きさを一番近しい2のn乗に拡張
        int w = powerOfTwo(surface->w);
        int h = powerOfTwo(surface->h);

        //新しいサーフェイスを生成
        SDL_Surface* image = SDL_CreateRGBSurface(
                                0,
                                w,
                                h,
                                32,
                                // OpenGL RGBAのマスクをする
                                #if SDL_BYTEORDER==SDL_LIL_ENDIAN        //こっちに入ってる
                                            0x000000FF,
                                            0x0000FF00,
                                            0x00FF0000,
                                            0xFF000000
                                #else
                                            0xFF000000,
                                            0x00FF0000,
                                            0x0000FF00,
                                            0x000000FF
                                #endif

                            );


        // テクスチャイメージにサーフェスをコピーする
        if(SDL_BlitSurface(surface, 0, image, 0) != 0){
              std::cout << "surface copy 失敗" << "\n";
         }
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glBindTexture(GL_TEXTURE_2D, m_tex);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

        glBindTexture(GL_TEXTURE_2D, 0);

        //** フォントデータ解放
        SDL_FreeSurface(surface);

    }

private:
    TTF_Font* font;
    GLuint m_tex;
    int powerOfTwo(int input) {
        int value = 1;

        while (value < input) {
            value <<= 1;
        }

        return value;
    }
};

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hoshi-takanori

    2021/02/11 08:53

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

    キャンセル

  • YS789789YS

    2021/02/12 00:48

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

    キャンセル

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

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る