質問編集履歴

3

文章とタイトルを編集しました。

2020/10/08 05:11

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Openglで文字を表示させる方法が知りたい。
1
+ Openglでテキスト表示が出来ない理由が知りたい。
test CHANGED
@@ -1,5 +1,377 @@
1
- OpenGL文字を表示させるにどうすればいいでしょうか?調べましたglutを使方法か出来ないのですが自分はそれを使ずに描画したいのですがどうすればいいのでしょうか?
1
+ 以下のコードは画面にテキスト出力をする関数すがなぜか何も画面に表示されまんこれ何をしたのでしょうか?原因うしてかりません。void RenderText();関数です
2
+
2
-
3
+  またfont_name変数ですがファイルパスの指定は正しいのでしょうか? 
4
+
5
+
6
+
3
-
7
+ シェーダーのコンパイルエラーも何も表示されないので正しくコンパイルされていると思われます。
4
-
8
+
5
- 何もわからないため提示コ参考サイト載せられません。
9
+ メインルプの第一引数を英語日本語に等試しましたが表示されません。
10
+
11
+ 表示座標を色々変更しましたが表示されません。
12
+
13
+
14
+
15
+ またRenderText();関数にprintf();を置いたらコンソールに画面が出力されるので処理はこの関数に来ていると思われます。
16
+
17
+
18
+
19
+
20
+
21
+ ```CPP
22
+
23
+ //メインループ
24
+
25
+ font->RenderText("ABCDE",0,0,1,glm::vec3(0.0,1.0,0.0));
26
+
27
+ ```
28
+
29
+
30
+
31
+ ```cpp
32
+
33
+ #include "Font.hpp"
34
+
35
+
36
+
37
+ #include "ft2build.h"
38
+
39
+ Font::Font()
40
+
41
+ {
42
+
43
+ //シェーダー読み込み
44
+
45
+ shaderProgram = Shader::LoadShader("DrawFont.vert","DrawFont.frag");
46
+
47
+
48
+
49
+ // All functions return a value different than 0 whenever an error occurred
50
+
51
+ if (FT_Init_FreeType(&ft))
52
+
53
+ {
54
+
55
+ std::cout << "ERROR::FREETYPE: Could not init FreeType Library" << std::endl;
56
+
57
+ //return -1;
58
+
59
+ }
60
+
61
+
62
+
63
+ // find path to font
64
+
65
+ std::string font_name = "C:\Windows\Fonts\meiryo.ttc";
66
+
67
+ if (font_name.empty())
68
+
69
+ {
70
+
71
+ std::cout << "ERROR::FREETYPE: Failed to load font_name" << std::endl;
72
+
73
+ // return -1;
74
+
75
+ }
76
+
77
+
78
+
79
+ // load font as face
80
+
81
+ if (FT_New_Face(ft, font_name.c_str(), 0, &face)) {
82
+
83
+ std::cout << "ERROR::FREETYPE: Failed to load font" << std::endl;
84
+
85
+ // return -1;
86
+
87
+ }
88
+
89
+ else {
90
+
91
+ // set size to load glyphs as
92
+
93
+ FT_Set_Pixel_Sizes(face, 0, 48);
94
+
95
+
96
+
97
+ // disable byte-alignment restriction
98
+
99
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
100
+
101
+
102
+
103
+ // load first 128 characters of ASCII set
104
+
105
+ for (unsigned char c = 0; c < 128; c++)
106
+
107
+ {
108
+
109
+ // Load character glyph
110
+
111
+ if (FT_Load_Char(face, c, FT_LOAD_RENDER))
112
+
113
+ {
114
+
115
+ std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl;
116
+
117
+ continue;
118
+
119
+ }
120
+
121
+ // generate texture
122
+
123
+ unsigned int texture;
124
+
125
+ glGenTextures(1, &texture);
126
+
127
+ glBindTexture(GL_TEXTURE_2D, texture);
128
+
129
+ glTexImage2D(
130
+
131
+ GL_TEXTURE_2D,
132
+
133
+ 0,
134
+
135
+ GL_RED,
136
+
137
+ face->glyph->bitmap.width,
138
+
139
+ face->glyph->bitmap.rows,
140
+
141
+ 0,
142
+
143
+ GL_RED,
144
+
145
+ GL_UNSIGNED_BYTE,
146
+
147
+ face->glyph->bitmap.buffer
148
+
149
+ );
150
+
151
+ // set texture options
152
+
153
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
154
+
155
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
156
+
157
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
158
+
159
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
160
+
161
+ // now store character for later use
162
+
163
+ Character character = {
164
+
165
+ texture,
166
+
167
+ glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
168
+
169
+ glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
170
+
171
+ static_cast<unsigned int>(face->glyph->advance.x)
172
+
173
+ };
174
+
175
+ Characters.insert(std::pair<char, Character>(c, character));
176
+
177
+ }
178
+
179
+ glBindTexture(GL_TEXTURE_2D, 0);
180
+
181
+ }
182
+
183
+ // destroy FreeType once we're finished
184
+
185
+ FT_Done_Face(face);
186
+
187
+ FT_Done_FreeType(ft);
188
+
189
+
190
+
191
+
192
+
193
+ glGenVertexArrays(1, &VAO);
194
+
195
+ glGenBuffers(1, &VBO);
196
+
197
+ glBindVertexArray(VAO);
198
+
199
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
200
+
201
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
202
+
203
+ glEnableVertexAttribArray(0);
204
+
205
+ glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
206
+
207
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
208
+
209
+ glBindVertexArray(0);
210
+
211
+ }
212
+
213
+
214
+
215
+
216
+
217
+ void Font::RenderText(std::string text, float x, float y, float scale, glm::vec3 color)
218
+
219
+ {
220
+
221
+ //printf("aaa\n");
222
+
223
+ // activate corresponding render state
224
+
225
+ //shader.use();
226
+
227
+ glUseProgram(shaderProgram);
228
+
229
+ glUniform3f(glGetUniformLocation(shaderProgram, "textColor"), color.x, color.y, color.z);
230
+
231
+ glActiveTexture(GL_TEXTURE0);
232
+
233
+ glBindVertexArray(VAO);
234
+
235
+
236
+
237
+ // iterate through all characters
238
+
239
+ std::string::const_iterator c;
240
+
241
+ for (c = text.begin(); c != text.end(); c++)
242
+
243
+ {
244
+
245
+ Character ch = Characters[*c];
246
+
247
+
248
+
249
+ float xpos = x + ch.Bearing.x * scale;
250
+
251
+ float ypos = y - (ch.Size.y - ch.Bearing.y) * scale;
252
+
253
+
254
+
255
+ float w = ch.Size.x * scale;
256
+
257
+ float h = ch.Size.y * scale;
258
+
259
+ // update VBO for each character
260
+
261
+ float vertices[6][4] = {
262
+
263
+ { xpos, ypos + h, 0.0f, 0.0f },
264
+
265
+ { xpos, ypos, 0.0f, 1.0f },
266
+
267
+ { xpos + w, ypos, 1.0f, 1.0f },
268
+
269
+
270
+
271
+ { xpos, ypos + h, 0.0f, 0.0f },
272
+
273
+ { xpos + w, ypos, 1.0f, 1.0f },
274
+
275
+ { xpos + w, ypos + h, 1.0f, 0.0f }
276
+
277
+ };
278
+
279
+ // render glyph texture over quad
280
+
281
+ glBindTexture(GL_TEXTURE_2D, ch.TextureID);
282
+
283
+ // update content of VBO memory
284
+
285
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
286
+
287
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); // be sure to use glBufferSubData and not glBufferData
288
+
289
+
290
+
291
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
292
+
293
+ // render quad
294
+
295
+ glDrawArrays(GL_TRIANGLES, 0, 6);
296
+
297
+ // now advance cursors for next glyph (note that advance is number of 1/64 pixels)
298
+
299
+ 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))
300
+
301
+ }
302
+
303
+ glBindVertexArray(0);
304
+
305
+ glBindTexture(GL_TEXTURE_2D, 0);
306
+
307
+ }
308
+
309
+ ```
310
+
311
+
312
+
313
+ ```GLSL
314
+
315
+ //頂点シェーダー
316
+
317
+
318
+
319
+ #version 400
320
+
321
+
322
+
323
+ layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
324
+
325
+ out vec2 TexCoords;
326
+
327
+
328
+
329
+ uniform mat4 projection;
330
+
331
+
332
+
333
+ void main()
334
+
335
+ {
336
+
337
+ gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
338
+
339
+ TexCoords = vertex.zw;
340
+
341
+ }
342
+
343
+ ```
344
+
345
+
346
+
347
+ ```GLSL
348
+
349
+ //フラグメントシェーダー
350
+
351
+
352
+
353
+ #version 400
354
+
355
+ in vec2 TexCoords;
356
+
357
+ out vec4 color;
358
+
359
+
360
+
361
+ uniform sampler2D text;
362
+
363
+ uniform vec3 textColor;
364
+
365
+
366
+
367
+ void main()
368
+
369
+ {
370
+
371
+ vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
372
+
373
+ color = vec4(textColor, 1.0) * sampled;
374
+
375
+ }
376
+
377
+ ```

