サンフランシスコで2023年3月20日から開催されたゲーム開発者向けのイベント「Game Developers Conference 2023」(GDC 2023)で、Unreal Engine5.2から実装される、マテリアルの表現をより豊かにする新機能「Substrate」が発表された。

本記事では、Substrateについて解説したセッション「The Future of Materials in Unreal Engine」の情報をもとに、本機能について詳細を説明する。


Unreal Engine5.2のその他の新機能群(プロシージャル3Dモデル生成、物理)については別記事にて詳しく解説しているので、参照してほしい。

記事の目次
    Substrateの解説を行ったMatt Oztalay氏(Epic Games シニアテクニカルアーティスト)

    次世代型物理ベースマテリアルの発表

    基調講演においては、UE5.2の新機能を使って再現されたジャングル内をRivian社製の電動ピックアップトラック「R1T」が走破して行くという「Electric Dreams」デモの中で、R1Tの車体のカーペイントが内部にキラキラしたメタルフレークのような複雑な層の輝きを持った厚いクリアコートのようなマテリアルに変わるという演出があった。

    従来のマテリアルシステムでは複雑なシェーダーセットアップが必要な演出だが、今回実装されたSubstrateでは簡単に、しかも従来のシェーダーとさほど変わらない処理負荷で実現できるようになったという。

    このセッションでは、Substrateの基本理念、従来のPBR(物理ベースレンダリング)マテリアルとの違い、実践的な作例を見せながらの機能解説が行われた。

    本記事ではこれらの要約と実際のUE5.2上でのセットアップ例の紹介を交えてお届けする。(使用バージョン:Unreal Engine5.2.0 preview2)

    「Electric Dreams」デモより。車体のマテリアルが金属、メタルフレーク、クリアコート、泥はねと層になっており、日光がクリアコート層を透過して下のフレーク層に反射して出てくる様子が表現されている。
    デモ内の該当シーン

    Substrateの概要

    Substrateは、正確には前バージョンであるUnreal Engine5.1に実験的機能として追加されていたStrataをベースにしたマテリアルフレームワークだ。バージョンアップした正式名称がSubstrateというわけだ。

    Matt氏によれば、「これはひとつのパラダイムの転換であり、サーフェス表現の新しい可能性を大きく広げることになる」ものだという。

    Substrateは、よりモジュール化された、表現力豊かで統一されたフレームワークであることを目標にしている。メタリック、オパシティなど計測値でない抽象的なパラメータの可能な限りの除去。多層になったマテリアルの物理的に正確な表現。異なるシェーディングモデルのブレンドを1つのマテリアル内で出来るようにすること。過去のシステムに習熟しているアーティストが直感的にパラメータを設定できるような互換性などが大きな特徴として挙げられる。

    実際にSubstrateを触ってみるにあたって注意すべきなのは、5.2時点ではまだ実験的機能であり、レンダーパイプラインを大きく変更するためにレガシーなマテリアルシステムと相互に排他的である点だ。

    プロジェクト設定で有効にする必要があり、有効にするとプロジェクトの既存のマテリアル全てがSubstrateマテリアルに変換される。

    この変換はマテリアルエディタ上のグラフ内に変換用ヘルパーノードが自動的に追加され、可能な限り同一の見た目を再現するように実行されるが、複雑なシェーダーはエラーが起きる可能性もあり元に戻せる保証がなくなる。そのため、必ずプロジェクトのバックアップを取るか新しいプロジェクトで始めるようにするのが良いだろう。

    プロジェクト設定>レンダリング>Substrateで設定できる画面。パフォーマンスに問題がなければ3つともチェックを入れる。重い場合はSubstrateマテリアルだけにするといいだろう。

    新たなシェーディングモデル「Slab BSDF」

    プロジェクト設定でSubstrateを有効にし新しいマテリアルを作成してマテリアルエディタに入ってみると最終入力ノードからベースカラーやラフネスなどのパラメータ入力ソケットがなくなっている事に気づくだろう。

    代わりにフロントマテリアルという入力があり、Substrate Slab BSDFという大きなノードが各種パラメータを受け取って集約してそこに渡すようになっている。イメージ的にはマテリアル属性でまとめたものをそのまま最終ノードに入れてしまう感覚だ。

    パラメータ名を見るとSSSや異方性反射など、以前では様々なシェーディングモデルを切り替えて個別に作成しなければならなかったようなマテリアル用のパラメータが1つのノードで受け取れるようになっている。

    Substrate Slab BSDF用のパラメータ。以前存在したMetallicやSpecularは無くなっている。

    BSDFとは何か。双方向散乱分布関数(Bidirectional Scattering Distribution Function)の略で、複雑なため非常にざっくりと説明すると光が物体のある1点を照らした場合どこへどのくらいの強さで反射するかというBRDFという反射計算モデルと、BTDFという透過の計算モデルを合わせたものである。

    以前は個別のシェーディングモデルを使い分けないと作成できなかった透明マテリアルやヘアなどの異方性反射、人肌などSSS効果を持ったマテリアルを1つの総合的なシェーディングモデルでまかなえるようになったと考えてよいだろう。

    Slabとは、簡単に言うと、「光が物質と相互作用する界面を表現するもの」だという。光が物質の界面をどのように伝搬するかを表すもので、工学系の論文などで「媒質境界表面」などと呼ばれているものの事だ。

    日本人にはあまりなじみのない単語だが、Substrateで扱う材質1つの事、と考えて問題ないだろう。

    従来のシステムでマテリアル属性同士をブレンドするような感覚でこのSlab同士をレイヤー状に重ねた表現が可能になっている。金属の上に透過するクリアコート層があり、光は主に金属層に反射する、といったマテリアルが作成可能だ。

    F0とF90

    まず目につくのは、長年お世話になってきたMetallicとSpecular入力がなくなっている事だ。代わりに導入されたのが「F0」と「F90」というパラメータ入力である。

    F0はPBRマテリアルでも使われている概念で、物体表面が照らされる時に正面(グレージング角0度)への反射率を表す。
    対してF90は90度、つまり平面なら面と並行である接線方向への反射率を表す。

    つまり球体をカメラの真正面に置いて見た時に、中央部分に見えるのがF0、外縁部分に見えるのがF90の反射となる。

    数値をいじってみると、F0に黒に近い色を入れDiffuse Albedo(拡散反射)にカラーを入れるとプラスチックや石に近いものが出来、F0とF90に色を入れた上でDiffuse Albedoを黒にするとメタリックサーフェスになる。

    従来のPBRで言うスペキュラワークフローの感覚に近いものになっていると思えばいいだろう。

    物理的に正確なマテリアルのブレンド

    Substrateの売りとして、異なるマテリアル同士のブレンドがより物理的に正確になったという事があげられる。

    水平(Holizontal blend)と垂直(Vertical layer)のブレンドがあり、まず水平は異なるマテリアルが隣り合って、あるいはサビかけの金属のようにある程度混ざりあっている状態をさす。

    以前はこれはマテリアル属性を作成しLerp(線形補完)して実現していたが、物理的に正確とは言い難いものだった。

    Sabstrateでは金属(メタル値1)と誘電体(メタル値0)が混ざりあい、メタリック値が0-1の間にあるようなセミメタリックサーフェスを作成するのにも適しているという。

    マテリアルエディタでのブレンド処理

    Matt氏いわく、メタリックやオパシティは抽象的なパラメータで目に見えるふるまいを抽象化して表しているに過ぎなく、Substrateではこれらを計測可能なパラメータで記述できるようにするのが目標だという。

    Metallic値を廃止しF0、F90値を導入したのがその例だが、レガシーなパラメータに慣れ親しんだアーティストのために、従来のPBRのパラメータを入力してSubstrate用の入力に変換してくれるヘルパーノードが用意されている。

    「Substrate Metalness To DiffuseAlbedo-F0」がそれで、メタリックとスペキュラを設定すると、材質の伝導率を計算しベースカラーに入力した値をアルベド(ベースカラー)とF0の間で適切に分配してくれる。

    ブレンドオペレーターとして用意されているもののうち最も基本的なものが「Substrate Horizontal Blend」である。ブレンドマスクで2つのBSDFをブレンドするもので、使い方はLerpと同じと思ってよい。

    新たなパラメータ「MFP」

    SlabBSDFノードを見ていくと、SSS MFPという入力がある。

    名前から表面下散乱(Subsurface Scattering)のための入力というのは想像がつくが、MFPというのが今回導入された透過や表面下散乱のためのパラメータである。

    MFPとは「Mean-free Path」の略で、日本語にすると「平均自由行程」となる。平均自由行程とは、簡単に言うと、光が何かにぶつかる前に媒体を通過できる距離のこと。

    光は物質に飛び込むといくらかの距離を進んだのち内部の原子にぶつかって方向を変える。これは物理的な特性であり、物質の測定可能な数値として扱えるものだ。マテリアル表現としては、光をどれくらい通すかという値だと考えていいだろう。

    数値が大きいほど光は物質の中を直進し続け、MFPが物質の厚みより長い場合は光は反対側に透過するという事になる。SubstrateではMFP1.0が1cmに相当する。平均値なので短い距離で散乱する光もあるのだが、SSS効果を出したい時の指標になるだろう。

    Matt氏によると、金属であってもMFPはナノスケールの微細な値だが存在するという。事実上すべての物質には多かれ少なかれSSS特性があるという考えの下で設計されているそうだ。MFPは測定可能な値であり、従来使われていた不透明度や表面化散乱光色といった抽象的で不正確なパラメータを置き換えようとしているのだという。

    光が物体に突入して散乱を始めるまでの距離がMFPである

    実はこのMFPのパラメータを設定する際には、以前のようなSSSの透過色を指定するような考え方だと思った通りの色が出ずに困惑することになる。求められているのは色ではなく距離だからだ。

    MFPについて実際に筆者が検証してみた。例えば緑色の透過あるいは散乱色を出したい場合、RGBで緑色を入力するとピンク色のマテリアルになってしまったりする。

    これは結果的に「緑色が透過し、それ以外の色が散乱して表面に出てくる」マテリアルになるためで、白色からグリーンを抜いた結果であるピンク色が現れるというわけだ。

    これは直観的でないというわけで、アーティストが出したい色を入力するとMFPに変換してくれるヘルパーノードが用意されている。「Substrate Transmittance-To-MeanFreePath」がそれで、TrancemittanceColorにRGB値を入力すると、その色があらわれるようなMFPの値を出力してくれる。基本的にはこのノードを使って調整していくのがいいだろう。さらにこのRGB値を0-1の間に保ったまま透過の強さのみを調整できるように「SSS MFP Scale」のパラメータが用意されている。

    クリアコート表現

    車の塗装のように、何層にも塗装が透けて見える必要がある場合、Substrateの機能は有用だ。

    例えば、マツダ車の赤(マツダレッド)は、表面のウレタン層だけではなく、フレークと呼ばれる金属のラメ層、下地の赤、地金素材など、7層コーティングしていることで知られており、Substrateの機能を使えば、理論上8層までのクリアコート表現が実現できるだろう。

    レガシーなシステムでは複数のシェーディングモデルのマテリアルを組み合わせる必要があった。それをしたくないがためにフェイクのようなシェーダートリックが多数編み出されたのだが、SubstrateではSlab同士をマテリアル内で混ぜ合わせることができるため、異なるシェーディングモデルが垂直にレイヤーで重なったような表現が簡単に作れる。

    GDCのデモに使用されたピックアップトラックの表面がその一例である。サンプルシーンが公開されていないため推測にはなるが、地金、塗装とフレーク、クリアコート、泥の最低でも4層以上のSlabが使用されている。一部の光は反射するが、一部の光は透過できずに拡散する。

    マテリアルのレイヤー表現

    実際に、どのようにクリアコートを作成したかを解説する。クリアコートだけではなく、マテリアルのレイヤー表現が可能になるため、泥や雪などの表現も可能になる。

    レイヤー同士を重ねるときに使用するのが「Substrate Coverage Weight」ノードである。役割はLerpに似ているが、Slab同士を重ね合わせてエネルギー保存則にのっとった最終結果になるよう処理してくれる。

    またこのカバレッジノードの値をゼロにすると、その層のSlabは計算されなくなるため処理負荷を検証するのにも役立つだろう。従来使われていたLerpノードを使った簡易ON/OFFスイッチのようなものだ。部分的に削りたい箇所がある場合のマスクもここに入力する。

    多層になったレイヤー表現のために用意されているのが「Substrate Vertical Layer」ノードだ。セットアップは単純で、上層と下層のSlabノードを接続し、トップ層の厚みを数値かテクスチャで設定するだけである。

    これだけでエンジンが複数の層を通過する光の挙動を計算し、それぞれのBSDFをブレンドした最終的な反射や拡散をレンダリングしてくれる。上層の厚みを考慮したい場合は、下層のハイトマップを調整してTop Thicknessに入力するなどするとよい。MFPよりも厚くなっている個所は光を吸収して鈍い反射になっていくのが分かるだろう。

    Top Thicknessを上げていったところ。表面のプラスチックコート層が厚くなるにつれ、下層の銅板のスペキュラが鈍くなっていく。またラフネスを上げていっても曇りガラスのような効果が表れ始める。

    このように複数のスペキュラローブ(反射特性)を持ったマテリアルを表現できるようになったのがSubstrateの特徴でもある。

    多層レイヤーのエイジング表現

    より実践的なサンプルとして、Quixel Megascanの金属のミルク缶を使ったプレゼンが行われた。

    地金、サビ、塗装、クリアコーティングが重なっており、これらに経年劣化表現を施す。カバレッジウェイトノードを使い、クリアコートが削れて塗装が露出し、さらに塗装が削れて金属が露出し錆に変わって行く表現が見られた。

    これらは別々のBSDFがブレンドされているもので、ウェザリング、エイジング箇所の定義にはカバチャーやAOから作成したマスクを使うことができる。

    異なるシェーディングモデル同士がブレンドされているため、従来のただマスクでマテリアルを混ぜただけのものより非常にきれいに見える。しかし相応に負荷も高いため全てのプロップに使うわけにはいかないだろう

    Substrateの負荷

    Substrateのコストはレガシーなシェーディングモデルと同様になるように努力しているという。

    1つのSlabBSDFが1つのレガシーマテリアルと同様ということだが、Slab1つだけのマテリアルの場合、レガシーパラメータの変換ノードを使うよりSlabに直接Substrate用のパラメータを入力するほうが少し安くなる。

    マテリアル内のSlabBSDFの数を増やすと、コストは線形より少し高い割合で増加していくとのことだ。

    なおレガシーなマテリアルがプロジェクト内に存在する場合、「Substrate Legacy Conversion」ノードが自動的に生成され、該当するシェーディングモデルに対応したパラメータがSlab BSDFに入力された状態になる。

    これをコピーしてSubstrateマテリアル内にレイヤーとして追加することも可能だ。

    薄膜の表現

    Substrateの表現で出来ることの一つとして薄膜干渉がある。

    可視光の波長は380から740ナノメートルのため、光の一波長が収まる厚さ1000ナノメートル程度の薄膜であれば、光はその膜の中に入り込み、大きく跳ね返って特徴的な干渉パターンを作り出す。良く知られた例はシャボン玉の表面だろう。

    というわけで、バブルサーフェスを作るMatt氏のデモが行われた。

    ここで使われたヘルパーノードは「Substrate Thin-Film」だ。このヘルパーノードは、膜の厚みや屈折率の値に対して適切なスペキュラカラーとエッジスペキュラカラーを与えてくれるものである。

    厚みにノイズテクスチャを入れ、Thicknessがテクスチャの1を10マイクロメートルとして受け取るため0.1を乗算する。これで薄膜干渉が起きる1000ナノメートルの範囲に厚みが収まる。

    あとはこのスペキュラとエッジスペキュラの色値をF0とF90に差し込むことでシャボン玉のエフェクトが完成した。

    完成したシャボン玉のマテリアルでは、見る角度によって変わる虹色の模様ができていることが確認できる。

    焼結金属の表現

    薄い物質の層によるスペキュラ変化の例として、荒野に置かれたロケットエンジンのデモが行われた。

    鍛冶や金属加工で行うことのひとつに、鋼の焼き入れがある。金属の温度を上げると、結晶構造に変化が生じ、鋼を加熱すると、表面に酸化鉄の層ができる。

    そして、その酸化鉄の層が薄膜干渉を起こす。さらに熱すると、より厚い皮膜ができ、その皮膜から反射する光はまた違った色になっていく。つまり、ロケットエンジンのような高温になる金属がある場合、高温になるにつれて酸化鉄のコーティングが追加されていくことになる。

    そして徐々にゆっくりと熱を加えるにつれて、金属の見かけの色が変化していく。溶接をしたことがある人なら、この効果を見たことがあるのではないだろうか。

    そして、さらに熱を加えていくと、今度は青白くなり、さらに温度が上がると、今度は深い紫色になっていく。

    Substrateは地金の上にレイヤーとなって追加されており、表面の周りを視点が移動すると、厚みを正確にシミュレートしているため、エッジのスペキュラーカラーの色や見た目の色も変わっていく。

    Substrateのパフォーマンス視覚化

    最後に、雪シーンのデモが行われた。このシーンに登場するすべてのマテリアルに最初から雪が積もっているが、これはSubstrateで雪のレイヤーを重ねたからである。

    Substrateでは、目に見えるBSDFをシェーディングする時にのみコストがかかっているのだという。これらのBSDFのコストがどれくらいか、新しいビューモードオプションで確認することができる。ビューモードでSubstrateを選択すると、Substrate用のデバッグビューに入ることができる。

    このビジュアライゼーションモードでは、マウスオーバーしたピクセルごとにBSDFのレイヤー数や計算コストが表示される。
    この薄緑色の部分が雪のレイヤーだが、Coverage Weightノードで雪のウェイトをゼロにすると、雪はなくなり、BSDFを1つだけ表示するコストになった。

    物理的な正しさは正義か

    物理的に正確な方法でライティングを行うからと言って、物理的にもっともらしいサーフェスを作成する必要があるわけではない。Matt Oztalay氏は講演の中で繰り返し物理的な正しさについて考えるだけではなく、与えられた機能の表現幅を最大限に利用することが大事だと主張している。

    PBRマテリアルは進化し続けるものであり現状完璧なものではなく、例えばラフネス/メタルネスフローによるPBRマテリアルは完璧さよりもアーティストにとってのわかり易さを優先したものであった。

    仮に完璧なBSDFが実現したとしても、アーティストの仕事は画作りにあり、物理的に正しい光学特性を再現することは必ずしもアーティストの役割ではない。

    厳格なルールに縛られるのではなく、物理ベースマテリアルを活用してどのように自由な画作りをしていくか、今一度アーティスト的な視点に立ち返り自由な発想で次世代型のマテリアルと向き合ってみてはいかがだろうか。

    今後の展開

    Substrateは、まだ実装されたばかりで実験的機能という事もありこれからまた変更が入る余地はありそうだ。複数のマテリアルが重なったレイヤー表現やリアルな半透過表現は強力で、今まで使いたくても使えなかったポイントで活躍させられそうである。

    特に有機的なマテリアルを作るのにかなり強力な武器になりそうだ。また金属表面の薄膜表現などはFPSの銃器のリッチな見た目を作るのに最適だろう。また、ゲームよりはパフォーマンスが問題になりにくい建築ビジュアライゼーション分野などでは積極的に使っていけそうだ。

    とはいえ、処理負荷が大きいということもあり今後これが主流になっていくかはまだ断言はできない。既存のPBRワークフローを置き換えるものになるかどうかは、処理負荷とのコストパフォーマンス次第と言える。

    全てのマテリアルでBSDFのブレンドを使う必要があるわけではないため、従来のテクスチャや頂点カラーマスクによる質感の切り分けはまだまだ使われていくことになるだろう。

    Substrateを有効にすると全てのマテリアルでSubstrateを使わなければならないという事もあり、商業プロジェクトに導入するにはまだ早いという印象だ。既存のマテリアルと共存出来るようになれば要所でかなり有効な使い方ができるはずなので、アップデートに期待したい。

    また筆者が使用してみての使用感だが、セットアップが単純になったのをいいことについつい重いマテリアルを作ってしまいリアルタイム用途で実用的な軽さに収めるにはまだ調査が必要だと感じた。

    現時点でのUnreal Engineの機能別サンプルは、まだUnrealEngine5.1のStrataを使ったものまでしかないが、今後UnrealEngine5.2以降のSubstrateの発展に期待したい。

    TEXT_Kerorin4410/ますく(KATASHIRO+)
    EDIT_山下一貴 / Itsuki Yamashita(CGWORLD)