Version: 2018.1
Monitors
Unity で HDR レンダリング

ポストプロセスエフェクトの作成

ポストプロセス は Unity でレンダリングした画像にエフェクトを適用する方法の 1 つです。

OnRenderImage 関数を使う Unity スクリプト はすべて、ポストプロセスエフェクトとして機能します。それを カメラ ゲームオブジェクト に加えると、ポストプロセスを実行できます。

OnRenderImage 関数

OnRenderImage Unity スクリプティング API 関数は2 つの引数を受け取ります。

ポストプロセスエフェクトには、しばしば シェーダー が使われます。シェーダーはソース画像を読み込み、演算を行い、結果を目的のレンダリング先に描画します (例えば Graphics.Blit を使用)。ポストプロセスエフェクトは、完全にレンダリング先のピクセルを置き換えます。

それぞれを コンポーネント として、カメラに複数のポストプロセスエフェクトを行うことが可能です。Unity はそれらをスタックとして実行します。エフェクトが Inspector のポストプロセスコンポーネントでリストされている順序で、Inspector の一番上にあるものが最初にレンダリングされます。この場合、最初のポストプロセスコンポーネントの結果が、「ソース画像」として次のポストプロセスコンポーネントに渡されます。内部では、Unity は 1 つ以上の一時的なレンダーテクスチャを作成して、この中間的な結果を維持します。

ポストプロセススタックにあるポストプロセスコンポーネントのリストは、それらが適用される順番を指定しません。

注意点

  • レンダリング先のレンダーテクスチャは null にすることができます。これは「画面にレンダリングする」 (つまり、バックバッファー) を意味します。これは、カメラの最後のポストプロセスエフェクトで発生します。

  • OnRenderImage が終了すると、Unity はレンダリング先のレンダーテクスチャがアクティブなレンダーターゲットであると仮定します。 一般に、Graphics.Blit またはレンダリング先のレンダーテクスチャへの手動レンダリングは、最後のレンダリング操作であるべきです。

  • ポストプロセスエフェクトシェーダで深度バッファの書き込みとテストをオフにします。 これにより、Graphics.Blit が意図しない値を目的先の Z バッファに書き込まないようにします。 ほとんどすべてのポストエフェクトシェーダーパスには Cull Off ZWrite Off ZTest Always が含まれている必要があります。

  • 元のシーンレンダリングのステンシルバッファー値、または深度バッファー値を使用するには、Graphics.SetRenderTarget を使用して、元のシーンレンダーの深度バッファを深度ターゲットとして明示的にバインドします。最初のソース画像エフェクトの深度バッファーをバインドする深度バッファーとして渡します。

不透明オブジェクトの後のポストプロセスエフェクト

デフォルトでは、Unity はシーンすべてをレンダリングした後に、ポストプロセスエフェクトを実行します。場合によっては、シーン内のすべての不透明なオブジェクトをレンダリングした後、ただし、その他 (スカイボックス またはtransparencies) をレンダリングする前に、ポストプロセスエフェクトをレンダリングしたい場合があるかもしれません。Depth of Field のような深度ベースのエフェクトでは、これをよく使用します。

これを行うには、ImageEffectOpaque 属性を OnRenderImage Unity のスクリプティング API 関数に加えます。

様々なプラットフォームのテクスチャ座標

ポストプロセスエフェクトが異なる画面に関連したテクスチャを一度にサンプリングする場合、異なるプラットフォームがテクスチャ座標をどのように使うかを理解する必要があります。一般的には、エフェクトの「ソース」テクスチャとカメラの 深度テクスチャ には、アンチエイリアス設定によって異なる垂直座標が必要です。Unity のユーザーマニュアル プラットフォーム別のレンダリングの違い を参照してください。

関連情報


  • 2017–05–24 編集レビュー 無しにパブリッシュされたページ

  • 5.6 の新機能

Monitors
Unity で HDR レンダリング