物理ベースのマテリアル

主要な物理ベース マテリアルの入力に関する概要と、それらを最大限に活用する方法を紹介します。

Choose your operating system:

Windows

macOS

Linux

PhysMatHeader.png

このドキュメントでは、Unreal Engine の 物理ベース マテリアル システムを活用するためのガイドラインとベスト プラクティスについて説明します。このドキュメントは、Unreal でマテリアルを作成した経験のある方やそのプロセスを理解してい方を対象としています。Unreal でのマテリアル作成がまったく初めての方は、「マテリアルの基本概念」ページから始めることをお勧めします。

このページでは、物理ベース シェーディングのワークフローに直接関連するマテリアル属性のみに焦点を当てます。メイン マテリアル ノードに含まれるすべての入力の詳細については、「マテリアル入力」ページを参照してください。

物理ベースとは

物理ベース レンダリング (PBR) とは、人が直感的に感じ取るライトの動作ではなく、現実世界におけるライトの動作の近似値を求める方法を指します。PBR の原則に沿ったマテリアルは精度がより高く、多くの場合、アーティストの主観に基づいて設定されたパラメータに完全に依存するシェーディング ワークフローよりも自然な外観を再現できます。

物理ベース マテリアルは、あらゆるライティング環境で同じようにうまく機能します。また、マテリアルの値はよりシンプルで相互依存性が低いため、マテリアル作成ワークフローがよりユーザーフレンドリーになります。Pixar [4] と Disney [3] 制作の映画に見受けられるように、これらのメリットは非フォトリアルなレンダリングにも適用されます。

Unreal Engine の物理ベース マテリアルとシェーディング モデルの技術的な詳細については、こちらの SIGGRAPH プレゼンテーション 2 を参照してください。

PBR マテリアル属性

Unreal マテリアルの「物理ベース」に直接関連するマテリアル属性は次のとおりです。

これらすべての入力は、0 ~ 1 の範囲の値を受け取るよう設計されています。Base Color の場合は、0 ~ 1 の範囲内の RGB 値を含む色またはテクスチャ サンプルを意味します。

物理ベースの値は、現実世界のマテリアルから計測することも可能です。その例を紹介します。

Base Color

Base Color ではマテリアル全体の色を定義します。Base Color 入力では、各チャンネルが 0 ~ 1 の値に自動的にクランプされた Vector3 (RGB) 値を受け取ります。

Base Color

次は、現実世界から取得する場合に、偏光フィルタを使って写真撮影したときの色です (偏光により、アライメント時に非メタルのスペキュラが取り除かれます)。

Measured BaseColor values for nonmetals (intensity only):

マテリアル

BaseColor の強度

Charcoal (木炭)

0.02

Fresh asphalt (新しいアスファルト)

0.02

Worn asphalt (摩耗したアスファルト)

0.08

Bare soil (むきだしの土壌)

0.13

Green grass (草)

0.21

Desert sand (砂漠の砂)

0.36

Fresh concrete (新しいコンクリート)

0.51

Ocean Ice (氷河)

0.56

Fresh snow (新雪)

0.81

メタルの BaseColors 計測値:

マテリアル

BaseColor (R, G, B)

Iron (鉄)

(0.560, 0.570, 0.580)

Silver (銀)

(0.972, 0.960, 0.915)

Aluminum (アルミニウム)

(0.913, 0.921, 0.925)

Gold (金)

(1.000, 0.766, 0.336)

Copper (銅)

(0.955, 0.637, 0.538)

Chromium (クロム)

(0.550, 0.556, 0.554)

Nickel (ニッケル)

(0.660, 0.609, 0.526)

Titanium (チタン)

(0.542, 0.497, 0.449)

Cobalt (コバルト)

(0.662, 0.655, 0.634)

Platinum (プラチナ)

(0.672, 0.637, 0.585)

Roughness

Roughness 入力では、マテリアルのサーフェスの粗さ、もしくは滑らかさを制御します。また、これによってマテリアル上の反射の鮮明さ、もしくはぼやけ具合が決まります。

粗いマテリアルでは、滑らかなマテリアルと比べて反射ライトがより多くの方向に拡散されてディフューズ (拡散色) となり、繊細な反射となる場合があります。滑らかサーフェスではライトの反射がより均一になり、鮮明で集中的な反射またはスペキュラ ハイライトとなります。

  • 0 の Roughness 値 (滑らか) はミラー反射となります。

  • 1 の Roughness 値 (粗い) は、ディフューズまたは艶消しされたサーフェスとなります。

roughness_nonmetal.png roughness_metal.png

0 から 1 の Roughness 値。上段は非メタル、下段はメタル。

0 から 1 の Roughness 値。

ラフネスをマッピングする

多くの場合、ラフネスは、サーフェスに物理的なバリエーションを加えるために、グレースケールのテクスチャを使ってオブジェクトにマッピングされます。ラフネス マップの暗い領域はマテリアル上ではミラー反射のようになり、明るい領域は反射の少ない粗い感じになります。

次のビデオでは、0 から 1 に変わるラフネス値を、明るい (粗い) 値と 暗い (滑らか) 値の分散を制御するパーリン テクスチャを使って示しています。0 の時点では、マテリアルのプレビューは完全にミラー反射になり、1 の時点では完全に艶消しされたサーフェスとなります。その中間の値ではサーフェスの一部が滑らかに、他の部分は粗くなるため、より興味深い結果となります。

