Files
UnrealEngine/Engine/Shaders/Private/HairStrands/HairStrandsCommon.ush
2025-05-18 13:04:45 +08:00

47 lines
2.2 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
struct FHairAverageEnergy
{
float3 A_R;
float3 A_TT;
float3 A_TRT;
};
struct FHairAverageScattering
{
float3 A_front; // Front Scattering A_f
float3 A_back; // Back Scattering A_b
};
float3 FromLinearAbsorption(float3 In) { return sqrt(In); }
float3 ToLinearAbsorption(float3 In) { return In*In; }
FHairAverageScattering SampleHairLUT(Texture3D<float4> LUTTexture, SamplerState LUTSampler, float3 InAbsorption, float Roughness, float SinViewAngle)
{
const float3 RemappedAbsorption = FromLinearAbsorption(InAbsorption);
const float2 LUTValue_R = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.x)), 0).xy;
const float2 LUTValue_G = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.y)), 0).xy;
const float2 LUTValue_B = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.z)), 0).xy;
FHairAverageScattering Output;
Output.A_front = float3(LUTValue_R.x, LUTValue_G.x, LUTValue_B.x);
Output.A_back = float3(LUTValue_R.y, LUTValue_G.y, LUTValue_B.y);
return Output;
}
FHairAverageEnergy SampleHairEnergyLUT(Texture3D<float4> LUTTexture, SamplerState LUTSampler, float3 InAbsorption, float Roughness, float SinViewAngle)
{
const float3 RemappedAbsorption = FromLinearAbsorption(InAbsorption);
const float3 LUTValue_R = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.x)), 0).xyz;
const float3 LUTValue_G = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.y)), 0).xyz;
const float3 LUTValue_B = LUTTexture.SampleLevel(LUTSampler, float3(saturate(abs(SinViewAngle)), saturate(Roughness), saturate(RemappedAbsorption.z)), 0).xyz;
FHairAverageEnergy Output;
Output.A_R = float3(LUTValue_R.x, LUTValue_G.x, LUTValue_B.x);
Output.A_TT = float3(LUTValue_R.y, LUTValue_G.y, LUTValue_B.y);
Output.A_TRT = float3(LUTValue_R.z, LUTValue_G.z, LUTValue_B.z);
return Output;
}