#include "common.hlsli" struct v2p { float2 tc0: TEXCOORD0; // base float3 tc1: TEXCOORD1; // environment float4 c0: COLOR0; // sun.(fog*fog) }; ////////////////////////////////////////////////////////////////////////////////////////// float resize(float input, float factor, float offset) { return (input-0.5f+offset) / factor+0.5f-offset; } // Pixel uniform float4 screen_res; uniform float4 m_hud_params; uniform float4 m_zoom_deviation; uniform sampler2D s_vp2; float4 main ( v2p I ) : COLOR { // Производим выборку правой и левой половин текстуры с сеткой float2 coords = I.tc0; coords.x *= 0.5; float4 base2 = tex2D(s_base, coords); coords.x += 0.5; float4 t_base = tex2D(s_base, coords); // Миксуем половинки в соответствии с текущим уровнем подсветки t_base = lerp(base2, t_base, m_zoom_deviation.z); //сдвиг от состояния оружия 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); 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; // Миксуем всё и собираем финальную картинку float3 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)); }