人柱系CGモデラーのTipsブログ

3DCGモデラーとして活動する管理人の独自解釈に基づく実践重視の解説や備忘録です。

■齟齬や誤字にお気づきの際は優しくご指導ご鞭撻のほどお願いいたします。

物理的に正しい!?PBR(フィジカルベースドレンダリング)基礎編!

 

《注意》ブログ移転につき、最新情報に更新した記事を新しいブログに掲載しております。こちらの情報は古い可能性があります。 

 

→新しい記事はこちらより

mask3dcg.com

 

 

 

最近の海外のゲーム作品は映画並みですよね。

DeadSpace2、GTASkyrimに始まり、P.T. 、TOMB RADERリブート、Outlast等、圧倒的なクオリティを持つハイエンドなゲームCGを前に息を呑むばかりです。

 

しかし残念ながら、これらのハイエンドゲームの多くは海外で開発されており日本は出遅れてしまっている現状があります。日本語の情報が非常に少ない分野でもあります。

 

ハイエンドゲーム市場が日本でも広まるように、少しでも多くの方にPBRの良さを理解して頂きく、今回の記事を執筆しました。

 

 

■PBRとは?

 

ハイエンドゲームに使われているリアルタイムCGの描画技術は【物理的に正しいPBR(フィジカルベースドレンダリング)】と呼ばれています。

 

著者がデモ用に作成し海外のCG投稿サイト【Sketchfab】にて運営公認(StaffPick)に選んで頂いた作例があるので、今回はこちらを作例に解説したいと思います。

 

 

IBUKI SUIKAby kazukisakamotoon Sketchfab

skfb.ly

 

※)表示に違和感がある場合は右下の設定よりテクスチャ解像度がをLD→HDに上げて頂けると正確に表示されます。

 

こちらが一般的なPBRのモデルになります。ドラックや中ボタンドラックでカメラ操作ができます。ぐるぐる回してご覧頂ければ幸いです。(よろしければ☆を頂けると歓喜します…)

 

 

■IBL(イメージベースドライティング)とHDR(ハイダイナミックレンジ)について

 

上記したビューをPCの場合はAltキーを押しながらドラッグ、タブレットの場合は3本指スワイプで背景画像(HDRハイダイナミックレンジ)を動かすことができます。

 

背景を動かすとキャラクターのライティングも瞬時に変化することがわかると思います。キャラクターのパーツはそれぞれに質感がペイントされています。これがリアルタイムかつ物理ベースの3Dモデルになります。

 

HDRI(ハイダイナミックレンジイメージ)は360度の写真素材で、背景に設定することで自然の光源として使用することができます。これがIBLイメージベースドライティングと呼ばれる手法です。

 

 

 

古くからある手法ですが、これをリアルタイムに反映することができるのが、現在のハイエンドゲームにおけるPBR(フィジカルベースドレンダリング)の特徴です。

 

著者はこのHDRIを収集するためにバイクで大陸横断の旅に出るという荒行まで行いました。HDRIはPBRにおける最も重要なファクターの一つです。

 

 

■2014~最先端のマテリアル

 

ライティング環境についての解説は終わりました。次はPBR向けのシェーダーマテリアルについて解説したいと思います。

 

現実世界の一般的な物体の質感は、粗さ(Roughness)、金属っぽさ(Metalness)の2つ尺度で数値化出来るという考え方があり、これがPBRの根底にある基礎理論です。

 

 

f:id:maskmen2:20160222173702j:plain

 

著者の作成したモデルの土台に用いたヒョウタンでラフネス、メタルネスの変化を図にしてみました。

 

世の中の物質の表面質感は全て粗さと金属っぽさの数値で表現できるという訳です。

このことから、ハイエンド向けのCGモデリングや3Dペイントの手法は【ラフネス/メタルネス・ワークフロー】と呼ばれています。

 

これら2つの数値で全ての質感を決定することができるため、前時代のワークフローの様に質感のために物理的に正しくないマテリアルを選択する必要がなくなりました。

 

 

補足ですが、

 

 【スペキュラ/グロシネス・ワークフロー】と呼ばれている運用法もございます。

 

ここで使われるスペキュラは、昔から使われていた見せかけだけの強い反射を表すスペキュラマップとは完全に異なるもので、

 

古い3DのシェーディングになれていてこれからPBRに取り組む方には一番注意していただきたいところです。

 

ラフネスメタルネスワークフローと同様に

反射の強さ(specular)、艶さ(glossiness)の二軸で表現する方法です。

 

そして重要なのは、

ラフネスメタルネスワークフローと、スペキュラグロシネスワークフローで得られる結果、見た目は完全に一致するということです。

 

使用するレンダラーや、エクスポート設定により、どちらを使うかを選択すれば良いです。

 

 

 

■テクスチャについて

 

一昔前のテクスチャワークフローでは、色、法線、スペキュラを、それぞれのマテリアルに割り当てて使用していました。

 

しかし、ラフネス/メタルネス・ワークフローが確立した現在、必要なテクスチャ類は以下のとおりです。

 

