OpenGL | 深度バッファー Z バッファー

1. 隠れ面の排除

3D シーンを描画する場合、どの部分が観察者に見えるか、またはどの部分が観察者に見えないかを決定する必要があります. 見えない部分については、不透明な壁の背後にあるオブジェクトをレンダリングしないなど、早期にそれらを破棄する必要があります. この問題は、隠れ面の除去、または可視面の決定と呼ばれます。

2. 隠面消去アルゴリズム

1.ペインターのアルゴリズム

隠面消去のより簡単な方法は、画家のアルゴリズムです。ペインターのアルゴリズムの基本的な考え方は、まずシーン内の観察者から遠く離れたオブジェクトを描画し、次に近くのオブジェクトを描画することです。たとえば、下図のオブジェクトを描画します (Z バッファーと W バッファーの導入から)、最初に赤い部分を描画し、次に黄色の部分を描画し、最後に灰色の部分を描画すると、陰面消去の問題を解決できます。

ペインターのアルゴリズムを使用する場合、観察者からの距離に応じてシーン内のオブジェクトを並べ替え、遠くから近くに描画するだけで済みます。ペインターのアルゴリズムは非常に単純ですが、一方で欠点もあります. たとえば、下の図では、ペインターのアルゴリズムは 3 つの三角形が互いに重なっている状況を処理できません。

2.Zバッファ

OpenGL は、深度バッファーとも呼ばれる Z バッファーにすべての深度情報を格納します。GLFW は、そのようなバッファーを自動的に生成します (出力画像の色を格納するためのカラー バッファーもあるのと同じように)。深さの値は各フラグメントに (フラグメントの z 値として) 保存されます. フラグメントがその色を出力したいとき, OpenGL はその深さの値を z-buffer と比較します. 現在のフラグメントが他のフラグメントの後ろにある場合, それはそうしないと、上書きされます。このプロセスは深度テスト (Depth Testing) と呼ばれ、OpenGL によって自動的に行われます。

(1) デプステスト

デプス テストはデフォルトで無効になっているため、デプス テストを有効にしたい場合は、GL_DEPTH_TEST オプションで有効にする必要があります。

glEnable(GL_DEPTH_TEST);

有効にすると、OpenGL は、フラグメントが深度テストに合格した場合、フラグメントの Z 値を深度バッファーに格納し、深度バッファーに失敗した場合、フラグメントを破棄します。深度バッファリングを有効にしている場合は、各レンダリング反復の前に GL_DEPTH_BUFFER_BIT を使用して深度バッファをクリアする必要もあります。そうしないと、前回のレンダリング反復で書き込まれた深度値を使用したままになります。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

深度バッファをクリアするデフォルト値は 1.0 で、最大深度値を表します. 深度値の範囲は [0.0, 1.0] の間です. 値が小さいほど観測者に近く, 値が大きいほど,観測者から遠ざかる。

(2) 適用シナリオ

スカイボックスを描画するときは、それをシーンで最初にレンダリングされるオブジェクトにし、深度書き込みを無効にする必要があります。このようにして、スカイボックスは常に他のオブジェクトの背後に描画されます。

次に描画される要素が現在のシーンの要素に覆われたくない場合 (現在のシーンには平面があり、次に描画される要素の位置が平面の下にあるが、平面の上に要素を表示したい場合) )、要素を描画できます 深さテストを無効にします。(深度テストが無効になっている場合、現在のシーンのすべての要素の深度値は 1.0 で、カメラから最も離れています)。

おすすめ

転載: blog.csdn.net/weixin_39766005/article/details/129792164