深度テスト(しんどてすと、英: Depth test)はZバッファ値と入力深度値の大小比較である[4]。Zテスト(英: Z test)とも。
深度テストはピクセル単位で実行される。
深度テストが実行されるタイミング(グラフィックスパイプライン上のステージ)はいくつかありえる。ピクセルシェーダー前に行われる深度テストを Early Z test、後に行われる深度テストを Late Z test と呼ぶ場合もある[5]。
古典的なレンダリングにおいて深度テストは Late Z test として実行される。この場合大半の描画済みピクセルはテストにより捨てられ無駄なピクセルシェーダー処理が走ったように見えるが、ピクセルシェーダーは深度値の上書きが可能なため必要なコストである[6]。特定の条件を満たした場合であれば Early Z test によってピクセルシェーダーをスキップし効率的に描画できる。
更なる最適化を考えると深度テストの実行順序が問題になる。空のZバッファに対して最背面部分の Early Z test をおこなうとバッファが空なのでテストパスし最背面なのに描画されてしまう。また手前寄りの部分を描画したあとに最前面が来ると結局テストパスして再描画されてしまう。つまりフラグメントシェーダーの実行を最小回数に抑えるには最前面から深度テストをしなければならない。これは矛盾していて、最前面が事前に分かっているのなら深度テストせずに最初から最前面だけ描画すればよい。
これを解決するレンダリングテクニックが depth pre-pass である。Early Z test 可能条件であることを前提に、全モデルのジオメトリパス(≒ピクセルシェーダー無し)をまず実行して完全なZバッファを完成させる。この小さなパスが depth pre-pass である[7]。このパスによって最前面で埋まったZバッファが得られる。このZバッファがあるということは「Early Z test をパスしたらすなわち最前面」という状態を意味するため、このZバッファを使ったうえで各モデルのレンダリングパイプラインを通常通り動かすと最前面以外がすべて事前破棄されるピクセルシェーダー最小実行回数が実現できる[8]。
^"The depth test compares the framebuffer depth coordinate Zf with the depth value Za in the depth attachment." Khronos. Vulkan Guide - Using Vulkan - Depth. Vulkan Documentation. 2024-08-17閲覧.
^"Early ZS testing ... it happens before any pixels are colored in by fragment shading. ... Late ZS testing happens after all the fragment shading work has been done" 以下より引用。arm. Depth (Z) and stencil (S) testing. arm Developer documentation. 2024-08-17閲覧.
^"For example, if a shader programmatically modifies gl_FragDepth, early ZS testing cannot be used, and late ZS testing is forced." 以下より引用。arm. Depth (Z) and stencil (S) testing. arm Developer documentation. 2024-08-17閲覧.
^"The depth-prepass renders the geometry without writing colors in the framebuffer." 以下より引用。arm. Use depth pre-pass. Arm Developer Documentation. 2024-08-17閲覧.
^"The depth-prepass ... initializes the depth buffer for each pixel with the depth of the nearest visible object. After this pre-pass the geometry is rendered as usual but using the Early-Z technique, only the objects that contribute to the final scene are actually rendered." 以下より引用。arm. Use depth pre-pass. Arm Developer Documentation. 2024-08-17閲覧.