質問編集履歴

1

文章とタイトルを修正

2021/07/07 03:16

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 全ての描画で頂点を共有するコードを方法が知りた
1
+ 全ての描画で共有する頂点コードで頂点とカメラクラスstatic にす行為は正しのかどうか?
test CHANGED
@@ -1,18 +1,12 @@
1
- 提示コードですがSprite クスはRenderクラスを継承してい
1
+ 提示コードですが頂点情報を全ての描画物で共有してメモリを節約したいのでカメラクラスのstatic 変数で定義しているのでがこれは実装としてありなのでしょうか?正解なのでしょうか?
2
-
2
+
3
+
4
+
3
- 質問 [ 全てのスプライトや矩形描画、円描画、等で頂点情報使いまわしてメモリ節約す方法知りた。 ]
5
+ またスプライトクラスのコンストラクタ引数で頂点属性のタイプ取得して法線がるときない時で処理分け必要あるので引数に取ってるんのですがこれは正しいのでしょうか?
4
-
6
+
7
+
8
+
5
- どういっやり方を用れば頂点数をべての描画物で節約出来るのでしょうか?
9
+ プログラミングに正解はないとよく聞きまがこの実装は回りくいのかどか知りたい
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
10
 
17
11
 
18
12
 
@@ -20,242 +14,558 @@
20
14
 
