3D プログラミングを学んでいると、次の 3 つの変換行列で考えるのが最も簡単だと教えられます。
モデル マトリックス。このマトリックスはモデルごとに個別であり、必要に応じてオブジェクトを回転およびスケーリングし、最終的に 3D ワールド内の最終的な位置に移動します。「モデル マトリックスは、モデル座標をワールド座標に変換します」。
ビューマトリックス. このマトリックスは通常、多数のオブジェクト (すべてではない場合) で同じであり、現在の「カメラ位置」に従ってすべてのオブジェクトを回転および移動します。3D シーンがカメラで撮影され、画面にレンダリングされるのはこのカメラでキャプチャされた画像であるとイメージする場合、カメラの位置とその視線方向によって、シーンのどの部分が見えるか、オブジェクトがどのように見えるかが決まります。キャプチャ画像に表示されます。単一フレームのレンダリング中にビュー マトリックスを変更する理由はほとんどありませんが、実際には存在します (たとえば、シーンを 2 回レンダリングし、その間にビュー マトリックスを変更することで、シーン内に非常にシンプルでありながら印象的なミラーを作成できます)。 . 通常、ビュー マトリックスは、描画される 2 つのフレーム間で 1 回だけ変更されます。"
射影行列。射影行列は、これらの 3D 座標が 2D 座標にどのようにマッピングされるかを決定します。たとえば、それらに遠近法が適用されるか (オブジェクトはビューアーから離れるほど小さくなります)、または適用されないか (直交投影) を決定します。射影行列はほとんど変化しません。ウィンドウにレンダリングしていてウィンドウ サイズが変更された場合、またはフル スクリーンでレンダリングしていて解像度が変更された場合は、変更が必要になることがありますが、新しいウィンドウ サイズ/画面解像度の表示アスペクト比が以前とは異なる場合に限ります。このマトリックスを変更したくなるクレイジーなエフェクトがいくつかありますが、ほとんどの場合、プログラムのライブ全体でほぼ一定です。「プロジェクション マトリックスは目の座標をスクリーン座標に変換します」.
これは私にとって非常に理にかなっています。もちろん、最初にベクトルを行列で乗算しA
、次に行列で乗算することは、ベクトルを行列でB
乗算することと同じであるため、常に 3 つの行列すべてを 1 つの行列に結合することができます。C
C = B * A
従来の OpenGL (OpenGL 1.x/2.x) を見ると、OpenGL は射影行列を認識しています。しかし、OpenGL はモデルやビュー マトリックスを提供せず、モデルとビュー マトリックスを組み合わせたもののみを提供します。なんで?この設計では、適用されたモデル変換によって「破棄」されるため、「ビュー マトリックス」を永続的に保存して復元する必要があります。3 つの個別の行列がないのはなぜですか?
新しい OpenGL バージョン (OpenGL 3.x/4.x) を見て、従来のレンダリング パイプラインを使用せず、すべてをシェーダー (GLSL) でカスタマイズしている場合、使用可能なマトリックスがまったくないため、独自の行列を定義します。それでもほとんどの人は、射影行列とモデル ビュー行列の古い概念を保持しています。どうしてそうするか?モデル ビュー マトリックスを永続的に保存および復元する必要がないことを意味する 3 つのマトリックスを使用しない理由、または頂点シェーダーでのマトリックス乗算を節約する単一の結合されたモデル ビュー プロジェクション (MVP) マトリックスを使用しない理由レンダリングされた単一の頂点に対して(結局のところ、そのような乗算も無料ではありません)。
私の質問を要約すると、3 つの個別のマトリックスまたは単一の MVP マトリックスよりも、モデル ビュー マトリックスと個別の射影マトリックスを組み合わせた利点はどれですか?