mirror of
https://github.com/muskit/H3VR-TNH-Quality-of-Life-Improvements.git
synced 2026-06-02 20:24:26 -07:00
109 lines
3.0 KiB
HLSL
109 lines
3.0 KiB
HLSL
// Alloy Physical Shader Framework
|
|
// Copyright 2013-2017 RUST LLC.
|
|
// http://www.alloy.rustltd.com/
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
/// @file Eyeball.cginc
|
|
/// @brief Eyeball surface shader definition.
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef ALLOY_LEGACY_SHADERS_DEFINITION_EYEBALL_CGINC
|
|
#define ALLOY_LEGACY_SHADERS_DEFINITION_EYEBALL_CGINC
|
|
|
|
#define A_NORMAL_MAPPING_ON
|
|
#define A_AMBIENT_OCCLUSION_ON
|
|
#define A_SPECULAR_TINT_ON
|
|
#define A_CLEARCOAT_ON
|
|
#define A_EYE_PARALLAX_REFRACTION
|
|
#define A_DETAIL_MASK_OFF
|
|
|
|
#include "Assets/Alloy/Shaders/Lighting/Standard.cginc"
|
|
#include "Assets/Alloy/Shaders/Type/Standard.cginc"
|
|
#include "Assets/Alloy/Legacy/Shaders/Feature/EyeParallax.cginc"
|
|
|
|
/// Cornea normals.
|
|
/// Expects a compressed normal map.
|
|
sampler2D _EyeBumpMap;
|
|
|
|
/// Cornea weight.
|
|
/// Expects values in the range [0,1].
|
|
half _EyeCorneaWeight;
|
|
|
|
/// Cornea roughness.
|
|
/// Expects values in the range [0,1].
|
|
half _EyeRoughness;
|
|
|
|
/// Schlera tint color.
|
|
/// Expects a linear LDR color.
|
|
half3 _EyeScleraColor;
|
|
|
|
/// Iris tint color.
|
|
/// Expects a linear LDR color.
|
|
half3 _EyeColor;
|
|
|
|
/// Iris specular tint by base color.
|
|
/// Expects values in the range [0,1].
|
|
half _EyeSpecularTint;
|
|
|
|
/// Samples and scales the base bump map.
|
|
/// @param s Material surface data.
|
|
/// @param scale Normal XY scale factor.
|
|
/// @return Normalized tangent-space normal.
|
|
half3 aSampleBumpScaleOld(
|
|
ASurface s,
|
|
half scale)
|
|
{
|
|
half4 result = 0.0h;
|
|
|
|
#ifdef _VIRTUALTEXTURING_ON
|
|
result = VTSampleNormal(s.baseVirtualCoord);
|
|
#else
|
|
result = tex2D(_BumpMap, s.baseUv);
|
|
#endif
|
|
|
|
return UnpackScaleNormal(result, _BumpScale * scale);
|
|
}
|
|
|
|
void aSurfaceShader(
|
|
inout ASurface s)
|
|
{
|
|
float4 uv01 = s.uv01;
|
|
|
|
aEyeParallax(s);
|
|
aDissolve(s);
|
|
|
|
// Iris
|
|
half4 base = aBase(s);
|
|
half4 material = aSampleMaterial(s);
|
|
half irisMask = material.A_METALLIC_CHANNEL;
|
|
|
|
s.baseColor = base.rgb * lerp(_EyeScleraColor, _EyeColor, irisMask);
|
|
s.metallic = 0.0h;
|
|
s.ambientOcclusion = aLerpOneTo(material.A_AO_CHANNEL, _Occlusion);
|
|
s.specularity = _Specularity * material.A_SPECULARITY_CHANNEL;
|
|
s.specularTint = _EyeSpecularTint * irisMask;
|
|
s.roughness = _Roughness * material.A_ROUGHNESS_CHANNEL;
|
|
|
|
// Cornea
|
|
half bumpMask = s.clearCoat * 0.95h;
|
|
half3 corneaNormalTangent = UnpackScaleNormal(tex2D(_EyeBumpMap, s.baseUv), bumpMask);
|
|
half3 irisScleraNormalTangent = aSampleBumpScaleOld(s, 1.0h - bumpMask);
|
|
|
|
s.clearCoat = _EyeCorneaWeight * irisMask;
|
|
s.clearCoatRoughness = _EyeRoughness;
|
|
s.normalTangent = A_NT(s, BlendNormals(irisScleraNormalTangent, corneaNormalTangent));
|
|
|
|
s.mask = 1.0h - irisMask;
|
|
aDetail(s);
|
|
s.mask = 1.0h;
|
|
|
|
aEmission(s);
|
|
|
|
// Remove parallax so these appears on top of the cornea!
|
|
s.uv01 = uv01;
|
|
aDecal(s);
|
|
aRim(s);
|
|
}
|
|
|
|
#endif // ALLOY_LEGACY_SHADERS_DEFINITION_EYEBALL_CGINC
|