BlenderとUnityで作ったものをVR(Oculus  Quest/Oculus Link)で動かします

ブログの女の子を作る #55 MToonシェーダーからURP用UTS/UniversalToonに変更する (2) 問題解決編

 
前回の記事では、 MToonシェーダーから URP用UTS/UniversalToon に変更して、基本的な設定を行いました。
 
今回はその続きとして、「UTS/UniversalToonシェーダー」の設定中に起きた問題や課題を解決していきます。
試行錯誤の連続で、設定したり戻したりで大変でしたが、最終的には良い感じになりました!
 
今回はその続きとして、キャラクターのVRM/MToonシェーダーをURP用の「UTS/UniversalToon」に変更します。
[2020/11/15追記]
プロジェクトをビルドすると、UTS/UniversalToonシェーダーで「invalid subscript ‘vertexSH’」エラーが発生しました。
ひとつ前の記事に詳細を書いてますので、よろしければご覧くださいね。



開発環境

・Blender 2.90.1
・Unity 2019.4.13f1
・グラボ:ASUS ROG-STRIX-RTX2060S-O8G-GAMING
・Oculus Quest 2
・Oculus Link(Windowsビルド)
・UTS/UniversalToon Ver.2.2.0
 

(1) 裏面のテクスチャが描画されない!

Base Shader Setting -> Culling Mode」を「Culling Off」にすると、オブジェクトの両面にテクスチャを表示するはずですが、裏面が灰色です。
 
いろいろ試してみると、Outline設定が Active で、「Outline Width:0」の場合にこんな表示になるようです。灰色の「アウトラインの線」がオブジェクト背面に表示されてる?
 

【解決策】アウトラインの設定を変更する

Outline設定を Off にするか、0より大きい数値を入れる。
 
とりあえず 0.01 を入力すると、背面が正しく表示されるようになりました。
 
別の角度からも確認してみましょう。
 
設定変更前です。
 
 
設定変更してみると、眉やリボンの裏面なども直りました。
これで直る理由は分かりませんが。。。
 

(2) キャラを少しでも動かすと急に影が出る!

キャラクターを動かした時、影の動きが激しく変わり、滑らかで無い感じがします。
 
例えば、この状態からキャラクターをほんの少し回転するだけで、
 
脇腹あたりに急に影が出てきました。これは腕の影のようですね。
影が出るのは良いのですが、突然表示されるのがおかしい気がします。
 
シェーダーのサンプル動画では、特にそんなこともなく影は滑らかに表示されてましたので、何かの設定が違ってるとは思うのですが。。。
 

テッセレーションは使えなかった

v.2.0.7のマニュアルに、
Tessellationフォルダ内には、DirectX 11のPhong テッセレーションに対応したUTS2シェーダーが入っています。
Phong テッセレーションは、結果となる表面がメッシュの法線にある程度沿うように、再分割(subdivide)された面の位置を修正します。ローポリのメッシュについてスムージングするのにかなり効果的な方法です。
と書いてあったので、もしかしたら影表示も滑らかになるかも、と思いましたが、
 
Ver.2.2.0のマニュアルにこんな記載がありました。
 
ユニバーサルレンダーパイプラインでは、DX11 Tesellationがサポートされていませんので、廃止されました。
別の方法を探すしか無さそうです。
 
で、いろいろ試してみて解決策がありました!
 

【とりあえずの解決策】影を消す

【Basic Lookdevs : Shading Step and Feather Settings】-> System Shadows : Self Shadows Receiving」の「Receive System Shadows」を Off にする。
 
オブジェクトにかかっていた影は表示されなくなったので、キャラクターを回転しても影が突然表示されるようなことは無くなりました。
ですが、これは消してはいけない影のような気がしますよ。
 
とはいえ良い方法も見つからないので、まずはこれで設定を進めましょう。
 


(3) 「天使の輪」を付けたいがUV2とか作るのが面倒!

メッシュのUV2を作成し、「AngelRing Projection Settings」を設定することで「天使の輪」を作れるらしい。
 
少し面倒なので、代わりの方法が無いか探してみました。
 

【解決策】ハイカラーを使う

【HighColor Settings】-> HighColor Power」や「HighColor Mask Level」の数値を変える。
 
設定変更前です。
 
値を変更してみました。
髪の毛に光の光沢が出ましたね。ハイカラーが表示されたようです。
 
上から見ると、光が固まってる?ような感じでした。
 
こんな場合は「Specular Mode:Active」にすると良いようです。
 
とりあえずはこれで行きましょう。
 
マニュアルに、
他にもノーマルマップは、スケールと共に使うことで肌の質感を調整したり、MatCap用のノーマルマップを別途用意することで、髪の毛の質感を表現するのに使われます。
と書いてありましたので、これはまた試してみたいですね。
 

(4) パンツの影側が暗くてシワが見えない!

明るい方なら良い感じにパンツのシワが見えますが、
 
その反対側で表示してみると、すべてが影になってしまい、シワが見えません。
暗いところでも、ある程度は表示してほしい。
 

試してみる

1st ShadeColor Step」の値を下げてみます。
ノーマルマップで作ったシワが見えるようになりました!
 
