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