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

回答編集履歴

2

コメントを受けて追記

2018/04/18 00:15

投稿

katsuko
katsuko

スコア3642

answer CHANGED
@@ -7,4 +7,37 @@
7
7
  また、glViewportは **これから描画する物の座標を設定する** 関数であって、既に描画された物の座標を設定する物ではありません。
8
8
  (つまり、AのglViewport関数の座標に影響するのはその後に処理されるBの描画になります)
9
9
  どうもglViewport関数の呼び出し場所がおかしいので、もしかするとそのあたりを勘違いされているとか?
10
- 気になったので、これも追記しておきます。
10
+ 気になったので、これも追記しておきます。
11
+
12
+ ---
13
+ コメントを受けて。
14
+
15
+ > その下にあるglViewport(0, height / 2, width, height / 2); の指示により画面上方に描かれていると思うのです。
16
+
17
+ これは、その通りです。
18
+ この認識があれば、私の説明で画面上部に描画される理由になると思うのですが。
19
+
20
+ ```c
21
+ void disp(void) {
22
+ glClear(GL_COLOR_BUFFER_BIT);
23
+ glColor3d(1.0, 0.0, 0.0); //(A)
24
+ glDrawArrays(GL_POLYGON, 0, 3); //(A)
25
+ glViewport(0, height / 2, width, height / 2); //(A)
26
+ //glColor3d(0.0, 1.0, 0.0); //(B)
27
+ //glDrawArrays(GL_POLYGON, 3, 3); //(B)
28
+ //glViewport(0, 0, width, height / 2); //(B)
29
+ glFlush();
30
+ }
31
+ ```
32
+
33
+ とBをコメントアウトした書いた時の動作を考えてみましょう。
34
+
35
+ 1. 1回目のdisp関数呼び出し
36
+ a. glDrawArrays関数の呼び出しで描画される。この時には、glViewport関数の呼び出しは行われていないので、ビューポート設定は(0, 0, width, height)になっている。
37
+ b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
38
+ 2. 2回目以降のdisp関数呼び出し
39
+ a. glDrawArrays関数の呼び出しで描画される。この時には、**1-bのビューポート設定が残っているので**、ビューポート設定は(0, height/2, width, height/2)(画面上部)になっている。
40
+ b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
41
+
42
+ となると考えています。
43
+ つまり、最初の一フレームは画面全体に、それ以降は前フレームのビューポート設定が残っているので画面上部に描画されると考えてます。

1

気になったので、追記

2018/04/18 00:14

投稿

katsuko
katsuko

スコア3642

answer CHANGED
@@ -1,4 +1,10 @@
1
1
  glViewportで指定するビューポート座標は、原点(0,0)が左 **下** で、(width,height)が右 **上**、Y軸プラス方向は **上方向** です。
2
2
  左上を原点とするウィンドウ座標とは、**縦方向が逆**になります。
3
3
 
4
- AとBのglViewportの指定が逆ではないでしょうか。
4
+ AとBのglViewportの指定が逆ではないでしょうか。
5
+
6
+ ---
7
+ また、glViewportは **これから描画する物の座標を設定する** 関数であって、既に描画された物の座標を設定する物ではありません。
8
+ (つまり、AのglViewport関数の座標に影響するのはその後に処理されるBの描画になります)
9
+ どうもglViewport関数の呼び出し場所がおかしいので、もしかするとそのあたりを勘違いされているとか?
10
+ 気になったので、これも追記しておきます。