ウーパの手習い

私的開発メモ用途なのでご容赦ください。2020年現在はSwiftとUnityでARのお勉強中。

ローポリをハイポリに見せる

f:id:uuupacom:20180604233706p:plain

Unityでリアルな空間を表現するための、とても有益な日本語翻訳記事がUnity公式サイトで公開されていました。

unity3d.com

※VRChat開発への留意点:記事はUnity2017を対象としており、DeferredレンダーパスでSSRを使用していたり、Baked GIを使わずに(開発イテレーションも考慮して)リアルタイムGI+リアルタイムライトを併用していたりしますし、チュートリアルのセッティングをそのままVRChatワールド作成に当てはめられるわけではありませんが、記事中に書かれている解説はすべてとても有益で理解しておかねばと感じました。

記事に書かれているいくつかの事項のうち、ライティングについては最近勉強したこともあり、おおよそ理解できたように思います。
一方、モデリングについて書かれているページ、特に下部のスムージンググループの解説箇所は、私が不勉強のためにイマイチ理解しきれず、自分の課題感を持ちました。

unity3d.com

動かないオブジェクトであっても、必ずしもライトマップで照らしたり、リアルタイム GI に寄与させる必要はありません。習慣的に全ての静的オブジェクトを静的ライトマップに含めてしまいがちですが、小さなオブジェクトや、大量のライトを反射するサーフェスを持たないオブジェクトは、通常はライトマップに含める必要はありません。

等、きちんと説明されていて勉強になります。

記事中では、UVの適切な展開方法についても解説されていますが、シリンダーをシームレスに展開するのって無茶な気もしますが、留意しておくといいんでしょうね。大きなサーフェスのUVを優先するとも書かれていて、それはすでになんとなく理解していました。

そして、今後私が習得すべきなのが、エッジの面取りの件。私は今まで、面取りすることでポリゴン数が増えるのを危惧して敬遠していました。(余談ですが面取りは英語でchumferと言うそうです。検索用に覚えておこう)

f:id:uuupacom:20180604232106p:plain

記事ダウンロードデータより:石段部分、ポリゴンは鋭角だけどシェーディングは面取りされています

ポリゴンを増やして面取りするのではなく、ノーマルマップ(法線マップ)を使って凹凸表現できることも知っていましたが実践したことがなかったので、これを機に勉強したいと思いました。

面取りについて

私の制作ツールはBlender,SubstancePainter,Unity,ZBrush,Photoshopです。そのツールをふまえて、面取りのための方法として以下の3つのアプローチを想定しました。

  1. Blender上でエッジモディファイアやSubdivisionSurfaceを使って、ポリゴン数を増やしてでも面取りする←ポリゴン数は増えるが忠実に面取りできる
  2. エッジの鋭いオブジェクトをSubstancePainter上でノーマルマップを利用して面取りされたように見せる←楽そう
  3. 2と似ているが、BlenderZBrushを使ってハイポリとローポリの2種類のオブジェクトデータを用意し、SubstancePainter上でローポリモデルに対してハイポリの凹凸をノーマルマップ適応させて面取り(面取りだけでなくいろいろな凹凸表現も)しているように見せる←モデルを2個用意する必要があってやや面倒

勘違いしていたこと 

まず、角張ったただのキューブでもノーマルマップで面取りできるという認識は、正確に言うと間違っています。

上の作業3をやってみようと思い、Blenderのデフォルトのキューブをローポリとし、それをSubdivision surfaceしてエッジを滑らかにしたり、面に凹凸を付けたオブジェクトをハイポリとして用意しました。

f:id:uuupacom:20180604233706p:plain


SubstancePainterでローポリオブジェクトを新規ファイル作成で開き、Bake Mesh MapsボタンでBakingパネルを開き、ハイポリを指定する。(方法は下の動画で紹介されています)

f:id:uuupacom:20180604234258p:plain(※理由はこの記事後半に説明していますが、ローポリキューブにスムーズをかけています。)

これによってハイポリの凹凸情報をローポリのノーマルマップに設定できるので、なんとか凹凸を表現しようとしているのですが、エッジの見え方は期待していたほど面取りされているようには見えません。

f:id:uuupacom:20180604234622p:plain(平面部分や角部分はいい感じに見えますが、)

f:id:uuupacom:20180604234800p:plain(決してポリゴン的に角が滑らかになったわけではないことに留意しておく必要はあります)

ノーマルマップはポリゴン形状自体を変形させるわけではないので、あくまでオブジェクトのポリゴンのアウトライン(輪郭)は角張ったキューブのままのポリゴンなんですね。

作業2にも当てはまりますが、ローポリといえどもポリゴンの段階で、多少の面取りや粗く凹凸を付けた状態にしておいたほうが良いです。ジオメトリシェーダーじゃないんだから、キューブを球には変形できないよということですね。

とはいえ、それほど接近してみない箇所は、この方法で大丈夫かと思います。先程の画像の段差部分も同じことをやっているようですし。

f:id:uuupacom:20180604232106p:plain

ローポリはスムーズをかけておく

ハイポリゴンからローポリゴン化して法線マップをベイキングする場合は、多面ポリゴンよりも、シンプルな構造のスムージンググループの方が推奨されます。これはなぜかというと、接線法線マップによって、ローポリゴンのジオメトリのサーフェス法線にできる尖った部分を丸める必要があるためです。

と書かれています。今回紹介しているUnity解説記事にはサンプルもダウンロードできるのでファイルを開いて見ていますが、確かに段差のある一連の地面のメッシュはスムージングがかけられています。

f:id:uuupacom:20180604231240p:plain

この状態でもポリゴン的にはエッジは鋭く表示されてしまいますが、これにハイポリのノーマルマップを適応させて、エッジが削れたような表現をしているようです。←どちらかというと、平面から角にかけてボコボコさせて胡麻化してるようにも見えますが。

f:id:uuupacom:20180604231910p:plain

f:id:uuupacom:20180604231924p:plain上がノーマルマップがある時。下がノーマルマップを削除した時です。段差の鋭さに注目です。

ローポリモデルとハイポリモデルの作り方

さらに、今後の私の想定フローと合致しているTips動画がありましたが、

youtu.be

先にローポリを作ってから、彫り込んでハイポリを作るのではなくて、先にハイポリを作り込んでから、それをリトポしてローポリゴン化したものを用意するという作業フローが正解のようです。上の動画でいうと、ローポリの状態でも面取りや傷の凹みはちゃんとポリゴン化しています。

ということで、現実的な表現におけるモデリングの面取りの勘所みたいなことが、少しだけ分かりました。
忘れないうちにこのネタでATL勉強会を近日やろうと思いますのでご興味ある方はフレンドになってくださいませ。

uuupa.hatenablog.com

追記:倍速ですがローポリモデルにハイポリの凹凸を反映させている動画