init
This commit is contained in:
commit
2fe6ca2f65
1473 changed files with 251771 additions and 0 deletions
79
gamedata/shaders/d3d11/metalic_roughness_light.hlsli
Normal file
79
gamedata/shaders/d3d11/metalic_roughness_light.hlsli
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
#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
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue