見出し画像

【Unity】シェーダー学習ログ #7

前回はこちら。

Unlitでも陰影を付けたい

もう何度目だというぐらいしつこく A Short Hikeのメイキング動画を見ている。今回は、動画の6:35あたりからやってる「Custom Unlit-ish Shaders」とかいうのを真似てみたい。

というかそもそも、Unlitてライトの影響受けない奴のはずなのに陰影付けられてるのどういうことなん?そして、こいつの具体的な再現方法がまたしても分からない。

と思ったら、海外のUnityフォーラムで同じような質問してるニキが居てた。この質問ニキ的にはインスペクタで色々調整する所まで踏み込みたい様子だが、俺はひとまずそれっぽい陰影が付けられる手段だけでも構わん。

その解答によると「この動画見ればいいぜ」的な感じだったので、今回はこいつを教材に進めてみようと思う。トゥーンシェーダーか…名前だけは聞いたことあるな。PS2/GCのゲームあたりから割と目立ち始めたイメージある。

カスタムノードでパワープレイ

ライトと法線の内積を取ればオブジェクト表面の明るさが決められるから陰影を付けられるっぽいのだけれど、残念ながらシェーダーグラフでライトの情報を持ってくるのは簡単じゃないらしい。ふえぇ。

どうやら、Custom Functionノードとやらを使って、HLSLで照明情報を持ってくる必要があるとのこと。やはりHLSLからは逃げられないのか…!

画像1

ぶっちゃけここはもう定石みたいな感じだと思うので深く考えずコピペでなんとかする。プリプロセス使ってる所は、ノードエディタのプレビューだとライトが取れないので、ゴリ押しで設定してる感じっぽいぜ。

画像2

とりま法線とライトを内積した結果をSaturateで0~1(負数を除外)してやって、それと照明の色をかけ合わせたやつをColorに設定すればおk。

画像3

そうすっと、Unlitだけどちゃんと陰影がつくようになった。

サブグラフに変換

画像4

動画の中で唐突に出てきたのだけれど、ShaderGraphは「サブグラフ」つって選んだノード達を関数化のように小分けにできるらしい。ためしに「unlit-getlight」という名前を付けて保存してみた。

画像6

すると、サブグラフ化した部分がノードに変わった。色々なグラフで使い回す奴とかは、サブグラフ化しとけばコピペ要らずで捗りそうねぇ。

ランプテクスチャを使う

画像6

ライトの効き具合というか影の付き具合を設定するためのグレースケールなテクスチャをGIMPとかのペイントソフトで作る。ちなみにここのグラデーションをクッソなめらかにすると、影の感じもクッソなめらかになる。

画像8

法線とライトの内積結果(diffuse)を使って、ランプテクスチャのU成分をキメる。んで、ランプテクスチャとライトの色情報をかけ合わせた結果を、最終的な色として設定している。

画像8

そうするとランプテクスチャがいい感じに適用されている事が分かる。

画像9

今作った部分もサブグラフ化させとくとスッキリ!

最終的なテクスチャを貼る

画像10

ランプテクスチャの出力を、モノホンのテクスチャと掛け合わせるだけでいい。

画像11

大げさな陰影がついた感じになったので、これはトゥーンシェーディングとギリギリ呼べるのではないだろうか。まあ、実際はここから調整が必要になると思うのだけれど、ひとまず今は影をつけられただけで満足だ。

元動画の内容的にはさらに先まであるのだが、内容が高度すぎてついていくのがしんどそうなので、とりあえず今回はここまでにしておこう・・・

この記事が気に入ったらサポートをしてみませんか?