2018年3月11日

Unity 油絵風のエフェクトをかける


画面全体に油絵(絵画)風のエフェクトをかける方法をメモメモ…


※このページの内容の動作確認にはUnity5.6を使用しています。
コマンドバッファを使用して画面全体にエフェクトをかける方法はこちら!(丸投げ)↓

【Unity】CommandBufferで画面にポストエフェクトをかける
https://qiita.com/r-ngtm/items/d58c4c8aad719d8c1c36


油絵風のエフェクトはこちら!(丸投げ)↓

Shaders Laboratory
http://www.shaderslab.com/demo-63---oil-painting.html



これが
こうなる

おしまい。



…というのはさすがにマズいので簡単に解説しておきますと…

カメラに映った画面全体にエフェクトをかけたい場合、コマンドバッファを利用すると便利です。コマンドバッファについてはUnityの公式マニュアルがわかりやすい上に、なんとページ内でご丁寧にもサンプルプロジェクトまで配布されていますので是非ご一読を。上記のQiitaのページでは、具体的に画面の「色を反転させる」というシンプルな実装例が示されているので、あとはこの「色を反転させる」シェーダを「油絵風の見た目にする」シェーダにすげ替えればいいわけです。

次のShader Laboratoryはすごい数のシェーダが紹介されているサイト。トップページには「あくまでUnityでのシェーダの学習のために作成したものだからクレジットなしで自由に使ってくれていいよ!ただし動かない可能性もあるから注意してね!(要旨)」という感じの何とも太っ腹なメッセージが書かれてあるので、ありがたく使わせていただきます。

このサイトで紹介されている絵画風シェーダはKuwahara Filterと呼ばれるフィルタを利用したものです。たとえば、ある点(テクセル)をAとして、この点Aが何色になるかは次のようにして決まります。


まず、点Aの周囲を左下、左上、右下、右上の4つの領域に分けます。この領域の大きさはシェーダ内の_Radiusプロパティで変化します。たとえば_Radiusが3の場合は上の図のようになりますね。そしてそれらの領域に含まれる点をひとつひとつ調べていき、4つの領域のうち最も色が「均質な」ものを1つ選び出します。あとは、その選ばれた領域の中での色の平均を算出し点Aに適用するというわけです。

…とまあ、処理の流れ自体はシェーダのコードを読めば大体わかるのですが、なぜこんなにも簡単な処理でまるで油絵のような効果が出せるのかがさっぱりわかりません。Unity関連のフォーラムなどを覗いていると"It works like a charm!(びっくりするほど見事に動いたよ!)"という表現がよく出てくるのですが、こういうシェーダを見ると、文字通り「魔法みたい!」と思わずにはいられないのです。

0 件のコメント:

コメントを投稿