最適化のためには16bitだ!と言うけどこれが何なのかいまいちわかっていなかったので自分メモです。
最初に書いておくと、ここ読めば大丈夫。
その71 深度バッファの精度って?
カメラからは0~1の深度値がとれています。
視点に近いほど黒く(0)、遠くほど白く(1)なっていきます。【Unityシェーダ入門】デプスバッファの内容を表示する - おもちゃラボ
16bitや24bitとはこの深度の精度に関わるようです。
精度がいい悪いというのはどういうことだろう?
- 精度がよい: ポリゴンが近接していても前後関係を正しく描画できる
- 精度が悪い: ポリゴンが近接しているとちらつきやZファイトなどの原因となる
あまりよくないけどイメージ図
0~1の深度値を16bitであれば2の16乗で、24bitであれば2の24乗で割って深度値を分割していき、その後パースペクティブ行列によってさらに深度値は変換されます。(詳しくは最初に掲載したリンク・・・)
パースペクティブ行列はその計算特性によって、近平面と遠平面までの距離比に大きく影響を受けるようです。
先のリンクでは24bitと32bitだったので、WMRの設定値の16bitと24bitで計算してみました。
近平面nz =
遠平面fz =
Z =
d =
最短区間距離(16bit)m =
最短区間距離(24bit)m =
HoloLensでnear推奨は0.85、farはデフォルトで1000なので例えば1000m先だと最短区間距離は24bitでは7m、16bitでなんと18mですね…
ARでは遠方のオブジェクトをあまり扱わないとはいえ、かなり大きい数値です。
ひとまずもんにょりしていたところがすっきりしました
追記
UnityだとReversed Zといって、深度値を逆転しているらしい。これによって先の問題を抑え込めるそう。