Panini プロジェクション

透視投影をすると FOV の広いビューの側面に生じるジオメトリ歪みを修正するための 3D プロジェクション

Windows
MacOS
Linux

コンフィギュレーション

Unreal Engine 4 は、透視投影を使用するデフォルト設定になっています。ただし、この投影モデルは FOV が広いと ジオメトリに歪みが生じてしまいます。インスタンスが FOV = 120 の球である以下の例では、 それが非常によく表れています。

qagame_fov120.png

そこで Unreal Engine では、オプションでポストプロセス パスを提供し、 Panini プロジェクションを使って問題を修正します。透視投影を使うべきところで Panini プロジェクションを使用して レンダリングしたピクセルを動かすというのが、このポスト プロセスの考え方です。設定手順は以下の通りです。 setting up r.Upscale.Panini.D > 0.このポストプロセス エフェクトはアップスケーリング パスで処理されます。つまり、r.ScreenPercentage != 100 または r.Upscale.Panini.D > 0 の場合に、 このパスが使われるということです。このパラメータの詳細について記載されているリンクを ページの最後に紹介しています。

qagame_fov120_panini.png

r.Upscale.Panini.D > 0 の場合、直接エフェクトが強調されます。ただし、このパラメータ以外でも方法があります。 r.Upscale.Panini.S もハードウェア圧縮で線形補完します。角にある球が楕円状になってしまう場合は、 このパラメータで調整することも可能です。ただし、r.Upscale.Panini.S < 0 の場合は、 レンダリングされていない黒いピクセルが開始として角に表示されます。

qagame_fov120_vertical_compression.png

このエフェクトの機能の仕方の理解を深めるために、r.Upscale.ScreenFit を修正することもできます。透視投影されたピクセルでは、 画面の上部付近と画面の下部では表示されないということを 覚えておくと良いでしょう。

qagame_actual_effect.png

直線

Panini プロジェクションでは、線上で確実に位置をそろえることができます。まず縦の線上では、すべての r.Upscale.Panini.D と r.Upscale.Panini.S. が 必ず真っすぐになります。次に、画面の中央を通る線上では、 すべての r.Upscale.Panini.D と r.Upscale.Panini.S = 0 が必ず真っすぐになります。従って、 画面中央を狙っている武器に Panini プロジェクションを使用すれば、そのまま中央に向かって真っすぐ行くので、 この数学的なプロパティはファーストパーソン シューティング ゲームでは理想的です。

shootergame_fov120.png shootergame_fov120_panini.png

Center Bluryness

このポストプロセス エフェクトの問題点の一つは、 r.Upscale.Panini.D が減少すると、画面の中央でブラー現象が発生することです。フィルタによって画像を鮮明にしてこの現象に対処するために、 Panini プロジェクションをアップスケーリング パスで実行しましたが、この問題を解決するには 遅すぎます。従って、この問題を解決するには r.ScreenPercentage を上げる必要がありますが、 描画するピクセル数が増えるので レンダリング パフォーマンス全体に負荷がかかってしまいます。画像比率を高めにできないハードウェア上で R.Upscale.Panini.D の値をうまく調整することになります。 そうすれば、アップスケール パスで画像を鮮明することで、このエフェクトが利用できます。

shootergame_fov120_panini_screen_percentage.png

Panini プロジェクションには別の使い方があります。 マテリアル関数を使って、ワールドオフセットがマテリアルのワールド位置オフセットの入力ピンにプラグインされるように出力します。実際アンリアル トーナメントでは、別の FOV で武器をレンダリングする代わりに Panini プロジェクションが実際に使って、 透視投影による歪みを修正しています。UT の Github レポジトリを見ると良いかもしれません。

リファレンス

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback