まず、OpenGLは複数の座標系を使用しているため、「 OpenGL座標系」はありません。あなたが指しているのは、3つの座標すべてが[-1,1]の範囲にある正規化されたデバイス座標(NDC)です。異なる座標系とその名前については、hereのセクション「9.011座標がどのように変換されますか?異なる座標空間は何ですか?」で説明されています。 1)
第2に、混乱を避けるために、OpenGLでは、「ビューポート」という用語は、レンダリングするウィンドウの一部を指し、ウィンドウ座標です。あなたの質問では、ワールド座標系でレンダリングしたいあなたの世界の部分(l、r、t、b)=( - 500、-500、1200、1200)を記述するために使用しました。
「画面上でオブジェクトを描画する場所を計算する」方法を尋ねました。あなたがする必要があるのは、ある座標系から別の座標系に写像する変換(4×4行列)を定義することです。あなたの2D世界は世界座標で与えられますので、世界座標をNDCに変換する行列、つまり投影行列を定義する必要があります。シェーダでは、頂点にこの投影行列を単純に掛けて、NDCを取得します。 glm::ortho
/glOrtho
は、そのような投影行列を計算する。透視投影については、あなたが何をしたいのかははっきりしませんが、perspective
とlookat
関数をglmで試してみる必要があります。
明確にするには、任意の座標系(ワールド座標系と呼ばれます)で頂点を定義し、単にこれらの頂点を描画します。頂点シェーダーの仕事は、定義した変換を適用することです。
また、正方形を指定していることに注意してください。通常、これはあなたが望むものではありません。モニターとほとんどのウィンドウは正方形ではありません。したがって、その正方形を典型的なビューポートにマップすると、あなたの世界が歪んで見えます。ビューポートのアスペクト比(幅:高さ)を考慮する必要があります。私はそれを説明しようとしたhere。
1)補足として、FAQはかなり古く、古いバージョンのOpenGLを指します。現在、プログラマは、シェーダで必要となるため、モデルビューと投影行列の両方を管理することが期待され、奨励されています。私はglmを強く推奨します。ヘッダーのみのため、統合が非常に簡単で、GLSLを反映する素晴らしい構文があります。
正射影投影行列を使用している場合、ビューはZ軸を無視するので2Dになります。正しいでしょうか?私がやっているほとんどのことについては問題ありませんが、私は、Z軸を使って2D世界で平らではない視点を作り出すことを実験したいと考えています。ですから、オルソではなく、パースペクティブの変換マトリックスをどのように定義しますか?どのGL関数がそれをするのですか? – bgroenks
1)いいえ、Z軸を無視しないで、同じピクセルに同じxy座標のものを投影します。しかし、あなたはまだ深さテストを行うことができます。 2) 'glm :: perspective'。 –
どのようにglm :: perspectiveを使用しますか?それは 'gl_ModelViewProjectionMatrix'とどのように対話しますか? – bgroenks