teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

文章を修正しました。

2021/02/12 05:37

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- glDeleteTextures()してもメモリ解放できない。原因と対処方法が知りたい。
1
+ OpenGL どこでglDeleteTexture();関数を置けばいいかわからない。
body CHANGED
@@ -1,4 +1,6 @@
1
+ 以下のコードですが以下コンストラクタ部のfor文ループが原因でメモリリークしてしまうのですがこれはどうすればいいのでしょか?
2
+ for文の最後にglDeleteTexture();関数を置くとバインドしてテクスチャを削除してしまうので描画されなくなります。またデストラクタの置くと
1
- 提示コードの///////コント部の一行でがなぜ glGenTexture()たtextureを修正デストラクタでglDeleteTexture() ているのにも関わらずメモリリークすのでしょうか? glGenTexture();をコメントアウトしたらメモリリーク収まったでこ関数が原因なの明確です
3
+ モリリークしてしまいま。試glDeleteTexture(128,&texture)ましたがやはりメモリリークしていしま。これはどうやって防いだらいいのでしょうか?色々試したがコード消してしまいました
2
4
 
3
5
 
4
6
 
@@ -19,11 +21,10 @@
19
21
  Owner = g;
20
22
 
21
23
  // シェーダープログラム
22
- // ShaderProgram = new Shader(g, "Shader/2D/Text.vert", "Shader/2D/Text.frag");
23
- ShaderProgram = std::make_unique<Shader>(g,"Shader/2D/Text.vert","Shader/2D/Text.frag");
24
+ ShaderProgram = std::make_unique<Shader>(g, "Shader/2D/Text.vert", "Shader/2D/Text.frag");
24
-
25
- FT_Error fe[100]; //エラー配列
26
25
 
26
+ FT_Error fe[100] = { 0 }; //エラー配列
27
+
27
28
  //FreeTypeを初期化
28
29
  fe[0] = FT_Init_FreeType(&ft);
29
30
 
@@ -39,9 +40,22 @@
39
40
  //ピクセルストレージモードを設定する
40
41
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
41
42
 
43
+ // エラー表示
44
+ printf("%d\n", fe[0]);
45
+ printf("%d\n", fe[1]);
46
+ printf("%d\n", fe[2]);
47
+
48
+
49
+
50
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
42
51
  //128文字のASCIIを読み込み
43
52
  for (unsigned char c = 0; c < 128; c++)
44
53
  {
54
+ //テクスチャをバインド
55
+ glGenTextures(1, &texture);
56
+ glBindTexture(GL_TEXTURE_2D, texture);
57
+
58
+
45
59
  // 文字のグリフをロードする
46
60
  if (FT_Load_Char(face, c, FT_LOAD_RENDER))
47
61
  {
@@ -49,9 +63,6 @@
49
63
  continue;
50
64
  }
51
65
 
52
- //テクスチャを生成する
53
- glGenTextures(1, &texture);/////////////////////////////////////////////////////
54
- glBindTexture(GL_TEXTURE_2D, texture);
55
66
 
56
67
  glTexImage2D(
57
68
  GL_TEXTURE_2D,
@@ -78,41 +89,39 @@
78
89
  glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
79
90
  static_cast<unsigned int>(face->glyph->advance.x)
80
91
  };
92
+
93
+
81
94
  Characters.insert(std::pair<char, Character>(c, character));
82
95
 
96
+
83
- glBindTexture(GL_TEXTURE_2D, 0);
97
+ //glBindTexture(GL_TEXTURE_2D, 0);
84
98
  }
85
-
99
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
86
100
  //FreeTypeの終了処理
87
101
  FT_Done_Face(face);
88
102
  FT_Done_FreeType(ft);
89
103
 
90
-
104
+ //VAO
91
105
  glGenVertexArrays(1, &VAO);
92
106
  glBindVertexArray(VAO);
93
107
 
94
-
108
+ //VBO
95
109
  glGenBuffers(1, &VBO);
96
110
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
97
111
 
112
+ //
98
113
  glEnableVertexAttribArray(0);
99
114
  glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
100
115
 
116
+ //
101
117
  glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
