Early-Z と Hierarchical Z が無効になる条件
Early-Z と Hierarchical Z が無効になる条件
- 下図のリファレンステーブルは参考文献の "Depth In-depth" Emil Persson に載っていたものです.
- Enabled の箇所はその項目によって無効にはなりませんが, 他の項目の Disabled によって無効になる可能性があることを示しています.
- Disabled の箇所があった場合, 必ず無効になります.
ピクセルシェーダの計算のスキップを、Early-Z + Z バッファで制御
- ある時点から隠面消去に Z バッファを使わなくて済む場合(Deferred Shading)は, Z バッファの値を制御コードとして利用し, Early-Z で計算したくないピクセルはスキップすることができます.
マルチ解像度のディファードシェーディング (Multi-Resolution Deferred Shading)
- Game Programming Gems8 で紹介されている Multi-Resolution Deferred Shading は低解像度から高解像度へレンダリングバッファへのシェーディングを行っていて, このときに特定のピクセルだけをシェーディングするために Early-Z を利用しています.
- (1) まず レンダリング用の複数解像度のバッファ(1280x1024, 640x512, 320x256)を用意しておきます.
- (2) 一番低解像度のレンダリングバッファのデプスを 1.0 でクリアしておきます.
- (3) この解像度でのシェーディングするピクセルをマークするために, Z_i = 1.0 - i * 0.1 (今回は i = 1)の長方形をレンダリングします.
- 次にミップマップ化した G-Buffer を読み込んで, 法線・デプスバッファ・マテリアル ID からピクセルの連続性をチェックします.
- もし不連続である場合は discard して, Z バッファへの書き込みをスキップします.
- もしこの解像度でシェーディングをする場合は, Zバッファに書き込んでおきます.
- (4) 次にシェーディングのパスとして, Z 比較を EQUAL にした状態で Z_i = 1.0 - i * 0.1 (今回は i = 1)の長方形をレンダリングしてシェーディングを行います. ここでは 3. でマーキングしたピクセルだけシェーディングの計算が行われます.
- (5) 低解像度のレンダリングバッファでの結果を 1 段階, 解像度が高いバッファにバイリニアフィルタを使いながらコピーします.
- (6) 3-5 の処理を, 一番解像度が高いバッファに到達するまで繰り返します.
- "Multi-Resolution Deferred Shading" Hyunwoo Ki. Game programming gems8 (p36〜p41)