以下のコードは画面にテキスト出力をする関数ですがなぜか何も画面に表示されませんこれは何をしたのでしょうか?原因がどうしてもわかりません。void RenderText();関数です。
またfont_name変数ですがファイルパスの指定は正しいのでしょうか?
シェーダーのコンパイルエラーも何も表示されないので正しくコンパイルされていると思われます。
メインループの第一引数を英語や日本語に等を試しましたが表示されません。
表示座標を色々変更しましたが表示されません。
またRenderText();関数にprintf();を置いたらコンソールに画面が出力されるので処理はこの関数に来ていると思われます。
CPP
1//メインループ 2 font->RenderText("ABCDE",0,0,1,glm::vec3(0.0,1.0,0.0));
cpp
1#include "Font.hpp" 2 3#include "ft2build.h" 4Font::Font() 5{ 6 //シェーダー読み込み 7 shaderProgram = Shader::LoadShader("DrawFont.vert","DrawFont.frag"); 8 9 // All functions return a value different than 0 whenever an error occurred 10 if (FT_Init_FreeType(&ft)) 11 { 12 std::cout << "ERROR::FREETYPE: Could not init FreeType Library" << std::endl; 13 //return -1; 14 } 15 16 // find path to font 17 std::string font_name = "C:\Windows\Fonts\meiryo.ttc"; 18 if (font_name.empty()) 19 { 20 std::cout << "ERROR::FREETYPE: Failed to load font_name" << std::endl; 21 // return -1; 22 } 23 24 // load font as face 25 if (FT_New_Face(ft, font_name.c_str(), 0, &face)) { 26 std::cout << "ERROR::FREETYPE: Failed to load font" << std::endl; 27 // return -1; 28 } 29 else { 30 // set size to load glyphs as 31 FT_Set_Pixel_Sizes(face, 0, 48); 32 33 // disable byte-alignment restriction 34 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 35 36 // load first 128 characters of ASCII set 37 for (unsigned char c = 0; c < 128; c++) 38 { 39 // Load character glyph 40 if (FT_Load_Char(face, c, FT_LOAD_RENDER)) 41 { 42 std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl; 43 continue; 44 } 45 // generate texture 46 unsigned int texture; 47 glGenTextures(1, &texture); 48 glBindTexture(GL_TEXTURE_2D, texture); 49 glTexImage2D( 50 GL_TEXTURE_2D, 51 0, 52 GL_RED, 53 face->glyph->bitmap.width, 54 face->glyph->bitmap.rows, 55 0, 56 GL_RED, 57 GL_UNSIGNED_BYTE, 58 face->glyph->bitmap.buffer 59 ); 60 // set texture options 61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 62 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 63 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 64 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 65 // now store character for later use 66 Character character = { 67 texture, 68 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 69 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 70 static_cast<unsigned int>(face->glyph->advance.x) 71 }; 72 Characters.insert(std::pair<char, Character>(c, character)); 73 } 74 glBindTexture(GL_TEXTURE_2D, 0); 75 } 76 // destroy FreeType once we're finished 77 FT_Done_Face(face); 78 FT_Done_FreeType(ft); 79 80 81 glGenVertexArrays(1, &VAO); 82 glGenBuffers(1, &VBO); 83 glBindVertexArray(VAO); 84 glBindBuffer(GL_ARRAY_BUFFER, VBO); 85 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); 86 glEnableVertexAttribArray(0); 87 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); 88 glBindBuffer(GL_ARRAY_BUFFER, 0); 89 glBindVertexArray(0); 90} 91 92 93void Font::RenderText(std::string text, float x, float y, float scale, glm::vec3 color) 94{ 95 //printf("aaa\n"); 96 // activate corresponding render state 97 //shader.use(); 98 glUseProgram(shaderProgram); 99 glUniform3f(glGetUniformLocation(shaderProgram, "textColor"), color.x, color.y, color.z); 100 glActiveTexture(GL_TEXTURE0); 101 glBindVertexArray(VAO); 102 103 // iterate through all characters 104 std::string::const_iterator c; 105 for (c = text.begin(); c != text.end(); c++) 106 { 107 Character ch = Characters[*c]; 108 109 float xpos = x + ch.Bearing.x * scale; 110 float ypos = y - (ch.Size.y - ch.Bearing.y) * scale; 111 112 float w = ch.Size.x * scale; 113 float h = ch.Size.y * scale; 114 // update VBO for each character 115 float vertices[6][4] = { 116 { xpos, ypos + h, 0.0f, 0.0f }, 117 { xpos, ypos, 0.0f, 1.0f }, 118 { xpos + w, ypos, 1.0f, 1.0f }, 119 120 { xpos, ypos + h, 0.0f, 0.0f }, 121 { xpos + w, ypos, 1.0f, 1.0f }, 122 { xpos + w, ypos + h, 1.0f, 0.0f } 123 }; 124 // render glyph texture over quad 125 glBindTexture(GL_TEXTURE_2D, ch.TextureID); 126 // update content of VBO memory 127 glBindBuffer(GL_ARRAY_BUFFER, VBO); 128 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); // be sure to use glBufferSubData and not glBufferData 129 130 glBindBuffer(GL_ARRAY_BUFFER, 0); 131 // render quad 132 glDrawArrays(GL_TRIANGLES, 0, 6); 133 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 134 x += (ch.Advance >> 6) * scale; // bitshift by 6 to get value in pixels (2^6 = 64 (divide amount of 1/64th pixels by 64 to get amount of pixels)) 135 } 136 glBindVertexArray(0); 137 glBindTexture(GL_TEXTURE_2D, 0); 138}
GLSL
1//頂点シェーダー 2 3#version 400 4 5layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex> 6out vec2 TexCoords; 7 8uniform mat4 projection; 9 10void main() 11{ 12 gl_Position = projection * vec4(vertex.xy, 0.0, 1.0); 13 TexCoords = vertex.zw; 14}
GLSL
1//フラグメントシェーダー 2 3#version 400 4in vec2 TexCoords; 5out vec4 color; 6 7uniform sampler2D text; 8uniform vec3 textColor; 9 10void main() 11{ 12 vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); 13 color = vec4(textColor, 1.0) * sampled; 14}
Ftglはなんだか、気に入らなかったので使わなかった。
http://www.natural-science.or.jp/article/20091123143714.phpのページの
//文字の描画
char t_char[20];
char t_char2[20];
strcpy_s(t_char2, "t = ");
sprintf_s(t_char, "%d", tn);
strcat_s(t_char2, t_char);
DISPLAY_TEXT(5, 95, t_char2 );
strcpy_s(t_char2, "p = ");
sprintf_s(t_char, "%d", pn);
strcat_s(t_char2, t_char);
DISPLAY_TEXT(5, 90, t_char2 );
のDISPLAY_TEXTがわからないのですがこれだけでどうにかならないですかね。(自分もgluまでしか使ってないです。)あ、調べなおしたら関数だった。freeglutまで使ってた。使いませんね。ごめんなさい。
GLUTを使わないで実装したいのです。
私も、GLUT、freeglutは使ってませんが、この問題は結構難しい気がする。freetypeで解決できればいいんですけど。
自分も色々調べましたがあまり参考になる記事が出てこなくて困っていますw
同じです。Ftglはすごく簡単だけど、なんか邪魔くさくて仕方なかった。ただ載っていればいいんならそれでもいいんでしょうけど。じゃないなら、ビットマップフォントだった。やり方は知らない。
//シェーダー読み込み部分の提示コードについて質問です
shaderProgram = Shader::LoadShader("DrawFont.vert","DrawFont.frag");についてききたいのですがシェーダの読み込みをここでしているのでしょうか。すると以下のコードも通るのでしょうか。
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);でエラーがでてしまいます。
回答1件
あなたの回答
tips
プレビュー