直交座標を正規化する必要があるのはなぜですか?
彼らはしません。必要に応じて、正射影ボリュームの制限を設定できます。glOrtho 呼び出しの left、right、bottom、top、near、far パラメータは、ビューポート ボリュームの制限を定義します。left=0、right=win_pixel_width、bottom=0、top=win_pixel_height を選択すると、慣れ親しんだピクセル単位の投影ボリュームになります。しかし、なぜピクセルを気にするのでしょうか? 後で実際のウィンドウ サイズを補正する必要があります。描画するシーンに合わせて、オルソ投影のボリューム範囲を選択するだけです。
これを正規化されたデバイス座標と混同している可能性があります。これらの場合、ビューポートの範囲にマップされるのは [-1, 1] の値の範囲であると単純に定義されています。
アップデート
ところで、Vertex vec4 が何を表しているのかよくわかりません。モデルのすべての頂点がモデル内にあると思っていました。何か案は?
ここ数日、このような質問に何度も答えていたので、今はかなり疲れています。それで、ここに再び行きます:
OpenGL にはカメラがありません。
OpenGL にはシーンがありません。
OpenGL にはモデルがありません。
「待って、なに!?」あなたは今疑問に思うかもしれません。しかし、それは本当です。
OpenGL が気にかけているのは、いくつかのターゲット フレームバッファ、つまり、描画できるキャンバス、およびジオメトリック プリミティブを作成する頂点属性のストリームがあることだけです。プリミティブは、点、線、および三角形です。どういうわけか、三角形などの頂点属性をフレームバッファ キャンバス上の位置にマップする必要があります。このために、位置と呼ばれる頂点属性は、多くのアフィン変換を通過します。
1 つ目は、ローカルモデル空間からワールド空間へのモデルトランスフォームです。
ワールド空間から目の空間へ、ビューが変換されます。シーンにカメラを配置するように機能するのは、このビュー トランスフォームです。
その後、投影変換であるカメラのレンズに相当するものを通過させます。
射影変換後、位置はいくつかの操作を受けるクリップ スペースにあります。クリッピング後、正規化されたデバイス座標空間に到達するために、クリップ空間の位置ベクトルを独自の w コンポーネントで除算することにより、いわゆる同種除算が適用されます。
v_position_ndc = v_position_clip / v_position_clip.w
このステップは、透視投影を実際に機能させるものです。頂点の位置の z 距離は、クリップ スペースの w コンポーネントに取り込まれます。また、より大きな位置 w を持つ均一な分割頂点によって、遠近効果を作成する XY 平面で 1/w に比例してスケーリングされます。
この操作を正規化と間違えましたが、そうではありません!
同種の分割頂点位置がクリップから NDC 空間にマッピングされた後。そして、OpenGL は、NDC 空間の可視ボリュームがボックス [-1, 1]^3 であることを定義します。このボックスの外側の頂点はクリップされます。
ビュー トランスフォームとプロジェクションが異なることを理解することが重要です。位置についてはそれほど明白ではありませんが、照明計算の重要な要素である法線と呼ばれる別の頂点属性は、わずかに異なる方法で変換する必要があります(Projection · View · Model
によって変換する必要があるのでinverse(transpose(View · Model))
はなく、つまり、投影はそれに関与しません)。しかし、視点はそうです)。
行列自体は、実数値のスカラーの 4×4 グリッドです (コンピューターの数値は常に有理数であることは当面無視してください)。したがって、行列のランクは 4 であるため、次元 4 のベクトルを乗算する必要があります (したがって、型vec4 )
OpenGL は頂点属性を列ベクトルとして扱うため、行列の乗算は左結合です。つまり、ベクトルは式の右側から入力され、左側から出力されます。行列の乗算の順序が重要です。自由に並べ替えはできません!
ステートメント
gl_Position = Projection * View * Model * vertex_position; // note the order
頂点シェーダーに、先ほど説明したまさにこの変換プロセスを実行させます。