2009-06-27 11 views
8

ここに初めて。今日座って、OpenGLを教えてください。しかし、私は答えが見つからないような質問に遭遇しました。私は深さテストがOpenGLの半透明オブジェクトと互換性がないように思われるのだろうかと思います。ドキュメンテーションでは、深度テストをオフにしてから逆距離順にオブジェクトを描画し、ブレンドが適切に機能しなければならないことが示唆されています。OpenGLでのZ-Depthテスト

しかし、なぜOpenGLは逆距離順で最も遠いのかを把握するために、常に同じ深度テストを使用できないのですか?それはフレームワークの単なる限界ですか、それともグラフィックハードウェアなどで効率的にできることとは何か?

誰かがここで誰かが解明できることを願っています。

答えて

11

良い質問です。

簡単な答えは、Zバッファがフレームバッファ内の各ピクセルに単一の値(唯一)を格納するということです。 「通常」の操作モード(不透明なオブジェクトの場合、GL_DEPTH_TESTが有効、glDepthFuncGL_LESSに設定されている)の場合、その値はそのピクセルにマップされる最も近いフラグメントの深さになります。

フレームバッファは「ダム」デバイスです。すべてのフラグメントは、他のフラグメントとは独立してラスタライズされ、深度テストが行​​われ、それを生成したプリミティブの概念とは分離されています。したがって、あなたの「自動透明性」機能を実装するために必要とされるように、先行するプリミティブ、深度ソートなどに関する情報が保持される場所はありません。

深度ソートのヘルプについては、「シーングラフ」を参照してください。これらは、OpenGLが提供する基本的なT &のものよりも「高水準」の機能を追加するライブラリです。

これが役に立ちます。

2

深度テストをオフにしていると聞いたことがありません。透明なオブジェクトの深度テストが必要です。

透明なオブジェクトがzバッファに書き込まれることを望まないのは、後で描画されるオブジェクトの背後にあるものに穴を開けるからです。

+0

私は彼が示唆しているようにOpenGLを使用した場合、透明オブジェクトの後ろに描画されたすべてが透明オブジェクトを完全に隠すことになるため、明確に意図されていないからです。 – Blindy

+1

これはポイントです。透明なものを最後に描画し、深度テストは有効にしていますが、深度書き込みは無効にしています。そうすることで、透明なものはまだその前にある不透明なもので塞がれます。 –

+0

最後に透明なオブジェクトを前面に描画します。私は彼が逆の順序を言い、zバッファリングについて尋ねていたので、彼がすでにそれを知っていると仮定しました。 – David

3

OpenGLはデプスバッファに一度に1ピクセルずつ書き込み、OpenGLに表示される順序でピクセルを生成する三角形をレンダリングします。 OpenGLは三角形の深度ソートを行いませんが、そのアプリケーションにとって最も効率的な方法でそれを管理するのは呼び出し元のフレームワークに任されています。多くの三角形をレンダリングする最も効率的な方法は、それらを頂点とインデックスの連続したバッファに格納することであり、APIがすべてのフレームをすべて並べ替えることを心配しなければならない場合、速度と柔軟性のためです。物事ははるかに遅い。

また、素材はAPIの三角形に直接関連付けられていないため、実際にレンダリングされるまで透明であるか透明でないかはわかりません。

まず、すべての不透明な三角形を描画してから、すべての透明/アルファブレンドされた三角形を最後に描画することをお勧めします。通常、深度テストは有効にしていますが、深度の書き込みは無効にし、正しいブレンドのために透明な三角形を先頭から順に並べ替えたいとします。私が通常これを処理する方法は、いくつかのバケットを持つシーングラフを作成することです。シーングラフに三角形を追加すると、適切な順序でレンダリングされる適切なバケットに自動的に分割されます。