mirror of
https://github.com/muskit/H3VR-TNH-Quality-of-Life-Improvements.git
synced 2026-06-03 04:34:26 -07:00
95 lines
3.0 KiB
HLSL
95 lines
3.0 KiB
HLSL
|
|
// Alloy Physical Shader Framework
|
||
|
|
// Copyright 2013-2017 RUST LLC.
|
||
|
|
// http://www.alloy.rustltd.com/
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
|
/// @file Light.cginc
|
||
|
|
/// @brief Deferred light pass vertex & fragment shaders.
|
||
|
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
#ifndef ALLOY_SHADERS_DEFERRED_LIGHT_CGINC
|
||
|
|
#define ALLOY_SHADERS_DEFERRED_LIGHT_CGINC
|
||
|
|
|
||
|
|
#define A_DIRECT_LIGHTING_PASS
|
||
|
|
|
||
|
|
#include "Assets/Alloy/Shaders/Framework/Deferred.cginc"
|
||
|
|
|
||
|
|
unity_v2f_deferred aMainVertexShader(
|
||
|
|
float4 vertex : POSITION,
|
||
|
|
float3 normal : NORMAL)
|
||
|
|
{
|
||
|
|
return vert_deferred(vertex, normal);
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef UNITY_HDR_ON
|
||
|
|
half4
|
||
|
|
#else
|
||
|
|
fixed4
|
||
|
|
#endif
|
||
|
|
aMainFragmentShader(
|
||
|
|
unity_v2f_deferred i) : SV_Target
|
||
|
|
{
|
||
|
|
ASurface s = aDeferredSurface(i);
|
||
|
|
ADirect d = aNewDirect();
|
||
|
|
float fadeDist = UnityComputeShadowFadeDistance(s.positionWorld, s.viewDepth);
|
||
|
|
float4 lightCoord = 0.0f;
|
||
|
|
float3 lightVector = 0.0f;
|
||
|
|
half3 lightAxis = 0.0h;
|
||
|
|
half range = 1.0h;
|
||
|
|
half4 c = 0.0h;
|
||
|
|
|
||
|
|
d.color = _LightColor.rgb;
|
||
|
|
|
||
|
|
#ifndef DIRECTIONAL
|
||
|
|
lightCoord = mul(unity_WorldToLight, float4(s.positionWorld, 1.0f));
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if defined(USING_DIRECTIONAL_LIGHT)
|
||
|
|
lightVector = -_LightDir.xyz;
|
||
|
|
d.shadow = UnityDeferredComputeShadow(s.positionWorld, fadeDist, s.screenUv);
|
||
|
|
|
||
|
|
#if !defined(ALLOY_SUPPORT_REDLIGHTS) && defined(DIRECTIONAL_COOKIE)
|
||
|
|
aLightCookie(d, tex2Dbias(_LightTexture0, float4(lightCoord.xy, 0, -8)));
|
||
|
|
#endif
|
||
|
|
#elif defined(POINT) || defined(POINT_COOKIE) || defined(SPOT)
|
||
|
|
lightVector = _LightPos.xyz - s.positionWorld;
|
||
|
|
lightAxis = normalize(unity_WorldToLight[1].xyz);
|
||
|
|
range = rsqrt(_LightPos.w); // _LightPos.w = 1/r*r
|
||
|
|
|
||
|
|
#if defined(SPOT)
|
||
|
|
// negative bias because http://aras-p.info/blog/2010/01/07/screenspace-vs-mip-mapping/
|
||
|
|
half4 cookie = tex2Dbias(_LightTexture0, float4(lightCoord.xy / lightCoord.w, 0, -8));
|
||
|
|
|
||
|
|
cookie.a *= (lightCoord.w < 0.0f);
|
||
|
|
aLightCookie(d, cookie);
|
||
|
|
d.shadow = UnityDeferredComputeShadow(s.positionWorld, fadeDist, s.screenUv);
|
||
|
|
#elif defined(POINT) || defined(POINT_COOKIE)
|
||
|
|
d.shadow = UnityDeferredComputeShadow(-lightVector, fadeDist, s.screenUv);
|
||
|
|
|
||
|
|
#if defined (POINT_COOKIE)
|
||
|
|
aLightCookie(d, texCUBEbias(_LightTexture0, float4(lightCoord.xyz, -8)));
|
||
|
|
#endif //POINT_COOKIE
|
||
|
|
#endif //POINT || POINT_COOKIE
|
||
|
|
|
||
|
|
A_UNITY_ATTENUATION(d, _LightTextureB0, lightVector, _LightPos.w)
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if !defined(ALLOY_SUPPORT_REDLIGHTS) || !defined(DIRECTIONAL_COOKIE)
|
||
|
|
aAreaLight(d, s, _LightColor, lightAxis, lightVector, range);
|
||
|
|
#else
|
||
|
|
d.direction = lightVector;
|
||
|
|
d.color *= redLightFunctionLegacy(_LightTexture0, s.positionWorld, s.normalWorld, s.viewDirWorld, d.direction);
|
||
|
|
aDirectionalLight(d, s);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
c.rgb = aHdrClamp(aDirectLighting(d, s));
|
||
|
|
|
||
|
|
#ifdef UNITY_HDR_ON
|
||
|
|
return c;
|
||
|
|
#else
|
||
|
|
return exp2(-c);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif // ALLOY_SHADERS_DEFERRED_LIGHT_CGINC
|