About Z-Buffer related graphics techniques

Z バッファ関連の技術について日本語で簡単に説明しようと思います.

  • Double-Speed Z-Only
    • Z 値とステンシル値だけに書き込みをする場合に, 通常の倍のスピードでレンダリングができるハードウェア機能のことです.
  • Hierarchical Z
    • ピクセルパイプによるフラグメント処理の前段階 かつ Early-Z の前に, 粗い解像度の Z バッファに保存しておいたタイルごとの代表値を使って Z テストを行うハードウェア機能です.
    • 例えば, 8x8 分の pixel を 1 タイル とした場合, HiZ の解像度は 縦横それぞれ 1/8 のサイズになります.
    • また 比較モードが LESS または LESSEQUAL の場合には, HiZ には 1 タイル中の最大値を記録しておいて, その最大値より大きい深度のピクセルreject することができます.
    • Hi-Z test に失敗したものは Early Z に進みます.
    • 効果は 1 タイル単位で, 後段の Early Z や ピクセルパイプの処理を省ける可能性があります.
  • Early Z
    • ピクセルパイプによるフラグメント処理の前段階で, フル解像度の Z バッファで デプス値による Z テストを行い, フラグメントを reject するハードウェア機能です.
    • 効果は, Z Buffer の Read は発生することは同じですが, fragment shader による処理と Z Buffer への書き込みを省く可能性があります.
  • Z compression
    • タイルごとに cleared, compressed, uncompressed の 3 つの内部状態を保存できるようにして, 無駄な Z Buffer への読み書きを減らすハードウェア機能です.
    • Fast Z Clear : 例えば, Z-Buffer をクリアするときは, Z-Buffer に直接クリアの値を書きこまずに, タイルの内部状態を cleared にしておくことで, Z-Buffer への無駄な書き込みを減らします.
    • また cleared の内部状態を持つタイルの Z 値を取ってくるときには, 実際の Z-buffer の値をいちいち読みにいかずに, クリアの値を直接返すようにします.
    • タイルの Z 情報が圧縮可能なとき( minZ, maxZ のみで表現できるとき?)には, タイルの代表値を返して その値でデプステストを行います.
    • タイルの Z 情報が圧縮できないときには uncompressed として, タイル内の全ピクセルごとに Z test を行います.
    • 効果は Z バッファへの読み書きで使用される帯域を減らす可能性があります.
  • Z pre-pass ( Early-Z pass )
    • 最低限のシェーダにし, またカラーバッファへの書き込みを無効にした状態でシーンを描画して, Z-Buffer を予め埋めて置くソフトウェアの手法です.
    • 必ずしもシーン全体で Z pre-pass する必要はなく, occluders になりやすいものや三角形の数や画面内のピクセル数が多いものだけを描画することもあります.