質問編集履歴

5

文章を設定

2021/02/12 03:25

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- OpenGL テキストレンダリング文字が正常に描画出来ない理由知りたい。
1
+ OpenGL レンダリングはされるが文字が表示されない原因どうしてもわからない。
test CHANGED
@@ -1,4 +1,4 @@
1
- 提示画像ですがレンダリングがされますが**文字は表示されません**フォントはゴシックです。日本語文字はそもそもレンダリングすらされないので英語の文字を指定するのは正しいです。なぜ文字は表示されないのにレンダリングは出来るのでしょうか?参考サイトのlearn opengl を参考に作り方が原因がどうしてもわかりませんどうしたらいいのでしょうか?
1
+ 提示画像ですがレンダリングがされますが**文字は表示されません**フォントはゴシックです。日本語文字はそもそもレンダリングすらされないので英語の文字を指定するのは正しいです。なぜ文字は表示されないのにレンダリングは出来るのでしょうか?参考サイトのlearn opengl を参考に作り方が原因がどうしてもわかりませんどうしたらいいのでしょうか?コンストラクタで文字情報を設定しているのですが何が理由なのかどうしてもわかりません、
2
2
 
3
3
 
4
4
 

4

文章を修正しました。

2021/02/12 03:25

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,10 @@
1
- 提示画像ですがなぜ文字が表示されないのでしょうか?描画は出来ているみたいですが描画文字であるAAAAAが表示されない原因が知りたいです。
2
-
3
- タ部が何かしている見たなのですがこは何が悪いのでしょうか?現状アルファベットのみ描画出来るみたいなのです日本語を含め描画出来ません。描画はされているめ初期化が悪いのでしょうか?
1
+ 提示画像ですがレダリングがされますが**文字は表示されません**フォンはゴシックです。日本語文字はそもそもレンダリングすらされなので英語の文字を指定すのは正しいです。なぜ文字は表示さいのにレンダリングは出来るのでしょうか?参考サイトのlearn opengl を参考に作り方原因がどうしてもわかりませんどうしのでしょうか?
2
+
3
+
4
+
5
+
6
+
7
+
4
8
 
5
9
 
6
10
 

3

文章を編集しました。

2021/02/12 02:04

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,30 @@
1
1
  提示画像ですがなぜ文字が表示されないのでしょうか?描画は出来ているみたいですが描画文字であるAAAAAが表示されない原因が知りたいです。
2
2
 
3
- コンストラクタ部がで何かしている見たいなのですがこれは何が悪いのでしょうか?
3
+ コンストラクタ部がで何かしている見たいなのですがこれは何が悪いのでしょうか?現状アルファベットのみ描画出来るみたいなのですが日本語を含め描画出来ません。描画はされているため初期化が悪いのでしょうか?
4
+
5
+
6
+
7
+ 試したこと「
8
+
9
+ エラーを表示させました。
10
+
11
+ 参考サイトを参考にコードを組みました。
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+ 参考サイト freetype: https://www.freetype.org/freetype2/docs/reference/ft2-error_code_values.html
20
+
21
+ 参考サイト learn opengl : https://learnopengl.com/In-Practice/Text-Rendering
22
+
23
+
24
+
25
+
26
+
27
+
4
28
 
5
29
 
6
30
 
@@ -8,10 +32,182 @@
8
32
 
9
33
 
10
34
 
