Files
UnrealEngineUWP/Engine/Shaders/Private/TransmissionCommon.ush
UnrealBot c47e81b2cb Branch snapshot for CL 18531810
[CL 18531810 in ue5-main branch]
2022-01-06 16:44:09 +00:00

77 lines
2.3 KiB
Plaintext

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
/*=========================================================================
TransmissionCommon.ush: Subsurface scattering transmission utilities.
=========================================================================*/
#include "SubsurfaceProfileCommon.ush"
#include "BurleyNormalizedSSSCommon.ush"
struct FTransmissionProfileParams
{
float ExtinctionScale;
float NormalScale;
float ScatteringDistribution;
float OneOverIOR;
};
FTransmissionProfileParams InitTransmissionProfileParams()
{
FTransmissionProfileParams Out;
Out.ExtinctionScale = 1.0f;
Out.NormalScale = 0.08f;
Out.ScatteringDistribution = 0.0f;
Out.OneOverIOR = 1.0f;
return Out;
}
FTransmissionProfileParams GetTransmissionProfileParams(uint SubsurfaceProfileInt)
{
FTransmissionProfileParams Result;
//X:ExtinctionScale, Y:Normal Scale, Z:ScatteringDistribution, W:OneOverIOR
float4 Data = View.SSProfilesTexture.Load(int3(SSSS_TRANSMISSION_OFFSET, SubsurfaceProfileInt, 0));
Result.ExtinctionScale = Data.x;
Result.NormalScale = Data.y;
Result.ScatteringDistribution = Data.z;
Result.OneOverIOR = Data.w;
return Result;
}
FTransmissionProfileParams GetTransmissionProfileParams(FGBufferData GBufferData)
{
// 0..255, which SubSurface profile to pick
uint SubsurfaceProfileInt = ExtractSubsurfaceProfileInt(GBufferData);
return GetTransmissionProfileParams(SubsurfaceProfileInt);
}
float4 GetTransmissionProfile(uint SubsurfaceProfileInt, float Thickness)
{
// 0..255, which SubSurface profile to pick
const float2 TextureSize = View.SSProfilesTextureSizeAndInvSize.xy;
float ProfileOffset = BSSS_TRANSMISSION_PROFILE_OFFSET;
float2 uv = float2((ProfileOffset + Thickness / SSSS_MAX_TRANSMISSION_PROFILE_DISTANCE * (BSSS_TRANSMISSION_PROFILE_SIZE - 1) + 0.5f), SubsurfaceProfileInt + 0.5f) / (TextureSize.xy);
return Texture2DSampleLevel(View.SSProfilesTexture, View.SSProfilesTransmissionSampler, uv, 0);
}
float4 GetTransmissionProfile(FGBufferData GBufferData, float Thickness)
{
// 0..255, which SubSurface profile to pick
return GetTransmissionProfile(ExtractSubsurfaceProfileInt(GBufferData), Thickness);
}
float EncodeThickness(float Thickness)
{
return 1 - Thickness;
}
float DecodeThickness(float Thickness)
{
return 1 - Thickness;
}