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
あなたの回答
tips
プレビュー