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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

解決済

FreeTypeによる文字描画で文字が上下逆に表示される原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

1回答

0グッド

0クリップ

1580閲覧

投稿2021/05/07 02:50

編集2021/05/07 05:12

提示画像ですがフォント描画で逆さまに描画してしまいます。これはなぜでしょうか?参考サイトを参考にして自分で修正を試みましたが原因がわかりません。Draw関数が原因なのですが何をしたのでしょうか?

参考サイト: 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 8Text::Text(std::shared_ptr<Window> w, const char* vert, const char* frag) : 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 FT_Library ft; 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 FT_Face face; 47 48 if (FT_New_Face(ft, "Font/ariali.ttf", 0, &face) != 0) 49 { 50 std::cout<<"ERROR::FREETYPE: Failed to load font" << std::endl; 51 assert(0); 52 53 } 54 55 56 FT_Set_Pixel_Sizes(face,0,48); //ピクセルサイズを指定 57 58 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // disable byte-alignment restriction 59 60 for (unsigned char c = 0; c < 128; c++) 61 { 62 // load character glyph 63 if (FT_Load_Char(face, c, FT_LOAD_RENDER)) 64 { 65 std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl; 66 continue; 67 } 68 // generate texture 69 unsigned int texture; 70 glGenTextures(1, &texture); 71 glBindTexture(GL_TEXTURE_2D, texture); 72 glTexImage2D( 73 GL_TEXTURE_2D, 74 0, 75 GL_RED, 76 face->glyph->bitmap.width, 77 face->glyph->bitmap.rows, 78 0, 79 GL_RED, 80 GL_UNSIGNED_BYTE, 81 face->glyph->bitmap.buffer 82 ); 83 // set texture options 84 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 85 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 86 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 87 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 88 // now store character for later use 89 Character character = { 90 texture, 91 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 92 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 93 (unsigned int)face->glyph->advance.x 94 95 }; 96 Characters.insert(std::pair<char, Character>(c, character)); 97 } 98 99 100 101 102 //グリフ解放 103 FT_Done_Face(face); 104 FT_Done_FreeType(ft); 105 106 //アルファブレンドを有効 107 glEnable(GL_BLEND); 108 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 109} 110 111void Text::Draw(std::string text, float x, float y, float scale, glm::vec3 color) 112{ 113 setEnable(); //シェーダーを有効にする 114 115 //テクスチャをアクティブ 116 glActiveTexture(GL_TEXTURE0); 117 glBindVertexArray(vao); 118 119 //Unform 120 setUniform3f("textColor",color); 121 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 122 123 124 // iterate through all characters 125 std::string::const_iterator c; 126 for (c = text.begin(); c != text.end(); c++) 127 { 128 Character ch = Characters[*c]; 129 130 printf("%f\n",x); 131 float xpos = x + ch.Bearing.x * scale; 132 float ypos = y - (ch.Size.y - ch.Bearing.y) * scale; 133 134 float w = ch.Size.x * scale; 135 float h = ch.Size.y * scale; 136 // update VBO for each character 137 float vertices[6][4] = { 138 { xpos, ypos + h, 0.0f, 0.0f }, 139 { xpos, ypos, 0.0f, 1.0f }, 140 { xpos + w, ypos, 1.0f, 1.0f }, 141 142 { xpos, ypos + h, 0.0f, 0.0f }, 143 { xpos + w, ypos, 1.0f, 1.0f }, 144 { xpos + w, ypos + h, 1.0f, 0.0f } 145 }; 146 // render glyph texture over quad 147 glBindTexture(GL_TEXTURE_2D, ch.textureID); 148 // update content of VBO memory 149 glBindBuffer(GL_ARRAY_BUFFER, vbo); 150 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 151 glBindBuffer(GL_ARRAY_BUFFER, 0); 152 // render quad 153 glDrawArrays(GL_TRIANGLES, 0, 6); 154 155 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 156 x += ((ch.Advance >> 6) * scale); // bitshift by 6 to get value in pixels (2^6 = 64) 157 158 } 159 160 161 glBindVertexArray(0); 162 glBindTexture(GL_TEXTURE_2D, 0); 163 setDisable(); //シェーダーを無効にする 164} 165 166 167 168Text::~Text() 169{ 170 171} 172

glsl

1/*######################################################################### 2# 単色の二次元テキストレンダリング vert 3###########################################################################*/ 4#version 330 5#extension GL_ARB_explicit_attrib_location: enable 6 7//頂点情報 8layout(location = 0) in vec4 vertexPosition; //頂点座標 9 10//フラグメント 転送 11layout(location = 2) out vec2 texCoord; //テキスト 12 13 14 15uniform mat4 uViewProjection; //ビュープロジェクション行列 16 17void main() 18{ 19 vec4 vertex = vec4(vertexPosition.x,vertexPosition.y,0.0,1.0); //頂点座標 20 gl_Position = (uViewProjection * vertex); 21 22 23 24 25 texCoord = vertexPosition.zw; 26}

glsl

1/*######################################################################### 2# 単色の二次元テキストレンダリング frag 3###########################################################################*/ 4#version 330 5 6#extension GL_ARB_explicit_attrib_location: enable 7 8 9layout(location = 2 ) in vec2 texCoord; 10 11out vec4 color; 12 13uniform sampler2D text; 14uniform vec3 textColor; 15 16void main() 17{ 18 vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, texCoord).r); 19 color = vec4(textColor,1.0) * sampled; 20}

以下のような質問にはグッドを送りましょう

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

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

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/05/07 15:26

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

退会済みユーザー

退会済みユーザー

2021/05/07 04:34

> 参考サイトを参考にして自分で修正を試みましたが原因がわかりません。 > 提示コードのDraw関数が原因なのですが何をしたのでしょうか? 矛盾している気がしますが、どういう意味でしょうか。

回答1

1

ベストアンサー

cpp

1setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f));

上記コードが原因ではないでしょうか。

座標系によるtextureの上下反転について

投稿2021/05/07 04:45

編集2021/05/07 05:33
退会済みユーザー

退会済みユーザー

総合スコア0

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2021/05/07 08:58

こちらの回答が他のユーザーから「過去の低評価」という指摘を受けました。

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/05/07 05:14

いえ、他のコードを見比べましたが問題ありませんでした。
退会済みユーザー

退会済みユーザー

2021/05/07 05:32

なんで、他のコードを見比べたんですか、上記のコードを比べてくださいよ。 参考サイトちゃんと読みましたか? 参考サイトの、 glm::mat4 projection = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f); と比べて、上下反転する理由がわからないんですか。
退会済みユーザー

退会済みユーザー

2021/05/07 05:35

代理デバッグは本人のためにならないですよ。
退会済みユーザー

退会済みユーザー

2021/05/07 05:37

出ました。自分のコードと比較してました。
K_3578

2021/05/07 05:37

>userisgodさん 一応忠告させて頂くと、 この質問者は前アカウントでも500件以上の質問をしながら 指摘されたことを全く聞き入れないタイプの人なので何を言っても徒労かと思われます。 理解した上で回答されているのでしたら出過ぎた真似です。無視して下さい。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

OpenGL

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。