e4s-sdk/gamedata/shaders/d3d11/models_reflex_lens.ps.hlsl
2026-06-17 23:06:51 +03:00

90 lines
2.8 KiB
HLSL

/*
=====================================================================
Addon : Parallax Reflex Sights
Link : https://www.moddb.com/mods/stalker-anomaly/addons/parallax-reflex-sights
Authors : LVutner, party_50
Date : 06.02.2024
Last Edit : 15.05.2025
=====================================================================
*/
#include "common.hlsli"
struct vf
{
float4 hpos : SV_Position;
float2 tc0 : TEXCOORD0;
float3 T : TEXCOORD1;
float3 B : TEXCOORD2;
float3 N : TEXCOORD3;
float3 P : TEXCOORD4;
};
TextureCube s_env0;
TextureCube s_env1;
float3 sample_sky(float3 dir)
{
dir.y = (dir.y - max(cos(dir.x) * 0.65, cos(dir.z) * 0.65)) * 2.1;
dir.y -= -0.35;
float3 sky0 = s_env0.SampleLevel(smp_base, dir, 0).xyz;
float3 sky1 = s_env1.SampleLevel(smp_base, dir, 0).xyz;
return lerp(sky0, sky1, L_ambient.w);
}
float current_lum()
{
float lum_min = 0.85;
float lum_max = 3;
float lum = s_tonemap.Load(int3(0, 0, 0)).x;
return clamp(1 - (lum - lum_min) / (lum_max - lum_min), 0, 1);
}
float3 sample_lens_normalmap(float2 tc, float radius)
{
float2 xy = (tc - 0.5) * 2;
return float3(xy, sign(radius) * sqrt(pow(radius, 2) - dot(xy, xy)));
}
float4 sample_reflections(float2 tc, float3x3 TBNw_inv, float3 w_pos, float3 w_nrm)
{
float3 normalmap = sample_lens_normalmap(tc, 2);
float3 lensnormal = normalize(float3(dot(normalmap, TBNw_inv[0]), dot(normalmap, TBNw_inv[1]), dot(normalmap, TBNw_inv[2])));
float3 reflections = sample_sky(reflect(normalize(normalize(w_pos - eye_position)), lensnormal));
float angle_factor = (dot(normalize(w_pos - eye_position), normalize(w_nrm)) + 1) / 2;
float4 color_direct = s_base.Sample(smp_rtlinear, float2(tc.x / 2 + 0.5, tc.y / 2));
float4 color_angled = s_base.Sample(smp_rtlinear, float2(tc.x / 2 + 0.5, tc.y / 2 + 0.5));
float4 color = lerp(color_direct, color_angled, smoothstep(0, 0.5, angle_factor));
reflections = saturate(reflections * color.rgb);
return float4(reflections, current_lum() * smoothstep(0, 0.03, angle_factor) * color.a);
}
float4 sample_dirt(float2 tc, float3 w_nrm)
{
float4 color = s_base.Sample(smp_rtlinear, float2(tc.x / 2, tc.y / 2 + 0.5));
return float4(color.rgb * 2 * calc_model_lq_lighting(w_nrm), color.a);
}
float4 rgba_blend(float4 b, float4 a)
{
float na = a.a + b.a * (1 - a.a);
float3 nc = na > 0 ? (a.rgb * a.a + b.rgb * b.a * (1 - a.a)) / na : float3(0, 0, 0);
return float4(nc, na);
}
float4 main(vf I): SV_Target
{
float4 lens = s_base.Sample(smp_rtlinear, I.tc0 / 2);
lens.a *= current_lum();
float4 reflections = sample_reflections(I.tc0, transpose(float3x3(I.T, I.B, I.N)), I.P, I.N);
float4 dirt = sample_dirt(I.tc0, I.N);
return rgba_blend(rgba_blend(lens, reflections), dirt);
}