質問編集履歴
3
文章を修正しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
OpenGL どこでglDeleteTexture();関数を置けばいいかわからない。
|
body
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
以下のコードですが以下コンストラクタ部のfor文ループが原因でメモリリークしてしまうのですがこれはどうすればいいのでしょか?
|
2
|
+
for文の最後にglDeleteTexture();関数を置くとバインドしてテクスチャを削除してしまうので描画されなくなります。またデストラクタの置くと
|
1
|
-
|
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
|
-
|
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
|
-
|
193
|
+
glDeleteTextures(1, &texture);
|
181
|
-
|
194
|
+
// glDeleteTextures(1, &texture);
|
195
|
+
|
182
196
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
183
|
-
glDeleteBuffers(1, &
|
197
|
+
glDeleteBuffers(1, &VBO);
|
184
198
|
|
185
|
-
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
186
199
|
glBindVertexArray(0);
|
187
|
-
|
200
|
+
glDeleteVertexArrays(1, &VAO);
|
188
|
-
glDeleteTextures(1, &texture);////////////////////////////
|
189
|
-
|
190
|
-
|
191
201
|
}
|
192
202
|
```
|
2
文章を修正しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
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
文章を修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
glGenTextures()したものをglDeleteTextures()してもメモリ解放できない。原因と対処方法が知りたい。
|
body
CHANGED
File without changes
|