質問編集履歴
3
この一つ前の修正の結果、タイトルの日本語が怪しくなったので修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
ウィンドウを移動するまで正常に図形が描画されない(OpenGL、GLFW)
|
body
CHANGED
File without changes
|
2
自力での調査で解決した部分があったのでそれに伴う文章と画像の差し替え。そして調べていく過程でOSや開発環境自体の問題である可能性を指摘されたので環境の追記とタグの追加。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
環境:
|
2
|
+
MacOS 10.14.5
|
3
|
+
Xcode 10.3
|
4
|
+
|
1
5
|
床井研究室様の『GLFWによるOpenGL入門』(http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf)を見て勉強しています。
|
2
6
|
|
3
|
-
第6章100P
|
7
|
+
第6章100Pまで行い、下記のソース(字数の都合上コメントを一部省略)ができたのですが、起動後は真ん中に(図1)、ウィンドウのサイズを変えると図形の位置が変わり、そこからウィンドウを移動すると再び図形の位置が戻ります。(図2,図3)
|
4
|
-

|
5
9
|
---図1 起動直後---
|
6
|
-

|
7
11
|
---図2 サイズ変更後---
|
8
|
-

|
9
|
-
---図3 サイズ変更後
|
13
|
+
---図3 サイズ変更後、移動---
|
10
14
|
|
11
15
|
```main
|
12
16
|
#include<cstdlib>
|
@@ -136,7 +140,7 @@
|
|
136
140
|
return vstat && fstat ? createProgram(vsrc.data(), fsrc.data()) : 0;
|
137
141
|
}
|
138
142
|
|
139
|
-
|
143
|
+
|
140
144
|
constexpr Object::Vertex rectangleVertex[] =
|
141
145
|
{
|
142
146
|
{-0.5f ,-0.5f },
|
@@ -186,8 +190,7 @@
|
|
186
190
|
|
187
191
|
//図形を描画
|
188
192
|
shape -> draw();
|
189
|
-
|
190
|
-
|
193
|
+
|
191
194
|
window.swapBuffers();
|
192
195
|
}
|
193
196
|
}
|
@@ -202,11 +205,8 @@
|
|
202
205
|
|
203
206
|
// ウィンドウ関連の処理
|
204
207
|
class Window{
|
205
|
-
//ウィンドウのハンドル
|
206
208
|
GLFWwindow *const window;
|
207
209
|
|
208
|
-
|
209
|
-
|
210
210
|
//ウィンドウのサイズ
|
211
211
|
GLfloat size[2];
|
212
212
|
|
@@ -251,8 +251,7 @@
|
|
251
251
|
resize(window,width,height);
|
252
252
|
}
|
253
253
|
|
254
|
-
|
255
|
-
|
254
|
+
|
256
255
|
virtual ~Window(){
|
257
256
|
glfwDestroyWindow(window);
|
258
257
|
}
|
@@ -264,10 +263,7 @@
|
|
264
263
|
|
265
264
|
//カラーバッファを入れ替えてイベントを取り出す
|
266
265
|
void swapBuffers(){
|
267
|
-
//カラーバッファを入れ替える
|
268
266
|
glfwSwapBuffers(window);
|
269
|
-
|
270
|
-
//イベントを取り出す
|
271
267
|
glfwWaitEvents();
|
272
268
|
}
|
273
269
|
|
@@ -361,7 +357,6 @@
|
|
361
357
|
const GLsizei vertexcount;
|
362
358
|
|
363
359
|
public:
|
364
|
-
//コンストラクタ
|
365
360
|
Shape(GLint size,GLsizei vertexcount,const Object::Vertex *vertex)
|
366
361
|
:object(new Object(size,vertexcount,vertex))
|
367
362
|
,vertexcount(vertexcount)
|
@@ -388,8 +383,8 @@
|
|
388
383
|
in vec4 position;
|
389
384
|
|
390
385
|
void main(){
|
391
|
-
gl_Position = vec4(2.0 * scale/size,1.0 , 1.0) * position;
|
386
|
+
gl_Position = vec4(2.0 * scale/size, 1.0 , 1.0) * position;
|
392
|
-
|
387
|
+
//二つ目の1.0のの前に空白を入れると動いた
|
393
388
|
```
|
394
389
|
|
395
390
|
```FragmentShader
|
@@ -401,8 +396,8 @@
|
|
401
396
|
}
|
402
397
|
|
403
398
|
```
|
399
|
+
ウィンドウのサイズが切り替わっても真ん中に表示したいのですが、移動するまでは左下の位置のままです、どうかよろしくお願いします。
|
404
400
|
|
405
|
-
|
401
|
+
追伸
|
406
|
-
|
407
|
-
|
408
|
-
|
402
|
+
バーテックスシェーダに1つスペースを加えたら、図形が横長になる問題とサイズがウィンドウに比例する問題は自己解決したので質問の画像、文章などを差し替えさせていただきました。
|
403
|
+
現在は画面サイズ変更に伴う図形の移動について悩んでいます。
|
1
字数の都合から削っていたWindow.hのコメントを追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -200,73 +200,95 @@
|
|
200
200
|
#include <GL/glew.h>
|
201
201
|
#include <GLFW/glfw3.h>
|
202
202
|
|
203
|
+
// ウィンドウ関連の処理
|
203
204
|
class Window{
|
205
|
+
//ウィンドウのハンドル
|
204
206
|
GLFWwindow *const window;
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
//ウィンドウのサイズ
|
205
211
|
GLfloat size[2];
|
212
|
+
|
213
|
+
//ワールド座標系に対するデバイス座標系の拡大率
|
206
214
|
GLfloat scale;
|
207
215
|
|
208
216
|
public:
|
217
|
+
//コンストラクタ
|
209
218
|
Window(int width = 640, int height = 480, const char *title = "Hello!")
|
210
219
|
: window(glfwCreateWindow(width, height, title, NULL, NULL))
|
211
220
|
, scale(100.0f)
|
212
221
|
{
|
213
222
|
if(window == NULL)
|
214
223
|
{
|
224
|
+
//ウィンドウが作成できなかった
|
215
|
-
std::cerr << "Can't create window." << std::endl;
|
225
|
+
std::cerr << "Can't create GLFW window." << std::endl;
|
216
226
|
exit(1);
|
217
227
|
}
|
218
228
|
|
229
|
+
//現在のウィンドウを処理対象にする
|
219
230
|
glfwMakeContextCurrent(window);
|
220
231
|
|
232
|
+
//GLEWを初期化する
|
221
233
|
glewExperimental = GL_TRUE;
|
222
234
|
if(glewInit() != GLEW_OK)
|
223
235
|
{
|
236
|
+
//GLEWの初期化に失敗した
|
224
237
|
std::cerr << "Can't initialize GLEW" << std::endl;
|
225
238
|
exit(1);
|
226
239
|
}
|
227
240
|
|
241
|
+
//垂直同期のタイミングを待つ
|
228
242
|
glfwSwapInterval(1);
|
229
243
|
|
230
|
-
//このインスタンスの this ポインタを記録
|
244
|
+
//このインスタンスの this ポインタを記録しておく
|
231
245
|
glfwSetWindowUserPointer(window, this);
|
232
246
|
|
233
|
-
//
|
247
|
+
//ウィンドウのサイズ変更時に呼び出す処理の登録
|
234
248
|
glfwSetWindowSizeCallback(window,resize);
|
249
|
+
|
235
|
-
|
250
|
+
//開いたウィンドウの初期設定
|
236
251
|
resize(window,width,height);
|
237
252
|
}
|
253
|
+
|
254
|
+
|
238
|
-
|
255
|
+
//デストラクタ
|
239
256
|
virtual ~Window(){
|
240
257
|
glfwDestroyWindow(window);
|
241
258
|
}
|
242
259
|
|
243
|
-
//ウィンドウを閉じるべきかを判定
|
260
|
+
//ウィンドウを閉じるべきかを判定する
|
244
261
|
int shouldClose() const{
|
245
262
|
return glfwWindowShouldClose(window);
|
246
263
|
}
|
247
264
|
|
248
265
|
//カラーバッファを入れ替えてイベントを取り出す
|
249
266
|
void swapBuffers(){
|
267
|
+
//カラーバッファを入れ替える
|
250
268
|
glfwSwapBuffers(window);
|
269
|
+
|
270
|
+
//イベントを取り出す
|
251
271
|
glfwWaitEvents();
|
252
272
|
}
|
253
273
|
|
274
|
+
|
254
|
-
//
|
275
|
+
//ウィンドウのサイズを取り出す
|
255
276
|
const GLfloat *getSize() const { return size; }
|
256
277
|
|
257
278
|
//ワールド座標系に対するデバイス座標系の拡大率を取り出す
|
258
279
|
GLfloat getScale() const{ return scale; }
|
259
280
|
|
260
|
-
//
|
281
|
+
// ウィンドウのサイズ変更時の処理
|
261
282
|
static void resize(GLFWwindow *const window,int width,int height)
|
262
283
|
{
|
284
|
+
//ウィンドウ全体をビューポートに設定する
|
263
|
-
|
285
|
+
glViewport(0, 0, width, height);
|
264
286
|
|
265
287
|
//このインスタンスのthisポインタを得る
|
266
288
|
Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(window)));
|
267
289
|
|
268
290
|
if(instance != NULL){
|
269
|
-
//開いたウィンドウのサイズを保存
|
291
|
+
//開いたウィンドウのサイズを保存する
|
270
292
|
instance->size[0] = static_cast<GLfloat>(width);
|
271
293
|
instance->size[1] = static_cast<GLfloat>(height);
|
272
294
|
}
|