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

回答編集履歴

2

書式修正

2020/09/15 14:17

投稿

mah
mah

スコア598

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  - create_maxtri_mpの引数を調整。
2
2
  - glUniformMatrix4fvの第2引数は個数なので1を指定
3
3
  - 並行移動の行列を調整して奥に移動
4
+
4
5
  とりあえず上記を修正したら表示はされました。
5
6
 
6
7
  あとは、回転行列の部分は元が何をしようとしているかが不明なので、

1

回答全面修正

2020/09/15 14:17

投稿

mah
mah

スコア598

answer CHANGED
@@ -1,37 +1,339 @@
1
+ - create_maxtri_mpの引数を調整。
2
+ - glUniformMatrix4fvの第2引数は個数なので1を指定
3
+ - 並行移動の行列を調整して奥に移動
1
- 関数の呼び出順序が違うのでないでょうか?
4
+ とりあえず上記を修正たら表示されまた。
2
5
 
6
+ あとは、回転行列の部分は元が何をしようとしているかが不明なので、
7
+ とりあえず画面の更新で回転するようにしてみました。
8
+
9
+ ```hpp
10
+ //平行移動
11
+ float mx = 0;
12
+ float my = 0;
13
+ float mz = -3; // 奥へ移動
14
+ const GLfloat move[4][4] =
15
+ {
16
+ 1,0,0,mx,
17
+ 0,1,0,my,
18
+ 0,0,1,mz,
19
+ 0,0,0,1,
20
+ };
21
+ ```
22
+
3
23
  ```cpp
24
+ #include "Game.hpp"
25
+ #include <iostream>
26
+ //#include "stdafx.h"
27
+ #include <iostream>
28
+ #include <string>
29
+ #include <fstream>
30
+ #include <sstream>
31
+ #include "Vector.hpp"
32
+
33
+
34
+ //透視投影変換行列を作る
35
+ void Game::create_maxtri_mp(float top, float bottom, float left, float right,
36
+ float near, float far, float result[4][4])
37
+ {
38
+ result[0][0] = (2 * near) / (right - left);
39
+ result[0][1] = 0;
40
+ result[0][2] = (right + left) / (right - left);
41
+ result[0][3] = 0;
42
+
43
+ result[1][0] = 0;
44
+ result[1][1] = (2 * near) / (top - bottom);
45
+ result[1][2] = (top + bottom) / (top - bottom);
46
+ result[1][3] = 0;
47
+
48
+ result[2][0] = 0;
49
+ result[2][1] = 0;
50
+ result[2][2] = -(far + near) / (far - near);
51
+ result[2][3] = -(2 * far + near) / (far - near);
52
+
53
+ result[3][0] = 0;
54
+ result[3][1] = 0;
55
+ result[3][2] = -1;
56
+ result[3][3] = 0;
57
+ }
58
+
59
+
60
+ //コンストラクタ
61
+ Game::Game()
62
+ {
63
+ mIsRunLoop = true;
64
+
65
+ }
66
+
67
+ //メインループ
68
+ bool Game::RunLoop()
69
+ {
70
+ if (mIsRunLoop == true)
71
+ {
72
+ Update();
73
+ GenerateOutput();
74
+ }
75
+ else {
76
+ return false;
77
+ }
78
+ return true;
79
+
80
+ }
81
+
82
+
83
+ //シェーダー関係のログを取得
84
+ void Game::GetShader_Log(GLuint shader_type, GLuint Log_type)
85
+ {
86
+ GLint bufferSize = 0;
87
+ GLchar* infoLog = nullptr;
88
+
89
+ //成功したかどうか?
90
+ glGetShaderiv(shader_type, Log_type, &bufferSize);
91
+ if (bufferSize == GL_FALSE)
92
+ {
93
+ //printf("");
94
+ }
95
+ //ログの長さを取得する
96
+ glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize);
97
+
98
+ infoLog = (GLchar*)malloc(bufferSize);
99
+
100
+ if (infoLog != NULL)
101
+ {
102
+ GLsizei length;//ログの長さ
103
+ glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog);
104
+
105
+ if (length > 1)//null文字を含むため一文字以上の場合ログ出力
106
+ {
107
+ fprintf(stderr, "InfoLog: %s\n\n", infoLog);
108
+ }
109
+
110
+ free(infoLog);//メモリ開放
111
+ infoLog = NULL;
112
+ }
113
+
114
+ //return true;
115
+ }
116
+
117
+ //シェーダを実装する
4
118
  bool Game::Shader()
5
119
  {
6
- ...
7
120
 
121
+ program = glCreateProgram();
122
+ GLuint out_vert = glCreateShader(GL_VERTEX_SHADER);
123
+ GLuint out_frag = glCreateShader(GL_FRAGMENT_SHADER);
124
+
125
+ //頂点シェーダーを読み込み
126
+ std::string fileName = "Basic.vert";
127
+ std::ifstream shaderfile(fileName);
128
+ if (shaderfile.is_open())
129
+ {
130
+ std::stringstream sstream;
131
+ sstream << shaderfile.rdbuf();
132
+ std::string str = sstream.str();
133
+ const char* cc = str.c_str();
134
+
135
+ out_vert = glCreateShader(GL_VERTEX_SHADER);
136
+ glShaderSource(out_vert, 1, &cc, nullptr);
137
+ glCompileShader(out_vert);
138
+ //printf("Basic.vert ファイル読み込み\n");
139
+
140
+ GetShader_Log(out_vert, GL_COMPILE_STATUS);
141
+ glAttachShader(program, out_vert);
142
+ shaderfile.close();
143
+
144
+ }
145
+ else {
146
+ shaderfile.close();
147
+ printf("ファイル: %s が読み込めませんでした。", fileName.c_str());
148
+ }
149
+
150
+
151
+ //バーティックスシェーダーを読み込み
152
+ fileName = "Basic.frag";
153
+ shaderfile.open(fileName);
154
+ if (shaderfile.is_open())
155
+ {
156
+
157
+ std::stringstream sstream;
158
+ sstream << shaderfile.rdbuf();
159
+ std::string str = sstream.str();
160
+ const char* cc = str.c_str();
161
+
162
+ out_frag = glCreateShader(GL_FRAGMENT_SHADER);
163
+ glShaderSource(out_frag, 1, &cc, nullptr);
164
+ glCompileShader(out_frag);
165
+ GetShader_Log(out_frag, GL_COMPILE_STATUS);
166
+ glAttachShader(program, out_frag);
167
+ shaderfile.close();
168
+
169
+ // printf("Basic.frag ファイル読み込み\n");
170
+ }
171
+ else {
172
+ shaderfile.close();
173
+ printf("ファイル: %s が読み込めませんでした。", fileName.c_str());
174
+ }
175
+
8
176
  glBindAttribLocation(program, 0, "position");
9
177
 
178
+
10
179
  glLinkProgram(program);
11
180
  //使わなくなったシェーダーオブジェクトを削除
12
181
  glDeleteShader(out_frag);
13
182
  glDeleteShader(out_vert);
14
-
15
183
  glUseProgram(program);
16
184
 
185
+
17
186
  //シェーダーに値を渡す
18
187
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////
19
188
  //*****************************************************************************
20
189
  float mp[4][4];
21
- create_maxtri_mp(HEIGHT, -HEIGHT, -WIDTH, WIDTH, 0.1, 0.0000000001, mp);//透視行列を作成
190
+ create_maxtri_mp(1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 10.0f, mp);//透視行列を作成
22
191
 
192
+ const GLfloat rot[4][4] = {
193
+ {1,0,0,0},
194
+ {0,1,0,0},
195
+ {0,0,1,0},
196
+ {0,0,0,1}
197
+ };
23
198
 
24
-
25
199
  //頂点シェーダー
26
- glUniformMatrix4fv(glGetUniformLocation(program,"scale"),0, GL_TRUE, &scale[0][0]);
200
+ glUniformMatrix4fv(glGetUniformLocation(program, "scale"), 1, GL_TRUE, &scale[0][0]);
27
- glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_TRUE, &rotate[0][0]);
201
+ glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_TRUE, &rot[0][0]);
28
- glUniformMatrix4fv(glGetUniformLocation(program, "move"), 2, GL_TRUE, &move[0][0]);
202
+ glUniformMatrix4fv(glGetUniformLocation(program, "move"), 1, GL_TRUE, &move[0][0]);
29
203
 
30
204
 
31
- glUniformMatrix4fv(glGetUniformLocation(program, "MP"), 3, GL_TRUE, &mp[0][0]);
205
+ glUniformMatrix4fv(glGetUniformLocation(program, "MP"), 1, GL_TRUE, &mp[0][0]);
32
- //*****************************************************************************
206
+ //*****************************************************************************
33
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
207
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
208
+ glUseProgram(program);
34
209
 
210
+
211
+
35
212
  return true;
36
213
  }
214
+
215
+
216
+
217
+
218
+ //初期化
219
+ bool Game::Initialization()
220
+ {
221
+ //画面初期化 関係
222
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////
223
+ //glfwの初期化に失敗
224
+ if (glfwInit() != GL_TRUE)
225
+ {
226
+ printf("glfwInit()失敗\n");
227
+ int _c = getchar();
228
+
229
+ return 0;
230
+ }
231
+
232
+ //コンテキストを作成
233
+ Window = glfwCreateWindow(640, 400, "Hello", NULL, NULL);
234
+
235
+ //OpenGLコンテキストの作成に失敗
236
+ if (Window == NULL)
237
+ {
238
+ printf("glfCreateWindow()失敗\n");
239
+ int c = getchar();
240
+
241
+ return 0;
242
+ }
243
+
244
+ //コンテキストをOpenGLの描画対象にする。
245
+ glfwMakeContextCurrent(Window);
246
+
247
+ //glewを初期化する。
248
+ glewExperimental = GL_TRUE;
249
+ if (glewInit() != GLEW_OK)
250
+ {
251
+ printf("glewInit() の初期化に失敗しました。");
252
+ return 0;
253
+ }
254
+
255
+ //OpenGLバージョン指定
256
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
257
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 0);
258
+
259
+ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
260
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
261
+
262
+ //垂直同期のタイミングを待つ
263
+ glfwSwapInterval(1);
264
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////
265
+
266
+
267
+
268
+ if (Shader() == true)//シェーダーを読み込む
269
+ {
270
+ printf("シェーダーを読み込む\n");
271
+ }
272
+
273
+
274
+ glGenVertexArrays(1, &vbo);
275
+ glBindVertexArray(vbo);
276
+ glGenBuffers(1, &vbo);
277
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
278
+ glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW);///////
279
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
280
+ glEnableVertexAttribArray(0);
281
+ //glEnableClientState(GL_VERTEX_ARRAY);//クライアントで頂点を有効にする。
282
+
283
+
284
+
285
+
286
+
287
+ mIsRunLoop = true;
288
+ return mIsRunLoop;
289
+ }
290
+
291
+ //アップデート
292
+ void Game::Update()
293
+ {
294
+ if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS || glfwWindowShouldClose(Window) != GL_FALSE)
295
+ {
296
+ mIsRunLoop = false;
297
+ }
298
+
299
+
300
+ }
301
+
302
+ static void rotateX(GLfloat radian, GLfloat m[])
303
+ {
304
+ float s = sin(radian);
305
+ float c = cos(radian);
306
+ m[0] = 1.0; m[1] = 0.0; m[2] = 0.0; m[3] = 0.0;
307
+ m[4] = 0.0; m[5] = c; m[6] = -s; m[7] = 0.0;
308
+ m[8] = 0.0; m[9] = s; m[10] = c; m[11] = 0.0;
309
+ m[12] = 0.0; m[13] = 0.0; m[14] = 0.0; m[15] = 1.0;
310
+ }
311
+
312
+ //描画アップデート
313
+ void Game::GenerateOutput()
314
+ {
315
+ glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
316
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
317
+ glUseProgram(program);
318
+
319
+ static float rotX = 0;
320
+ float rot[16];
321
+ rotateX(rotX, rot);
322
+ rotX += 0.01f;
323
+
324
+ glUniformMatrix4fv(glGetUniformLocation(program, "rotate"), 1, GL_FALSE, rot);
325
+
326
+
327
+ glDrawArrays(GL_POLYGON, 0, 18);
328
+
329
+
330
+
331
+
332
+
333
+
334
+ glViewport(0, 0, WIDTH, HEIGHT);
335
+ glfwSwapBuffers(Window);
336
+ glfwPollEvents();
337
+
338
+ }
37
339
  ```