mirror of
https://github.com/muskit/H3VR-TNH-Quality-of-Life-Improvements.git
synced 2026-06-02 20:24:26 -07:00
90 lines
2.7 KiB
HLSL
90 lines
2.7 KiB
HLSL
|
|
// Alloy Physical Shader Framework
|
||
|
|
// Copyright 2013-2017 RUST LLC.
|
||
|
|
// http://www.alloy.rustltd.com/
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
|
/// @file Wetness.cginc
|
||
|
|
/// @brief Handles all wet material effects.
|
||
|
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
#ifndef ALLOY_SHADERS_FEATURE_WETNESS_CGINC
|
||
|
|
#define ALLOY_SHADERS_FEATURE_WETNESS_CGINC
|
||
|
|
|
||
|
|
#if !defined(A_WETNESS_ON) && defined(_WETNESS_ON)
|
||
|
|
#define A_WETNESS_ON
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#include "Assets/Alloy/Shaders/Framework/Feature.cginc"
|
||
|
|
|
||
|
|
#ifdef A_WETNESS_ON
|
||
|
|
#ifndef A_WETNESS_MASK_OFF
|
||
|
|
/// Mask that controls the wetness influence on the base material.
|
||
|
|
/// Expects an alpha data map.
|
||
|
|
A_SAMPLER_2D(_WetMask);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/// Controls how much the vertex alpha masks the detail maps.
|
||
|
|
/// Expects values in the range [0,1].
|
||
|
|
half _WetMaskStrength;
|
||
|
|
|
||
|
|
/// The tint color for liquid wetting the surface.
|
||
|
|
/// Expects a linear LDR color.
|
||
|
|
half3 _WetTint;
|
||
|
|
|
||
|
|
#ifndef A_WETNESS_NORMAL_MAP_OFF
|
||
|
|
/// Wetness normal map.
|
||
|
|
/// Expects a compressed normal map.
|
||
|
|
A_SAMPLER_2D(_WetNormalMap);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/// Controls the wetness influence on the base material.
|
||
|
|
/// Expects values in the range [0,1].
|
||
|
|
half _WetWeight;
|
||
|
|
|
||
|
|
/// The roughness for wet porous materials.
|
||
|
|
/// Expects values in the range [0,1].
|
||
|
|
half _WetRoughness;
|
||
|
|
|
||
|
|
#ifndef A_WETNESS_NORMAL_MAP_OFF
|
||
|
|
/// Normal map XY scale.
|
||
|
|
half _WetNormalMapScale;
|
||
|
|
#endif
|
||
|
|
#endif
|
||
|
|
|
||
|
|
void aWetness(
|
||
|
|
inout ASurface s)
|
||
|
|
{
|
||
|
|
#ifdef A_WETNESS_ON
|
||
|
|
half mask = s.mask * _WetWeight;
|
||
|
|
|
||
|
|
#ifndef A_WETNESS_MASK_OFF
|
||
|
|
#ifdef _WETMASKSOURCE_VERTEXCOLORALPHA
|
||
|
|
half alpha = s.vertexColor.a;
|
||
|
|
#else
|
||
|
|
half alpha = tex2D(_WetMask, A_TEX_TRANSFORM_UV_SCROLL(s, _WetMask)).a;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
mask *= aLerpOneTo(alpha, _WetMaskStrength);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
// Physically-based wet surfaces.
|
||
|
|
// cf https://seblagarde.files.wordpress.com/2013/08/gdce13_lagarde_harduin_light.pdf pg 63
|
||
|
|
half porosity = 1.0h;
|
||
|
|
|
||
|
|
#ifndef A_WETNESS_POROSITY_OFF
|
||
|
|
porosity = (1.0h - s.metallic) * saturate(s.roughness * 2.5h - 1.25h);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
s.baseColor *= aLerpWhiteTo(_WetTint * aLerpOneTo(0.2h, porosity), mask);
|
||
|
|
s.roughness *= aLerpOneTo(_WetRoughness, aLerpOneTo(0.2h, 0.5h * porosity) * mask);
|
||
|
|
|
||
|
|
#ifndef A_WETNESS_NORMAL_MAP_OFF
|
||
|
|
float2 normalUv = A_TEX_TRANSFORM_UV_SCROLL(s, _WetNormalMap);
|
||
|
|
half3 wetNormals = UnpackScaleNormal(tex2D(_WetNormalMap, normalUv), mask * _WetNormalMapScale);
|
||
|
|
s.normalTangent = A_NT(s, BlendNormals(s.normalTangent, wetNormals));
|
||
|
|
#endif
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif // ALLOY_SHADERS_FEATURE_WETNESS_CGINC
|