Files
UnrealEngineUWP/Engine/Shaders/Private/SubsurfaceProfileCommon.ush
wei liu daa9ecccb5 1. Porting the shading model "Subsurface" and "PreIntegrated Skin" to mobile.
2. Support "Subsurface Profile" shading mobile by preintegral burley diffusion on ring, just like the PreIntegrated Skin, but could be generated at runtime based on the Burley inputs.

#jira UE-101323

#rb Dmitriy.Dyomin, Tiantian.Xie
#p4v-preflight-copy 16327658
#preflight 61013bb05938f900010c8402

[CL 16982577 by wei liu in ue5-main branch]
2021-07-28 11:08:45 -04:00

63 lines
3.2 KiB
Plaintext

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================================
SubsurfaceProfileCommon.ush: Subsurface scattering parameter lookup / decoding constants.
=============================================================================================*/
#pragma once
// NOTE: Changing offsets below requires updating all instances of #SSSS_CONSTANTS
// TODO: This needs to be defined in a single place and shared between C++ and shaders!
#define SSSS_SUBSURFACE_COLOR_OFFSET 0
#define BSSS_SURFACEALBEDO_OFFSET (SSSS_SUBSURFACE_COLOR_OFFSET+1)
#define BSSS_DMFP_OFFSET (BSSS_SURFACEALBEDO_OFFSET+1)
#define SSSS_TRANSMISSION_OFFSET (BSSS_DMFP_OFFSET+1)
#define SSSS_BOUNDARY_COLOR_BLEED_OFFSET (SSSS_TRANSMISSION_OFFSET+1)
#define SSSS_APPROXIMATE_SURFACEALBEDO_OFFSET (SSSS_BOUNDARY_COLOR_BLEED_OFFSET+1)
#define SSSS_APPROXIMATE_DMFP_OFFSET (SSSS_APPROXIMATE_SURFACEALBEDO_OFFSET+1)
#define SSSS_DUAL_SPECULAR_OFFSET (SSSS_APPROXIMATE_DMFP_OFFSET+1)
#define SSSS_KERNEL0_OFFSET (SSSS_DUAL_SPECULAR_OFFSET+1)
#define SSSS_KERNEL0_SIZE 13
#define SSSS_KERNEL1_OFFSET (SSSS_KERNEL0_OFFSET + SSSS_KERNEL0_SIZE)
#define SSSS_KERNEL1_SIZE 9
#define SSSS_KERNEL2_OFFSET (SSSS_KERNEL1_OFFSET + SSSS_KERNEL1_SIZE)
#define SSSS_KERNEL2_SIZE 6
#define SSSS_KERNEL_TOTAL_SIZE (SSSS_KERNEL0_SIZE + SSSS_KERNEL1_SIZE + SSSS_KERNEL2_SIZE)
#define SSSS_TRANSMISSION_PROFILE_OFFSET (SSSS_KERNEL0_OFFSET + SSSS_KERNEL_TOTAL_SIZE)
#define SSSS_TRANSMISSION_PROFILE_SIZE 32
#define BSSS_TRANSMISSION_PROFILE_OFFSET (SSSS_TRANSMISSION_PROFILE_OFFSET + SSSS_TRANSMISSION_PROFILE_SIZE)
#define BSSS_TRANSMISSION_PROFILE_SIZE SSSS_TRANSMISSION_PROFILE_SIZE
#define SSSS_MAX_TRANSMISSION_PROFILE_DISTANCE 5.0f // See MaxTransmissionProfileDistance in ComputeTransmissionProfile(), SeparableSSS.cpp
#define SSSS_MAX_DUAL_SPECULAR_ROUGHNESS 2.0f
// Threshold value at which model switches from SSS to default lit
#define SSSS_OPACITY_THRESHOLD_EPS 0.10
// One profile per line, encoded using constants above. See FSubsurfaceProfileTexture::CreateTexture() in SubsurfaceProfile.cpp.
// By default, SSProfilesTexture is "Texture2D SSProfilesTexture", but it can be remapped as in BasePassCommon.usf.
#ifndef SSProfilesTexture
Texture2D SSProfilesTexture;
#endif
// Rename to allow the base pass to intercept with a value from its pass uniform buffer
#ifndef ActualSSProfilesTexture
#define ActualSSProfilesTexture SSProfilesTexture
Texture2DArray SSProfilesPreIntegratedTexture;
SamplerState SSProfilesPreIntegratedSampler;
#if COMPILER_GLSL_ES3_1
SamplerState SSProfilesSampler;
float4 SSProfilesTextureSizeAndInvSize;
#endif
#endif
half4 GetSubsurfaceProfileTexture(uint SampleIndex, uint SubsurfaceProfileInt)
{
#if COMPILER_GLSL_ES3_1 // Force to use a point sampler for Texture2D.Load on OpenGLES platform
return ActualSSProfilesTexture.SampleLevel(SSProfilesSampler, (uint2(SampleIndex, SubsurfaceProfileInt) + float2(0.5f, 0.5f)) * SSProfilesTextureSizeAndInvSize.zw, 0);
#else
return ActualSSProfilesTexture.Load(int3(SampleIndex, SubsurfaceProfileInt, 0));
#endif
}