21
15
  ```cpp
22
16
 
23
- #ifndef ___SPRITE_2D_HPP_
24
-
25
- #define ___SPRITE_2D_HPP_
26
-
27
-
28
-
29
- #include <iostream>
30
-
31
- #include <fstream>
32
-
33
-
34
-
35
- #include <glew/include/GL/glew.h>
36
-
37
- #include <glm/glm.hpp>
38
-
39
- #include "glm/glm.hpp"
40
-
41
- #include "glm/gtc/matrix_Transform.hpp"
42
-
43
- #include "glm/gtx/Transform.hpp"
44
-
45
-
46
-
47
- #include "Render.hpp"
17
+ #include "Sprite.hpp"
48
-
49
- #include "VertexData.hpp"
18
+
50
-
51
- #include "Resource.hpp"
19
+
52
-
53
-
54
-
20
+
21
+
22
+
23
+
24
+
55
- /*#########################################################################
25
+ // ##################################### コンストラクタ #####################################
56
-
57
- # スプライトクラス
26
+
58
-
59
-
60
-
61
- 説明
62
-
63
- 2Dのテクスチャ描画 正射形
64
-
65
- ###########################################################################*/
27
+ FrameWork::Sprite::Sprite(FrameWork::Vertex::Attribute type, const char* vert, const char* frag) : Render_2D()
66
-
67
-
68
-
69
- /*#########################################################################
28
+
70
-
71
- *NOTE
72
-
73
- *
74
-
75
- * 頂点の順番
76
-
77
- * 0 2,3
78
-
79
- * 1,4 5
80
-
81
- ###########################################################################*/
82
-
83
-
84
-
85
- namespace FrameWork
86
-
87
- {
29
+ {
88
-
89
- class Window;
30
+
90
-
91
-
92
-
93
- //頂点配列を指定
94
-
95
-
96
-
97
- class Sprite : public FrameWork::Render_2D
31
+ shader = std::make_shared<FrameWork::Shader>(); //シェーダー
32
+
33
+
34
+
35
+ if (vert == NULL || frag == NULL)
98
36
 
99
37
  {
100
38
 
101
-
102
-
103
- public:
104
-
105
-
106
-
107
- Sprite(FrameWork::Vertex::Attribute type = FrameWork::Vertex::Attribute::UV, const char* vert = NULL, const char* frag = NULL); // コンストラクタ
108
-
109
- ~Sprite(); // デストラクタ
110
-
111
-
112
-
113
- void InputTexture(std::shared_ptr<FrameWork::Resource::Texture> tex); // テクスチャ 設定
114
-
115
- void setNormal(glm::vec3 normal[6]); // 法線 設定
116
-
117
- void setAttribute(std::vector<Vertex::ALL_2D>& vertex); // 頂点属性 編集
118
-
119
- void setUnBind(); // バインド 無効
120
-
121
- void setBind(); // バインド 有効
122
-
123
- void setDraw(glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end); // 描画 設定
124
-
125
-
126
-
127
- private:
128
-
129
-
130
-
131
- //テクスチャ
132
-
133
- typedef struct
134
-
135
- {
136
-
137
- glm::vec2 size; //画像サイズ
138
-
139
- int unitNumber; //ユニットナンバー
140
-
141
- GLuint ID; //ID
142
-
143
- std::shared_ptr<byte> file; //テクスチャ
144
-
145
- }Texture;
146
-
147
-
148
-
149
- //テクスチャ範囲
150
-
151
- glm::vec2 startSize; //始点
152
-
153
- glm::vec2 endSize; //終点
154
-
155
-
156
-
157
- std::vector<Texture> texture; //テクスチャデータ
158
-
159
- int textureNumber = 0; //描画テクスチャナンバー
160
-
161
-
162
-
163
- glm::vec3 attributeNormal[6]; //法線
164
-
165
- };
166
-
167
- }
168
-
169
- #endif
39
+ shader->Input(FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicTexture_vert), FrameWork::Resource::getShader(FrameWork::Resource::Asset::shader_BasicTexture_frag));
40
+
41
+ }
42
+
43
+ else
44
+
45
+ {
46
+
47
+ shader->Input((char*)vert,(char*)frag);
48
+
49
+ }
50
+
51
+
52
+
53
+ vertex = FrameWork::Camera_2D::getVertexAttribute(); //頂点属性を取得
54
+
55
+ vertex->resize(6);
56
+
57
+ if (type == FrameWork::Vertex::Attribute::UV)
58
+
59
+ {
60
+
61
+ //頂点
62
+
63
+ GLint attrib = shader->getAttribLocation("vertexPosition");
64
+
65
+ glEnableVertexAttribArray(attrib);
66
+
67
+ glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW);
68
+
69
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0);
70
+
71
+ shader->setBindAttribLocation("vertexPosition");
72
+
73
+
74
+
75
+ //UV
76
+
77
+ attrib = shader->getAttribLocation("vertexUV");
78
+
79
+ glEnableVertexAttribArray(attrib);
80
+
81
+ glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW);
82
+
83
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2));
84
+
85
+ shader->setBindAttribLocation("vertexUV");
86
+
87
+
88
+
89
+ }
90
+
91
+ else if (type == FrameWork::Vertex::Attribute::Normal)
92
+
93
+ {
94
+
95
+ //頂点
96
+
97
+ GLint attrib = shader->getAttribLocation("vertexPosition");
98
+
99
+ glEnableVertexAttribArray(attrib);
100
+
101
+ glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW);
102
+
103
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0);
104
+
105
+ shader->setBindAttribLocation("vertexPosition");
106
+
107
+
108
+
109
+ //UV
110
+
111
+ attrib = shader->getAttribLocation("vertexUV");
112
+
113
+ glEnableVertexAttribArray(attrib);
114
+
115
+ glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW);
116
+
117
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2));
118
+
119
+ shader->setBindAttribLocation("vertexUV");
120
+
121
+
122
+
123
+ //Normal
124
+
125
+ attrib = shader->getAttribLocation("vertexNormal");
126
+
127
+ glEnableVertexAttribArray(attrib);
128
+
129
+ glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(Vertex::ALL_2D), vertex->data(), GL_DYNAMIC_DRAW);
130
+
131
+ glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 4));
132
+
133
+ shader->setBindAttribLocation("vertexNormal");
134
+
135
+
136
+
137
+
138
+
139
+ }
140
+
141
+
142
+
143
+ texture.resize(0); //テクスチャデータ
144
+
145
+ }
146
+
147
+
148
+
149
+ // ##################################### テクスチャ 設定 #####################################
150
+
151
+ void FrameWork::Sprite::InputTexture(std::shared_ptr<FrameWork::Resource::Texture> tex)
152
+
153
+ {
154
+
155
+ //文字数の関係
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+
163
+ // ##################################### 頂点属性 #####################################
164
+
165
+
166
+
167
+ void FrameWork::Sprite::setAttribute()
168
+
169
+ {
170
+
171
+
172
+
173
+ // 頂点座標
174
+
175
+ vertex->at(0).position[0] = -0.5f;
176
+
177
+ vertex->at(0).position[1] = 0.5f;
178
+
179
+
180
+
181
+ vertex->at(1).position[0] = -0.5f;
182
+
183
+ vertex->at(1).position[1] = -0.5f;
184
+
185
+
186
+
187
+ vertex->at(2).position[0] = 0.5f;
188
+
189
+ vertex->at(2).position[1] = 0.5f;
190
+
191
+
192
+
193
+ vertex->at(3).position[0] = 0.5f;
194
+
195
+ vertex->at(3).position[1] = 0.5f;
196
+
197
+
198
+
199
+ vertex->at(4).position[0] = -0.5f;
200
+
201
+ vertex->at(4).position[1] = -0.5f;
202
+
203
+
204
+
205
+ vertex->at(5).position[0] = 0.5f;
206
+
207
+ vertex->at(5).position[1] = -0.5f;
208
+
209
+
210
+
211
+ //UV座標
212
+
213
+ float sizeX = 1.0f / (float)texture.at(textureNumber).size.x;
214
+
215
+ float sizeY = 1.0f / (float)texture.at(textureNumber).size.y;
216
+
217
+
218
+
219
+ vertex->at(0).uv[0] = sizeX * startSize.x;
220
+
221
+ vertex->at(0).uv[1] = sizeY * endSize.y;
222
+
223
+
224
+
225
+ vertex->at(1).uv[0] = sizeX * startSize.x;
226
+
227
+
228
+
229
+ vertex->at(1).uv[1] = sizeY * startSize.y;
230
+
231
+
232
+
233
+ vertex->at(4).uv[0] = sizeX * startSize.x;
234
+
235
+ vertex->at(4).uv[1] = sizeY * startSize.y;
236
+
237
+
238
+
239
+ vertex->at(2).uv[0] = sizeX * endSize.x;
240
+
241
+ vertex->at(2).uv[1] = sizeY * endSize.y;
242
+
243
+
244
+
245
+ vertex->at(3).uv[0] = sizeX * endSize.x;
246
+
247
+ vertex->at(3).uv[1] = sizeY * endSize.y;
248
+
249
+
250
+
251
+ vertex->at(5).uv[0] = sizeX * endSize.x;
252
+
253
+ vertex->at(5).uv[1] = sizeY * startSize.y;
254
+
255
+
256
+
257
+ }
258
+
259
+
260
+
261
+
262
+
263
+ // ##################################### 法線 設定 #####################################
264
+
265
+ void FrameWork::Sprite::setNormal(std::shared_ptr<std::array<glm::vec3, 6>> n)
266
+
267
+ {
268
+
269
+ if (n != nullptr)
270
+
271
+ {
272
+
273
+ vertex->at(0).normal[0] = n->at(0).x;
274
+
275
+ vertex->at(0).normal[1] = n->at(0).y;
276
+
277
+ vertex->at(0).normal[2] = n->at(0).z;
278
+
279
+
280
+
281
+ vertex->at(1).normal[0] = n->at(1).x;
282
+
283
+ vertex->at(1).normal[1] = n->at(1).y;
284
+
285
+ vertex->at(1).normal[2] = n->at(1).z;
286
+
287
+
288
+
289
+ vertex->at(2).normal[0] = n->at(2).x;
290
+
291
+ vertex->at(2).normal[1] = n->at(2).y;
292
+
293
+ vertex->at(2).normal[2] = n->at(2).z;
294
+
295
+
296
+
297
+ vertex->at(3).normal[0] = n->at(3).x;
298
+
299
+ vertex->at(3).normal[1] = n->at(3).y;
300
+
301
+ vertex->at(3).normal[2] = n->at(3).z;
302
+
303
+
304
+
305
+ vertex->at(4).normal[0] = n->at(4).x;
306
+
307
+ vertex->at(4).normal[1] = n->at(4).y;
308
+
309
+ vertex->at(4).normal[2] = n->at(4).z;
310
+
311
+
312
+
313
+ vertex->at(5).normal[0] = n->at(5).x;
314
+
315
+ vertex->at(5).normal[1] = n->at(5).y;
316
+
317
+ vertex->at(5).normal[2] = n->at(5).z;
318
+
319
+ }
320
+
321
+ }
322
+
323
+
324
+
325
+ // ##################################### 描画指定 #####################################
326
+
327
+ void FrameWork::Sprite::Draw(glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end,std::shared_ptr<std::array<glm::vec3,6>> n)
328
+
329
+ {
330
+
331
+
332
+
333
+ vertex->resize(6);
334
+
335
+
336
+
337
+ startSize = start; //テクスチャ始点
338
+
339
+ endSize = end; //テクスチャ終点
340
+
341
+ textureNumber = texNum; //テクスチャを指定
342
+
343
+ setAttribute(); //頂点属性 設定
344
+
345
+ setNormal(n); //法線 設定
346
+
347
+
348
+
349
+ glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Vertex::ALL_2D) * vertex->size(),vertex->data());
350
+
351
+
352
+
353
+
354
+
355
+ glBindTexture(GL_TEXTURE_2D, texture.at(textureNumber).ID); //テクスチャをバインド
356
+
357
+ //glActiveTexture(texture.at(textureNumber).unitNumber); //テクスチャを有効にする
358
+
359
+
360
+
361
+ //Transform
362
+
363
+ setPosition(pos); //座標
364
+
365
+ setScale(s + glm::vec2(end - start)); //スケール
366
+
367
+ setRotate(r); //回転
368
+
369
+
370
+
371
+ //描画行列
372
+
373
+ shader->setUniformMatrix4fv("uTranslate", getMatTranslation());
374
+
375
+ shader->setUniformMatrix4fv("uRotate", getMatRotate());
376
+
377
+ shader->setUniformMatrix4fv("uScale", getMatScale());
378
+
379
+ shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f));
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+ glDrawArrays(GL_TRIANGLES, 0, 6);
388
+
389
+
390
+
391
+
392
+
393
+ glBindTexture(GL_TEXTURE_2D, 0);
394
+
395
+ }
396
+
397
+
398
+
399
+ // ##################################### デストラクタ #####################################
400
+
401
+ FrameWork::Sprite::~Sprite()
402
+
403
+ {
404
+
405
+
406
+
407
+ }
408
+
409
+
170
410
 
171
411
  ```
