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

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

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

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

C++

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

Q&A

1回答

1004閲覧

FreeTypeライブラリ glTextureImage2Dでアクセスエラーになる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/06/18 04:52

編集2021/06/18 07:18

提示コードのvoid Draw();関数ですがコメント部の////内部の関数で例外エラーが発生してしまいます。itr->face のface に値がうまく入っていないのだと思いコンストラクタのfor文を確認しましたがしっかりとfaceが代入されていますこれはなぜ例外エラーが出るのでしょか?原因がわかりません。一番怪しいのはft_Load_glyph();関数なのですが引数を確認しましたが正しいと思います。

FreeTyper: https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_glyph

hpp

1#ifndef ___TEXT_HPP_ 2#define ___TEXT_HPP_ 3#include "Transform_2D.hpp" 4#include "Shader.hpp" 5#include "glm/glm.hpp" 6#include <map> 7#include "ft2build.h" 8#include FT_FREETYPE_H 9 10/*######################################################################### 11# 文字描画クラス 12 13説明 14 文字を描画する 15###########################################################################*/ 16namespace FrameWork 17{ 18 class Window; 19 20 class Text : protected FrameWork::Transform_2D 21 { 22 23 public: 24 Text(int fontSize, const char* str, ...); //コンストラクタ 25 ~Text(); //デストラクタ 26 27 void Draw(glm::vec2 pos,glm::vec3 color); //描画 28 private: 29 30 struct Character 31 { 32 unsigned int textureID; // グリフのテクスチャID 33 FT_Face face; //フェイス 34 }; 35 36 std::vector<Character> character; //文字データ 37 std::shared_ptr<Window> windowContext; //ウインドウコンテキスト 38 int charSize; //文字の大きさ(ピクセル) 39 40 //FreeType 41 //FreeTypeを初期化 42 FT_Face face = nullptr; //フェイス 43 FT_Face fc = nullptr; //フェイス 44 FT_Library ft; //freetype 45 46 }; 47} 48#endif

cpp

1#include "Text.hpp" 2 3#include "glew/include/GL/glew.h" 4#include "glm/glm.hpp" 5#include "uchar.h" 6#include "Window.hpp" 7#include "FrameWork.hpp" 8#include <iostream> 9 10// ##################################### コンストラクタ ##################################### 11FrameWork::Text::Text(int fontSize,const char *str,...) : FrameWork::Transform_2D() 12{ 13 setlocale(LC_CTYPE, ""); //ローカルを設定 14 15 shader = std::make_unique<FrameWork::Shader>(); 16 shader->Load("Shader/2D/BasicText_2D.vert", "Shader/2D/BasicText_2D.frag"); 17 18 19 20 //vao 21 glGenVertexArrays(1, &vao); 22 glBindVertexArray(vao); 23 24 //vbo 25 glGenBuffers(1, &vbo); 26 glBindBuffer(GL_ARRAY_BUFFER, vbo); 27 28 //頂点属性 29 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW); 30 glEnableVertexAttribArray(0); 31 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0); 32 33 34 //初期化 35 if (FT_Init_FreeType(&ft) != 0) 36 { 37 std::cerr << "FreeType ライブラリを初期化出来ません。"<<std::endl; 38 } 39 40 //フェイス作成 フォントはメイリオ 41 if (FT_New_Face(ft, "C:\Windows\Fonts\meiryo.ttc", 0, &face) != 0) 42 { 43 std::cerr << "フォントを読み込めません。" << std::endl; 44 } 45 46 charSize = fontSize; 47 FT_Set_Pixel_Sizes(face,0,charSize); //ピクセルサイズを指定 48 49 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // disable byte-alignment restriction 50 51 //文字データを生成 52 53 //マルチバイト文字をワイド文字変換 54 wchar_t txt[1000] = { L'\0' }; 55 char text[1000]; 56 va_list args; 57 va_start(args, str); 58 vsprintf_s(text, sizeof(text), str, args); 59 va_end(args); 60 61 int i, j, f; 62 for (i = 0, j = 0; text[j]; i++, j += f) 63 { 64 f = (int)mbrtowc(txt + i, &text[j], (size_t)MB_CUR_MAX, nullptr); 65 } 66///////////////////////////////////////////////////////////////////////////////////////////////// 67 for (int i = 0; txt[i] != L'\0'; i++) 68 { 69 unsigned int texture = 0; 70 71 //グリフをロード 72 73 74 //文字データを設定 75 Character ch = 76 { 77 texture, 78 face 79 }; 80 81 glGenTextures(1, &ch.textureID); 82 glBindTexture(GL_TEXTURE_2D, ch.textureID); 83 FT_Load_Glyph(face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); 84 ch.face = face; 85 86 glTexImage2D( 87 GL_TEXTURE_2D, 88 0, 89 GL_RED, 90 face->glyph->bitmap.width, 91 face->glyph->bitmap.rows, 92 0, 93 GL_RED, 94 GL_UNSIGNED_BYTE, 95 face->glyph->bitmap.buffer 96 ); 97 98 99 //テクスチャを生成 100 character.push_back(ch); 101 } 102/////////////////////////////////////////////////////////////////////////////////////////////////////////// 103 //グリフ解放 104 // FT_Done_Face(face); 105 FT_Done_FreeType(ft); 106 107 glBindBuffer(GL_ARRAY_BUFFER, 0); 108 glBindVertexArray(0); 109} 110 111// ##################################### 描画 ##################################### 112void FrameWork::Text::Draw(glm::vec2 pos,glm::vec3 color) 113{ 114 shader->setEnable(); //シェーダーを有効にする 115 116 //色をRGBにして位置を反転 117 pos.y = FrameWork::getWindowContext()->getSize().y - pos.y - charSize; 118 const float c = 1.0f / 255; 119 color = color * c; 120 121 //テクスチャをアクティブ 122 glActiveTexture(GL_TEXTURE0); 123 124 glBindVertexArray(vao); 125 glBindBuffer(GL_ARRAY_BUFFER,vbo); 126 127 //Unform 128 shader->setUniform3f("textColor", color); 129 shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::getWindowContext()->getSize().x, 0.0f, FrameWork::getWindowContext()->getSize().y)); 130 131 132 133 134 for (std::vector<Character>::iterator itr = character.begin(); itr != character.end(); itr++) 135 { 136 137 //テクスチャタイプを設定 138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 140 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 142 143 //テクスチャを生成 144 145/////////////////////////////////////////////////////////////////////////////////// 146 147 float xpos = pos.x + itr->face->glyph->bitmap_left * 1.0f; 148 float ypos = pos.y - (itr->face->glyph->bitmap.rows - itr->face->glyph->bitmap_top) * 1.0f; 149////////////////////////////////////////////////////////////////////////////////////// 150 float w = itr->face->glyph->bitmap.width * 1.0f; 151 float h = itr->face->glyph->bitmap.rows * 1.0f; 152 153 float vertices[6][4] = 154 { 155 { xpos, ypos + h, 0.0f, 0.0f }, 156 { xpos, ypos, 0.0f, 1.0f }, 157 { xpos + w, ypos, 1.0f, 1.0f }, 158 159 { xpos, ypos + h, 0.0f, 0.0f }, 160 { xpos + w, ypos, 1.0f, 1.0f }, 161 { xpos + w, ypos + h, 1.0f, 0.0f } 162 }; 163 164 glBindBuffer(GL_ARRAY_BUFFER, vbo); 165 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 166 glDrawArrays(GL_TRIANGLES, 0, 6); 167 glBindTexture(GL_TEXTURE_2D, 0); 168 169 pos.x += ((itr->face->glyph->advance.x >> 6) * 1.0f); //次のグリフに進める 170 171 } 172 173 174 glBindVertexArray(0); 175 glBindBuffer(GL_ARRAY_BUFFER, 0); 176 glBindTexture(GL_TEXTURE_2D, 0); 177 shader->setDisable(); //シェーダーを無効にする 178} 179 180 181// ##################################### デストラクタ ##################################### 182FrameWork::Text::~Text() 183{ 184 185 glDeleteVertexArrays(1, &vao); 186 glDeleteBuffers(1, &vbo); 187} 188

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

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

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

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

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

