マスク処理 - ShaderLab
Unityでマスクを用いたエフェクト処理を色々と試してみたのでメモ。
マスク処理とは
マスクと呼ばれる数値の集合と、注目ピクセルの周辺のピクセル色を一定の規則に従って計算する処理をマスク処理といいます。
注目ピクセルとその周辺ピクセルを$S_n$で表し、マスクデータの各要素を$M_n$で表した時、出力するべきピクセル色$X$は以下の式で計算できます。
$$ X = \sum_{i=1}^{n} S_iM_i $$
こうして得たピクセル色に対して、加算を行った数を除算すれば処理は完了です。
実装
マスクパターン試してみた ref: http://qiita.com/Es_Program/item ...
マスク処理をするシェーダです。3×3のマスクに対応するようにしています。
Pass内で宣言している
- _TexWidth : テクスチャの幅
- _TexHeight : テクスチャの高さ
- _Matrix : マスク
- _Div : マスク適用後の除算に用いる
このスクリプトをカメラに取り付け、MaskPattern.shaderを適用したマテリアルをインスペクターからスクリプトに貼り付ければ動きます。 適宜MatrixやDivの値を変更することで、様々な効果が得られると思います。
注意ですが、Matrixは4×4ですが、3×3の領域しか使っていません。なのでその他の領域を弄っても効果は得られません。ガバガバな実装ですね、、ごめんなさい。 スクリプトから3×3のマトリックスを入れてやりたかったのですが、良い方法が見つけられず、変数大量に作ったりするのもなぁと思い妥協しました。もっといい方法ご存知でしたらご教示くださいませ。
使用例
実際に使ってみてどんな効果が得られるか見ていきたいと思います。 まず効果適用前の画像です。
では、効果適用後の画像を。
単純平滑化
平滑化は色の変化をゆるやかにする処理です。画像がちょっとぼやけて見えます。
エッジ抽出
エッジ抽出は画像内に含まれる輪郭線を抽出する処理です。今回使用したマスクはとても単純な横方向のエッジ検出をするマスクです。エッジ抽出のマスクパターンには
- Prewittオペレータ
- Sobelオペレータ
- Robertsオペレータ
- Robinsonオペレータ
- Kirschオペレータ
などが有名らしいです。
先鋭化
先鋭化は、境界部分を鮮明にする処理です。色の変化の大きい部分を検出し、さらに変化を大きくすることで実現しています。