OpenGLの研究ノート12(デプステスト)
深さをテストする理由
我々は複数のオブジェクトをレンダリングする場合、複数のオブジェクトの各ブロックの間に関係があり、オブジェクトの一部を不明瞭に表示されません、それは遠く離れてカメラからで、コンピュータを伝えるために、描画オブジェクトによってブロックされている必要はありません、我々それはレンダリングする必要があるかどうかを検出するために、オブジェクト上の点の深さをテストするために行われる必要があります。
上記検出、デプスバッファの必要性を達成するために、単に、オブジェクトに格納された深さ値にポイントの配列である、配列値は、現在のオブジェクトの奥行き値をバッファに格納されているときよりも大きくレンダリングされる場合、0の開始でありますこの値は逆に、深さ値が少ないバッファ内の深度値よりも、深さテストが渡されない場合には、デプステストしながら、バッファに書き込まれ、書き込みしないバッファを行い、(レンダリングされていないこの点を解消します)。
もちろん、あなたが、あなた自身の比較関数を定義することができ、次のプレゼンテーションを行います。
デプステスト機能
二つの主要な段階の深さのテストがあり、
- バッファ内の値の比較は、(Zテスト)か否かを試験することによって決定されます
- 書き込みバッファの値(Zライト)かどうか
デプステスト機能はデフォルトで、深さ試験方法オープン機能では無効になっています。
glEnable(GL_DEPTH_TEST);
深書き込み制御ロジック機能:
glDepthMask(GL_FALSE);
glDepthMask(GL_TRUE);
比較関数
比較関数によって、我々はリフレッシュモードバッファをカスタマイズすることができます
glDepthFunc(GL_ALWAYS);
機能 | 説明 |
---|---|
GL_ALWAYS | 常に深さ試験による |
GL_NEVER | 深さをテストすることはありません |
GL_LESS | フラグメントの深さ値をテストすることによってデプスバッファ値よりも小さいです |
GL_EQUAL | 深さ値によって試験したとき、断片バッファのデプス値に等しいです |
GL_LEQUAL | 深さ値に等しい断片の深さを試験することによってバッファの値よりも小さいです |
GL_GREATER | 断片バッファの深度値よりも深さも大きくすることにより試験した場合 |
GL_NOTEQUAL | 深さ値によって試験した場合には、セグメントデプスバッファ値に等しくありません |
GL_GEQUAL | デプスバッファ値よりも断片深さより大きいを試験することにより、に等しいです。 |
デプスバッファをクリア
私たちが必要とするたびにキャッシュ値を空にした後、再びレンダリングされる、または画面のエラー状態が発生することがあります
クリアは同じように、明確な色をキャッシュ
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
試験深さの精度及び紛争の深さ
関数は、深さの値を計算する
深さ値は、多くの場合16ビット、24ビットおよび32ビット、その値のビット0-1を有しています。
新興の問題:
- 非常に遠く離れてカメラからの多数のオブジェクト場合は、1の値で、この上あまり焦点ので、エラー現象の深度値があるでしょう
- 同一平面内のオブジェクトの場合に多数、(それはフロートであるので、それはジッタを引き起こし、結果は毎回異なるレンダリングすることができる)は、同じ深さ値が存在するであろう
問題2種類以上の場合、それは、そのレンダリング順序を設定し、カメラの近くと遠くのプレーン、最良の結果を達成するために必要があります