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

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

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

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

C++

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

Q&A

解決済

1回答

2931閲覧

Openglでテキスト表示が出来ない理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/10/05 06:09

編集2020/10/08 05:11

以下のコードは画面にテキスト出力をする関数ですがなぜか何も画面に表示されませんこれは何をしたのでしょうか?原因がどうしてもわかりません。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}

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

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

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

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

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

txty

2020/10/08 08:55 編集

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まで使ってた。使いませんね。ごめんなさい。
退会済みユーザー

退会済みユーザー

2020/10/08 09:00

GLUTを使わないで実装したいのです。
txty

2020/10/08 09:09

私も、GLUT、freeglutは使ってませんが、この問題は結構難しい気がする。freetypeで解決できればいいんですけど。
退会済みユーザー

退会済みユーザー

2020/10/08 09:37

自分も色々調べましたがあまり参考になる記事が出てこなくて困っていますw
txty

2020/10/10 00:20 編集

同じです。Ftglはすごく簡単だけど、なんか邪魔くさくて仕方なかった。ただ載っていればいいんならそれでもいいんでしょうけど。じゃないなら、ビットマップフォントだった。やり方は知らない。
txty

2020/10/14 16:02 編集

//シェーダー読み込み部分の提示コードについて質問です 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);でエラーがでてしまいます。
guest

回答1

0

ベストアンサー

頂点シェーダが間違えていたそうで画面に出力されなかったみたいです。z軸を-10とすることで強制的に画面に表示することは出来ますがUIの場合は基本的には画面に引っ付く形だと思うので二次元版の行列を作成しました。

GLSL

1//頂点シェーダー 2 3#version 400 4 5layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex> 6out vec2 TexCoords; 7 8 9uniform mat3 projection; //ビュー行列 10uniform mat3 WorldMatrix; //ワールド行列 11 12 13void main() 14{ 15 TexCoords = vertex.zw; 16 17 18 19 vec3 pos = vec3(vertex.xy,-1.0); 20 gl_Position = vec4(pos * WorldMatrix * projection,1.0); 21 22 23}

投稿2020/10/11 12:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問