質問編集履歴
3
この一つ前の修正の結果、タイトルの日本語が怪しくなったので修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ウィンドウを移動するまで正常に図形が描画されない(OpenGL、GLFW)
|
test
CHANGED
File without changes
|
2
自力での調査で解決した部分があったのでそれに伴う文章と画像の差し替え。そして調べていく過程でOSや開発環境自体の問題である可能性を指摘されたので環境の追記とタグの追加。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,20 +1,28 @@
|
|
1
|
+
環境:
|
2
|
+
|
3
|
+
MacOS 10.14.5
|
4
|
+
|
5
|
+
Xcode 10.3
|
6
|
+
|
7
|
+
|
8
|
+
|
1
9
|
床井研究室様の『GLFWによるOpenGL入門』(http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf)を見て勉強しています。
|
2
10
|
|
3
11
|
|
4
12
|
|
5
|
-
第6章100P
|
13
|
+
第6章100Pまで行い、下記のソース(字数の都合上コメントを一部省略)ができたのですが、起動後は真ん中に(図1)、ウィンドウのサイズを変えると図形の位置が変わり、そこからウィンドウを移動すると再び図形の位置が戻ります。(図2,図3)
|
6
|
-
|
14
|
+
|
7
|
-
![](
|
15
|
+
![イメージ説明](19d4bc370e1f6a203bb1032431c86e7c.png)
|
8
16
|
|
9
17
|
---図1 起動直後---
|
10
18
|
|
11
|
-
![](
|
19
|
+
![イメージ説明](b070d1252dbd168875c44c05e5150a7b.png)
|
12
20
|
|
13
21
|
---図2 サイズ変更後---
|
14
22
|
|
15
|
-
![](a
|
23
|
+
![イメージ説明](c1aa1cb0452d2417d5327fe6872c3c37.png)
|
16
|
-
|
24
|
+
|
17
|
-
---図3 サイズ変更後
|
25
|
+
---図3 サイズ変更後、移動---
|
18
26
|
|
19
27
|
|
20
28
|
|
@@ -274,7 +282,7 @@
|
|
274
282
|
|
275
283
|
|
276
284
|
|
277
|
-
|
285
|
+
|
278
286
|
|
279
287
|
constexpr Object::Vertex rectangleVertex[] =
|
280
288
|
|
@@ -374,9 +382,7 @@
|
|
374
382
|
|
375
383
|
shape -> draw();
|
376
384
|
|
377
|
-
|
378
|
-
|
379
|
-
|
385
|
+
|
380
386
|
|
381
387
|
window.swapBuffers();
|
382
388
|
|
@@ -406,16 +412,10 @@
|
|
406
412
|
|
407
413
|
class Window{
|
408
414
|
|
409
|
-
//ウィンドウのハンドル
|
410
|
-
|
411
415
|
GLFWwindow *const window;
|
412
416
|
|
413
417
|
|
414
418
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
419
|
//ウィンドウのサイズ
|
420
420
|
|
421
421
|
GLfloat size[2];
|
@@ -504,9 +504,7 @@
|
|
504
504
|
|
505
505
|
|
506
506
|
|
507
|
-
|
508
|
-
|
509
|
-
|
507
|
+
|
510
508
|
|
511
509
|
virtual ~Window(){
|
512
510
|
|
@@ -530,14 +528,8 @@
|
|
530
528
|
|
531
529
|
void swapBuffers(){
|
532
530
|
|
533
|
-
//カラーバッファを入れ替える
|
534
|
-
|
535
531
|
glfwSwapBuffers(window);
|
536
532
|
|
537
|
-
|
538
|
-
|
539
|
-
//イベントを取り出す
|
540
|
-
|
541
533
|
glfwWaitEvents();
|
542
534
|
|
543
535
|
}
|
@@ -724,8 +716,6 @@
|
|
724
716
|
|
725
717
|
public:
|
726
718
|
|
727
|
-
//コンストラクタ
|
728
|
-
|
729
719
|
Shape(GLint size,GLsizei vertexcount,const Object::Vertex *vertex)
|
730
720
|
|
731
721
|
:object(new Object(size,vertexcount,vertex))
|
@@ -778,38 +768,38 @@
|
|
778
768
|
|
779
769
|
void main(){
|
780
770
|
|
781
|
-
gl_Position = vec4(2.0 * scale/size,1.0 , 1.0) * position;
|
771
|
+
gl_Position = vec4(2.0 * scale/size, 1.0 , 1.0) * position;
|
772
|
+
|
773
|
+
//二つ目の1.0のの前に空白を入れると動いた
|
774
|
+
|
775
|
+
```
|
776
|
+
|
777
|
+
|
778
|
+
|
779
|
+
```FragmentShader
|
780
|
+
|
781
|
+
#version 150 core
|
782
|
+
|
783
|
+
out vec4 fragment;
|
784
|
+
|
785
|
+
|
786
|
+
|
787
|
+
void main(){
|
788
|
+
|
789
|
+
fragment = vec4(1.0, 0.0, 0.0, 1.0);
|
782
790
|
|
783
791
|
}
|
784
792
|
|
793
|
+
|
794
|
+
|
785
795
|
```
|
786
796
|
|
787
|
-
|
788
|
-
|
789
|
-
```FragmentShader
|
790
|
-
|
791
|
-
#version 150 core
|
792
|
-
|
793
|
-
out vec4 fragment;
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
void main(){
|
798
|
-
|
799
|
-
fragment = vec4(1.0, 0.0, 0.0, 1.0);
|
800
|
-
|
801
|
-
}
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
```
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
797
|
+
ウィンドウのサイズが切り替わっても真ん中に表示したいのですが、移動するまでは左下の位置のままです、どうかよろしくお願いします。
|
798
|
+
|
799
|
+
|
800
|
+
|
801
|
+
追伸
|
802
|
+
|
803
|
+
バーテックスシェーダに1つスペースを加えたら、図形が横長になる問題とサイズがウィンドウに比例する問題は自己解決したので質問の画像、文章などを差し替えさせていただきました。
|
804
|
+
|
805
|
+
現在は画面サイズ変更に伴う図形の移動について悩んでいます。
|
1
字数の都合から削っていたWindow.hのコメントを追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -402,18 +402,36 @@
|
|
402
402
|
|
403
403
|
|
404
404
|
|
405
|
+
// ウィンドウ関連の処理
|
406
|
+
|
405
407
|
class Window{
|
406
408
|
|
409
|
+
//ウィンドウのハンドル
|
410
|
+
|
407
411
|
GLFWwindow *const window;
|
408
412
|
|
413
|
+
|
414
|
+
|
415
|
+
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
//ウィンドウのサイズ
|
420
|
+
|
409
421
|
GLfloat size[2];
|
410
422
|
|
423
|
+
|
424
|
+
|
425
|
+
//ワールド座標系に対するデバイス座標系の拡大率
|
426
|
+
|
411
427
|
GLfloat scale;
|
412
428
|
|
413
429
|
|
414
430
|
|
415
431
|
public:
|
416
432
|
|
433
|
+
//コンストラクタ
|
434
|
+
|
417
435
|
Window(int width = 640, int height = 480, const char *title = "Hello!")
|
418
436
|
|
419
437
|
: window(glfwCreateWindow(width, height, title, NULL, NULL))
|
@@ -426,7 +444,9 @@
|
|
426
444
|
|
427
445
|
{
|
428
446
|
|
447
|
+
//ウィンドウが作成できなかった
|
448
|
+
|
429
|
-
std::cerr << "Can't create window." << std::endl;
|
449
|
+
std::cerr << "Can't create GLFW window." << std::endl;
|
430
450
|
|
431
451
|
exit(1);
|
432
452
|
|
@@ -434,16 +454,22 @@
|
|
434
454
|
|
435
455
|
|
436
456
|
|
457
|
+
//現在のウィンドウを処理対象にする
|
458
|
+
|
437
459
|
glfwMakeContextCurrent(window);
|
438
460
|
|
439
461
|
|
440
462
|
|
463
|
+
//GLEWを初期化する
|
464
|
+
|
441
465
|
glewExperimental = GL_TRUE;
|
442
466
|
|
443
467
|
if(glewInit() != GLEW_OK)
|
444
468
|
|
445
469
|
{
|
446
470
|
|
471
|
+
//GLEWの初期化に失敗した
|
472
|
+
|
447
473
|
std::cerr << "Can't initialize GLEW" << std::endl;
|
448
474
|
|
449
475
|
exit(1);
|
@@ -452,27 +478,35 @@
|
|
452
478
|
|
453
479
|
|
454
480
|
|
481
|
+
//垂直同期のタイミングを待つ
|
482
|
+
|
455
483
|
glfwSwapInterval(1);
|
456
484
|
|
457
485
|
|
458
486
|
|
459
|
-
//このインスタンスの this ポインタを記録
|
487
|
+
//このインスタンスの this ポインタを記録しておく
|
460
488
|
|
461
489
|
glfwSetWindowUserPointer(window, this);
|
462
490
|
|
463
491
|
|
464
492
|
|
465
|
-
//
|
493
|
+
//ウィンドウのサイズ変更時に呼び出す処理の登録
|
466
494
|
|
467
495
|
glfwSetWindowSizeCallback(window,resize);
|
468
496
|
|
497
|
+
|
498
|
+
|
469
|
-
|
499
|
+
//開いたウィンドウの初期設定
|
470
500
|
|
471
501
|
resize(window,width,height);
|
472
502
|
|
473
503
|
}
|
474
504
|
|
505
|
+
|
506
|
+
|
507
|
+
|
508
|
+
|
475
|
-
|
509
|
+
//デストラクタ
|
476
510
|
|
477
511
|
virtual ~Window(){
|
478
512
|
|
@@ -482,7 +516,7 @@
|
|
482
516
|
|
483
517
|
|
484
518
|
|
485
|
-
//ウィンドウを閉じるべきかを判定
|
519
|
+
//ウィンドウを閉じるべきかを判定する
|
486
520
|
|
487
521
|
int shouldClose() const{
|
488
522
|
|
@@ -496,15 +530,23 @@
|
|
496
530
|
|
497
531
|
void swapBuffers(){
|
498
532
|
|
533
|
+
//カラーバッファを入れ替える
|
534
|
+
|
499
535
|
glfwSwapBuffers(window);
|
500
536
|
|
537
|
+
|
538
|
+
|
539
|
+
//イベントを取り出す
|
540
|
+
|
501
541
|
glfwWaitEvents();
|
502
542
|
|
503
543
|
}
|
504
544
|
|
505
545
|
|
506
546
|
|
547
|
+
|
548
|
+
|
507
|
-
//
|
549
|
+
//ウィンドウのサイズを取り出す
|
508
550
|
|
509
551
|
const GLfloat *getSize() const { return size; }
|
510
552
|
|
@@ -516,13 +558,15 @@
|
|
516
558
|
|
517
559
|
|
518
560
|
|
519
|
-
//
|
561
|
+
// ウィンドウのサイズ変更時の処理
|
520
562
|
|
521
563
|
static void resize(GLFWwindow *const window,int width,int height)
|
522
564
|
|
523
565
|
{
|
524
566
|
|
567
|
+
//ウィンドウ全体をビューポートに設定する
|
568
|
+
|
525
|
-
glViewport(0, 0, width, height);
|
569
|
+
glViewport(0, 0, width, height);
|
526
570
|
|
527
571
|
|
528
572
|
|
@@ -534,7 +578,7 @@
|
|
534
578
|
|
535
579
|
if(instance != NULL){
|
536
580
|
|
537
|
-
//開いたウィンドウのサイズを保存
|
581
|
+
//開いたウィンドウのサイズを保存する
|
538
582
|
|
539
583
|
instance->size[0] = static_cast<GLfloat>(width);
|
540
584
|
|