画面の分割表示
たいていの場合はウィンドウ一杯に描画するわけだが、
ちょっと凝ったことをやりたい場合、
右半分と左半分で別なものを表示したり、
端っこに小さく別枠で何かを表示したりとか、
色々やってみたくなるわけで。
で、こういう事を設定するのが、ビューポートというやつです。
ビューポートは、
「描画領域内のどこにどんな範囲で描画を行うか」
を指定します。
描画領域一杯に表示したければ、ビューポートは描画領域に一致させておけばよいし、
左半分だけに表示したければ、ビューポートは左半分の領域に指定すればいい。
描画領域のサイズを知りたければ、
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では左上。)
たとえば、左右にに分割して描画する場合、
実際のプログラム上の流れとしては、こんな感じになります。
- バッファのクリア。
glClear( ... );
- ビューポートを左側半分に設定。
glViewport( 0, 0, ClientSize.Width / 2, ClientSize.Height );
- 左側分のシーンの描画。
- ビューポートを左側半分に設定。
glViewport( ClientSize.Width / 2, 0, ClientSize.Width / 2, ClientSize.Height
);
- 右側分のシーンの描画。
- 表示の実行(glFlush or wglSwapBuffer)。
これを利用すれば、視点の位置を目幅分ずらしたものをそれぞれ左右に描画して、
立体視ができるようにしたりもできます。
見えますか?見えませんか?どせいさんが、手前にいたり、奥にいたり。
<back to OpenGL menu>