が、明るい方で見てみると、シワが消えてしまいました。
そうなりますよね。。。
 

【解決策】2影色を設定する

2nd ShadeColor」に、1影色より少し濃い目で「2影色」を設定する。
 
影が出る範囲とぼかしの度合いは、以下で調整します。
(1) DoubleShadeWithFeatherの場合:「ShadeColor Step」と「1st/2nd_Shades Feather
(2) ShadingGradeMapの場合:「2nd ShadeColor Step」と「2nd ShadeColor Feather
 
暗い側でもシワが見えるようになりました!
 
この状態で、明るい側も確認しておきましょう。
 
問題なさそうですね。質感も良くなった気がします。
 
この設定は素晴らしいですね。このシェーダーを導入して良かったですよ。
 

最近作ったパンツで確認しておく

白いパンツではシワは表現しやすいですので、最近作った「柄があるパンツ(水色の水玉とフチ)」で確認しておきます。
 
色が付いていても大丈夫そうですね。
 
暗い側でもOKです。
 

(5) 家の窓が真っ黒で、透過設定すると表示がおかしくなる

以前の記事で解決できなかった「家の窓を透過しようとすると表示がおかしい」件ですね。
 
この建物は「UTS/UniversalToon」シェーダーではなく、「Universal Render Pipeline/Lit」を使ってますが、気になるので直しておきましょう。
 
Surface Typeを「Opaque → Transparent」に変更すると、窓は透過しますが、見えないはずの後ろ側の屋根が見えてしまってます。
 
かなりおかしいですね。
 

【解決策】クリッピング設定をオンにする

Surface Typeは「Opaque」のままで、「Alpha Clipping」にチェックを入れる。
 
窓だけを透過することができました!
Alpha値が設定されているところだけをクリッピングする設定のようですね。
 


(6-1) 地面やキャラクター自身に影が出ない!

ふと地面を見てみると、キャラクターの影が無いことに気づきました。
以前から、なんか違和感あったんですよね。。。
 

実験してみる

建物の前にキャラクターを移動してみると、アスファルトっぽい地面の部分だけは影が出ますが、Terrainの地面には出ませんでした。
更に、キャラクターの上に「適当なオブジェクト」を配置してみましたが、そのオブジェクトの影はキャラクターに出ていないようです。
 
UTS/UniversalToon」シェーダーの影は出てますが、それ以外の影が無くなってしまったようです。
(2) キャラを少しでも動かすと急に影が出る!」の設定変更が原因ですね。
 

【解決策】設定を元に戻す

【Basic Lookdevs : Shading Step and Feather Settings】-> System Shadows : Self Shadows Receiving」の「Receive System Shadows」を Active に戻す。
 
とりあえず、キャラクターにオブジェクトの影が当たるようになりました。
やはり消してはいけない影だったようです。
 
ですが、設定を戻したことで、
・急に影が出る現象が再発する。
・地面にはまだ影がない。
という問題が残ることになりました。
 
両方を解決する方法が必要ですね。
 

(6-2) 地面やキャラクター自身に影が出ない!

いろいろ探してやっと解決策を見つけました!
 
以前の記事で作った「UniversalRenderPipelineAsset」で設定しますよ。
 

【解決策】Cascades設定を変更する

Project画面で「UniversalRenderPipelineAsset」を選択し、Inspectorで「Shadows -> Cascades」の設定を変更する。
 
設定変更前です。
 
Two Cascades」にすると、地面に影が表示されて、キャラクターへの影もやや滑らかになりました!
 
Soft Shadows」にチェックを入れると、更に影が滑らかになります。
設定変更前。
 
設定するとこんな感じです。
滑らかになったのは良いですが、やや「ぼやけ過ぎた感」がありますね。
 
そんな時は「Four Cascades」にすると良いようです。
影がくっきり表示されました!
キャラクターに当たる影も滑らかなで、かなり良い感じです。
 

更にキレイにできるが

更なる設定として、Inspectorで「Lighting -> Main Light -> Shadow Resolution」の値を「2048 → 4096」に変更すると、よりキレイになります。
 
2048の場合。
 
4096の場合。
手の指の影が出てるのがすごいですね。
 
このあたりは、好みで決めるのが良いですね。今回は、2048のままにしておきます。
 

Cascades設定は必須?

キャラクターを回転してみても、腕の影が滑らかに表示されますね。
 
Cascades設定は必須な気がするんですが、レンダーパイプラインをSRPに変更したタイミングで、オフになってしまったのでしょうか。。。
 
この記事によると、デバイス依存するようなので、必須機能までとはいかないようですね。
影は奥が深い。
 
 

まとめ

UTS/UniversalToonシェーダー」の設定中に起きた問題や課題を解決しました。
 
ほぼ影に関する問題でしたね。良い影が出るようになって良かったですよ。
 
これでURPシェーダーへの移行がなんとか終わりました。
新しい環境で、いろいろと試していきたいと思います。
 
スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。

ブログの女の子を作る #54 MToonシェーダーからURP用UTS/UniversalToonに変更する (1) 基本設定編

最近のコメント

だーしゅ
IT関係のお仕事してます。
VRは楽しいですね。

[当ブログについて]