画像をトゥーン化するシェーダーを作りたい


トゥーンシェーディング(セルシェーディング)はアニメ風の塗りを表現します。

今回は3Dを描画するときのトゥーンレンダリングではなくて、画像をそれっぽく変換してみたいと思います。

することを簡単に書くと、明るさを数段階に分けることとエッジ抽出です。

 

今回はやりたいことと考え方のまとめで、上手くは行きません。

明るさの段階化

3Dレンダリングであれば拡散反射(多くはランバート反射)をステップ関数などで分ければできそうですが、画像だと明るさを計算するところからです。

RGBベクトルの長さでもいいんですがせっかくなので明るさを分離する色空間を使ってみます。

参照:【GLSL】YUV色空間とHSV色空間

YUV色空間

古いアドベンチャーゲームのような感じがします。
ベタ塗り感を出すには少しノイズがきつい。

HSV色空間

hsv変換の書き方は簡潔なのものあるんですが、わかりやすさ重視で。

HSVの明るさは max(rgb) のため明るくなりがちなので、閾値を上げる。

こっちの方が好きかな。

エッジ抽出

これは3Dと違って法線が使えないため困難です。模様とかがあればアウトですね。

適当な方法として8方向ラプラシアンフィルタでも使ってみます。

合わせ

平滑化:ガウシアンフィルタ

ラプラシアンフィルタに限らずエッジ検出ではノイズが大敵なので前処理として平滑化を行うことが多いです。

ラプラシアンガウシアン(LoG)フィルタも有名ですね。

明るさの段階わけもノイズっぽいので、共通の前処理としてガウシアンフィルタをかけたものを使うことにします。

それっぽければいいので 3x3 の離散近似フィルタです。

これで同様の処理をやり直します。

少しは良くなったような気はしますが、この路線は無理そうです。

所感

エッジ検出がとにかくきつい感じがする。

キャニー法とかも気が乗れば試してみたい。

 

明るさの段階わけはヒストグラム平坦化とかでもっとそれっぽくできないかな。

平滑化をもう少し効かせるだけでもそれっぽくなりそうな感じはします。


コメントを残す

メールアドレスが公開されることはありません。