f:id:maskmen2:20160222144239j:plain

 

一つのグループにつき、4種類のテクスチャにまとめられていることが分かると思います。

 

①色(ディフューズ)マップ

色の付いているものはディフューズマップ(カラーマップ、アルベドマップ)で、ライティングを無視した物質本来の固有色を表します。

 

PBRは表現では固有色のみで良いのですが、影色を強調するためにAO(アンビエントオクリュージョン)マップを焼き込むと効果的です。

 

②法線マップ

青っぽいマップが法線マップです。

ゲームでは表示できるポリゴン数が限られているためローポリゴンに擬似的な凹凸情報をペイント/ベイクして使用します。RGチャンネルで深度を表現しているので関係のないBチャンネルがベースカラーになっていることが多いです。

 

③ラフネス/メタルネス or  グロシネス/スペキュラ

黒白で0~100%を表しています。1チャンネルの情報なので、ラフネス/メタルネスをRBG等の3チャンネルテクスチャ一枚にまとめて保存、運用することも多いです。

 

しかし、ノーマルマップのようにオーソドックスなスタイルが確立していないため、スタジオやチームでどのように運用するのかは異なります。

 

今回は人間の目で確認できるように分割して保存しました。一枚のテクスチャにまとめるメリットは大量データを運用する際、セットアップしやすいということです。容量的には分けたほうが1チャンネル情報が2枚なので軽量になりますが、読み込みを分けるのでシェーダーによっては若干遅くなる可能性があります。。

 

以上の3項目をマテリアルIDがの割り振られたモデルにアサイン(割当て)します。

 

PBRの質感設定は3Dペイントでほぼ決まってしまうのでセットアップで悩むのはポスプロだけです。色、法線、ラフネス、メタルネス、それぞれの出力項目にテクスチャを割り当てれば良いだけです。

 

PBRでは質感によってマテリアルグループを分ける必要がありません(注1:例外あり)。

テクスチャを運用しやすいようにマテリアルを分けましょう。

f:id:maskmen2:20160222144242j:plain

 

 

■例外(発光、透過)について

 

今まで解説してきたのはPBRの基本的なワークフローです。

ラフネス/メタルネスで物体の表面は数値化出来るという大法則は変わりません、しかし発光、透過という別の要素が存在しますのでこの点に触れていきたいと思います。

 

④透過

 

透過は主に二種類の使用方法があります。

 

瞳や水を表現する場合、半透明にてメタルネスやラフネスで反射質感を設定します。

 

もう一つはマスクで抜く場合です。まつ毛や葉などの細かい表現はポリゴンで作成すると非常に重いデータになってしまいます。そのため透過PNG等をマスクに割て完全に透過してしまう手法を用いることが多いです。

 

透過PNGは重いので、WebGLの際はテクスチャ類はJPEG推奨です。透過PNGを用いなくてもマスク画像を用意すれば透過Mapとして用いることも可能です。

 

リソースを取るか、作業時間を取るか、二者択一だと思います…。

 

 

f:id:maskmen2:20160222151229j:plain

 

⑤発光

 

発光も質感とは異なる部分の問題です。発光には2つの定義があります。

 

一つ目は、ライティングの影響を受けず一定の輝度、彩度、明度を保ち続けるということ、

 

二つ目は、発行するオブジェクト自身が光源になり、他者に影響するということ。

こちらの定義はリアルタイム描画では非常に難しいです。

 

しかし、ポストエフェクトという手法で、レンダリング後の描画した画像自体にグロー処理を施すことで擬似的に発光のエフェクトをかけることが可能です。

 

ポスプロは描画エンジンによって異なりますが、見た目が大きく変わるので最大限に活用すべきですね。

 

画像は、目とリボン等を発光させた状態です。実はこのモデルも虹彩が瞳の反射に負けないように1%だけ発光する設定にしてあります。

 

発光させる部分が少ない場合は割当のマテリアルグループを分けてマテリアル全体を発光させれば済みますが、ロボット等で発光する部分が多い場合は発光する部分だけ特別に発光マップを作成するのが良いです。

 

 

f:id:maskmen2:20160222151227j:plain

 

 

■最先端のローポリモデリングについて

 

Sketchfabのシェーダー上でも左下の設定からワイヤーフレーム表示ができるので試していただきたいのですが、こちらのモデルは約1500ポリゴン程度しかありません。

 

これは一般的なゲームキャラクターのポリゴンの数です。

 

最先端のローポリフローは、ZBrush等でハイポリを作り、そこからローポリに落とし込む手法が用いられます。

 

海外の予算が多い大手プロダクションでは実物の粘土造形をベースにスキャンした点群データを元にデジタルスカルプトをし、そこからローポリゴンにベイクする、といった手法があったりもします。

 

デジタルアート分野ではハイエンド=アナログに帰化する、と考えてほぼ間違いないです。小手先のデジタルテクニックではなく、アナログのテクニック、造形力が非常に大事になってきていると実感します。

 

以下の資料は例題モデルのヒョウタンに巻かれた縄です。

