しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Shader Graph でテクスチャ画像をグレースケール化する

※ これは 2020/07/17 時点の Unity 2019.4.4f1 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

Shader Graph の一部を別ファイルに分割したあとにわかったこと

画像を色付けする場合は事前にグレースケール化して、明るさだけの情報に補正をかけてから RGB 値をかける必要がある、と

なのでこのグレースケール化をやってみたい

そこで、複数のノードをまとめてすっきりさせる方法を試してみる

前回分割したサブ Graph に対して、下記のように2つのノードを挿入

グレースケール化の追加ノード

Sample TExture 2D のノードにつないだのは Dot Product のノードで、ベクトル同士の内積を求める

なんでテクスチャ画像の色情報の内積を取るかというと、RGB の各要素の加重平均をとるためで、別に内積でなくても R、G、B のそれぞれに重みをつけた掛け算をしてその平均が求められれば内積である必要はないらしい

この加重平均では R x 0.299G x 0.587B x 0.114 と、色により重みをかける・・・これは緑が青や赤に比べて、物理的な明るさより主観的には明るく感じることに配慮した補正*1らしい

緑 > 赤 > 青 の順に明るく感じるのでこんな係数になる

また、この Dot Product のノードのあとは Vector4 で値をまとめているだけでそんなに重要ではない

透明度のアルファ値はグレースケール化の対象外なので、テクスチャ画像の元の値をそのままつなぐ、と

これでグレースケール化の完成・・・以前よりもきれいに色付けされるはず!

*1:NTSC 加重平均法という