深度テストとは
深度テストの有効かもenableを使う
組み込みの定数である gl.DEPTH_TEST を引数に与えて有効化
disable メソッドも同様
深度テストを有効にするコードの例
gl.enable(gl.DEPTH_TEST);
深度テストは、既定では無効になっています。
深度テストを有効にすると、いったいどういうことが起こるのでしょうか。
そもそも、どうして深度テストが必要なのでしょう。
深度テストは
要は手前にあるものが奥にあるものを覆い隠す
現実世界では当たり前のように起こっていることをシミュレートするため
三次元空間の奥行きを表現するために欠かせない要素の一つです。
深度 という言葉からも連想できる
DirectX では Z テストなどと呼ばれたり
WebGL のなかで描画命令が発行されると、仮想的な三次元空間上に次々とモデルが描画されていきます。
ただしこのとき、描画されたものが順番に配置されていくため、最初のほうに描画されたものは後から描画されたものによってどんどん上書きされていきます。
これはモデルが手前にあろうが奥にあろうが変わりません。実際には遠くのほうにあるはずのモデルが、手前にあるはずのモデルの上に上書きされていってしまうのですね。
深度テストが有効にされると、
奥行きを基準とした評価(テスト)が行なわれるようになります。
テストに合格したものだけが画面上に描画され、
テストに合格できなかったものは描画されないようになるわけです。
富豪的に考えれば、全部を奥行きを考慮して描画して、最後に一番手前にあるのだけを描画いいはず
計算量を節約するため、max関数みたいな感じで「現在のいち番手前」を保持して、テストで比較していると考えられる
深度テストの評価方法を指定するのが depthFunc メソッドです。
このメソッドの引数に、組み込みの定数で評価方法を指定するのですが、一般的には次の組み込み定数を使います。
一般的な深度テストの評価方法指定gl.depthFunc(gl.LEQUAL);
ここで指定されている gl.LEQUAL という組み込み定数を使うと、奥にあるものが隠れるという一般的な三次元シミュレートが実現できます。
逆に言うと、あまりこれ以外の指定をすることはないでしょう。