64 lines
2.4 KiB
C
64 lines
2.4 KiB
C
/**
|
|
* @ Version: SCREEN SPACE SHADERS - UPDATE 17
|
|
* @ Description: HUD Raindrops - Base
|
|
* @ Modified time: 2023-08-04 07:23
|
|
* @ Author: https://www.moddb.com/members/ascii1457
|
|
* @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders
|
|
*/
|
|
|
|
Texture2D s_hud_rain; // Raindrops texture [ x: Fade | y: Normal-Y | z: Normal-X | w: Time Offset ]
|
|
|
|
#define SSFX_HUD_LIGHTVECTOR float3(0.30f, 0.59f, 0.11f) // Vector to adjust the intensity of the raindrops at night
|
|
|
|
uniform float4 ssfx_hud_drops_1; // Time, Int, refle, refra
|
|
uniform float4 ssfx_hud_drops_2; // Density, Size, Extra Gloss, Gloss
|
|
|
|
float3 ssfx_process_drops(float4 droplets, float speed, float intensity )
|
|
{
|
|
// Unpack normal [ -1.0 ~ 1.0 ]
|
|
float2 droplets_N = droplets.yz * 2 - 1;
|
|
|
|
// Apply time
|
|
float DropsTime = ssfx_hud_drops_1.x * speed; // Fade * speed factor
|
|
float DropsFrac = 1.0f - frac(droplets.w + DropsTime); // Time offset
|
|
float DropsInt = saturate((DropsFrac * droplets.x) - ssfx_hud_drops_2.x); // (Time * Fade) - Density
|
|
|
|
// Apply intensity
|
|
DropsInt *= intensity;
|
|
droplets_N *= DropsInt;
|
|
|
|
return float3(droplets_N, DropsInt);
|
|
}
|
|
|
|
// Mapping based on https://iquilezles.org/articles/biplanar/
|
|
// Thanks to the chaotic nature of the drops, we can do a very basic planar mapping with 1 sample ( I'm using 2 to add variety to the drops )
|
|
float3 ssfx_hud_raindrops( Texture2D drops_tex, float3 p, float uv_scale )
|
|
{
|
|
// Partial derivatives to reconstruct normal & mapping
|
|
float3 d1 = ddx(p);
|
|
float3 d2 = ddy(p);
|
|
|
|
// Recontruct normal
|
|
float3 n = abs(normalize(cross(d1, d2)));
|
|
|
|
// Major axis (in x; yz are following axis)
|
|
int3 ma = (n.x > n.y && n.x > n.z) ? int3(0, 1, 2) : // [ yz ] Side
|
|
(n.y > n.z) ? int3(1, 2, 0) : // [ zx ] Top
|
|
int3(2, 0, 1) ; // [ xy ] Front
|
|
|
|
// Uvs & partial derivatives
|
|
float2 uvs = float2(p[ma.y], p[ma.z]) * ssfx_hud_drops_2.y;
|
|
float4 d1_d2 = float4(d1[ma.y], d1[ma.z], d2[ma.y], d2[ma.z]);
|
|
|
|
// Project + Fetch [ x: Fade | y: Normal-Y | z: Normal-X | w: Time Offset ]
|
|
float4 Layer0 = drops_tex.SampleGrad(smp_base, uvs * 15.0f, d1_d2.xy, d1_d2.zw);
|
|
float4 Layer1 = drops_tex.SampleGrad(smp_base, (uvs + float2(.23,.46)) * 8.0f, d1_d2.xy, d1_d2.zw);
|
|
|
|
float w = pow( n[ma.x], 5 );
|
|
|
|
// Process animation
|
|
float3 result = ssfx_process_drops(Layer0, 0.2f, w) + ssfx_process_drops(Layer1, 0.1f, w);
|
|
result.xy = clamp(result.xy, -1.0f, 1.0f);
|
|
|
|
return result;
|
|
} |