ネリスさん備忘録

主にUE4の備忘録を残すよ!

【UE4】スクリーントーン風マテリアルを作ったよ

ちょっと思い立ってトーン風マテリアルを作ってみた。
いわゆる漫画のあれね

f:id:LunaNelis:20210120022211p:plain

需要はわからないけど、たぶん誰かがいい感じに使うでしょってことでノードを公開しとくね

blueprintue.com

 ノードは各自コピペしてもらえればいいとして、作り方についての簡単な説明をば

 ベースとしてはみつまめ杏仁さんのところのこの記事

limesode.hatenablog.com

この記事をみてスクリーントーンも作れそうだなとなったので実践

 

 

まずはノードを写す
杏仁さんの作ったマテリアルを解析する…

最初のFmodでUV値を指定した数に分割する。
Fmodを使うとUVの値が減るため、次のMultiplyで減らした分を元に戻す。
お前は何を言っているんだ。という人は小さい数値で手で計算してみるとなるほどとなる。

f:id:LunaNelis:20210120030029p:plain

続いてここはUV値の調整。
すぐ後に使うVectortoRadialValueで正しい円を描くための調整。
テクスチャを使う場合は不要

f:id:LunaNelis:20210120031438p:plain

ここでドットの描画とStepによるドットサイズの調整をしている。
VectortoRadialValueは円形のグラデーションを生成する関数。

f:id:LunaNelis:20210120032014p:plain



さて、調査は終了。分解して考えればなんということは無い。
あとはこれをスクリーントーン化するだけ

そもそもスクリーントーンの形状ってなんぞ?
というと、ただドットが並んでるだけではなく1列ごとにズレてドットが並んでいるパターンになっている。漫画見ればわかると思うけど。

つまり杏仁さんのままだと要件を満たせていないのだ。
また、杏仁さんのマテリアルは特定のドット数…つまりサイズの割合が限定されているという制限がある。

(Imageを引き延ばしたりすると、とたんに点が正円にならず崩壊する)

 

今回はその制限も解決することにした。
最初の部分はTexcoordではなくScreenAlignedUVsに変更。
ちょっと小細工をすることでスクリーンサイズに影響されずに画面に張ったようなトーン表現ができるようになる。

f:id:LunaNelis:20210120032849p:plain

右側は元のノードと意味は一緒。
1行のドット数をパラメータにして使いまわしてる。

f:id:LunaNelis:20210120033543p:plain

そして本命の部分
偶数行のUVズラし

まずは大元のUV値からGの値(縦のUV値)を抜き出す
ドット数の半分をFmodをかける。
これで緩やかな縦のUVを作り出す

f:id:LunaNelis:20210120033948p:plain

MultiplyでUV値を0~1に戻したうえでStepノードに0.5を入れることで
1行ごとに縞々になるUV値が出来上がる。
つまり、この縞々の赤い部分だけ横軸のUV値をズラせば目的を達成可能ということ
Multiplyの0.5の部分でUV値を0.5ズラしている。

f:id:LunaNelis:20210120034406p:plain

 あとは杏仁さんのマテリアルと基本は変わらず。

トーングラデーションをしたかったのと背景カラーも欲しかったため少し手を加えたけど、そこは見たままだから特に説明しない。
ノードは渡したから自分で見れるはず。

 

あとがき

なんとなく思い立って作ったけど、思いのほかいい感じにできて〇

使い道はわからんけど、自分はフォントマテリアルとして使った。

改善点としてはトーングラデーションがX方向あるいはY方向の一方向にしかかけられず斜めのトーングラデーションがかけられないこと

DotSizeの設定が定量的ではないからもう少しわかりやすい0~1化をしたい
とまぁ心残りはあるけど別に売るわけでもなし、ここでひとまず終わりとする。

改善案わかったら教えてほしい…

わかんないところがあっても教えてほしい…