PBR 素材
"PBR 素材" は、Azure Remote Rendering でサポートされている素材の種類の 1 つです。 これらは、リアルな照明を受ける必要がある三角形メッシュに使用されます。 一方、ポイント クラウドは、動的な照明の影響を受けません。
PBR は、Physically Based Rendering (物理ベース レンダリング) の頭文字であり、すべての照明条件下で現実的な結果が得られるように、物理的に適切な方法で表面のビジュアル特性が素材において記述されることを意味します。 リアルタイム レンダリング用に現実世界を近似する手段としては PBR が最適であると考えられているため、最新のゲーム エンジンやコンテンツ作成ツールは、PBR 素材をサポートしています。
物理ベース レンダリングの中心になる概念は、BaseColor、Metalness、Roughness プロパティを使用して、さまざまな現実世界の素材をエミュレートすることです。 PBR の詳細については、この記事では説明しません。 PBR について詳しくは、他のソースをご覧ください。
ただし、PBR 素材は万能のソリューションではありません。 見る角度によって色の反射が異なる素材があります。 たとえば、一部の織物や自動車の塗装などです。 この種の素材は、標準的な PBR モデルでは処理されず、現在 Azure Remote Rendering によってサポートはされていません。 この制限事項には、Thin-Film (多層表面) や Clear-Coat (自動車の塗装用) などの、PBR 拡張機能が含まれます。
PBR 素材のプロパティ
次の素材プロパティは、たとえばそれぞれ C# PbrMaterial クラスや C++ PbrMaterial クラスのランタイム API で公開されます。
PbrFlags
: その他の機能フラグをこのビット マスクで組み合わせて、次の機能を有効にすることができます:TransparentMaterial
: PBR 素材の場合、透過性の設定は、有効か無効のいずれかのみです。 不透明度は、アルベド カラーのアルファ チャネルによって定義されます。 有効にすると、より複雑なレンダリング メソッドが呼び出されて、半透明のサーフェスが描画されます。 Azure Remote Rendering では、真の順序に依存しない透明度 (Order Independent Transparency: OIT) が実装されています。 透明なジオメトリは、レンダリングの負荷が大きくなます。 表面に穴が必要なだけの場合は (木の葉など)、代わりにアルファ クリッピングを使用することをお勧めします。
上の画像では、右端の球は完全に透明ですが、反射がまだ見えていることに注目してください。
重要
実行時に素材が不透明から透明に切り替わることが想定される場合は、レンダラーで TileBasedComposition レンダリング モードを使用する必要があります。 この制限は、最初から透明な素材として変換される素材には適用されません。
UseVertexColor
: メッシュに vertex カラーが含まれていて、このオプションが有効になっている場合は、メッシュの vertex カラーがAlbedoColor
とAlbedoMap
に乗算されます。 既定では、UseVertexColor
は無効になっています。DoubleSided
: 両面に対する表示が true に設定されている場合、この素材が表示されている三角形は、カメラが背面を見ていてもレンダリングされます。 PBR 素材の場合、照明も背面に対して適切に計算されます。 既定では、このオプションは無効になっています。 参照 Single-sided rendering.SpecularHighlights
: この素材の反射ハイライトを有効にします。 既定では、SpecularHighlights
フラグが有効になっています。AlphaClipped
:AlphaClipThreshold
の値を下回るアルファ値に基づいて、ピクセル単位でハード カットアウトを有効にします (下記参照)。 これは不透明な素材にも適しています。FresnelEffect
: この素材フラグを使用すると、個々の素材に対して付加的なフレネル効果が有効になります。 この効果の外観は、以下で説明する、他のフレネル パラメーターFresnelEffectColor
とFresnelEffectExponent
によって制御されます。TransparencyWritesDepth
: 素材にTransparencyWritesDepth
フラグが設定されていて、その素材が透明である場合、その素材を使用した物体も、最終的な深度バッファーに寄与します。 次のセクションの PBR 素材フラグ transparent を参照してください。 実際のユース ケースで、完全に透明なシーンの Late Stage Reprojection の現実感を高める必要がある場合は、この機能を有効にすることをお勧めします。 不透明と透明が混在するシーンでは、この設定によって、非現実的な再投影動作や再投影アーティファクトが生じることがあります。 このため、一般的なユース ケースにおいて推奨される既定の設定は、このフラグを無効にすることです。 書き込まれる深度値は、カメラに最も近い物体のピクセルごとの深度レイヤーから取得されます。
AlbedoColor
: この色には、AlbedoMap
や "vertex カラー" など、その他の色が乗算されます。 素材に対して透明度が有効な場合、アルファ チャネルを使用して不透明度が調整されます。ここで、1
は完全に不透明、0
は完全に透明を意味します。 既定の albedo の色は不透明な白です。Note
まったく汚れのないガラス サーフェスのように、PBR 素材が完全に透明な場合でも、環境が反射されます。 太陽のような明るいスポットは、反射でもやはり見えます。 これは、色素材とは異なります。
AlbedoMap
: ピクセル単位の albedo 値の 2D テクスチャ。AlphaClipThreshold
:AlphaClipped
フラグがPbrFlags
プロパティに設定されている場合、アルベドのアルファ値がAlphaClipThreshold
より小さいすべてのピクセルは描画されません。 アルファ クリッピングは、透明度を有効にしなくても使用でき、レンダリングがはるかに高速になります。 ただし、アルファ クリッピングされた素材は、完全に不透明な素材と比べると、レンダリングは遅くなります。 既定では、アルファ クリッピングは無効になっています。TexCoordScale
とTexCoordOffset
: スケールが UV テクスチャ座標に乗算され、オフセットが追加されます。 テクスチャの伸縮とシフトに使用できます。 既定のスケールは (1, 1) で、オフセットは (0, 0) です。FresnelEffectColor
: この素材に使用されるフレネルの色。 この素材に対してフレネル効果フラグが設定されている場合にのみ重要です (上記を参照)。 このプロパティによって、フレネル光沢の基本色が制御されます (詳細な説明は「フレネル効果」を参照してください)。 現在は、RGB チャネル値のみが重要であり、アルファ値は無視されます。FresnelEffectExponent
: この素材に使用されるフレネル指数。 この素材に対してフレネル効果フラグが設定されている場合にのみ重要です (上記を参照)。 このプロパティによって、フレネル光沢の拡散が制御されます。 最小値 0.01 の場合、オブジェクト全体にわたって拡散されます。 最大値 10.0 では、光沢が抑制され、最グレージング端にのみ表示されます。PbrVertexAlphaMode
: 頂点カラーのアルファ チャネルの使用方法を指定します。 次のモードが提供されています:Occlusion
: アルファ値はアンビエント オクルージョン値を表すため、スカイ ボックスからの間接照明にのみ影響します。LightMask
: アルファ値は、適用される照明の全体的な量のスケール ファクターとして機能します。つまり、アルファを使用して領域を暗くすることができます。 これは間接照明と直接照明の両方に影響します。Opacity
: アルファは、素材の不透明度 (1.0) または透明度 (0.0) を表します。
NormalMap
: 微細なディテールをシミュレートするには、法線マップを提供できます。NormalMapScale
: 法線マップの強度をスケールするスカラー値。 値が 1.0 の場合は法線マップの法線をそのまま使用し、値 0 の場合はサーフェスが平坦に表示されます。 1.0 より大きい値は、法線マップの摂動を誇張します。Roughness
およびRoughnessMap
: roughness では、サーフェスの粗さまたは滑らかさを定義します。 粗い表面では滑らかな表面より多くの方向に光が散乱するため、反射がシャープではなくぼやけます。 値の範囲は0.0
から1.0
までです。Roughness
が0.0
の場合、反射はシャープになります。Roughness
が0.5
の場合、反射はぼやけるようになります。 粗さの値と粗さのマップの両方を指定した場合、最終的な値は両方の積になります。Metalness
およびMetalnessMap
: 物理的には、このプロパティはサーフェスが導電性か誘電性かに対応します。 導電性の素材にはさまざまな反射特性があり、アルベド カラーなしで反射される傾向があります。 PBR 素材では、このプロパティによって、周囲の環境がどの程度反射されるかが決まります。 値の範囲は0.0
から1.0
です。 metalness を0.0
にすると、アルベド カラーが完全に見えるようになり、素材はプラスチックやセラミックのようになります。 metalness を0.5
にすると、塗装された金属のように見えます。 metalness を1.0
にすると、サーフェスはアルベド カラーをほぼ完全に失い、周囲の反射だけになります。 たとえば、metalness
を1.0
にして、roughness
を0.0
にした場合、表面は実際の鏡のように見えます。 metalness の値と metalnessMap の両方を指定した場合、最終的な値は両方の積になります。上の図では、右下隅の球は実際の金属素材のように見え、左下はセラミックまたはプラスチックのように見えます。 アルベド カラーも、物理的なプロパティに応じて変化します。 粗さが増すと、素材の反射のシャープさが失われます。
AOMap
およびAOScale
: アンビエント オクルージョンを使用すると、間に隙間があるオブジェクトの隠されている領域にシャドウが追加されて、外観がいっそう現実的になります。 オクルージョン値の範囲は0.0
から1.0
です。0.0
は暗い (隠されている) ことを意味し、1.0
は隠されていないことを意味します。 2D テクスチャをオクルージョン マップとして提供した場合、効果が有効になり、AOScale
は乗数として機能します。
変換中の色素材のオーバーライド
色素材のプロパティのサブセットは、素材のオーバーライド ファイルを使用してモデル変換中にオーバーライドできます。 次の表は、上記のランタイム プロパティと、オーバーライド ファイル内の対応するプロパティ名の間のマッピングを示しています。
素材のプロパティ名 | オーバーライド ファイル内のプロパティ名 |
---|---|
PbrFlags.TransparentMaterial |
transparent |
PbrFlags.AlphaClipped |
alphaClipEnabled |
PbrFlags.UseVertexColor |
useVertexColor |
PbrFlags.DoubleSided |
isDoubleSided |
PbrFlags.TransparencyWritesDepth |
transparencyWritesDepth |
AlbedoColor |
albedoColor |
TexCoordScale |
textureCoordinateScale |
TexCoordOffset |
textureCoordinateOffset |
NormalmapScale |
normalMapScale |
Metalness |
metalness |
Roughness |
roughness |
AlphaClipThreshold |
alphaClipThreshold |
技術詳細
Azure Remote Rendering では、Cook-Torrance マイクロファセット BRDF と GGX NDF、Schlick フレネル、GGX Smith で相関された可視性項と Lambert 拡散項が使用されています。 このモデルは、現時点では事実上の業界標準です。 詳細については、この記事を参照してください。物理ベースのレンダリング - クック トーランス
Azure Remote Rendering で使用されている Metalness-Roughness PBR に代わるものとして、Specular-Glossiness PBR モデルがあります。 このモデルでは、より広い範囲の素材を表すことができます。 ただし、コストが高く、通常、リアルタイムでは適切に機能しません。 (BaseColor、Metalness) に変換できない "(拡散、反射)" の値のペアがあるため、Specular-Glossiness から Metalness-Roughness に常に変換できるとは限りません。 (BaseColor、Metalness) のすべてのペアは明確に定義された "(拡散、反射)" のペアに対応するため、反対方向への変換は、より簡単で正確です。
API ドキュメント
- C# PbrMaterial クラス
- C# RenderingConnection.CreateMaterial()
- C++ PbrMaterial クラス
- C++ RenderingConnection::CreateMaterial()