Openglでfreetypeを使って日本語の文字を描画したいです。 提示サイトでは英語の文字表示をやり方が乗っているやり方では事前に用意したアルファベットの文字を描画していますが。日本語はまた違うはずです。提示コードの//////コメント内部のfor文ですが参考サイトを参考に
const char16_t型にキャストして日本語文字の描画を試みましたが字の枠しか描画されませんこれはどうしたらいいのでしょうか?
参考サイト: http://blendgimper.hatenablog.jp/entry/2016/01/01/074615
参考サイト: https://learnopengl.com/In-Practice/Text-Rendering
cpp
1#include "Text.hpp" 2#include "glew/include/GL/glew.h" 3#include "glm/glm.hpp" 4 5#include "Window.hpp" 6#include <iostream> 7 8FrameWork::Text::Text(std::shared_ptr<Window> w, const char* vert, const char* frag) : FrameWork::Transform_2D(),Shader() 9{ 10 windowContext = w; //ウインドウコンテキスト 11 12 //シェーダー 13 if (vert == NULL && frag == NULL) 14 { 15 vert = "Shader/2D/BasicText_2D.vert"; 16 frag = "Shader/2D/BasicText_2D.frag"; 17 LoadShader(vert,frag); 18 } 19 else { 20 LoadShader(vert, frag); 21 } 22 23 //vao vbo 24 glGenVertexArrays(1, &vao); 25 glGenBuffers(1, &vbo); 26 glBindVertexArray(vao); 27 glBindBuffer(GL_ARRAY_BUFFER, vbo); 28 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); 29 glEnableVertexAttribArray(0); 30 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); 31 glBindBuffer(GL_ARRAY_BUFFER, 0); 32 glBindVertexArray(0); 33 34 35 //FreeTypeを初期化 36 // 37 //初期化 38 39 if (FT_Init_FreeType(&ft) != 0) 40 { 41 std::cout << "ERROR::FREETYPE: Could not init FreeType Library"<<std::endl; 42 assert(0); 43 } 44 45 //フェイス作成 46 47 if (FT_New_Face(ft, "C:\Windows\Fonts\meiryo.ttc", 0, &face) != 0) 48 { 49 std::cout<<"ERROR::FREETYPE: Failed to load font" << std::endl; 50 assert(0); 51 52 } 53 54 charSize = 24; //文字サイズを指定 55 FT_Set_Pixel_Sizes(face,0,charSize); //ピクセルサイズを指定 56 57 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // disable byte-alignment restriction 58 59 //アルファブレンドを有効 60 glEnable(GL_BLEND); 61 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 62} 63 64void FrameWork::Text::Draw(glm::vec2 pos,const char16_t* text,float scale, glm::vec3 color) 65{ 66 setEnable(); //シェーダーを有効にする 67 68 pos.y = windowContext->getSize().y - pos.y - charSize; 69 70 //テクスチャをアクティブ 71 glActiveTexture(GL_TEXTURE0); 72 glBindVertexArray(vao); 73 74 //Unform 75 setUniform3f("textColor",color); 76 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, 0.0f, windowContext->getSize().y)); 77 /////////////////////////////////////////////////////////////////////////////////////////////////////////////// 78 for (int i = 0; text[i] != '\0'; i++) 79 { 80 81 unsigned int texture = 0; 82 83 // load character glyph 84 FT_Load_Glyph(face, FT_Get_Char_Index(face, (char16_t)text[i]), FT_LOAD_RENDER); 85 86 87 // now store character for later use 88 Character ch = { 89 texture, 90 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 91 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 92 (unsigned int)face->glyph->advance.x 93 94 }; 95 96 97 // generate texture 98 glGenTextures(1, &ch.textureID); 99 glBindTexture(GL_TEXTURE_2D, ch.textureID); 100 101 glTexImage2D( 102 GL_TEXTURE_2D, 103 0, 104 GL_RED, 105 face->glyph->bitmap.width, 106 face->glyph->bitmap.rows, 107 0, 108 GL_RED, 109 GL_UNSIGNED_BYTE, 110 face->glyph->bitmap.buffer 111 ); 112 // set texture options 113 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 114 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 117 // now store character for later use 118 119 120 121 float xpos = pos.x + ch.Bearing.x * scale; 122 float ypos = pos.y - (ch.Size.y - ch.Bearing.y) * scale; 123 124 float w = ch.Size.x * scale; 125 float h = ch.Size.y * scale; 126 // update VBO for each character 127 float vertices[6][4] = { 128 { xpos, ypos + h, 0.0f, 0.0f }, 129 { xpos, ypos, 0.0f, 1.0f }, 130 { xpos + w, ypos, 1.0f, 1.0f }, 131 132 { xpos, ypos + h, 0.0f, 0.0f }, 133 { xpos + w, ypos, 1.0f, 1.0f }, 134 { xpos + w, ypos + h, 1.0f, 0.0f } 135 }; 136 // render glyph texture over quad 137 // update content of VBO memory 138 glBindBuffer(GL_ARRAY_BUFFER, vbo); 139 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 140 glBindBuffer(GL_ARRAY_BUFFER, 0); 141 142 // render quad 143 glDrawArrays(GL_TRIANGLES, 0, 6); 144 145 146 147 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 148 pos.x += ((ch.Advance >> 6) * scale); // bitshift by 6 to get value in pixels (2^6 = 64) 149 } 150//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 151 glBindVertexArray(0); 152 glBindTexture(GL_TEXTURE_2D, 0); 153 setDisable(); //シェーダーを無効にする 154} 155 156 157 158FrameWork::Text::~Text() 159{ 160 //グリフ解放 161 FT_Done_Face(face); 162 FT_Done_FreeType(ft); 163 164} 165
Font/ariali.ttf に日本語のグリフは入っていますか?
Text::Text() では文字コード0から127までのグリフしか用意していないのは理解していますか?
参考サイトでは "メイリオ" 使ってますね↓
FT_New_Face(library, "C:\\Windows\\Fonts\\meiryo.ttc", 0, &face);
> 参考サイト: http://blendgimper.hatenablog.jp/entry/2016/01/01/074615
参考サイトはちゃんと読んだのでしょうか。
> 参考サイトはちゃんと読んだのでしょうか。
「例示のとおりにやってない」か
「自分の問題に置き換えることができない」のいずれかでしょう。
>色々調べましたがわかりません。
そこでパッと提示された記事をどのように理解したのか書かないと
何をしたのか分かりません。
「読んだ」と「理解した」は別物です。
理解できたのかできなかったのか
理解できたならどこが理解できてどこが理解できてないのか
全く理解できてないなら「そもそも理解するためのベースは自身の中にあるのか」を疑う必要があります。
> const char16_t型にキャストして日本語文字の描画を試みましたが字の枠しか描画されませんこれはどうしたらいいのでしょうか?
キャストして……?
どう出力されることを期待しているのか、呼び出し側が提示されていないためわかりません。
呼び出し側のコードも書いてください
「std::string text」から「const char16_t* text」へ変更したようですが、
文字通りキャストしたのであれば描画されるわけがありません
まず、「char16_t」が何かから理解する必要があるでしょう
回答2件
あなたの回答
tips
プレビュー