Substrate führt Änderungen hinsichtlich der Erfassung, Verarbeitung, Speicherung und Verwendung von Materialdaten für die Beleuchtung ein. Diese Seite bietet einen schnellen Überblick darüber, wie das System für Programmierer funktioniert.
Aus Sicht der Erstellung kann ein Material weiterhin die Inputs des bestehenden Stammknotens verwenden oder Substrate-Material-Knoten (Platten, Operatoren) verwenden und sie in den Input Oberflächenmaterial des Stammknoten einfügen. Innerhalb eines Material-Shaders wird dies im ersten Fall durch TEMPLATE_USES_SUBSTRATE==0 und im zweiten Fall durch TEMPLATE_USES_SUBSTRATE==1 verschoben.
Bei Verwendung von aufgeschobener Beleuchtung werden die Materialdaten in einem Zwischenspeicher mit dem Namen GBuffer gespeichert. Substrate verfügt über zwei GBuffer-Speichermodi:
Überblendbarer GBuffer: Ähnlich dem bestehenden GBuffer Speicher-Format
Adaptiver GBuffer: Dieser Speicherplatz wird in einen Bitstream von Daten umgewandelt, deren Format sich von Pixel zu Pixel ändert.
Dieses GBuffer-Format wird in den Projekt-Einstellungen konfiguriert und hängt davon ab, ob die vorgesehene Zielplattform Adaptive GBuffer unterstützt oder nicht.
Weitere Informationen zu GBuffer und dessen Verwendung mit Substrate findest du im Abschnitt „GBuffer” der Übersicht über Substrate-Materialien.
Szenentexturdaten
Die Szenentexturdaten werden weiterhin mit SceneTextureLookup() sowohl für das Format Überblendbarer GBuffer and Adaptiver GBuffer abgefragt Beim Einsatz von adaptiven GBuffer gibt diese Funktion nur die ersten Abschlussdaten zurück.
Globaler Shader
Wenn in einem globalen Shader auf Daten zugegriffen werden muss, beispielsweise beim aufgeschobenen Rendern (z. B. für Beleuchtungszwecke), musst du den globalen Parameter „Substrate“ wie folgt deklarieren und binden:
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);Im Shader müssen sowohl das Zusammensetzbare- als auch das Adaptive-GBuffer-Format verarbeitet werden.
Für eine zukünftige Freigabe ist eine bessere Abstraktion geplant, um die Wartung zu vereinfachen.
#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
Material-Shader
Wenn in einem Material-Shader der Input Oberflächenmaterial des Materials verbunden ist, wird TEMPLATE_USES_SUBSTRATE==1 definiert und die Abschlussdaten können wie folgt verarbeitet und abgerufen werden:
// 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);
Für Materialien, die keine Substrate-Knoten verwenden (z. B. alte Stammknoten-Inputs), wird TEMPLATE_USES_SUBSTRATE==0 definiert und die Daten können wie folgt abgerufen werden:
float3 BaseColor = GetMaterialBaseColor(PixelMaterialInputs);
float Metallic = GetMaterialMetallic(PixelMaterialInputs);
...Materialeigenschaften
Sobald ein BSDFContext abgerufen wurde (siehe Code oben), kannst du wie folgt auf die Abschlussdaten zugreifen:
SLAB_DIFFUSEALBEDO(BSDFContext.BSDF)
SLAB_F0(BSDFContext.BSDF);
SLAB_ROUGHNESS(BSDFContext.BSDF)Beleuchtungsbewertung
Zur Bewertung eines bestimmten Lichts mit aufgeschobener Beleuchtung kann die folgende Funktion verwendet werden, zu finden unter Substrate\SubstrateDeferredLighting.ush:
FSubstrateDeferredLighting SubstrateDeferredLighting(...)Für die Auswertung der gesamten Beleuchtung beim Vorwärtsrendern kann die folgende Funktion aus Substrate\SubstrateForwardLighting.ush verwendet werden:
float3 SubstrateForwardLighting(...)Zusätzlich gibt es zwei nützliche Funktionen für die Bewertung bzw. analytische Lichter und Umgebungsbeleuchtung, die sich in Substrate/SubstrateEvaluation.ush befinden:
// Analytical lighting
FSubstrateEvaluateResult SubstrateEvaluateBSDFCommon(...);
// Environment lighting
FSubstrateEnvLightResult SubstrateEvaluateForEnvLight(...);Shader-Dateien
Hier ist eine Liste häufig verwendeter Shader-Dateien:
Die aktuelle Shader-API kann sich in zukünftigen Freigaben ändern.
| Shader-Dateien | Beschreibung |
|---|---|
| Enthält die Kern-Datenstruktur von Substrate, Daten-Zugangskennung sowie Datenauslesen für adaptiven GBuffer. |
| Enthält eine Logik zum Lesen / Entpacken von Zusammensetzbaren GBuffer Daten. |
| Enthält die Hauptlogik zur Schattierungsbewertung für analytisches Licht und Umgebungslicht. |
| Enthält die Schattierung für den Pfad der aufgeschobenen Beleuchtung. |
| Enthält die Schattierung für den Vorwärts-Beleuchtung-Pfad. |
Zusätzliche Ressourcen
Technische Präsentation von Substrate: Siggraph 2023 – Unreal Engine Substrate: Authoring Materialien That Matter
Authoring-Präsentation von Substrate: Unreal Fest 2025 Stockholm - Everything You Wanted to Know About Substrate