web-dev-qa-db-ja.com

openGLのglOrthoとglViewPortの違い

高さ100、幅100の画像をレンダリングする場合など、何かを理解するのに苦労しています。

シナリオAの場合

GlOrthoisが(left、right、bottom、top、zNear、zFar)として定義され、glV​​iewPortが(左下隅x、左下隅)として定義されている場合、glOrtho(0,100,0,100,-100,100)およびglViewPort(0,0,50,50)を使用しています。 y、幅、高さ)。

シナリオBでは

glOrthoisが(left、right、bottom、top、zNear、zFar)として定義され、glV​​iewPortが(左下隅)として定義されている場合、glOrtho(0,50,0,50,-100,100)およびglViewPort(0,0,100,100)を使用していますx、左下隅y、幅、高さ)

これは基本的に、シナリオAでは、画像が必要な幅と高さよりも低い幅と高さにレンダリングされることを意味します(つまり、2ピクセルごとにレンダリングされます)。元の画像では、宛先の「サーフェス」の画像にマッピングされますが、それでも画像全体が表示されます。

ただし、シナリオBでは、画像がクリップされるため、画像の左上の4分の1のみが表示されます。私は正しいですか? -明確にするために、これは明日を迎えるCGテストからの質問です。openGLが正しく取得されたことを確認したいと思います...(すでにAPIを読んでいます... =\

9
crazyPixel

glViewPortは画面のピクセル単位です。それだけです。グラフィックカードの「内部」にある3Dの世界とは何の関係もありません。ウィンドウのどの部分がレンダリングに使用されるか(または単に表示されるか)を通知するだけです。

glOrthoは、代わりに「内部」の世界を変更し、OpenGLユニットです。より多くのOpenGLユニットが画面の表示部分に収まるため、「より大きな」オブジェクトはオルソサイズを大きくすると、視認可能な領域に簡単に収まります。

ビューポートを変更しても錐台は変更されません。実際、同じ画像が新しいビューポートに合うように引き伸ばされるだけです。

説明的な画像:

写真1:ビューポートはハーフウィンドウです

enter image description here

写真2:ビューポートを2倍にすると、画像が引き伸ばされます(同じ錐台が別の表面を埋めます)

enter image description here

したがって、アスペクト比を維持する唯一の解決策は、オルソサイズも2倍にすることです(この場合、左右の値を2倍にします)

写真3:最終結果(3Dワールドの大部分が表示されることに注意してください):

enter image description here

詳細については、 OpenGL NeHeプロダクションの非常に馴染みのあるサイト を参照してください。

26
GameDeveloper

これら2つのことは、GLの座標変換パイプラインのさまざまな段階に影響を与えます。 OpenGLは、正規化されたデバイス空間で3次元すべてに沿って[-1,1]の範囲の立方体である錐台を使用します。 glOrtho()呼び出しは通常、射影行列を設定するために使用されます。これにより、目の空間の座標がクリップ空間に変換されます。 GLは内部でクリップスペースからNDCに変換されます。直交する場合、クリップスペースとNDCは同じものであると想定することもできます。ビューポートは、NDCからウィンドウスペースへの変換を記述します。ラスタライズが行われる場所です。

私は正しいですか? -明確にするために、それは明日を迎えるCGテストからの質問であり、openGLを正しく取得したことを確認したいと思います...

あなたはおそらくケースAに対して正しいです。ケースBの場合、おそらくbootm左の四半期が見られます。しかし実際には、それ以上の情報が与えられなければ、質問は答えられません。画像の「幅」と「高さ」が100であると言います。通常、このような寸法は、各方向のピクセル数として解釈されます。しかし、この場合、質問は、画像でテクスチャリングされたquadも、(0,0)から(100,100)までの目のスペースになるようにレンダリングされることを意味しているようです。 )(オブジェクト座標として直接使用するか、別のmdoelおよび/またはビュー変換を使用する)。また、画像がどのようにマッピングされるか、つまり回転できるかどうかも指定されていません(これにより、シナリオBで画像のどの部分が表示されているかを合理的に確信して判断することができなくなります)。

注目に値するもう1つの点は、glOrtho()乗算現在の行列に正射影行列を掛けることです。したがって、その行列の初期状態が不明な場合、結果の変換がどうなるかを言うことは不可能です。

実際のテストにそのような不特定の質問が含まれないことを願っています。

1
derhass