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

78 lines
2.2 KiB
HLSL

#include "common.hlsli"
struct v2p
{
float2 tc0: TEXCOORD0; // base
float3 tc1: TEXCOORD1; // environment
float4 c0: COLOR0; // sun.(fog*fog)
};
//////////////////////////////////////////////////////////////////////////////////////////
// Pixel
uniform float4 screen_res;
uniform float4 m_hud_params;
uniform float4 m_zoom_deviation;
uniform float4 m_affects;
float resize(float input, float factor, float offset)
{
return (input-0.5f+offset) / factor+0.5f-offset;
}
float get_noise(float2 co)
{
return (frac(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453))*0.5;
};
uniform sampler2D s_vp2;
float random(float2 co)
{
return 0.5+(frac(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453))*0.5;
};
float4 main ( v2p I ) : COLOR
{
float4 t_base = tex2D (s_base, I.tc0); // Òåêñòóðà ñåòêè
//ñäâèã îò ñîñòîÿíèÿ îðóæèÿ
I.tc0.x = I.tc0.x+m_zoom_deviation.x;
I.tc0.y = I.tc0.y+m_zoom_deviation.y;
// Ðàñòÿãèâàåì êàðòèíêó â ëèíçå òàê, ÷òîáû íà ëþáîì ðàçðåøåíèè ýêðàíà áûëè ïðàâèëüíûå ïðîïîðöèè
I.tc0.x = resize(I.tc0.x, screen_res.x/screen_res.y, 0);
float4 t_vp2 = tex2D (s_vp2, I.tc0); // Èçîáðàæåíèå ñî âòîðîãî âüþïîðòà
float3 final = float3(0, 0, 0);
//Àááåðàöèÿ
float2 offset = distance(I.tc0, float2( .5f, .5f ))*float2(m_hud_params.z, m_hud_params.z);
t_vp2.r = tex2D ( s_vp2, I.tc0+offset).r;
t_vp2.b = tex2D ( s_vp2, I.tc0-offset).b;
//Íî÷íîé ðåæèì
// Ðàññ÷èòûâàåì ñëó÷àéíûé øóì ïèêñåëÿ
float noise = random(I.tc0*timers.z) * m_zoom_deviation.w;
float gray = ((t_vp2.r + t_vp2.g + t_vp2.b))*m_zoom_deviation.z*7;
t_vp2.r = t_vp2.r*(1-m_zoom_deviation.z) + gray;
t_vp2.g = t_vp2.g*(1-m_zoom_deviation.z) + gray;
t_vp2.b = t_vp2.b*(1-m_zoom_deviation.z) + gray;
t_vp2.b+= (0.4 + noise)*m_zoom_deviation.z;
// Øóì ïðè âûáðîñå
float noise_blow = get_noise(I.tc0*timers.z) * m_affects.x * m_affects.x * 30;
t_vp2.r += noise_blow;
t_vp2.g += noise_blow;
t_vp2.b += noise_blow;
// Ìèêñóåì ñ ñåòêîé
final = lerp (t_vp2, t_base, t_base.a);
// out
return float4 (final.r, final.g, final.b, min(m_hud_params.y, m_hud_params.a));
}