-2

y 軸を中心に回転する 3 つの頂点の三角形を取得しました。私が「奇妙」だと思うことの 1 つは、GL のデフォルトの正射影における正規化された座標です。私は SDL や SFML などの 2 次元ライブラリを使用してきましたが、これらはほとんど常にピクセルを処理します。50x50 ピクセルのイメージ サーフェスが必要だと言うと、それが得られます。そのため、当初、頂点位置の選択を [-1,1] から制限すると言うのは奇妙でした。

直交座標を正規化する必要があるのはなぜですか? 透視投影は同じですか?もしそうなら、オブジェクトの原点を z=-10 にしたいのはどのように言えますか? (マトリックス数学をざっと見てみると、パースペクティブが異なると言われています。「w」による除算が同種の(正規化されたものと同じ?)座標を作成することについての何かですが、よくわかりません)。

gl_Position = ビュー * モデル * プロジェクト * 頂点;

上記の式を見て、シェーダーで使用される変数 gl_Position が、モデル/オブジェクトの現在の頂点の位置と、同時にビュー/プロジェクション、またはカメラ。それはどのように機能しますか?乗算によって、すべての情報が 1 つのマトリックスに格納されていることは理解していますが、OpenGL は、情報が結合された 1 つのマトリックスをどのように使用して、「わかりました、gl_Position のこの部分/部分はカメラ用であり、他の部分はカメラ用の情報です」と言います。モデルはどこへ行くのか?」(ところで、頂点 vec4 が何を表しているのかよくわかりません。モデルのすべての頂点がモデル内にあると思いました。何かアイデアはありますか?

もう 1 つの質問です。たとえば、FPS ゲームでマウスを上に動かして見上げるなど、カメラを動かしたいだけで、カメラ以外にオブジェクトが回転または移動されていない場合 (私が思うに)、上記の方程式は何かに見えますか?このような?

gl_Position = ビュー * プロジェクト;

4

2 に答える 2

5

直交座標を正規化する必要があるのはなぜですか?

彼らはしません。必要に応じて、正射影ボリュームの制限を設定できます。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

頂点シェーダーに、先ほど説明したまさにこの変換プロセスを実行させます。

于 2012-12-28T12:09:49.063 に答える
0

「OpenGLには個別のカメラ(ビュー)マトリックスがないことに注意してください。したがって、カメラまたはビューの変換をシミュレートするには、シーン(3Dオブジェクトとライト)をビュー変換の逆で変換する必要があります。つまり、 OpenGL は、カメラが常に (0, 0, 0) に位置し、目の空間座標の -Z 軸に面していて、変換できないと定義しています。ModelView マトリックスの GL_MODELVIEW マトリックスの詳細を参照してください。

ソース: http://www.songho.ca/opengl/gl_transform.html

それが私が夢中になっていたことです。OpenGL には別のカメラ ビュー マトリックスがあると思いました。

于 2012-12-28T18:36:39.320 に答える