いくつかの方法をやってみた。それぞれ利便性とか拡張性で一長一短だと感じる。
例えば人物モデルのような比較的凹凸のあるものには丁度いい設定と、ビルのような直線的なもの合う調整とが必要だなと感じる。
個人的によく使うのは トゥーンシェーダー2色Ver。軽くて使いやすい
あと事前にColorManagementをStandardにするというのは、必ずしも推奨しない。Compositで色調整したほうが柔軟に対応できるのでそっち推奨
方法1ノイズ入り Toon Shader
準備
ShaderEditorのWorld設定を開き、環境光を消しておく。
今回はCubeでなくSuzanneを利用。
またLightはShadowを外しておき、プレビューモードをRenderPreviewにする(ライトが反映される状態にする)。
Shaderを組む
まずはデフォルトであるノードの間に ShaderToRGB とColorRamp ノードを接続する。
ColorRampの方はモードを Constantに変更し、カラーストップは必要があるなら増やして色を変える。
PrincipleBSDFのBaseColorの箇所に TextureCordinateとMappingの2つのノードを接続する。
TextureCordinateはデフォルトだとUVになっているが、Generatedに変更する
最後にNoiseTexture ColorRamp(Constant) MixColor の3つを出す。
これはノイズを加えるノード群。ノイズの大きさはNoiseTextureのScaleで調整し、色はColorRamp、MixColorノードのFactorで強さを制御する。
全景はこんな感じ
使い回せるようにノードグループを作成する / ColorRampをノードグループの外部から操作できるようにする
上記のままだと色指定をカラーランプでやらないといけないのでつらい。
これをGroupノードで外部から指定できるようにしたい。
カラーランプの色をグループノードで外部から指定できるようにする
今回のは3色指定しているので、Rampノードを2つ複製し3つ出して接続する(一番したのが元からあるやつ)。
真ん中のノードは、一番右側のカラーストップを消す。
そして左のストップを真っ黒、右のストップを真っ白にする。
ColorModeはRGB
このノードをCtrol+Chift+クリックでプレビューするとこんな感じ。
同じことを上のランプノードでもやる。こちらは一番左のストップを消して、中央と右のストップ。
MixColorノードを出して複製したRampに接続する。
色は元のColorRampと対応するものをドラッグドロップでABにそれぞれ割り当てる。
さらもう一つMixColorを出して、Aの箇所に接続する。Bは元のColorRampからドラッグドロップで持ってくる。Factorは一番上のRampと接続。
整理する。元のColorRampは外しても問題ない。
グループノードを作っていく。
とりあえず一番右以外のノードをまとめて選択し、 Ctrol + G でグループ化する。
そしたらGroupInputというノードが表示されるはずなので、そこにMixColorノードの3色を繋げていく。
Tabキーで移動し、下のようになっていればとりあえず外部から色指定できるようになっている。外部から呼び出すので、名前をわかりやすいものに変えておく。
このラベル表記の変更は、ShaderEditor内でNキーでメニューを出して、Groupというタブを開いて行う。
カラーランプのValueも外部から調整できるようにする
GroupタブのInputの項目で、Color1がアクティブの状態でプラスアイコンを押す。
すると直下に複製されるので、名前を変更しておき(Color1Postionとする)、さらに下のTypeの箇所を Float にする。
Tabキーで戻り、下のColorRampの左側のカラーストップを選択し、Posの箇所で右クリックする。
AddDriverを選択する。
そしたら開いた画面のTypeをSumValuesに変更し、 (X) var となっている箇所をバツボタンで消しておく。
このドライバー画面は移動すると表示が消えるが、EditDriverで再表示できる。
そしたらAddInutVariableで新規に変数を作る。
Propの箇所を選択するとリストが表示されるので、その中からMaterialを選択する。
右側のアイコンを選択するとマテリアル一覧が出てくるので、このマテリアルを選択する(わかり易い名前をつけておこう)。
tabキーでGroupを出て、今操作している項目(Color1Postion)で右クリックし、 CopyDataPathを選択する。これでnode_tree.nodes[“Group”].inputs[1].default_value というpathを取得するコードがコピーされる。
※これはこのコードの感じからするとGroupNodeのInputの並び順で選択しているのだろう。もしGroupNodeの順序をいじる場合は注意が必要
そしたらTabキーで戻って Pathの箇所に貼り付ける。
貼り付け終えたら、UpdateDependencyを実行する。
戻って操作してみる。動けば問題なし。
あとは同じ要領でColor2 ,Color3もやっていく。
注意点として、どのカラーストップにドライバを割り当てるのか少し混乱する。
今回はColor1下の黒、Color2下の白、Color3上の白だとうまく動いた。
こんな感じ。
注意点はドライバーを使っている箇所は並びの位置を固定しておいた方がいい(最上部におく)でないとドライバを作り直さなければいけない
水彩風シェーディング
同じ動画のやり方。ノードの共通箇所も多いので少し省いている。上の章をチェック
ライトを設置し、RenderPreviewモードでやる。
シェーダーの組み方
まずよ4つのノードを組む。
ColorRampの補完は B-spline にして2つのカラーストップの間隔は狭めにしておく。
MixColorで色を指定。
PrincipleBSDFのNormalに以下のようなノードを接続する。
①Voronoiを出して 4Dに変更。
②MixColorノードはBlendeModeを LinearLightにする。
③GeometryのNormalをMixColorのAに、NoiseTextureをBに(Scaleを10にする)
④あとはMappingとTextureCordinate(Generated)
TextureCordinateとMappingを複製し、PrincipleBSDFのBaseColorに接続する。
これのLocationのY値を調整することで
ラストに、Noiseを被せる。
NoiseTextureとColorRampを出し、MixColorで元からあるMixColorに接続する。
ColorRampの補完がContrastならノイズくっきり、ぼかすなら他のに変える。
2色の水彩っぽくなる。
全景。
Inputを調整した
調整
これはライトを取得して色を決めるという感じのシェーダーなので、ライトの位置や強さの管理がシビアだと感じる。
トゥーンシェーダー2色Ver
これが軽量シンプルで使いやすいと感じる。
お気に入りの使い方として、これをEmissionとBaseColorに接続し、Strengthを少し弱めにしたりして使うと、セルルック感を少し弱めて表現するという
Emission1だと影色がかっつり描写されるが、0.3とかに弱めると下。
準備
①RenderPropertiesのColorManagementをStandardにしておく。Lookは好みに。
②画面にライトを出しておく。
③ShaderEditorの左上をWorld画面にする。
デフォルトは灰色なので、色を真っ黒にしておく。
バリエーションとして下のようなものもある。これだと影とワールドの背景を別カラーにできる。
ShaderEditorでノードを組んでいく
マテリアルを作成し、デフォルトのPrincipleBSDFを削除する。
まず下のようなノードを組んでいく。
左からDiffuseBSDF – ShadertoRGB – SeparateColor – MapRAnge – Ceil(Mathノードで設定)
Ceilノードを Ctrol + Shift を押しながらクリックしてプレビューするとこんな感じになる。
Mixノード(Float)を出して、MapRangeをAに、CeilをBに接続する。
このMixノードでセルルックの強弱を指定する。1ならくっきり、下げるとグラデがかかる。
Mixノードの次にMixColorノードを接続することで上側は完了。
次に下側(ベースカラー側)を組んでいく。
ShadertoRGBノードから分岐し、下側に3つのノードを繋げてるだけ。
上で作ったSeparateColorノードを複製し、CombineColorノード(こっちもHSVに変更する)に接続する。
Valueの箇所だけ 1にしておく。
最後はMixノードでこれを上のMixのBにつなげる。
上のノード群が影色で下のノード群がベースカラーとなる。
ノードグループ化して使い回せるようにする
色々なオブジェクトに使い回せるようにカスタムする。
まず赤で囲ったノード群をまとめて選択し、 Ctrol + G を実行する。
Editor内でTabキーを押して下の画像のようになればグループ化できている。
名前をわかりやすいものに変えておく。
このグループノードを選択してTabキーを押し、再度展開する。
GroupInputというグレーのノードがあるはずなので、そこに6つの箇所を繋げいく。
1.上のMixのFactor - これで影のくっきり度合いを調整
2.MapRangeのFromMin - 影の範囲
3.同じくMapRangeの FromMax - 影の範囲
4.下のMixColorのA - ベースカラー
5.上のMixColorのA - 影色
6.下のMixColorのFactor - ライトとのBlend具合を調整する
そしたらNキーでメニューを出し、Groupというタブから各Inputに名前をつけておく。
ついでにDiffuseBSDFのNormalもInputにつないでおく。
再度TabキーでGroupノードを出す。
以下のようになっていればOK
呼び出し方
マテリアル単位でAppendしてもよいが、NodeだけをAppendすることも可能。
呼び出す際は、NodeTreeからAppendする
その状態でGroup の中を見るとあるはず。わかり易い名前をつけておくこと。
バリエーションとしてノイズを加えてみる
全景
新規に付け加えたのは赤枠の4つのノード。
左からNoiseTexture(Scaleでノイズのサイズ)
ColorRamp(補完はConstant。左黒、右白)
MixColor(Aは黒、Bでノイズの色を指定)
MixColor(これで既存のノードとノイズノードを合成。Factorで強さ調整)
こんな感じにノイズをのせられる。
3色トゥーンシェーダー / ToonShader 3color With Noises
上述のトゥーン系テクを使い、3色 + ノイズ2色というシェーダーを作ってみた。
GroupNodeはこんな感じ。
色が3色に、色の境界位置を調整2つ
後はノイズ関連や光の反映など
準備
RenderPropertiesの ColorManagementをStandardに
ライトを出し、Shadowを切っておく。
Shader
左から
上の分岐は色の指定など
左のこれらのMathノード群は、色の境界調整用に2つの値を取得し、大きい方と小さい方を分けている。
あえてDivideを入れたのは、マウスで値調整するとき極端に動きすぎて微調整がやりづらかったため。
小さい方の値を利用して2色を規定する。光の当たり方で影になる方の2色。
大きい方の値で、3色目を規定する。
違いとして、MixColorが1個多い。中央のMixColorノードは、光の色を反映するかどうかのノードになる。Bスロットは、最初にやった分岐の下側から繋がっている。Aのスロットで3色目の色を規定している。
もう一つのMixColorは、Color12と、ここで規定したColor3とをMixするもの
ノイズ部分はシンプル。
NoiseTextureのScaleでノイズのサイズを規定。
MixColorのABでノイズの2色を規定している。
そして最後、もう一つのMixColorで3色とノイズを合成する。
Aが3色、Bがノイズ、Factorで合成度合いを調整。
NoiseStrengthをのせないならこんな感じ。
のいずをのせるとこんな感じ。
Scaleを小さくする
問題点として平面的なモデルだと調整が難しい。
Emissionを加えた方がより利便性が高まると思う。