回答編集履歴

2

コメントを受けて追記

2018/04/18 00:15

投稿

katsuko
katsuko

スコア3469

test CHANGED
@@ -17,3 +17,69 @@
17
17
  どうもglViewport関数の呼び出し場所がおかしいので、もしかするとそのあたりを勘違いされているとか?
18
18
 
19
19
  気になったので、これも追記しておきます。
20
+
21
+
22
+
23
+ ---
24
+
25
+ コメントを受けて。
26
+
27
+
28
+
29
+ > その下にあるglViewport(0, height / 2, width, height / 2); の指示により画面上方に描かれていると思うのです。
30
+
31
+
32
+
33
+ これは、その通りです。
34
+
35
+ この認識があれば、私の説明で画面上部に描画される理由になると思うのですが。
36
+
37
+
38
+
39
+ ```c
40
+
41
+ void disp(void) {
42
+
43
+ glClear(GL_COLOR_BUFFER_BIT);
44
+
45
+ glColor3d(1.0, 0.0, 0.0); //(A)
46
+
47
+ glDrawArrays(GL_POLYGON, 0, 3); //(A)
48
+
49
+ glViewport(0, height / 2, width, height / 2); //(A)
50
+
51
+ //glColor3d(0.0, 1.0, 0.0); //(B)
52
+
53
+ //glDrawArrays(GL_POLYGON, 3, 3); //(B)
54
+
55
+ //glViewport(0, 0, width, height / 2); //(B)
56
+
57
+ glFlush();
58
+
59
+ }
60
+
61
+ ```
62
+
63
+
64
+
65
+ とBをコメントアウトした書いた時の動作を考えてみましょう。
66
+
67
+
68
+
69
+ 1. 1回目のdisp関数呼び出し
70
+
71
+ a. glDrawArrays関数の呼び出しで描画される。この時には、glViewport関数の呼び出しは行われていないので、ビューポート設定は(0, 0, width, height)になっている。
72
+
73
+ b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
74
+
75
+ 2. 2回目以降のdisp関数呼び出し
76
+
77
+ a. glDrawArrays関数の呼び出しで描画される。この時には、**1-bのビューポート設定が残っているので**、ビューポート設定は(0, height/2, width, height/2)(画面上部)になっている。
78
+
79
+ b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
80
+
81
+
82
+
83
+ となると考えています。
84
+
85
+ つまり、最初の一フレームは画面全体に、それ以降は前フレームのビューポート設定が残っているので画面上部に描画されると考えてます。

1

気になったので、追記

2018/04/18 00:14

投稿

katsuko
katsuko

スコア3469

test CHANGED
@@ -5,3 +5,15 @@
5
5
 
6
6
 
7
7
  AとBのglViewportの指定が逆ではないでしょうか。
8
+
9
+
10
+
11
+ ---
12
+
13
+ また、glViewportは **これから描画する物の座標を設定する** 関数であって、既に描画された物の座標を設定する物ではありません。
14
+
15
+ (つまり、AのglViewport関数の座標に影響するのはその後に処理されるBの描画になります)
16
+
17
+ どうもglViewport関数の呼び出し場所がおかしいので、もしかするとそのあたりを勘違いされているとか?
18
+
19
+ 気になったので、これも追記しておきます。