102
- glBindBuffer(GL_ARRAY_BUFFER, 0);
118
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
103
-
104
-
105
- // glBindVertexArray(0);
106
119
  }
107
120
 
108
121
 
109
122
  //文字を表示
110
123
  void Text::RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...)
111
124
  {
112
-
113
- float xx = (-SCREEN_WIDTH / 2) + x;
114
- float yy= (SCREEN_HEIGHT / 2) - y;
115
-
116
125
  //文字を生成
117
126
  std::string text; //生成した文字を格納
118
127
  va_list ap;
@@ -129,7 +138,8 @@
129
138
  ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); //ワール行列
130
139
  ShaderProgram->SetFloatUniform_3f("uTextColor", color); //色を設定 RGB
131
140
 
132
- Transform_2D::setTransform_Move(glm::vec2(x, y));
141
+ Transform_2D::setTransform_Move(glm::vec2(x, y)); //座標
142
+ Transform_2D::UpdateTransform(); //
133
143
 
134
144
  glActiveTexture(GL_TEXTURE0);
135
145
 
@@ -155,38 +165,38 @@
155
165
  { xpos + w, ypos + h, 1.0f, 0.0f }
156
166
  };
157
167
 
168
+
169
+
158
170
  //テクスチャを設定
159
171
  glBindTexture(GL_TEXTURE_2D, ch.TextureID);
160
-
172
+ glBindVertexArray(VAO);
161
-
162
173
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
163
174
  glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //
175
+
164
176
 
165
177
 
166
178
  // ポリゴンをレンダリング
167
- glDrawArrays(GL_TRIANGLES, 0, 6);
179
+ glDrawArrays(GL_TRIANGLES, 0, 6);
168
180
 
169
181
 
170
- x += (ch.Advance>> 6) * scale; // 次のグリフにカーソルを進める
182
+ x += (ch.Advance >> 6) * scale; // 次のグリフにカーソルを進める
171
183
  }
172
184
 
185
+
173
186
 
174
-
175
187
  }
176
188
 
177
189
 
178
190
  Text::~Text()
179
191
  {
192
+ glBindTexture(GL_TEXTURE_2D, 0);
180
- glDeleteBuffers(1, &VAO);
193
+ glDeleteTextures(1, &texture);
181
- glDeleteVertexArrays(1, &VAO);
194
+ // glDeleteTextures(1, &texture);
195
+
182
196
  glBindBuffer(GL_ARRAY_BUFFER, 0);
183
- glDeleteBuffers(1, &VAO);
197
+ glDeleteBuffers(1, &VBO);
184
198
 
185
- glBindBuffer(GL_ARRAY_BUFFER, 0);
186
199
  glBindVertexArray(0);
187
- glBindTexture(GL_TEXTURE_2D, 0);
200
+ glDeleteVertexArrays(1, &VAO);
188
- glDeleteTextures(1, &texture);////////////////////////////
189
-
190
-
191
201
  }
192
202
  ```

2

文章を修正しました。

2021/02/12 05:37

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- glGenTextures()したものをglDeleteTextures()してもメモリ解放できない。原因と対処方法が知りたい。
1
+ glDeleteTextures()してもメモリ解放できない。原因と対処方法が知りたい。
body CHANGED
@@ -1,12 +1,9 @@
1
1
  提示コードの///////コメント部の一行ですがなぜ glGenTexture()したtextureを修正デストラクタでglDeleteTexture() しているのにも関わらずメモリリークするのでしょうか? glGenTexture();をコメントアウトしたらメモリリークが収まったのでこの関数が原因なのは明確です。
2
2
 
3
3
 
4
- ※またこのクラスはインスタンスを生成しても文字は表示されません。
5
4
 
6
5
 
7
6
 
8
-
9
-
10
7
  ```cpp
11
8
  #include "../Header/Text.hpp"
12
9
 

1

文章を修正

2021/02/10 05:05

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- glDeleteTexture();ているメモリリークする原因が知りたい。
1
+ glGenTextures()したもをglDeleteTextures()してもメモリ解放できない。原因と対処方法が知りたい。
body CHANGED
File without changes