すとーぶろぐ

主にUnity。実質備忘録。

【Unity】テクスチャをグレースケールからカラーへ素敵にトランジションさせるShader

 

実行結果

 

f:id:t_stove_k:20181103222058g:plain

世界に色を取り戻しました。Shaderは世界を救う…

 

しくみ

 

「カラー画像からグレースケール画像を作って、ルール画像で2つの画像間のトランジションパターンを決める。」って感じです。

ルール画像とは以下のような規則性があるっぽいグレースケール画像のことです。

 

f:id:t_stove_k:20181103220947p:plain

 

このルール画像をうまいこと使えば、素敵なトランジションを行うことができます。

 

 

コード

 

【Unity】テクスチャトランジション(グレイスケールからカラー。もしくはその逆)【Shader】

 

上記Shaderコードでは大体以下の①〜③の手順を踏んでます。

① 入力テクスチャのオリジナルカラー値(col)からグレースケール値(gray)を生成

② 変数_Thresholdとルール画像のピクセル値(pg)を比較。比較結果から0か1を取得。

③ オリジナルカラー値(col)とグレースケール値(gray)をlerpで補間、出力。補間値は②で取得した値

 

 

問題点

 

ルール画像によっては下図のような残りカスみたいなのができます。

f:id:t_stove_k:20181103211355p:plain

ルール画像のピクセル値(pg)がちょうど0か1となってしまう場合、_Threshold(0〜1)をどんなにいじっても、0より小さくならないし、1より大きくもなりません。つまり、step(pg, _Threshold) の値が変動しなくなってしまいます。step(pg, _Threshold) が変動しないので、最終的に出力するピクセル値も変動しません。

これが原因で変化しないピクセル、残りカスができてしまうみたいです。

今回は解決のためにpgを0.01~0.99の範囲にclampしてます。

Thresholdの範囲を広げるのもありだと思います。

 

 

おまけ

 

グレースケール画像に関してもう少し詳しく知りたい場合は以下の記事を。

qiita.com

 

以下のサイトで素敵なルール画像をたくさんゲットできます。

4you.bz