2012-08-14 1 views
10

私はOpenGLを学んできました。私を困惑させ続けている1つの話題は遠いクリッピングプレーンです。ニアクリッピングプレーンとサイドクリッピングプレーン(それ以外のオブジェクトは決してレンダリングされないため、決して実際の効果はありません)の背後にある推論を理解することができますが、遠いクリッピングプレーンは迷惑に見えるだけです。なぜOpenGLに遠いクリッピングプレーンがあり、これを扱うのにどのようなイディオムが使われていますか?

OpenGLの背後にある人は明らかにこのことを考えていたので、私が紛失しているものがあるはずです。なぜOpenGLは遠くのクリッピングプレーンを持っていますか?もっと重要なのは、あなたがそれをオフにすることができないため、宇宙遊戯やスカイボックスなどで何千も離れた星のようなオブジェクトの場合、巨大な距離で物を描くときに使用する推薦イディオムやプラクティスは何ですか?クリッピング平面を非常に遠くにすることだけが期待されているのですか、より洗練されたソリューションがありますか?これはプロダクションソフトウェアでどのように行われますか?

答えて

19

唯一の理由は深度精度です。深度バッファにはビット数が限られているだけなので、そこには限られた深さの深さを表現することもできます。

ただし、遠方の平面を無限遠くに設定することができます。thisを参照してください。深度バッファーではうまく動作しません。遠く離れたところにオクルージョンがあると、多くのアーティファクトが表示されます。

これはデプスバッファの周りを回っているので、使用しない限り、離れたものには問題はありません。例えば、一般的なテクニックは、内部で深度バッファを使用する(スラブのすべてのものについて)シーンをレンダリングすることですが、スラブの場合は外部のペインタのアルゴリズムの何らかの形式を使用するため、最も遠いものを描画します最初に)

+0

ニアクリッピングプレーンをゼロに近づけると、遠いクリッピングプレーンをあまりにも遠くに設定することと同じ効果が生じることに注意することは重要です。 http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htmによると、失われたビットの数はlog2(far/near)です。 –

9

なぜ遠いクリッピングプレーンがあるのですか?

コンピュータはのためです。

これに対処するには、一般に2通りの方法があります。 1つの方法は、z-farが無限に近づくにつれて限界を取ることによって投影を構成することです。これは有限の値に収束しますが、遠くのオブジェクトに対して深度の精度を混乱させる可能性があります。

(特定の距離を超えるオブジェクトを持っていても、正確に深度テストに失敗した場合)は、glEnable(GL_DEPTH_CLAMP)で深度クランプをオンにすることです。これにより、近平面および遠平面に対するクリッピングを防止します。 [-1、1]の範囲外で正規化されたz座標を持つフラグメントは、その範囲にクランプされます。前述のようにクランプされている破片の間で深さ試験をネジ止めしますが、通常はそれらのオブジェクトは遠く離れています。

0

Window Space Coordinates([-1,1]^3の標準化されたデバイス座標、追加のスケーリングglViewportとglDepthRangeを使用)で深さテストが実行されたのはちょうど "事実"です。

私の視点から見ると、それはOpenGLライブラリのデザインの観点の1つです。それはあなたのOpenGLのバージョンで利用可能な場合、このOpenGLの拡張/ OpenGLのコア機能https://www.opengl.org/registry/specs/ARB/depth_clamp.txtを排除するためのアプローチの


一つ。


私は、透視投影では「遠方のクリッピング平面」について何も記述しません。

3.1透視投影の場合は、投影の中心となる点\ vec {c}を設定する必要があります。投影平面Tの分割点の任意点\ vec {r}と\ vec {r}を、以下のように仮定してみましょう:\ vec {r} - \ vec {r_0}、\ vec {n}} \ 012 c}投影の中心。他の場合、\ vec {r}と\ vec {c}は1つのハフ空間にあり、\ vec {r}は破棄されるべきです。

3.4投影のアイデアは、交差点を見つけることである\ VEC {I} \面T とVEC {I} =(1-T)\ VEC {C} + T \ VEC {R}

3.5それは あるように(\ VEC {I} - VEC {R_0} \ \ VEC {N})= 0

=>

((1-T)\ VEC {C} + T \ VEC {R} - VEC \ {R_0}、\ VEC {N})= 0

=>

(\ VEC {C } vec {r_0}、\ vec {n})= 0

3.6。 "3.5"から導かれたtは "3.4"に代入することができ、平面Tへの投影を受け取ります。

3.7。投射後、ポイントは飛行機の中にあります。しかし、イメージ平面がOXY平面に平行であると仮定すると、投影後に元の「深度」を使用するように提案することができます。

したがって、遠方の平面を全く使用しないことが可能です。また、[-1,1]^3モデルを明示的に使用しないでください。

p.s.私は正しい方法でラテックスの式を入力する方法を知らない、s.t.彼らはレンダリングされます。

関連する問題