79 lines
2.4 KiB
HLSL
79 lines
2.4 KiB
HLSL
#ifndef metalic_roughness_light_h_ixray_included
|
|
#define metalic_roughness_light_h_ixray_included
|
|
|
|
#include "common.hlsli"
|
|
|
|
float DistributionGGX(float NdotH, float Roughness)
|
|
{
|
|
float Alpha = Roughness * Roughness;
|
|
float AlphaTwo = Alpha * Alpha;
|
|
|
|
float AlphaTwoInv = AlphaTwo - 1.0f;
|
|
|
|
float Divider = NdotH * NdotH * AlphaTwoInv + 1.0f;
|
|
return AlphaTwo * rcp(Divider * Divider);
|
|
}
|
|
|
|
// Simple GSC - like attention
|
|
float ComputeLightAttention(float3 PointToLight, float MinAttention)
|
|
{
|
|
return saturate(1.0f - dot(PointToLight, PointToLight) * MinAttention);
|
|
}
|
|
|
|
float GeometrySmithD(float NdotL, float NdotV, float Roughness)
|
|
{
|
|
float R = Roughness + 1.0f;
|
|
float K = R * R * 0.125f;
|
|
float InvK = 1.0f - K;
|
|
|
|
float DivGGXL = 1.0f * rcp(K + NdotL * InvK);
|
|
float DivGGXV = 1.0f * rcp(K + NdotV * InvK);
|
|
|
|
return 0.25f * DivGGXL * DivGGXV;
|
|
}
|
|
|
|
float3 FresnelSchlick(float3 F, float NdotV)
|
|
{
|
|
return F + (1.0f - F) * pow(1.0f - NdotV, 5.0f);
|
|
}
|
|
|
|
float3 DirectLight(float4 Radiance, float3 Light, float3 Normal, float3 View, float3 Color, float Metalness, float Roughness, float3 F0 = 0.04f)
|
|
{
|
|
float3 Half = normalize(Light + View);
|
|
|
|
float NdotL = max(0.0f, -dot(Normal, Light));
|
|
float NdotH = max(0.0f, -dot(Normal, Half));
|
|
|
|
#ifndef USE_LEGACY_LIGHT
|
|
float NdotV = max(0.0f, -dot(Normal, View));
|
|
float HdotV = max(0.0f, dot(Half, View));
|
|
|
|
float3 D = DistributionGGX(NdotH, Roughness);
|
|
float3 G = GeometrySmithD(NdotL, NdotV, Roughness);
|
|
float3 F = FresnelSchlick(lerp(F0, Color, Metalness), HdotV);
|
|
|
|
float3 Specular = D * G;
|
|
float3 Diffuse = Color * (1.0f - Metalness);
|
|
|
|
float3 BRDF = lerp(Diffuse, Specular, F);
|
|
return PushGamma(Radiance.xyz) * NdotL * BRDF;
|
|
#else
|
|
float2 Material = s_material.SampleLevel(smp_material, float3(NdotL, NdotH, Metalness), 0).xy;
|
|
return Radiance.xyz * (Material.x * Color.xyz + Material.y * Roughness.x * Radiance.w);
|
|
#endif
|
|
}
|
|
|
|
float3 SimpleTranslucency(float3 Radiance, float3 Light, float3 Normal)
|
|
{
|
|
float NdotL = dot(Light, Normal);
|
|
float Scale = 0.36f * NdotL;
|
|
|
|
float Attention = Scale + 0.0769f; Attention *= Attention * 1.171f;
|
|
float Factor = 1.0f - saturate(abs(Scale) * 13.0f - 1.0f);
|
|
|
|
float SSS = lerp(saturate(NdotL), Attention, Factor * Factor);
|
|
return PushGamma(Radiance) * saturate(3.5f * SSS + 0.1f);
|
|
}
|
|
|
|
#endif
|
|
|