Files
UnrealEngine/Engine/Shaders/Private/MaterialCache/MaterialCacheShadeCommon.ush
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

69 lines
2.5 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Engine/Private/MaterialCache/MaterialCacheCommon.ush"
#include "/Engine/Shared/MaterialCacheDefinitions.h"
#ifndef MATERIAL_CACHE_TAG_INDEX
#define MATERIAL_CACHE_TAG_INDEX 0
#endif // MATERIAL_CACHE_TAG_INDEX
#define TOKEN_CONCAT(A, B, C) A ## B ## C
#define TOKEN_EXPAND(A, B, C) TOKEN_CONCAT(A, B, C)
#define TAG_NAME(NAME) TOKEN_EXPAND(NAME, MATERIAL_CACHE_TAG_INDEX, )
#define TAG_NAME_ANALYTIC(NAME) TOKEN_EXPAND(NAME, MATERIAL_CACHE_TAG_INDEX, _Analytic)
// Current tag in use
typedef TAG_NAME(FMaterialCacheABuffer_) FMaterialCacheABufferTag;
FMaterialCacheABufferTag GetMaterialABuffer(in FMaterialPixelParameters MaterialParameters, in FPixelMaterialInputs PixelMaterialInputs)
{
// Handle opacity
#if MATERIALBLENDING_ANY_TRANSLUCENT
bool bClipped = GetMaterialOpacity(PixelMaterialInputs) - 1e-2f < 0.0f;
#elif MATERIALBLENDING_MASKED // MATERIALBLENDING_ANY_TRANSLUCENT
bool bClipped = GetMaterialMask(PixelMaterialInputs) < 0.0f;
#else // MATERIALBLENDING_MASKED
bool bClipped = false;
#endif // MATERIALBLENDING_MASKED
// If clipped, assume black
if (bClipped)
{
// TODO: Temporarily driving weight through opacity, will be removed once the material generation is set up
//FMaterialCacheABufferTag ABuffer = (FMaterialCacheABufferTag)0;
//ABuffer.Clipped = true;
//return ABuffer;
}
#if NUM_MATERIAL_OUTPUTS_GETMATERIALCACHE > 0
#if USE_ANALYTIC_DERIVATIVES
return TAG_NAME_ANALYTIC(GetMaterialCache)(MaterialParameters);
#else // USE_ANALYTIC_DERIVATIVES
return TAG_NAME(GetMaterialCache)(MaterialParameters);
#endif // USE_ANALYTIC_DERIVATIVES
#else // NUM_MATERIAL_OUTPUTS_GETMATERIALCACHE > 0
return TAG_NAME(GetABufferFromMaterialInputs_)(PixelMaterialInputs);
#endif // NUM_MATERIAL_OUTPUTS_GETMATERIALCACHE > 0
}
FMaterialCacheABufferTag GetMaterialBottomABuffer(EMaterialCacheFlag Flags, uint3 ABufferPhysicalPosition, uint2 PagePixelPos)
{
if (Flags & MatCache_DefaultBottomLayer)
{
return TAG_NAME(DefaultMaterialCacheABuffer_)();
}
else
{
return TAG_NAME(LoadMaterialCacheABufferPixel_)(ABufferPhysicalPosition, PagePixelPos);
}
}
void StoreMaterialABufferPixel(FMaterialCacheABufferTag Top, EMaterialCacheFlag Flags, uint3 ABufferPhysicalPosition, uint2 PagePixelPos)
{
FMaterialCacheABufferTag Bottom = GetMaterialBottomABuffer(Flags, ABufferPhysicalPosition, PagePixelPos);
Top = TAG_NAME(BlendMaterialCacheFixedFunctionLerp_)(Bottom, Top, Top.Weight);
TAG_NAME(StoreMaterialCacheABufferPixel_)(Top, ABufferPhysicalPosition, PagePixelPos);
}