35
+ ```hpp
36
+
37
+ #ifndef ___TEXT_HPP_
38
+
39
+ #define ___TEXT_HPP_
40
+
41
+
42
+
43
+
44
+
45
+ //標準ヘッダー
46
+
47
+ #include <iostream>
48
+
49
+ #include <string>
50
+
51
+ #include <map>
52
+
53
+
54
+
55
+ //自作ヘッダー
56
+
57
+ #include "Entry.hpp"
58
+
59
+ #include "Shader.hpp"
60
+
61
+ #include "Transform_2D.hpp"
62
+
63
+
64
+
65
+ //OpenGL 関係
66
+
67
+ #include "GLEW/include/GL/glew.h"
68
+
69
+ #include "gl/GL.h"
70
+
71
+ #include "GLFW/include/GLFW/glfw3.h"
72
+
73
+
74
+
75
+ //数学ライブラリ
76
+
77
+ #include "glm/glm.hpp"
78
+
79
+ #include "glm/gtx/euler_angles.hpp"
80
+
81
+ #include "glm/gtx/quaternion.hpp"
82
+
83
+
84
+
85
+
86
+
87
+ //FreeType 関係
88
+
89
+ #include "ft2build.h"
90
+
91
+ #include FT_FREETYPE_H
92
+
93
+ #include "freetype/fterrors.h" //エラーライブラリ
94
+
95
+ #undef FTERRORS_H_
96
+
97
+ #define FT_ERRORDEF( e, v, s ) { e, s },
98
+
99
+ #define FT_ERROR_START_LIST {
100
+
101
+ #define FT_ERROR_END_LIST { 0, NULL } };
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+ //前方宣言
110
+
111
+ class Entry;
112
+
113
+ //class Transform_2D;
114
+
115
+
116
+
117
+ /*###############################################################################################################
118
+
119
+ # 文字描画
120
+
121
+ #################################################################################################################*/
122
+
123
+
124
+
125
+ class Text : public Transform_2D
126
+
127
+ {
128
+
129
+ public:
130
+
131
+ Text(Entry* g);
132
+
133
+ ~Text();
134
+
135
+ //文字レンダリング
136
+
137
+ //座標、大きさ、色、文字
138
+
139
+ void RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...);
140
+
141
+
142
+
143
+ private:
144
+
145
+
146
+
147
+ //char str[10000];
148
+
149
+
150
+
151
+ struct Character {
152
+
153
+ unsigned int TextureID; // ID handle of the glyph texture
154
+
155
+ glm::ivec2 Size; // Size of glyph
156
+
157
+ glm::ivec2 Bearing; // Offset from baseLine_2D to left/top of glyph
158
+
159
+ unsigned int Advance; // Horizontal offset to advance to next glyph
160
+
161
+ };
162
+
163
+
164
+
165
+ FT_Library ft;
166
+
167
+ FT_Face face;
168
+
169
+ std::map<GLchar, Character> Characters;
170
+
171
+ unsigned int VAO, VBO;
172
+
173
+ unsigned int texture = 0;
174
+
175
+
176
+
177
+
178
+
179
+ // Shader* ShaderProgram;
180
+
181
+ std::unique_ptr<Shader> ShaderProgram;
182
+
183
+
184
+
185
+
186
+
187
+ Entry* Owner;
188
+
189
+
190
+
191
+ };
192
+
193
+
194
+
195
+
196
+
197
+ #endif
198
+
199
+ ```
200
+
11
201
 
12
202
 
