Substrate introduce cambios en cómo se recopilan, procesan, almacenan y usan los datos de los materiales para la iluminación. Esta página proporciona una descripción general rápida de cómo funciona el sistema para los programadores.
Desde el punto de vista de la creación, un material puede seguir usando las entradas del nodo raíz existente o usar nodos de material de Substrate (bloques, operadores) y conectarlos a la entrada de material frontal del nodo raíz. Dentro de un sombreador de materiales, esto se traduce en TEMPLATE_USES_SUBSTRATE==0 en el primer caso y TEMPLATE_USES_SUBSTRATE==1 en el segundo.
Cuando se usa la iluminación diferida, los datos del material se almacenan en un almacenamiento intermedio llamado GBuffer. Substrate viene con dos modos de almacenamiento de GBuffer:
GBuffer combinable: es similar al formato de almacenamiento existente GBuffer.
GBuffer adaptativo: este almacenamiento se convierte en un flujo de bits de datos, cuyo formato cambia de un píxel a otro.
Este formato de GBuffer se configura en los ajustes del proyecto y depende de si la plataforma objetivo es compatible o no con GBuffer adaptativo.
Para obtener más información sobre el GBuffer y su uso con Substrate, consulta la sección GBuffer de Descripción general de los materiales de Substrate.
Datos de texturas de escena
Los datos de texturas de escena se siguen consultando con SceneTextureLookup() tanto para el formato de GBuffer combinable como para el de GBuffer adaptativo. Al usar GBuffer adaptativo, esta función solo devolverá los primeros datos de cierre.
Sombreador global
Cuando es necesario acceder a datos en un sombreador global durante el renderizado diferido (por ejemplo, con fines de iluminación), tienes que declarar y vincular el parámetro global Substrate de la siguiente manera:
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);En el sombreador hay que gestionar tanto el formato de GBuffer adaptativo como el combinable.
Se planea mejorar la abstracción en futuras versiones para facilitar el mantenimiento.
#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
Sombreador de materiales
En un sombreador de materiales, si el material tiene su entrada de material frontal conectada, se definirá TEMPLATE_USES_SUBSTRATE==1 y los datos de cierre se podrán procesar y recuperar de esta manera:
// 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);
Para los materiales que no usan nodos de Substrate, como las entradas del nodo raíz heredado, se definirá TEMPLATE_USES_SUBSTRATE==0 y los datos se podrán recuperar de la forma habitual de esta manera:
float3 BaseColor = GetMaterialBaseColor(PixelMaterialInputs);
float Metallic = GetMaterialMetallic(PixelMaterialInputs);
...Propiedades de los materiales
Una vez que se ha recuperado un BSDFContext (ver el código anterior), puedes acceder a los datos de cierre de la siguiente forma:
SLAB_DIFFUSEALBEDO(BSDFContext.BSDF)
SLAB_F0(BSDFContext.BSDF);
SLAB_ROUGHNESS(BSDFContext.BSDF)Evaluación de la iluminación
Para evaluar una luz en particular con iluminación diferida, se puede usar la siguiente función, ubicada en Substrate\SubstrateDeferredLighting.ush:
FSubstrateDeferredLighting SubstrateDeferredLighting(...)Para evaluar toda la iluminación en el renderizado directo, puedes usar la siguiente función, ubicada en Substrate\SubstrateForwardLighting.ush:
float3 SubstrateForwardLighting(...)Además, hay dos funciones útiles para evaluar las luces analíticas y la iluminación ambiental respectivamente, ubicadas en Substrate/SubstrateEvaluation.ush:
// Analytical lighting
FSubstrateEvaluateResult SubstrateEvaluateBSDFCommon(...);
// Environment lighting
FSubstrateEnvLightResult SubstrateEvaluateForEnvLight(...);Archivos de sombreador
Aquí tienes una lista de los archivos de sombreador más usados:
La API de sombreador actual está sujeta a cambios en futuras versiones.
| Archivos de sombreador | Descripción |
|---|---|
| Contiene las estructuras de datos principales de Substrate, los descriptores de acceso a los datos y la lectura de datos para GBuffer adaptativo. |
| Contiene lógica de lectura y desempaquetado para los datos de GBuffer combinable. |
| Contiene la lógica principal de evaluación del sombreado para la luz analítica y la luz ambiental. |
| Contiene la evaluación del sombreado para la ruta de iluminación diferida. |
| Contiene la evaluación del sombreado para la ruta de iluminación directa. |
Recursos adicionales
Presentación técnica de Substrate: Siggraph 2023 - Unreal Engine Substrate: Creación de materiales que importan
Presentación de creación de Substrate: Unreal Fest 2025 Estocolmo - Todo lo que quieres saber de Substrate