Substrate对材质数据的收集、处理、存储和用于光照的方式进行了更改。 本页面简要概述了该系统对于程序员的工作原理。
从创作的角度来看,材质可以继续使用现有根节点的输入,或使用Substrate材质节点(Slab、运算符)并将其插入根节点的Front Material输入。 在材质着色器中,前一种情况按TEMPLATE_USES_SUBSTRATE==0转换,后一种情况按TEMPLATE_USES_SUBSTRATE==1转换。
使用延迟光照时,材质数据会被保存到一个名为GBuffer的中间存储。 Substrate有两种GBuffer存储模式:
可混合GBuffer:这类似于现有的GBuffer存储格式。
自适应GBuffer:此存储更改为数据的比特流,其格式因像素而异。
此GBuffer格式在项目设置中配置,取决于预期目标平台是否支持自适应GBuffer。
有关GBuffer及其与Substrate用法的更多信息,请参阅Substrate材质概述的“GBuffer”分段。
场景纹理数据
继续使用SceneTextureLookup()查询场景纹理数据,以获取可混合GBuffer和自适应GBuffer格式。 使用自适应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);在着色器中,需要处理可混合(Blendable)和自适应GBuffer(Adaptive 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(...)此外,在Substrate/SubstrateEvaluation.ush中还有两个有用的函数,分别用于求值分析光源和环境光照:
// Analytical lighting
FSubstrateEvaluateResult SubstrateEvaluateBSDFCommon(...);
// Environment lighting
FSubstrateEnvLightResult SubstrateEvaluateForEnvLight(...);着色器文件
以下是常用的着色器文件列表:
当前的着色器API可能会在未来的版本中发生变化。
| 着色器文件 | 说明 |
|---|---|
| 包含Substrate的核心数据结构体、数据访问器以及自适应GBuffer的数据读取。 |
| 包含可混合GBuffer数据的读取/解包逻辑。 |
| 包含用于分析光源和环境光源的主着色求值逻辑。 |
| 包含延迟光照路径的着色评估。 |
| 包含前向光照路径的着色求值。 |
其他资源
Substrate技术演示:Siggraph 2023 - 虚幻引擎Substrate:创作重要材质
Substrate创作演示:Unreal Fest 2025斯德哥尔摩 - 你想知道的关于Substrate的一切