guest

回答1

0

FT_Load_Glyphを呼んだ時点でfc->glyphが変更されるので、FT_Load_Glyphとテクスチャ生成は一緒にしないとだめですね

投稿2021/06/18 05:19

S.Percentage

総合スコア283

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

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

S.Percentage

2021/06/18 05:25 編集

んん、よく読んだらfcは初回以外代入されてないから常にnullだしラスタライズしたグリフデータを使う前にFaceをDoneしてるしだいぶ全体的に謎なコードですね。 フレームワーク化する前に一度最小コードでFreeType2の使い方を理解するべきでは
退会済みユーザー

退会済みユーザー

2021/06/18 05:34

一緒に生成とはどういう意味でしょうか?
S.Percentage

2021/06/18 05:40

どういう意味も何もFT_Load_GlyphしてglGenTexturesした直後にglTexImage2Dする以外ないと思いますが…… もし他の解釈ができたのであれば、それを書いてもらえればより的確な返答ができると思います。
退会済みユーザー

退会済みユーザー

2021/06/18 06:27

float xpos = pos.x + itr->face->glyph->bitmap_left * 1.0f; コード部で例外エラーが発生するのですがface変数が上書きされしまって無効なものを指してしまっているのでしょか?
int32_t

2021/06/18 06:37

型Characterの定義か書いていないので、itr->face が初期化されているかどうかも第三者にはわからないですね。
int32_t

2021/06/18 06:47

S.Percentage さんがコメントに書いているとおり、fcがnullptrだからCharacter::faceも常にnullptrでは?
退会済みユーザー

退会済みユーザー

2021/06/18 06:55

グリフをロードする部分でポインターを得てるんではないのでしょうか?
S.Percentage

2021/06/18 07:03

ちゃんとドキュメント読んでください…… Ft_Load_Glyphの第一引数はinoutなので正しいハンドルを与えないとだめです。 ハンドルが指すメモリ領域内にグリフデータの情報が書き込まれます。
退会済みユーザー

退会済みユーザー

2021/06/18 07:16 編集

リファレンスを読んだのですがどうしてもわかりません。 FT_Load_Glyph(ch.face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); ではないのでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/18 07:18 編集

この質問者の過去の質問を読めば分かりますが、基本的にドキュメント読んだりエラーコードを調査するといった事はしないし、自分でデバッグせずにここに丸投げするだけなので、解決方法を理解する事はなく延々と代理デバッグさせられるだけです。
S.Percentage

2021/06/18 07:30

んんん知らんうちにコードが変わっている……これならいけるんでは まあなんというか、見てて思うのは実力に対してやりたいことのレベルがありえん高すぎるので個々の要素に絞って基礎をやり直したほうがいいかなというところですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問