Substrate では、マテリアル データの収集、処理、保存、ライティングでの使用の方法の変更が導入されています。 このページでは、プログラマーのために、システムの仕組みを簡単に説明します。
オーサリングの観点では、マテリアルでは既存のルート ノードの入力を引き続き使用することも、Substrate Material Nodes (Substrate マテリアル ノード) (スラブ、演算子) を使用して、ルート ノードの Front Material (フロント マテリアル) 入力に接続することもできます。 マテリアル シェーダー内では、前者の場合は TEMPLATE_USES_SUBSTRATE==0 、後者の場合は TEMPLATE_USES_SUBSTRATE==1 によって変換されます。
ディファード ライティングを使用する場合、マテリアル データは「GBuffer」という中間ストレージに保存されます。 Substrate には、以下の 2 つの GBuffer ストレージ モードがあります。
ブレンダブル GBuffer:既存の GBuffer 保存形式に似ています。
アダプティブ GBuffer:このストレージは、データのビットストリームに変更され、その形式はピクセルごとに変化します。
この GBuffer 形式はプロジェクト設定で設定され、対象のターゲット プラットフォームがアダプティブ GBuffer をサポートしているかどうかによって異なります。
GBuffer と Substrate での使用方法の詳細は、「Substrate マテリアルの概要」の「GBuffer」セクションを参照してください。
シーン テクスチャ データ
シーン テクスチャ データは、ブレンダブル GBuffer 形式とアダプティブ GBuffer 形式の両方で、SceneTextureLookup() を使って引き続きクエリされます。 アダプティブ GBuffer を使用する場合、この関数は最初のクロージャー データのみを返します。
グローバル シェーダー
グローバル シェーダーでデータにアクセスする必要がある場合、ディファード レンダリングでは、以下のように Substrate グローバル パラメータを宣言してバインドする必要があります。
class FMyGlobasShaderCS : public FGlobalShader
{
DECLARE_SHADER_TYPE(FMyGlobasShaderCS, Global)
SHADER_USE_PARAMETER_STRUCT(FMyGlobasShaderCS, FGlobalShader);
using FPermutationDomain = TShaderPermutationDomain<>;
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
...
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSubstrateGlobalUniformParameters, Substrate)
...
END_SHADER_PARAMETER_STRUCT()
FMyGlobasShaderCS::FParameters PassParameters;
PassParameters.Substrate = Substrate::BindSubstrateGlobalUniformParameters(View);シェーダーでは、ブレンダブル GBuffer 形式とアダプティブ GBuffer 形式の両方を処理する必要があります。
メンテナンスを容易にするために、将来のリリースでより適切な抽象化が予定されています。
#if SUBSTRATE_LOAD_FROM_MATERIALCONTAINER
// For Adaptive GBuffer
FSubstrateAddressing Addressing = GetSubstratePixelDataByteOffset(PixelPos, uint2(View.BufferSizeAndInvSize.xy), Substrate.MaxBytesPerPixel);
FSubstratePixelHeader Header = UnpackSubstrateHeaderIn(Substrate.MaterialTextureArray, Addressing, Substrate.TopLayerTexture);
#else
// For Blendable GBuffer
FSubstrateGBufferBSDF Data = SubstrateReadGBufferBSDF(GetScreenSpaceDataUint(PixelPos));
#endif
マテリアル シェーダー
マテリアル シェーダーでは、マテリアルの Front Material (フロント マテリアル) 入力がプラグインされている場合、TEMPLATE_USES_SUBSTRATE==1 が定義され、クロージャー データは次のように処理および取得できます。
// Initialise a Substrate header with normal in registers
FSubstrateData SubstrateData = PixelMaterialInputs.GetFrontSubstrateData();
FSubstratePixelHeader Header = MaterialParameters.GetFrontSubstrateHeader();
Header.IrradianceAO.MaterialAO = GetMaterialAmbientOcclusion(PixelMaterialInputs);
if (Header.SubstrateTree.BSDFCount > 0)
{
FSubstrateIntegrationSettings Settings = InitSubstrateIntegrationSettings(false, true, 0, false);
float3 TotalTransmittancePreCoverage = 0;
Header.SubstrateUpdateTree(SubstrateData, V, Settings, TotalCoverage, TotalTransmittancePreCoverage);
レガシー ルート ノード入力など、Substrate ノードを使用しないマテリアルでは、TEMPLATE_USES_SUBSTRATE==0 が定義され、以下のように通常どおりデータを取得できます。
float3 BaseColor = GetMaterialBaseColor(PixelMaterialInputs);
float Metallic = GetMaterialMetallic(PixelMaterialInputs);
...マテリアルのプロパティ
BSDFContext が取得されると (上のコードを参照)、以下のようにクロージャー データにアクセスできます。
SLAB_DIFFUSEALBEDO(BSDFContext.BSDF)
SLAB_F0(BSDFContext.BSDF);
SLAB_ROUGHNESS(BSDFContext.BSDF)ライティング評価
ディファード ライティングを使用して特定のライトを評価するには、Substrate\SubstrateDeferredLighting.ush にある、以下の関数を使用できます。
FSubstrateDeferredLighting SubstrateDeferredLighting(...)フォワード レンダリングでライティング全体を評価するには、Substrate\SubstrateForwardLighting.ush にある、以下の関数を使用できます。
float3 SubstrateForwardLighting(...)分析ライトと環境ライティングという、評価に役立つ 2 つの関数も、Substrate/SubstrateEvaluation.ush にあります。
// Analytical lighting
FSubstrateEvaluateResult SubstrateEvaluateBSDFCommon(...);
// Environment lighting
FSubstrateEnvLightResult SubstrateEvaluateForEnvLight(...);シェーダ ファイル
以下は、一般的に使用されるシェーダー ファイルのリストです。
現在のシェーダー API は、今後のリリースで変更される可能性があります。
| シェーダ ファイル | 説明 |
|---|---|
| Substrate のコア データ構造体、データ アクセサ、またアダプティブ GBuffer のデータ読み取りが含まれます。 |
| ブレンダブル GBuffer データの読み取り/アンパック ロジックが含まれます。 |
| 分析ライトと環境ライト向けの主要なシェーディング評価ロジックが含まれます。 |
| ディファード ライティング パスのシェーディング評価が含まれます。 |
| フォワード ライティング パスのシェーディング評価が含まれます。 |
その他のリソース
Substrate の技術的プレゼンテーション:Siggraph 2023 - Unreal Engine Substrate: Authoring Materials That Matter(Siggraph 2023 - Unreal Engine Substrate: 重要なオーサリング素材)
Substrate のプレゼンテーション制作:Unreal Fest 2025 Stockholm - Everything You Wanted to Know About Substrate(Substrate について知りたいすべてのこと)