ラフネス マップは、プラスチックやメタルなどのマテリアルに汚れやシミ、不完全な部分を加える際によく使用されます。

ラフネスとスペキュラ

特に PBR ワークフローの採用前から Unreal Engine を使用していた方にとって、ラフネスとスペキュラとの相互作用は理解しておくべき重要なトピックです。

スペキュラリティ (鏡面反射性) とは、サーフェスで反射する スペキュラ ライト の量を指します。この値はマテリアル タイプに継承され、通常はデフォルト値である「0.5」が正確なものになります。Specular 入力は 反射/スペキュラリティのマップには使用せず、サーフェスのバリエーションを加える際にも使用しません。これらはラフネス マップを通じて処理する必要があります。

Metallic

Metallic 入力では 0 ~ 1 の範囲の値を受け取り、マテリアルがメタルであるか非メタルであるかを定義します。

ほとんどの場合、Unreal Engine では Metallic をバイナリ プロパティとして扱う必要があります。純粋なメタルや石、プラスチックなどの「純粋なサーフェス」では、Metallic を 「0」か「1」のいずれか に設定し、その中間の値は使用しません。ただし、腐食したメタルや埃っぽいメタル、または錆びたメタルなどの「ハイブリッドなサーフェス」を作成する場合は、0 から 1 の間の値が必要になることもあります。

  • 非メタル の Metallic 値は 0 で、これがそのデフォルト値です。

  • メタル の Metallic 値は 1 です。

Metallic values

0 ~ 1 の Metallic 値。

最初はマテリアルを完全なメタリックにすることに抵抗を感じるかもしれませんが、そこを我慢して、明確な理由がない限り、中間の値を使用しないようにしてください。

次の例では、比較的 Roughness 値の低いマテリアル上で Metallic 値が 0 から 1 に変わる際のサーフェスの変化を示しています。

0 から 1 の Metallic 値。

メタリックをマッピングする

同じマテリアルにメタルと非メタルの両方の部分が含まれていることがよくあります。たとえば、メタルの一部またはすべてにペイントが施されたメタル製のパネルなどがあります。

ペイントは非メタルであるため、ペイントが施されたすべての部分の Metallic 値は「0」になります。メタルがむき出しになっている部分については、Metallic 値は「1」になります。

これは、Metallic 入力に渡される「白黒のマスク」によって処理します。ペイントはメタルとブレンドされず、あくまでもメタル上に存在するものです。メタリック マップには中間のグレースケール値は含めず、黒色と白色だけにとどめてください。また、マテリアル レイヤーを使うことで同じ結果を得ることもできます。

Specular

Specular 入力では 0 ~ 1 の範囲の値を受け取り、サーフェスで反射するスペキュラ ライトの量を制御します。

  • 0 の Specular 値ではまったく反射しません。

  • 1 の Specular 値では完全に反射します。

Unreal Engine では、約 4% のスペキュラ反射を表す 「0.5」をデフォルト値 として使用します。これは、ほぼすべてのマテリアルに対して正確な値です。

散乱性の高いディフューズ マテリアルでは、はこの値を「0」に設定したい衝動に駆られるかもしれませんが、我慢しましょう。すべてのマテリアルにはスペキュラがあり、その例をこちらで参照できます[5]。このようなディフューズ マテリアルを作成する際は、Roughness 値を高く設定することが正しい方法です。

キャビティ マップ

スペキュラを変更する理由の一つは、法線マップで表現される隙間など、マイクロ オクルージョンまたは小規模スケールのシャドウイングを追加することにあります。これらは「キャビティ」と呼ばれることがあります。 小規模スケールのジオメトリ、特に高ポリゴンの部分のみでディテールを表示するものや法線マップにベイクされるものは、レンダラのリアルタイム シャドウでは検出されません。

このようなシャドウイングをキャプチャするためにキャビティ マップを作成します。通常、キャビティ マップは非常に短いトレース距離を含む AO マップです。これが出力前に最終的な BaseColor 値によって乗算され、「0.5」 (Specular のデフォルト値) で乗算されて Specular の出力値となります。

つまり、BaseColor = Cavity*OldBaseColor、Specular = Cavity*0.5 です。

さらに上級向けの使用方法として、これを使って「屈折率」 (IOR) を制御することもできます。ただし、99% のマテリアルではその必要性は認められていません。次は、IOR 計測値に基づいた Specular 値の一覧です。

Specular 計測値:

マテリアル

Specular 値

Glass (ガラス)

0.5

Plastic (プラスチック)

0.5

Quartz (石英)

0.570

Ice (氷)

0.224

Water (水)

0.255

Milk (牛乳)

0.277

Skin (皮)

0.35

0 から 1 の Specular 値

measured_materials.png

計測マテリアルの例。上部:上部:木炭、新しいコンクリート、摩耗したアスファルト。下部:銅、鉄、金、アルミニウム、銀、ニッケル、チタン。

リファレンス

1.Lagarde, Feeding a physically based shading model

2.Karis, Real Shading in Unreal Engine 4

3.Burley, Physically-Based Shading at Disney

4.Smits, Reflection Model Design for WALL-E and Up

5.Hable, Everything is Shiny