172
412
 
173
413
  ```cpp
174
414
 
175
- #ifndef ___RENDER_HPP_
176
-
177
- #define ___RENDER_HPP_
178
-
179
- #include <iostream>
180
-
181
-
182
-
183
- #include "glm/glm.hpp"
184
-
185
- #include "glm/gtc/matrix_Transform.hpp"
186
-
187
- #include "glm/gtx/Transform.hpp"
188
-
189
- #include "glew/include/GL/glew.h"
190
-
191
-
192
-
193
- //#include "Help.hpp"
194
-
195
- #include "Shader.hpp"
196
-
197
- #include "VertexData.hpp"
198
-
199
- #include "Transform_2D.hpp"
200
-
201
-
202
-
203
- namespace FrameWork
204
-
205
- {
206
-
207
- class Render_2D : public Transform_2D
208
-
209
- {
210
-
211
- public:
212
-
213
-
214
-
215
- //頂点属性、レンダリングタイプ、頂点数
216
-
217
- Render_2D(Vertex::Attribute vt, GLenum rt); //コンストラクタ
218
-
219
- ~Render_2D(); //デストラクタ
220
-
221
-
222
-
223
- Vertex::Attribute getAttribType(); //頂点属性
224
-
225
- GLenum getRenderType(); //レンダリングタイプ
226
-
227
-
228
-
229
- virtual void setAttribute(std::vector<Vertex::ALL_2D>& vertex) = 0; //頂点配列 編集
230
-
231
- virtual void setUnBind(); //バインド 解除
232
-
233
- virtual void setBind(); //バインド 有効
234
-
235
-
236
-
237
- std::shared_ptr<FrameWork::Shader> shader; //シェーダー
238
-
239
-
240
-
241
- protected:
242
-
243
-
244
-
245
- GLenum renderType; //レンダリングタイプ
246
-
247
- Vertex::Attribute attributeType; //頂点属性のタイプ
248
-
249
-
250
-
251
- };
252
-
253
- };
254
-
255
-
256
-
257
- #endif
258
-
259
-
415
+
416
+
417
+
418
+
419
+ std::shared_ptr<std::vector<FrameWork::Vertex::ALL_2D>> FrameWork::Camera_2D::vertex = std::make_shared<std::vector<FrameWork::Vertex::ALL_2D>>(0); //頂点配列
420
+
421
+
422
+
423
+ GLuint FrameWork::Camera_2D::vao = 0; //vao
424
+
425
+ GLuint FrameWork::Camera_2D::vbo = 0; //vbo
426
+
427
+
428
+
429
+ glm::mat4 FrameWork::Camera_2D::scale = glm::mat4(); //拡大縮小
430
+
431
+ glm::mat4 FrameWork::Camera_2D::rotate = glm::mat4(); //回転
432
+
433
+ glm::mat4 FrameWork::Camera_2D::translate = glm::mat4(); //平行移動
434
+
435
+
436
+
437
+ //描画行列
438
+
439
+ glm::vec2 FrameWork::Camera_2D::vecPosition = glm::vec2(0,0); //座標
440
+
441
+ glm::vec3 FrameWork::Camera_2D::vecLook = glm::vec3(0,0,-1); //向き(視線)
442
+
443
+ glm::mat4 FrameWork::Camera_2D::view = glm::lookAt(glm::vec3(vecPosition.x, vecPosition.y, 0.0f), vecLook, glm::vec3(0, 1, 0)); //ビュー行列
444
+
445
+ glm::mat4 FrameWork::Camera_2D::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形行列
446
+
447
+
448
+
449
+
450
+
451
+ // ##################################### 初期化 #####################################
452
+
453
+ void FrameWork::Camera_2D::Init()
454
+
455
+ {
456
+
457
+ glGenVertexArrays(1, &vao);
458
+
459
+ glGenBuffers(1, &vbo);
460
+
461
+
462
+
463
+ glBindVertexArray(vao);
464
+
465
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
466
+
467
+
468
+
469
+ vertex->resize(6);
470
+
471
+ }
472
+
473
+
474
+
475
+ // ##################################### 頂点属性を取得 #####################################
476
+
477
+ std::shared_ptr<std::vector<FrameWork::Vertex::ALL_2D>> FrameWork::Camera_2D::getVertexAttribute()
478
+
479
+ {
480
+
481
+ return vertex;
482
+
483
+ }
484
+
485
+
486
+
487
+ // ##################################### 座標を設定 #####################################
488
+
489
+ void FrameWork::Camera_2D::setPosition(glm::vec2 p)
490
+
491
+ {
492
+
493
+ vecPosition = p; //座標
494
+
495
+ view = glm::lookAt(glm::vec3(vecPosition.x,vecPosition.y,0), vecLook, glm::vec3(0, 1, 0));
496
+
497
+ }
498
+
499
+
500
+
501
+ // ##################################### 視線を設定 #####################################
502
+
503
+ void FrameWork::Camera_2D::setLook(glm::vec3 l)
504
+
505
+ {
506
+
507
+ vecLook = l; //向き
508
+
509
+ view = glm::lookAt(glm::vec3(vecPosition.x, vecPosition.y, 0.0f), vecLook, glm::vec3(0, 1, 0));
510
+
511
+ }
512
+
513
+
514
+
515
+ // ##################################### 座標を取得 #####################################
516
+
517
+ glm::vec2 FrameWork::Camera_2D::getPosition()
518
+
519
+ {
520
+
521
+ return vecPosition;
522
+
523
+ }
524
+
525
+ // ##################################### 視線を取得 #####################################
526
+
527
+ glm::vec3 FrameWork::Camera_2D::getLook()
528
+
529
+ {
530
+
531
+ return vecLook;
532
+
533
+ }
534
+
535
+
536
+
537
+ // ##################################### 3D ビュー行列を取得 透視射形行列 #####################################
538
+
539
+ glm::mat4 FrameWork::Camera_2D::getViewProjection()
540
+
541
+ {
542
+
543
+ return projection * view;
544
+
545
+ }
546
+
547
+
548
+
549
+ // ##################################### 2D ビュー行列を取得 正射形 #####################################
550
+
551
+ glm::mat4 FrameWork::Camera_2D::getProjection_2D()
552
+
553
+ {
554
+
555
+ return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f);
556
+
557
+ }
558
+
559
+
560
+
561
+ // ###################### デストラクタ ######################
562
+
563
+ FrameWork::Camera_2D::~Camera_2D()
564
+
565
+ {
566
+
567
+
568
+
569
+ }
260
570
 
261
571
  ```