13
203
  ```cpp
14
204
 
205
+ #include "../Header/Text.hpp"
206
+
207
+
208
+
209
+
210
+
15
211
 
16
212
 
17
213
  /*****************************************************************************************************************
@@ -34,127 +230,325 @@
34
230
 
35
231
  // シェーダープログラム
36
232
 
37
- ShaderProgram = std::make_unique<Shader>(g,"Shader/2D/Text.vert","Shader/2D/Text.frag");
233
+ ShaderProgram = std::make_unique<Shader>(g, "Shader/2D/Text.vert", "Shader/2D/Text.frag");
234
+
235
+
236
+
237
+ FT_Error fe[100] = { 0 }; //エラー配列
238
+
239
+
240
+
241
+ //FreeTypeを初期化
242
+
243
+ fe[0] = FT_Init_FreeType(&ft);
244
+
245
+
246
+
247
+ //利用フォント
248
+
249
+ std::string font_name = "C:/Windows/Fonts/msgothic.ttc";
250
+
251
+
252
+
253
+ //フォントを読み込む
254
+
255
+ fe[1] = FT_New_Face(ft, font_name.c_str(), 0, &face);
256
+
257
+
258
+
259
+ //ピクセルの大きさを指定する。
260
+
261
+ fe[2] = FT_Set_Pixel_Sizes(face, 0, 25);
262
+
263
+
264
+
265
+ //ピクセルストレージモードを設定する
266
+
267
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
268
+
269
+
270
+
271
+ // エラー表示
272
+
273
+ for (int i = 0; i < 100; i++)
274
+
275
+ {
276
+
277
+ if (fe[i] != 0)
278
+
279
+ {
280
+
281
+ printf("%d\n",fe[i]);
282
+
283
+ }
284
+
285
+
286
+
287
+ }
288
+
289
+
290
+
291
+
292
+
293
+ //テクスチャを生成する
294
+
295
+ glGenTextures(1, &texture);
296
+
297
+ glBindTexture(GL_TEXTURE_2D, texture);
298
+
299
+
300
+
301
+ //128文字のASCIIを読み込み
302
+
303
+ for (unsigned char c = 0; c < 128; c++)
304
+
305
+ {
306
+
307
+ // 文字のグリフをロードする
308
+
309
+ if (FT_Load_Char(face, c, FT_LOAD_RENDER))
310
+
311
+ {
312
+
313
+ std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl;
314
+
315
+ continue;
316
+
317
+ }
318
+
319
+
320
+
321
+
322
+
323
+ glTexImage2D(
324
+
325
+ GL_TEXTURE_2D,
326
+
327
+ 0,
328
+
329
+ GL_RED,
330
+
331
+ face->glyph->bitmap.width,
332
+
333
+ face->glyph->bitmap.rows,
334
+
335
+ 0,
336
+
337
+ GL_RED,
338
+
339
+ GL_UNSIGNED_BYTE,
340
+
341
+ face->glyph->bitmap.buffer
342
+
343
+ );
344
+
345
+
346
+
347
+ //テクスチャ設定
348
+
349
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
350
+
351
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
352
+
353
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
354
+
355
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
356
+
357
+
358
+
359
+ //現在の文字情報を格納
360
+
361
+ Character character = {
362
+
363
+ texture,
364
+
365
+ glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
366
+
367
+ glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
368
+
369
+ static_cast<unsigned int>(face->glyph->advance.x)
370
+
371
+ };
372
+
373
+ Characters.insert(std::pair<char, Character>(c, character));
374
+
375
+
38
376
 
39
377
 
40
378
 
41
- FT_Error fe[100]; //エラー配列
42
-
43
-
44
-
45
- //FreeTypeを初期化
46
-
47
- fe[0] = FT_Init_FreeType(&ft);
48
-
49
-
50
-
51
- //利用フォント
52
-
53
- std::string font_name = "C:/Windows/Fonts/msgothic.ttc";
54
-
55
-
56
-
57
- //フォントを読み込む
58
-
59
- fe[1] = FT_New_Face(ft, font_name.c_str(), 0, &face);
60
-
61
-
62
-
63
- //ピクセルの大きさを指定する。
64
-
65
- fe[2] = FT_Set_Pixel_Sizes(face, 0, 25);
66
-
67
-
68
-
69
- //ピクセルストレージモードを設定する
70
-
71
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
72
-
73
-
74
-
75
-
76
-
77
- //テクスチャを生成する
78
-
79
- glGenTextures(1, &texture);
80
-
81
- glBindTexture(GL_TEXTURE_2D, texture);
82
-
83
-
84
-
85
- //128文字のASCIIを読み込み
86
-
87
- for (unsigned char c = 0; c < 128; c++)
379
+
380
+
381
+ }
382
+
383
+
384
+
385
+ //FreeTypeの終了処理
386
+
387
+ FT_Done_Face(face);
388
+
389
+ FT_Done_FreeType(ft);
390
+
391
+
392
+
393
+ //VAO
394
+
395
+ glGenVertexArrays(1, &VAO);
396
+
397
+ glBindVertexArray(VAO);
398
+
399
+
400
+
401
+ //VBO
402
+
403
+ glGenBuffers(1, &VBO);
404
+
405
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
406
+
407
+
408
+
409
+ //
410
+
411
+ glEnableVertexAttribArray(0);
412
+
413
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
414
+
415
+
416
+
417
+ //
418
+
419
+ glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
420
+
421
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
422
+
423
+ }
424
+
425
+
426
+
427
+
428
+
429
+ //文字を表示
430
+
431
+ void Text::RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...)
432
+
433
+ {
434
+
435
+ //文字を生成
436
+
437
+ std::string text; //生成した文字を格納
438
+
439
+ va_list ap;
440
+
441
+ char str[10000];
442
+
443
+ va_start(ap, format);
444
+
445
+ vsprintf_s(str, sizeof(str), format, ap);
446
+
447
+ va_end(ap);
448
+
449
+ text = std::string(str);
450
+
451
+
452
+
453
+
454
+
455
+ //シェーダー
456
+
457
+ ShaderProgram->Enable(); //アクティブにする
458
+
459
+ ShaderProgram->SetFloatUniform_3m("uViewMatrix", Transform_2D::getViewMatrix()); //ビュー行列
460
+
461
+ ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); //ワール行列
462
+
463
+ ShaderProgram->SetFloatUniform_3f("uTextColor", color); //色を設定 RGB
464
+
465
+
466
+
467
+ Transform_2D::setTransform_Move(glm::vec2(x, y)); //座標
468
+
469
+ Transform_2D::UpdateTransform(); //
470
+
471
+
472
+
473
+ glActiveTexture(GL_TEXTURE0);
474
+
475
+
476
+
477
+ std::string::const_iterator itr;
478
+
479
+ for (itr = text.begin(); itr != text.end(); itr++)
88
480
 
89
481
  {
90
482
 
483
+ Character ch = (Character)Characters[*itr];
484
+
485
+
486
+
91
- // 文字のグリフをロードする
487
+ float w = ch.Size.x * scale;
488
+
92
-
489
+ float h = ch.Size.y * scale;
490
+
491
+
492
+
93
- if (FT_Load_Char(face, c, FT_LOAD_RENDER))
493
+ float xpos = (x + (ch.Bearing.x * scale));
94
-
95
- {
494
+
96
-
97
- std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl;
98
-
99
- continue;
100
-
101
- }
102
-
103
-
104
-
105
-
106
-
107
- glTexImage2D(
108
-
109
- GL_TEXTURE_2D,
110
-
111
- 0,
112
-
113
- GL_RED,
114
-
115
- face->glyph->bitmap.width,
116
-
117
- face->glyph->bitmap.rows,
118
-
119
- 0,
120
-
121
- GL_RED,
122
-
123
- GL_UNSIGNED_BYTE,
124
-
125
- face->glyph->bitmap.buffer
126
-
127
- );
128
-
129
-
130
-
131
- //テクスチャ設定
132
-
133
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
134
-
135
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
136
-
137
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
495
+ float ypos = (y - ((ch.Size.y - ch.Bearing.y) * scale));
138
-
139
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
496
+
140
-
141
-
142
-
497
+
498
+
143
- //現在の文字情報を格納
499
+ //頂点情報を書き換え
144
-
500
+
145
- Character character = {
501
+ float vertices[6][4] = {
146
-
147
- texture,
502
+
148
-
149
- glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
150
-
151
- glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
152
-
153
- static_cast<unsigned int>(face->glyph->advance.x)
503
+ { xpos , ypos + h, 0.0f, 0.0f },
504
+
505
+ { xpos, ypos, 0.0f, 1.0f },
506
+
507
+ { xpos + w, ypos, 1.0f, 1.0f },
508
+
509
+
510
+
511
+ { xpos, ypos + h, 0.0f, 0.0f },
512
+
513
+ { xpos + w, ypos, 1.0f, 1.0f },
514
+
515
+ { xpos + w, ypos + h, 1.0f, 0.0f }
154
516
 
155
517
  };
156
518
 
519
+
520
+
521
+
522
+
523
+
524
+
525
+ //テクスチャを設定
526
+
527
+ glBindTexture(GL_TEXTURE_2D, ch.TextureID);
528
+
529
+ glBindVertexArray(VAO);
530
+
531
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
532
+
533
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+ // ポリゴンをレンダリング
542
+
543
+ glDrawArrays(GL_TRIANGLES, 0, 6);
544
+
545
+
546
+
547
+
548
+
157
- Characters.insert(std::pair<char, Character>(c, character));
549
+ x += (ch.Advance >> 6) * scale; // 次のグリフにカーソルを進める
550
+
551
+ }
158
552
 
159
553
 
160
554
 
@@ -162,209 +556,47 @@
162
556
 
163
557
 
164
558
 
165
- }
166
-
167
-
168
-
169
- //FreeTypeの終了処理
170
-
171
- FT_Done_Face(face);
172
-
173
- FT_Done_FreeType(ft);
174
-
175
-
176
-
177
- //VAO
178
-
179
- glGenVertexArrays(1, &VAO);
180
-
181
- glBindVertexArray(VAO);
182
-
183
-
184
-
185
- //VBO
186
-
187
- glGenBuffers(1, &VBO);
188
-
189
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
190
-
191
-
192
-
193
- //
194
-
195
- glEnableVertexAttribArray(0);
196
-
197
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
198
-
199
-
200
-
201
- //
202
-
203
- glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
204
-
205
- // glBindBuffer(GL_ARRAY_BUFFER, 0);
206
-
207
559
  }
208
560
 
209
561
 
210
562
 
211
563
 
212
564
 
213
- //文字を表示
565
+ Text::~Text()
214
-
215
- void Text::RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...)
216
566
 
217
567
  {
218
568
 
219
- //文字を生成
220
-
221
- std::string text; //生成した文字を格納
222
-
223
- va_list ap;
224
-
225
- char str[10000];
226
-
227
- va_start(ap, format);
228
-
229
- vsprintf_s(str, sizeof(str), format, ap);
230
-
231
- va_end(ap);
232
-
233
- text = std::string(str);
234
-
235
-
236
-
237
-
238
-
239
- //シェーダー
240
-
241
- ShaderProgram->Enable(); //アクティブにする
242
-
243
- ShaderProgram->SetFloatUniform_3m("uViewMatrix", Transform_2D::getViewMatrix()); //ビュー行列
244
-
245
- ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); //ワール行列
246
-
247
- ShaderProgram->SetFloatUniform_3f("uTextColor", color); //色を設定 RGB
248
-
249
-
250
-
251
- Transform_2D::setTransform_Move(glm::vec2(x, y)); //座標
252
-
253
- Transform_2D::UpdateTransform(); //
254
-
255
-
256
-
257
- glActiveTexture(GL_TEXTURE0);
258
-
259
-
260
-
261
- std::string::const_iterator itr;
262
-
263
- for (itr = text.begin(); itr != text.end(); itr++)
264
-
265
- {
266
-
267
- Character ch = (Character)Characters[*itr];
268
-
269
-
270
-
271
- float w = ch.Size.x * scale;
272
-
273
- float h = ch.Size.y * scale;
274
-
275
-
276
-
277
- float xpos = (x + (ch.Bearing.x * scale));
278
-
279
- float ypos = (y - ((ch.Size.y - ch.Bearing.y) * scale));
280
-
281
-
282
-
283
- //頂点情報を書き換え
284
-
285
- float vertices[6][4] = {
286
-
287
- { xpos , ypos + h, 0.0f, 0.0f },
288
-
289
- { xpos, ypos, 0.0f, 1.0f },
290
-
291
- { xpos + w, ypos, 1.0f, 1.0f },
292
-
293
-
294
-
295
- { xpos, ypos + h, 0.0f, 0.0f },
296
-
297
- { xpos + w, ypos, 1.0f, 1.0f },
298
-
299
- { xpos + w, ypos + h, 1.0f, 0.0f }
300
-
301
- };
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
- //テクスチャを設定
310
-
311
- glBindTexture(GL_TEXTURE_2D, ch.TextureID);
569
+ glBindTexture(GL_TEXTURE_2D, 0);
312
-
570
+
313
- glBindVertexArray(VAO);
571
+ glDeleteTextures(1, &texture);
314
-
572
+
573
+
574
+
315
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
575
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
316
-
576
+
317
- glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //
577
+ glDeleteBuffers(1, &VBO);
318
-
319
-
320
-
321
-
322
-
323
-
324
-
578
+
579
+
580
+
325
- // ポリゴンをレンダリング
581
+ glBindVertexArray(0);
326
-
582
+
327
- glDrawArrays(GL_TRIANGLES, 0, 6);
583
+ glDeleteVertexArrays(1, &VAO);
328
-
329
-
330
-
331
-
332
-
333
- x += (ch.Advance >> 6) * scale; // 次のグリフにカーソルを進める
334
-
335
- }
336
-
337
-
338
-
339
-
340
-
341
-
342
584
 
343
585
  }
344
586
 
345
-
587
+ ```
588
+
589
+
590
+
346
-
591
+ ```cpp
347
-
348
-
592
+
349
- Text::~Text()
593
+ void Scene::Draw()
350
-
594
+
351
- {
595
+ {
352
-
353
- glBindTexture(GL_TEXTURE_2D, 0);
596
+
354
-
355
- glDeleteTextures(1, &texture);
356
-
357
-
358
-
359
- glBindBuffer(GL_ARRAY_BUFFER, 0);
360
-
361
- glDeleteBuffers(1, &VBO);
362
-
363
-
364
-
365
- glBindVertexArray(0);
597
+ Text a(Owner);
366
-
598
+
367
- glDeleteVertexArrays(1, &VAO);
599
+ a.RenderText(0,0,2.0,glm::vec3(1,0,0),"AAAAAAAAAAAAAAAAA");
368
600
 
369
601
  }
370
602
 

2

文章を修正

2021/02/12 01:25

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- OpenGL テキストレンダリングで文字が正常に描画出来ない理由が知りたい。
1
+ OpenGL テキストレンダリングで文字が正常に描画出来ない理由が知りたい。
test CHANGED
@@ -1,6 +1,8 @@
1
+ 提示画像ですがなぜ文字が表示されないのでしょうか?描画は出来ているみたいですが描画文字であるAAAAAが表示されない原因が知りたいです。
2
+
1
- 提示ードですが提示画像ようなテキスト描画にってしまうのですがどうすば正常に描画出来るのでしょか?
3
+ ストラクタ部がで何かしている見たいなのですがは何が悪いのでしょか?
2
-
3
- "AAAAA"という引数がRenderText()関数の引数になるのですがなぜ描画がおかしくなるのでしょうか?原因がどうしてもわかりません
4
+
5
+
4
6
 
5
7
  ![イメージ説明](47eba3351fbcd3cefdd8bb769cca83bc.jpeg)
6
8
 

1

文章を修正

2021/02/12 00:08

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- OpenGL テキストがレンダリング出来ない理由が知りたい。
1
+ OpenGL テキストがレンダリングで文字が正常に描画出来ない理由が知りたい。
test CHANGED
@@ -1,17 +1,15 @@
1
+ 提示コードですが提示画像ようなテキスト描画になってしまうのですがどうすれば正常に描画出来るのでしょか?
2
+
1
- 提示コードのRenderText()関数コメント内部コードですがなぜ描画されのでしょうか? よく考えましたがどうしてもわかりませんどうすればいいのでしょうか?
3
+ "AAAAA"という引数がRenderText()関数の引数になるのですがなぜ描画がおかしくのでしょうか?原因がどうしてもわかりません
2
-
4
+
3
- 参考サト: https://learnopengl.com/In-Practice/Text-Rendering
5
+ ![メージ説明](47eba3351fbcd3cefdd8bb769cca83bc.jpeg)
6
+
7
+
4
8
 
5
9
 
6
10
 
7
11
  ```cpp
