1

OpenGL を使用してオブジェクトを描画する方法を理解しようとしています。質問は非常に単純ですが、それでもどこにも明確な答えが見つかりません(または私は完全に愚かです:))。問題を説明しましょう。

1) 画面に 2 つの三角形を配置するだけです。三角形の座標 (x、y、z、w) は次のとおりです。

Triag1 = { {0, 0, -0.5, 1} , {1, 0, -0.5, 1}, {0, 1, -0.5, 1} } // a bigger one
Triag2 = { {0, 0, 0.5, 1} , {0.5, 0, 0.5, 1}, {0, 0.5, 0.5, 1} } // a smaller one

2) ビューも投影変換も使用していません

3) 各三角形の「デフォルト」の色を頂点属性の 1 つとして渡し、さまざまな属性を使用してフラグメント シェーダーに単純にバイパスします。Triag1 は青、Triag2 は赤

ネット上のすべてのチュートリアルでは、OpenGL は右手系の座標系を使用し、Z 軸は「画面外」を指すと述べています。したがって、オブジェクトのそれぞれの z 座標を考慮すると、小さな赤い三角形とその背後にある大きな青い三角形が表示されると予想されます。どんなにそれが起こっていない。大きな太い青い三角形しか見えません。

三角形のそれぞれの z 座標を交換すると (Triag1 は正の z 座標を取得し、Triag2 は負の z 座標を取得します)、期待どおりの結果が得られます。しかし。これは、どういうわけか、Z 軸が画面の外ではなく、画面の内側を指していることを意味します。

より経験豊富な人が、私が見逃している基本的な側面を説明してもらえますか?

PS GLUT も GLM も、さまざまな OpenGL マトリックスをセットアップするための呼び出しもありません。「頂点を GPU に渡す - シェーダー プログラムを有効にする - ものを描画する」のみ

4

1 に答える 1

2

ネット上のすべてのチュートリアルでは、OpenGL は右手系の座標系を使用し、Z 軸は「画面外」を指すと述べています。

これは単なる慣習であり、実際には適用されない慣習です。これは目の空間の慣習であるためです。通常、カメラが -z 方向に沿って見える目の空間があります (gluLookAt()関数はそれを念頭に置いて設計されています)。

典型的な射影行列も、副作用として利き手を反転させます。、gluPerspective()glOrtho()および関数は、実際にはおよびパラメータにglFrustum()正の値を指定することを期待していますが、それぞれおよびに近平面と遠平面を設定します。そのため、GL のクリップ スペースは通常、左利きと見なされます。変換行列を使用しないため、クリップ スペースに直接描画します。nearfarz=-nearz=-far

ただし、これは単なる別の規則であり、必要に応じて変更できます。深度テスト機能を反転させるか、 を使用して反転させることができますglDepthRange()。結局、それはすべてあなた次第です。しかし、通常、人々は GL 規則と左利きのクリップ スペース、NDC、およびウィンドウ スペースに固執します。ウィンドウ座標の z=0 にニア プレーンを、z=1 にファー プレーンを配置することは、実際には非常に直感的です。

于 2014-09-13T22:00:50.543 に答える