調査目的
UE5.7でBlendable GBufferが追加されました。一方でレガシーマテリアルも使い続けられます。これは、Substrateという新システムがレガシーを捨てるのではなく機能の一部として取り込んだように見えます。
しかし、新旧GBufferと新旧マテリアルは一見排他的で、相互運用が可能である事実は直感に反するようです。そこで、出力されるHLSLを確認してみました。
結論
UE5.7からのSubstrateは、マテリアルごとに新旧、GBufferの新旧を設定できます。これらはそれぞれ独立して選択可能であり、相互に可能な限りで互換性を保つように設計されています。
GBufferをBlendableにすると、SubstrateマテリアルはレガシーなShading Modelに内部的に変換されます。
GBufferをAdaptiveにすると、レガシーマテリアルはそのShading Modelが対応するSlabに内部的に変換されます。
| Blendable GBuffer | Adaptive GBuffer | |
|---|---|---|
| マテリアルがShading Model | そのまま | Slabに変換 |
| マテリアルがSubstrate Slab | Shading Modelに変換 | そのまま |
Blendable GBufferを用いる場合、Substrate BSDFのDiffuse AlbedoとF0からMetallic, Specular, BaseColorが逆算されます。F90はBlendable GBufferに格納されることなく捨てられます。
HLSLの確認
DefaultLitとSubstrate Slabで金のマテリアルを作り、それぞれHLSLを確認します。
下のマテリアルを M_DefaultLit_Gold とします。
下のマテリアルを M_Substrate_Gold とします。
プロジェクト設定を変えながらそれぞれのHLSLを出力してみます。
上の”HLSL Code"で見たい情報にたどり着ける場合もありますが、そのまま実行できないコードスニペットの集合です。最終的に実行可能なHLSLは、例えば以下のようにDirectX SM6 -- Epic Quality → TBasePassPSFNoLightMapPolicy を選ぶと見られます。
それぞれのプロジェクト設定においてそれぞれのマテリアルが出力するHLSLを確認すると、概ね以下のような構造が確認できました。
| プロジェクト設定 | M_DefaultLit_Gold | M_Substrate_Gold |
|---|---|---|
| Substrate materialsをOFF | 旧マテリアルHLSL | N/A |
| Blendable GBuffer | 旧マテリアルHLSL | 新マテリアル+変換コード |
| Adaptive GBuffer | 旧マテリアルHLSL+変換コード | 新マテリアル |
Default LitがSubstrate Slabに変換される過程
SubstrateConvertLegacyMaterialStaticという関数で行われます。
処理内容を確認すると、Unlit, Hair, Single Layer Waterなど、各Shading Modelが対応するSlabに変換されます。
Substrate SlabがDefault LitなどのShading Modelに変換される過程
SubstrateMaterialExportOutという関数が従来方式のGBufferで使えるパラメータ郡に変換をしています。
SubstrateMaterialExportOutはFExportResultという構造体を返します。
FExportResultはMetallicやSpecularなど従来のGBufferの要素を含んでおり、これら値は最終的にSetGBufferForShadingModel関数でFGBufferData構造体に書き込まれます。
各要素の変換には以下ような関数郡が定義されており、それぞれFSubstrateBSDF構造体から従来方式のPBRパラメータを算出します。
- SubstrateGetLegacyShadingModels
- SubstrateGetBSDFMetallic
- SubstrateGetBSDFSpecular
- SubstrateGetBSDFBaseColor
レンダーターゲット
DirectX SM6 -- Epic Quality → TBasePassPSFNoLightMapPolicyでHLSLを見ると、MainPS関数にレンダーターゲットの形式が記述されます。
Blendable GBufferの時のMainPSです。
void MainPS
(
...
, out float4 OutTarget0 : SV_Target0
, out float4 OutTarget1 : SV_Target1
, out float4 OutTarget2 : SV_Target2
, out float4 OutTarget3 : SV_Target3
Adaptive GBufferの時のMainPSです。
void MainPS
(
...
, out float4 OutTarget0 : SV_Target0
, out uint SubstrateOutput1 : SV_Target1
, out uint SubstrateOutput2 : SV_Target2
, out uint SubstrateOutput3 : SV_Target3
, out uint SubstrateOutput4 : SV_Target4
F90が無視される実験
Blendable GBufferにはF90を格納できないので、F90ピンへの入力は無視されるはずです。試してみると実際その通りになりました。
Diffuse Albedoが無視される実験
Diffuse AlbedoとF0両方から強い反射率を入力し、エネルギー保存の法則を破ってみます。Blendable GBufferは基本的には物理的にあり得ないマテリアルを格納できないので丸め込まれるはずです。
以下Blendable GBufferの時です。SubstrateGetBSDFMetallicで金属判定されてDiffuse Albedoが無視され、F0がBase Colorとして格納されています。
以下Adaptive GBufferの時です。
リファレンス
UE5.7のBlendable/Adaptive GBufferと新旧マテリアルについて、実践的な運用の考え方について述べられています。







