たとえば、1 つは正投影を使用し、もう 1 つは遠近法を使用して、2 つの異なるビューポートで OpenGL の同じオブジェクトを表示する必要があります。これを行うには、glViewport() を呼び出すたびにオブジェクトを再度描画する必要がありますか?
6 に答える
Nehe には、これを行う方法に関する優れたチュートリアルがあり、彼のサイトは通常、OpenGL に関する質問の優れたリソースです。
// normal mode
if(!divided_view_port)
glViewport(0, 0, w, h);
else
{
// right bottom
glViewport(w/2, h/2, w, h);
glLoadIdentity ();
gluLookAt(5.0f, 5.0f, 5.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
display();
// left bottom
glViewport(0, h/2, w/2, h);
glLoadIdentity();
gluLookAt (5.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
display();
// top right
glViewport(w/2, 0, w, h/2);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 5.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
display();
// top left
glViewport(0, 0, w/2, h/2);
glLoadIdentity();
gluLookAt(0.0f, 5.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
display();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-2.0, 2.0,
-2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w,
-10.0, 100.0);
else
glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h,
-2.0, 2.0,
-10.0, 100.0);
glMatrixMode(GL_MODELVIEW);
はい、
また、2 つのビューが同じウィンドウにある場合は、シザー設定を変更して 2 つのビューを明確に分離する必要があります。
OpenGL は、現在作業しているウィンドウに出力する準備をするコマンドにすぎないと考えてください。
OpenGL には、NEHE のチュートリアルでさえ重要性を説明していないコマンドが 2 つあります。
wglCreateContext - ウィンドウ デバイス コンテキスト DC を受け取り、ユーザー コントロール、ウィンドウ フォーム、GL ウィンドウ、別のアプリケーション ウィンドウ (メモ帳など) のいずれであっても、任意のウィンドウから取得できます。これにより、OpenGL デバイス コンテキストが作成されます (リソース コンテキストと呼ばれます)。これを後で使用します ...
wglMakeCurrent - これは、処理するデバイス コンテキスト (wglCreateContext で Windows デバイス コンテキストに渡されるパラメータ) と、返されるリソース コンテキストの 2 つのパラメータを取ります。
これら 2 つのことだけを活用する - これが私のアドバイスです。
NEHE のチュートリアルでは、既存のウィンドウのみを活用し、画面をセグメント化して描画するソリューションを提供しています。チュートリアルは次のとおりです: http://nehe.gamedev.net/tutorial/multiple_viewports/20002/
glViewport を利用すると、更新のたびに再描画する必要があります。
それが一つの方法です。
しかし、別の方法があります-グラフィックが少なく、プロセッサに負荷がかかる方法:
ユーザー コントロールを利用して、各ビューのウィンドウを作成します。
各ウィンドウには独自の hWnd があります。
DC を取得し、wglcreatecontext を処理し、タイマー (私の場合は 1 秒あたり 30 フレーム) で、状態の変化を検出した場合は、そのビューの wglMakeCurrent を選択して再描画します。それ以外の場合は、セクションを完全にスキップしてください。
これにより、貴重な処理能力が節約され、コードがウィンドウとビューポートの計算を手動で管理する必要がなくなります。