2016-11-12 8 views
0

私は、Google GVR SDK for Unityのレンズ補正シェーダコードを見ていて、ビュースペース位置のzコンポーネント(UNITY_MATRIX_MV、UNITY_MATRIX_MVPのパースペクティブトランスフォームなし)の使用について私の頭を傷つけています。 undistort()関数(単純な変種のこの1):Google VRレンズ補正で奥行きを使用していますか?

我々は画面がを通して見ているレンズによって適用される歪みを打ち消すために、2Dスクリーン空間でレンダリングされた画像をワープしたいことを理解し、私の考える
float r2 = clamp(dot(pos.xy, pos.xy)/(pos.z*pos.z), 0, _MaxRadSq); 
pos.xy *= 1 + (_Undistortion.x + _Undistortion.y*r2)*r2; 

、何私たちの半径(?)を直線の深さ(pos.z)の二乗で除算していますか?私はこれを視点でwで割る代わりに考えることができますが、なぜz成分の2乗で除算したいのですか(単純にzまたはwで除算するよりも正しい方法はどうでしょうか?

答えて

0

これは通常の最適化の結果であるため、後ろの視界では少しばかげて感じます。

分割は通常のパースペクティブ分割です(ただし、深度バッファ/カリングに使用されるz座標はリニアにしておき、適切な深度補間を保証するためにwは1.0にする必要があります)。計算を再構成することは、おそらくシェーダサイクルおよび/または精度を節約することが分かった。

このコードはpos.zを最初にpos.xで割って縮小し、次にpos.xyのドット積を取って2Dスクリーンスペースで長さを2乗する(そしてクランプするなど)のと同じです。 )

関連する問題