2

文章とタイトルを編集しました。

2020/10/08 05:10

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- freetypeを使ってopenglで文字を表示させるための手順が知りたい。
1
+ Openglで文字を表示させる方法が知りたい。
test CHANGED
@@ -1,51 +1,5 @@
1
- 文字描画をしたいのですが提示コードから先作業何をすればいいかわかりません。
1
+ OpenGLで文字を表示させるにはどうすればいいでょうか?調べましがglutを使う方法しか出て来ないのですが自分はそれを使わずに描画したいのですがどうすればいいのでしょう
2
-
3
- 環境はopenGLで シェーダー描画です。
4
2
 
5
3
 
6
4
 
7
- 質問 文字描画までに至るまでの手順が知りたです。
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
- 参考サイト: http://blendgimper.hatenablog.jp/entry/2016/01/01/074615
24
-
25
-
26
-
27
- ```cpp
28
-
29
- //文字描画
30
-
31
-
32
-
33
- FT_Library library;
34
-
35
- FT_Face face;
36
-
37
- FT_GlyphSlot slot;
38
-
39
-
40
-
41
- FT_Init_FreeType(&library);
5
+ 何もわからないため提示コードや参考サイトを載せられません。
42
-
43
- FT_New_Face(library, "C:/Windows/Fonts/meiryo.ttc", 0, &face);
44
-
45
- FT_Set_Pixel_Sizes(face, 0, 48);
46
-
47
- slot = face->glyph;
48
-
49
-
50
-
51
- ```

1

文章とタイトルを編集しました。

2020/10/08 03:48

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- freetypeを使ってopenglで文字を表示させたい。
1
+ freetypeを使ってopenglで文字を表示させめの手順が知りたい。
test CHANGED
@@ -1,4 +1,16 @@
1
- 文字描画をしたいのですが提示コードから先の作業で何をすればいいかわかりません。どうしたらいいのでしょうか?参考サイトを見ましたがよくわかりません。 やりたいことは文字列を読み込んで画面に表示させたいです。3Dでシェーダーを使っています。
1
+ 文字描画をしたいのですが提示コードから先の作業で何をすればいいかわかりません。
2
+
3
+ 環境はopenGLで シェーダー描画です。
4
+
5
+
6
+
7
+ 質問 文字描画までに至るまでの手順が知りたです。
8
+
9
+
10
+
11
+
12
+
13
+
2
14
 
3
15
 
4
16