75 lines
2.1 KiB
PostScript
75 lines
2.1 KiB
PostScript
/**
|
|
* @ Version: SCREEN SPACE SHADERS - UPDATE 17.1
|
|
* @ Description: Rain Shader - PS
|
|
* @ Modified time: 2024-02-10 06:32
|
|
* @ Author: https://www.moddb.com/members/ascii1457
|
|
* @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders
|
|
*/
|
|
|
|
#include "screenspace_common.h"
|
|
|
|
#ifdef SSFX_BEEFS_NVG
|
|
uniform float4 shader_param_8;
|
|
#endif
|
|
|
|
// Pixel Struct
|
|
struct p_Rain
|
|
{
|
|
float2 Tex0 : TEXCOORD0;
|
|
float4 tc : TEXCOORD1;
|
|
};
|
|
|
|
float4 ssfx_rain_setup; // Alpha, Brigthness, Refraction, Reflection
|
|
|
|
float4 main ( p_Rain I ) : SV_Target
|
|
{
|
|
// Factor to adjust the effect depending on light conditions
|
|
float HemiFactor = saturate(dot(L_hemi_color.rgb, float3(1.0f, 1.0f, 1.0f)));
|
|
|
|
// Screen Space
|
|
float2 PosTc = I.tc.xy / I.tc.w;
|
|
|
|
// Normal Setup
|
|
float4 N0 = s_base.Sample( smp_rtlinear, I.Tex0);
|
|
N0.xy = N0.xy * 2.0f - 1.0f; // Convert to -1.0f ~ 1.0f
|
|
|
|
// Adjust "refraction" offset
|
|
float4 UV_Offset = float4(N0.xy * 0.0125f, N0.xy);
|
|
UV_Offset.xy = normalize(float3(UV_Offset.xy * ssfx_rain_setup.z, 1.0f));
|
|
UV_Offset.zw = normalize(float3(UV_Offset.zw * (0.2f + HemiFactor * 0.5f), 1.0f));
|
|
|
|
#if SSFX_RAIN_QUALITY > 0
|
|
// Remove incorrect refraction
|
|
float Depth = SSFX_get_depth(saturate(PosTc + UV_Offset.xy), 0);
|
|
UV_Offset.xy *= (I.tc.w < Depth || Depth <= SKY_EPS);
|
|
#endif
|
|
|
|
// Screen Buffer ( Blur )
|
|
float3 Screen = s_blur_4.Sample(smp_nofilter, saturate(PosTc + UV_Offset.xy)).rgb;
|
|
|
|
#if SSFX_RAIN_QUALITY > 1
|
|
// Fake reflection using light accumulator with a high UV offset
|
|
#ifndef USE_MSAA
|
|
float3 rL = s_accumulator.Sample(smp_nofilter, saturate(PosTc + UV_Offset.zw)).rgb;
|
|
#else
|
|
float3 rL = s_accumulator.Load(int3(saturate(PosTc + UV_Offset.zw) * screen_res.xy, 0), 0).rgb;
|
|
#endif
|
|
|
|
// Adjust intensity ( Day: 3.0f | Night: 18.0f )
|
|
rL *= 3.0f + (1.0 - HemiFactor) * 15.0f;
|
|
|
|
// Add fake reflection
|
|
Screen += rL * ssfx_rain_setup.w;
|
|
#endif
|
|
|
|
// Add Brightness
|
|
Screen += L_hemi_color.rgb * ssfx_rain_setup.y;
|
|
|
|
#ifdef SSFX_BEEFS_NVG
|
|
N0.w *= shader_param_8.x > 0 ? 0.5f : 1.0f;
|
|
#endif
|
|
|
|
// Result
|
|
return float4( saturate(Screen), N0.w * ssfx_rain_setup.x );
|
|
}
|