回答編集履歴

2 コメントを受けて追記

katsuko

katsuko score 932

2018/04/18 09:14  投稿

glViewportで指定するビューポート座標は、原点(0,0)が左 **下** で、(width,height)が右 **上**、Y軸プラス方向は **上方向** です。
左上を原点とするウィンドウ座標とは、**縦方向が逆**になります。
AとBのglViewportの指定が逆ではないでしょうか。
---
また、glViewportは **これから描画する物の座標を設定する** 関数であって、既に描画された物の座標を設定する物ではありません。
(つまり、AのglViewport関数の座標に影響するのはその後に処理されるBの描画になります)
どうもglViewport関数の呼び出し場所がおかしいので、もしかするとそのあたりを勘違いされているとか?
気になったので、これも追記しておきます。
気になったので、これも追記しておきます。
---
コメントを受けて。
> その下にあるglViewport(0, height / 2, width, height / 2); の指示により画面上方に描かれていると思うのです。
これは、その通りです。
この認識があれば、私の説明で画面上部に描画される理由になると思うのですが。
```c
void disp(void) {
   glClear(GL_COLOR_BUFFER_BIT);
   glColor3d(1.0, 0.0, 0.0);         //(A)
   glDrawArrays(GL_POLYGON, 0, 3);  //(A)
   glViewport(0, height / 2, width, height / 2); //(A)
   //glColor3d(0.0, 1.0, 0.0);  //(B)
   //glDrawArrays(GL_POLYGON, 3, 3); //(B)
   //glViewport(0, 0, width, height / 2); //(B)
   glFlush();
}
```
とBをコメントアウトした書いた時の動作を考えてみましょう。
1. 1回目のdisp関数呼び出し
a. glDrawArrays関数の呼び出しで描画される。この時には、glViewport関数の呼び出しは行われていないので、ビューポート設定は(0, 0, width, height)になっている。
b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
2. 2回目以降のdisp関数呼び出し
a. glDrawArrays関数の呼び出しで描画される。この時には、**1-bのビューポート設定が残っているので**、ビューポート設定は(0, height/2, width, height/2)(画面上部)になっている。
b. glViewport(0, height/2, width, height/2)の呼び出しで、ビューポート設定は、画面上部に設定される。
となると考えています。
つまり、最初の一フレームは画面全体に、それ以降は前フレームのビューポート設定が残っているので画面上部に描画されると考えてます。
1 気になったので、追記

katsuko

katsuko score 932

2018/04/18 02:23  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る