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

質問編集履歴

3

この一つ前の修正の結果、タイトルの日本語が怪しくなったので修正

2019/07/26 15:28

投稿

code413
code413

スコア14

title CHANGED
@@ -1,1 +1,1 @@
1
- GLFW画面のサイズ関わらず図形を固定の大きに設定したです。
1
+ ウィンドウを移動するま正常に図形が描画れな(OpenGL、GLFW)
body CHANGED
File without changes

2

自力での調査で解決した部分があったのでそれに伴う文章と画像の差し替え。そして調べていく過程でOSや開発環境自体の問題である可能性を指摘されたので環境の追記とタグの追加。

2019/07/26 15:28

投稿

code413
code413

スコア14

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、下記のソース(字数の都合上コメントを一部省略)ができたのですが、起動後は真ん中に大きく(図1)、画面サイズを変えると比例して図形が変わり位置が移動します。(図2図3参照
7
+ 第6章100Pまで行い、下記のソース(字数の都合上コメントを一部省略)ができたのですが、起動後は真ん中に図1)、ウィンドウのサイズを変えると図形の位置が変わり、そこからウィンドウを移動すると再び図形の位置が戻ります。(図2,図3)
4
- ![](f44e29ae65b8150ae4d38057bc61ee6d.png)]
8
+ ![イメージ説明](19d4bc370e1f6a203bb1032431c86e7c.png)
5
9
              ---図1 起動直後---
6
- ![](600151cbd0e22a46fbf8121802136edb.png)
10
+ ![イメージ説明](b070d1252dbd168875c44c05e5150a7b.png)
7
11
              ---図2 サイズ変更後---
8
- ![](a37378875dc75832775e1b1259277ebf.png)
12
+ ![イメージ説明](c1aa1cb0452d2417d5327fe6872c3c37.png)
9
- ---図3 サイズ変更後(2)---
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のコメントを追記

2019/07/26 15:25

投稿

code413
code413

スコア14

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
- glViewport(0, 0, width, height);
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
  }