T.TAO
Back to Blog
/3 min read/Blog

Unity Shader #13 Post Processing

Unity Shader #13 Post Processing

Unity Shader #13 ポストプロセッシング

このノートでは、画面後処理の実装方法と原理について説明します。実装原理はOnRenderImage関数に基づいており、この関数はBuilt-inレンダリングパイプラインでのみ有効です。URPでは別の操作で適応する必要がありますが、原理は同じです。まずBuilt-inで導入し、最後の部分でパイプラインのアップグレードを検討します。

フルスクリーンシェーダー

Unity Built-Inレンダリングパイプラインで、Image Effectシェーダーを作成します。このシェーダーは通常フルスクリーンエフェクトに使われ、Hiddenブランチの下にあるため、マテリアルで直接選択できません。

後処理では、多くの場合頂点を特別に処理する必要はありません。したがって、頂点シェーダーには組み込みのvert_imgを直接使用できます。フラグメントシェーダーでは、従来のv2fの代わりに組み込みのv2f_img構造体を使用します。

明度 / 彩度 / コントラスト

明度(Brightness)

明度の定義に従い、最終出力色のRGB値に明度係数を掛けるだけです。

彩度(Saturation)

彩度が最低のとき、色は直接のグレースケールに近づきます。高いときはより鮮やかになります。0.2125R、0.7154G、0.0721Bは経験式で、RGBをこの比率でグレーに変換すると人眼にとって最も自然なグレーになります。

コントラスト(Contrast)

コントラストが低いとき、すべての色が区別できず、統一されたグレー(0.5, 0.5, 0.5)になります。したがって、コントラストも線形補間で簡単に解決できます。

エッジ検出

エッジ検出には、まず畳み込みと畳み込みカーネルの概念を理解する必要があります。

畳み込み(Convolution)は本質的に重み付き合計です。サンプル点を中心に、周囲の一定領域をカバーし、畳み込みカーネル(Convolution Kernel)で定義された重み付け方式でその点の数値を求めます。画像に1回畳み込みで値を求める過程はフィルタリング(Filter)とも呼ばれます。

Sobelが定義したSobel畳み込みカーネルで画像を畳み込み処理すると、エッジ付近で得られる値が高くなることがわかります。エッジ付近の色は激しく変化するため、この方法でエッジの位置を見つけられます。