画面の分割表示



たいていの場合はウィンドウ一杯に描画するわけだが、
ちょっと凝ったことをやりたい場合、
右半分と左半分で別なものを表示したり、
端っこに小さく別枠で何かを表示したりとか、
色々やってみたくなるわけで。

で、こういう事を設定するのが、ビューポートというやつです。
ビューポートは、
「描画領域内のどこにどんな範囲で描画を行うか」
を指定します。

描画領域一杯に表示したければ、ビューポートは描画領域に一致させておけばよいし、
左半分だけに表示したければ、ビューポートは左半分の領域に指定すればいい。


 
描画領域のサイズを知りたければ、
Windowsフォームとかコントロールの場合は、
ClientSizeプロパティが、描画領域のサイズにあたります。

描画領域一杯に表示したければ、
glViewport( 0, 0, ClientSize.Width, ClientSize.Height );
で、OK。

上半分なら、
glViewport( 0, ClientSize.Height / 2, ClientSize.Width, ClientSize.Height / 2 );
下半分は、
glViewport( 0, 0, ClientSize.Width, ClientSize.Height / 2 );

ただし、OpenGLでは、座標の原点(0,0)は左下です。
(※Windowsでは左上。)


 
たとえば、左右にに分割して描画する場合、
実際のプログラム上の流れとしては、こんな感じになります。
  1. バッファのクリア。
    glClear( ... );
  2.  ビューポートを左側半分に設定。
    glViewport( 0, 0, ClientSize.Width / 2, ClientSize.Height  );
  3. 左側分のシーンの描画。
  4.  ビューポートを左側半分に設定。
    glViewport( ClientSize.Width / 2, 0, ClientSize.Width / 2, ClientSize.Height  );
  5. 右側分のシーンの描画。
  6. 表示の実行(glFlush  or  wglSwapBuffer)。

これを利用すれば、視点の位置を目幅分ずらしたものをそれぞれ左右に描画して、
立体視ができるようにしたりもできます。
 
見えますか?見えませんか?どせいさんが、手前にいたり、奥にいたり。


<back to OpenGL menu>