8
12
 
9
- #include "../Header/Text.hpp"
10
-
11
-
12
-
13
-
14
-
15
13
 
16
14
 
17
15
  /*****************************************************************************************************************
@@ -34,8 +32,6 @@
34
32
 
35
33
  // シェーダープログラム
36
34
 
37
- // ShaderProgram = new Shader(g, "Shader/2D/Text.vert", "Shader/2D/Text.frag");
38
-
39
35
  ShaderProgram = std::make_unique<Shader>(g,"Shader/2D/Text.vert","Shader/2D/Text.frag");
40
36
 
41
37
 
@@ -168,16 +164,6 @@
168
164
 
169
165
 
170
166
 
171
-
172
-
173
- //開放
174
-
175
- // glBindTexture(GL_TEXTURE_2D, 0);
176
-
177
- // glDeleteTextures(1, &texture);
178
-
179
-
180
-
181
167
  //FreeTypeの終了処理
182
168
 
183
169
  FT_Done_Face(face);
@@ -214,176 +200,170 @@
214
200
 
215
201
  glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
216
202
 
203
+ // glBindBuffer(GL_ARRAY_BUFFER, 0);
204
+
205
+ }
206
+
207
+
208
+
209
+
210
+
211
+ //文字を表示
212
+
213
+ void Text::RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...)
214
+
215
+ {
216
+
217
+ //文字を生成
218
+
219
+ std::string text; //生成した文字を格納
220
+
221
+ va_list ap;
222
+
223
+ char str[10000];
224
+
225
+ va_start(ap, format);
226
+
227
+ vsprintf_s(str, sizeof(str), format, ap);
228
+
229
+ va_end(ap);
230
+
231
+ text = std::string(str);
232
+
233
+
234
+
235
+
236
+
237
+ //シェーダー
238
+
239
+ ShaderProgram->Enable(); //アクティブにする
240
+
241
+ ShaderProgram->SetFloatUniform_3m("uViewMatrix", Transform_2D::getViewMatrix()); //ビュー行列
242
+
243
+ ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); //ワール行列
244
+
245
+ ShaderProgram->SetFloatUniform_3f("uTextColor", color); //色を設定 RGB
246
+
247
+
248
+
249
+ Transform_2D::setTransform_Move(glm::vec2(x, y)); //座標
250
+
251
+ Transform_2D::UpdateTransform(); //
252
+
253
+
254
+
255
+ glActiveTexture(GL_TEXTURE0);
256
+
257
+
258
+
259
+ std::string::const_iterator itr;
260
+
261
+ for (itr = text.begin(); itr != text.end(); itr++)
262
+
263
+ {
264
+
265
+ Character ch = (Character)Characters[*itr];
266
+
267
+
268
+
269
+ float w = ch.Size.x * scale;
270
+
271
+ float h = ch.Size.y * scale;
272
+
273
+
274
+
275
+ float xpos = (x + (ch.Bearing.x * scale));
276
+
277
+ float ypos = (y - ((ch.Size.y - ch.Bearing.y) * scale));
278
+
279
+
280
+
281
+ //頂点情報を書き換え
282
+
283
+ float vertices[6][4] = {
284
+
285
+ { xpos , ypos + h, 0.0f, 0.0f },
286
+
287
+ { xpos, ypos, 0.0f, 1.0f },
288
+
289
+ { xpos + w, ypos, 1.0f, 1.0f },
290
+
291
+
292
+
293
+ { xpos, ypos + h, 0.0f, 0.0f },
294
+
295
+ { xpos + w, ypos, 1.0f, 1.0f },
296
+
297
+ { xpos + w, ypos + h, 1.0f, 0.0f }
298
+
299
+ };
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+ //テクスチャを設定
308
+
309
+ glBindTexture(GL_TEXTURE_2D, ch.TextureID);
310
+
311
+ glBindVertexArray(VAO);
312
+
313
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
314
+
315
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+ // ポリゴンをレンダリング
324
+
325
+ glDrawArrays(GL_TRIANGLES, 0, 6);
326
+
327
+
328
+
329
+
330
+
331
+ x += (ch.Advance >> 6) * scale; // 次のグリフにカーソルを進める
332
+
333
+ }
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+ }
342
+
343
+
344
+
345
+
346
+
347
+ Text::~Text()
348
+
349
+ {
350
+
351
+ glBindTexture(GL_TEXTURE_2D, 0);
352
+
353
+ glDeleteTextures(1, &texture);
354
+
355
+
356
+
217
357
  glBindBuffer(GL_ARRAY_BUFFER, 0);
218
358
 
219
-
359
+ glDeleteBuffers(1, &VBO);
360
+
361
+
362
+
363
+ glBindVertexArray(0);
364
+
365
+ glDeleteVertexArrays(1, &VAO);
220
366
 
221
367
  }
222
368
 
223
-
224
-
225
-
226
-
227
- //文字を表示
228
-
229
- void Text::RenderText(float x, float y, float scale, glm::vec3 color, const char* format, ...)
230
-
231
- {
232
-
233
- //文字を生成
234
-
235
- std::string text; //生成した文字を格納
236
-
237
- va_list ap;
238
-
239
- char str[10000];
240
-
241
- va_start(ap, format);
242
-
243
- vsprintf_s(str, sizeof(str), format, ap);
244
-
245
- va_end(ap);
246
-
247
- text = std::string(str);
248
-
249
-
250
-
251
-
252
-
253
- //シェーダー
254
-
255
- ShaderProgram->Enable(); //アクティブにする
256
-
257
- ShaderProgram->SetFloatUniform_3m("uViewMatrix", Transform_2D::getViewMatrix()); //ビュー行列
258
-
259
- ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); //ワール行列
260
-
261
- ShaderProgram->SetFloatUniform_3f("uTextColor", color); //色を設定 RGB
262
-
263
-
264
-
265
- Transform_2D::setTransform_Move(glm::vec2(x, y)); //座標
266
-
267
- Transform_2D::UpdateTransform(); //
268
-
269
-
270
-
271
- glActiveTexture(GL_TEXTURE0);
272
-
273
-
274
-
275
- std::string::const_iterator itr;
276
-
277
- for (itr = text.begin(); itr != text.end(); itr++)
278
-
279
- {
280
-
281
- Character ch = (Character)Characters[*itr];
282
-
283
-
284
-
285
- float w = ch.Size.x * scale;
286
-
287
- float h = ch.Size.y * scale;
288
-
289
-
290
-
291
- float xpos = (x + (ch.Bearing.x * scale));
292
-
293
- float ypos = (y - ((ch.Size.y - ch.Bearing.y) * scale));
294
-
295
-
296
-
297
- //頂点情報を書き換え
298
-
299
- float vertices[6][4] = {
300
-
301
- { xpos , ypos + h, 0.0f, 0.0f },
302
-
303
- { xpos, ypos, 0.0f, 1.0f },
304
-
305
- { xpos + w, ypos, 1.0f, 1.0f },
306
-
307
-
308
-
309
- { xpos, ypos + h, 0.0f, 0.0f },
310
-
311
- { xpos + w, ypos, 1.0f, 1.0f },
312
-
313
- { xpos + w, ypos + h, 1.0f, 0.0f }
314
-
315
- };
316
-
317
-
318
-
319
-
320
-
321
- //////////////////////////////////////////////////////////////////////////////
322
-
323
- //テクスチャを設定
324
-
325
- glBindTexture(GL_TEXTURE_2D, ch.TextureID);
326
-
327
- glBindVertexArray(VAO);
328
-
329
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
330
-
331
- glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //
332
-
333
- /////////////////////////////////////////////////////////////////////////////
334
-
335
-
336
-
337
- // ポリゴンをレンダリング
338
-
339
- glDrawArrays(GL_TRIANGLES, 0, 6);
340
-
341
-
342
-
343
-
344
-
345
- x += (ch.Advance>> 6) * scale; // 次のグリフにカーソルを進める
346
-
347
- }
348
-
349
-
350
-
351
-
352
-
353
-
354
-
355
- }
356
-
357
-
358
-
359
-
360
-
361
- Text::~Text()
362
-
363
- {
364
-
365
- glBindTexture(GL_TEXTURE_2D, 0);
366
-
367
- glDeleteTextures(1, &texture);
368
-
369
-
370
-
371
- glBindBuffer(GL_ARRAY_BUFFER, 0);
372
-
373
- glDeleteBuffers(1, &VAO);
374
-
375
-
376
-
377
- glBindVertexArray(0);
378
-
379
- glDeleteVertexArrays(1, &VAO);
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
- }
388
-
389
369
  ```