縄は実際にモデリングしていますが、単純なポリゴンメッシュに質感をベイクしています。

 

ハイポリに対して差分のローポリを作成し焼きこむ事を、私はベイクフロー(ベイキングワークフロー)と呼んでいます。

 

f:id:maskmen2:20160222154153j:plain

 

 

■データ作成方法(3Dペイントについて)

 

PBRモデリングの難しさはテクスチャ作成の難易度だと思います。

 

テクスチャは3Dビュー上で行われるのがハイエンドの手法で、3D-CoatやSubstance、Mari等のソフトで3Dペイントを行います。

 

尚、3dsMaxやMayaはHubとして用いるのが最近の通例です。マテリアルを割り当てたり、アニメーションを付ける場合はAutodesk製品をHubにしてFBX形式で書き出しましょう。

 

この辺の細かい話はLong storyになってしまうので今後機会があれば記事にしたいと思います。

 

今回は3Dペイントに共通する幾つかのテクニック項目に触れたいと思います。以下の概念を理解しなければ3Dペイントを使いこなすことはできません。

 

①ベイク

 

まず、ハイエンドCGの特徴として、ローポリと対になるハイポリが必要となることが挙げられます。

ローポリをハイポリにする手法は非常に昔からある方法ですが、ハイポリからローポリに落とし込んだほうが効率が良いです。

 

ZBrushでは「マルチレゾリューションエメッシュディティング」といってポリゴンをカトマルクラーク方に従い4の倍数で細分化させるハイポリ、ローポリの差分作成に有用なモデリング手法が取られています。

 

ハイポリを更に極限まで肉抜きしたい場合は3D-Coatでのリトポロジーが一般的な手法です。その際、UV展開やUVセットの編集も3D-Coatで済ませておくと楽です。

 

かつて、古い方法ではベイクフローにXNormalが用いられることが多かったですが、

3D-CoatやSubstanceDesignerでより効率的にベイクすることができ、可視化してベイク範囲を見ることができるので非常に多くの利点があります。

 

②AO、曲率マップの活用

 

3Dペイントでは、墨入れや影入れ、形状に即したウェザリングが非常に有用です。

そのために用いるのがノーマルから生成するカバチャーマップ(曲率)、AOマップ(アンビエントオクリュージョン)、そして、これは必要ない時もありますが、上下左右や影の判定に用いるワールドノーマルです。

 

これらはMari、Substance、3D-Coatでペイントを始める際に共通して必要となるベースの情報(マップ)です。

 

そしてこれらのマップは最初はハイポリ、ローポリの差分ノーマルから作られます。

ペイントを進めるにあたって、ノーマルペイントをして質感を追加した場合は随時更新しないと反映されないので注意が必要です。

 

これらのマップにより墨入れや、凹凸判定を活かしたリアルなペイント、ウェザリングが可能になります。

 

例えば、曲率マップを参照元にすることで、ロボットの角の塗装が剥げて中の金属が露出するようなペイントが簡単にできます。

 

③UV、マテリアルグループ、スムージンググループの設定

 

 

■最終出力は…

 

Unity、UE4、Cryengine、Stingray、最近話題のAmazonEngine(仮)等のDirectXベースのレンダリングエンジンです。その他にもToolbagや今回私が用いたSketchfabのようなHTML5WebGLといった手法もあり、最終出力形態によってク消費メモリが変わるので、オリティラインを調整する必要があります。

 

ゲームエンジンでコンテンツを作成し、それぞれのデバイスに向けた携帯に書き出すことをコンパイルと呼びます。

 

コンパイルすることで、Web上で閲覧できる3Dコンテンツや、PS4、XBoxONE向けのコンテンツ、スマホアプリまで幅広く出力することが可能です。

 

 

■次回予告

 

 

次回は3Dペイントについて言及したいと思います。

 

著者は3D-CoatとSubstanceを愛用していますが、Substanceはもっと詳しい方がKerorin氏やもんしょ氏等、ネット上で活躍されている詳しい方が多いので

 

ネット上にあまり情報のない3D-CoatのPBRペイントのノウハウを扱う方向で考えています。

 

3D-Coatの最大の違いはモデリング機能、UV編集機能も付いている点です。また、ZBrushの数億頂点のデータを表示できるのは現状3D-Coatしかありません。

 

以前はSubstanceDesigerでしかAOマップやCurvertureマップを計算できなかったのですが、3D-Coat4.5以降は飛躍的な進化を遂げました。

 

SubstancePainterも最近は曲率AOの計算ができる様になったので非常に優秀です。

 

話が逸れました。

 

というわけで、後半は漠然とした話で非常に難解だったと思います。

日本の皆様も徐々にハイエンドCGを受け入れてくれれば良いと思います。

 

今回の記事が少しでもみなさまのお役に立てましたら、Sketchfabにコメント、☆を頂けると非常に有り難いです。

 

それではまた、次回は3Dペイント実践編でお会いしましょう。

 

◆続編記事

 

kazukisakamoto.hateblo.jp

 

◆関連記事(この記事の続編、応用記事です)

 

kazukisakamoto.hateblo.jp