59 lines
2.3 KiB
HLSL
59 lines
2.3 KiB
HLSL
|
|
#ifndef FILAMENT_SHADING_CLOTH_INCLUDED
|
|
#define FILAMENT_SHADING_CLOTH_INCLUDED
|
|
|
|
#include "FilamentBRDF.cginc"
|
|
|
|
/**
|
|
* Evaluates lit materials with the cloth shading model. Similar to the standard
|
|
* model, the cloth shading model is based on a Cook-Torrance microfacet model.
|
|
* Its distribution and visibility terms are however very different to take into
|
|
* account the softer apperance of many types of cloth. Some highly reflecting
|
|
* fabrics like satin or leather should use the standard model instead.
|
|
*
|
|
* This shading model optionally models subsurface scattering events. The
|
|
* computation of these events is not physically based but can add necessary
|
|
* details to a material.
|
|
*/
|
|
half3 surfaceShading(const ShadingParams shading, const PixelParams pixel, const Light light, half occlusion) {
|
|
half3 h = normalize(shading.view + light.l);
|
|
half NoL = light.NoL;
|
|
half NoH = saturate(dot(shading.normal, h));
|
|
half LoH = saturate(dot(light.l, h));
|
|
|
|
// specular BRDF
|
|
half D = distributionCloth(pixel.roughness, NoH);
|
|
half V = visibilityCloth(shading.NoV, NoL);
|
|
half3 F = pixel.f0;
|
|
// Ignore pixel.energyCompensation since we use a different BRDF here
|
|
half3 Fr = (D * V) * F;
|
|
|
|
// diffuse BRDF
|
|
half diffuseLobe = diffuse(pixel.roughness, shading.NoV, NoL, LoH);
|
|
#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
|
|
// Energy conservative wrap diffuse to simulate subsurface scattering
|
|
diffuseLobe *= Fd_Wrap(dot(shading.normal, light.l), 0.5);
|
|
#endif
|
|
|
|
// We do not multiply the diffuse term by the Fresnel term as discussed in
|
|
// Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886"
|
|
// The effect is fairly subtle and not deemed worth the cost for mobile
|
|
half3 Fd = diffuseLobe * pixel.diffuseColor;
|
|
|
|
#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
|
|
// Cheap subsurface scatter
|
|
Fd *= saturate(pixel.subsurfaceColor + NoL);
|
|
// We need to apply NoL separately to the specular lobe since we already took
|
|
// it into account in the diffuse lobe
|
|
half3 color = Fd + Fr * NoL;
|
|
color *= light.colorIntensity.rgb * (light.colorIntensity.w * light.attenuation * occlusion);
|
|
#else
|
|
half3 color = Fd + Fr;
|
|
color *= light.colorIntensity.rgb * (light.colorIntensity.w * light.attenuation * NoL * occlusion);
|
|
#endif
|
|
|
|
return color;
|
|
}
|
|
|
|
#endif // FILAMENT_SHADING_CLOTH_INCLUDED
|